From b9e138939b1140f2ebca59d7efaa625ac19f8aed Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 3 May 2024 15:20:59 +0200 Subject: [PATCH 01/23] refactor, add feature for register address --- dlt-connector/src/data/User.repository.ts | 8 +++ .../src/data/proto/3_3/RegisterAddress.ts | 20 ++++++ .../src/data/proto/3_3/TransactionBody.ts | 15 ++++- .../src/data/proto/TransactionBody.builder.ts | 11 +++- .../src/data/proto/transactionBody.logic.ts | 59 +++++++++++++++++ .../src/graphql/resolver/AccountsResolver.ts | 60 ++++++++++++++++++ .../graphql/resolver/TransactionsResolver.ts | 2 +- .../account/RegisterAddress.context.ts | 63 +++++++++++++++++++ .../community/HomeCommunity.role.ts | 6 +- .../AbstractTransactionRecipeRole.ts | 15 +++++ ...> BalanceChangingTransactionRecipeRole.ts} | 17 +---- .../CommunityRootTransaction.role.ts | 8 +-- .../CreateTransactionRecipe.context.test.ts | 2 +- ....ts => CreateTransactionRecipe.context.ts} | 38 ++++++++--- .../RegisterAddressTransaction.role.ts | 29 +++++++++ .../TransmitToIota.context.test.ts | 2 +- 16 files changed, 318 insertions(+), 37 deletions(-) create mode 100644 dlt-connector/src/data/proto/transactionBody.logic.ts create mode 100644 dlt-connector/src/graphql/resolver/AccountsResolver.ts create mode 100644 dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts create mode 100644 dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts rename dlt-connector/src/interactions/backendToDb/transaction/{TransactionRecipe.role.ts => BalanceChangingTransactionRecipeRole.ts} (87%) rename dlt-connector/src/interactions/backendToDb/transaction/{CreateTransationRecipe.context.ts => CreateTransactionRecipe.context.ts} (61%) create mode 100644 dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts diff --git a/dlt-connector/src/data/User.repository.ts b/dlt-connector/src/data/User.repository.ts index 6e5a66203..1e9e4dcef 100644 --- a/dlt-connector/src/data/User.repository.ts +++ b/dlt-connector/src/data/User.repository.ts @@ -1,5 +1,6 @@ import { Account } from '@entity/Account' import { User } from '@entity/User' +import { FindOptionsRelations } from 'typeorm' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { getDataSource } from '@/typeorm/DataSource' @@ -21,4 +22,11 @@ export const UserRepository = getDataSource() return account } }, + + findByGradidoId( + { uuid }: UserIdentifier, + relations?: FindOptionsRelations, + ): Promise { + return User.findOne({ where: { gradidoID: uuid }, relations }) + }, }) diff --git a/dlt-connector/src/data/proto/3_3/RegisterAddress.ts b/dlt-connector/src/data/proto/3_3/RegisterAddress.ts index 87f09afbd..08cb39868 100644 --- a/dlt-connector/src/data/proto/3_3/RegisterAddress.ts +++ b/dlt-connector/src/data/proto/3_3/RegisterAddress.ts @@ -1,15 +1,35 @@ /* eslint-disable @typescript-eslint/no-empty-function */ /* eslint-disable @typescript-eslint/no-unused-vars */ +import { Account } from '@entity/Account' import { Transaction } from '@entity/Transaction' +import { User } from '@entity/User' import { Field, Message } from 'protobufjs' import { AddressType } from '@/data/proto/3_3/enum/AddressType' +import { AccountType } from '@/graphql/enum/AccountType' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' +import { accountTypeToAddressType } from '@/utils/typeConverter' import { AbstractTransaction } from '../AbstractTransaction' // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class RegisterAddress extends Message implements AbstractTransaction { + constructor(transaction?: UserAccountDraft, account?: Account) { + if (transaction) { + super({ addressType: accountTypeToAddressType(transaction.accountType) }) + if (account) { + this.derivationIndex = account.derivationIndex + this.accountPubkey = account.derive2Pubkey + if (account.user) { + this.userPubkey = account.user.derive1Pubkey + } + } + } else { + super() + } + } + @Field.d(1, 'bytes') public userPubkey: Buffer diff --git a/dlt-connector/src/data/proto/3_3/TransactionBody.ts b/dlt-connector/src/data/proto/3_3/TransactionBody.ts index 39d5602ec..934e05cfc 100644 --- a/dlt-connector/src/data/proto/3_3/TransactionBody.ts +++ b/dlt-connector/src/data/proto/3_3/TransactionBody.ts @@ -4,12 +4,14 @@ import { Field, Message, OneOf } from 'protobufjs' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { TransactionError } from '@/graphql/model/TransactionError' import { logger } from '@/logging/logger' import { LogError } from '@/server/LogError' import { timestampToDate } from '@/utils/typeConverter' import { AbstractTransaction } from '../AbstractTransaction' +import { determineCrossGroupType, determineOtherGroup } from '../transactionBody.logic' import { CommunityRoot } from './CommunityRoot' import { PROTO_TRANSACTION_BODY_VERSION_NUMBER } from './const' @@ -25,14 +27,21 @@ import { Timestamp } from './Timestamp' // https://www.npmjs.com/package/@apollo/protobufjs // eslint-disable-next-line no-use-before-define export class TransactionBody extends Message { - public constructor(transaction?: TransactionDraft | CommunityDraft) { + public constructor(transaction?: TransactionDraft | CommunityDraft | UserAccountDraft) { if (transaction) { + let type = CrossGroupType.LOCAL + let otherGroup = '' + if (transaction instanceof TransactionDraft) { + type = determineCrossGroupType(transaction) + otherGroup = determineOtherGroup(type, transaction) + } + super({ memo: 'Not implemented yet', createdAt: new Timestamp(new Date(transaction.createdAt)), versionNumber: PROTO_TRANSACTION_BODY_VERSION_NUMBER, - type: CrossGroupType.LOCAL, - otherGroup: '', + type, + otherGroup, }) } else { super() diff --git a/dlt-connector/src/data/proto/TransactionBody.builder.ts b/dlt-connector/src/data/proto/TransactionBody.builder.ts index 22d943d48..cfc1e808b 100644 --- a/dlt-connector/src/data/proto/TransactionBody.builder.ts +++ b/dlt-connector/src/data/proto/TransactionBody.builder.ts @@ -4,12 +4,14 @@ import { Community } from '@entity/Community' import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { LogError } from '@/server/LogError' import { CommunityRoot } from './3_3/CommunityRoot' import { CrossGroupType } from './3_3/enum/CrossGroupType' import { GradidoCreation } from './3_3/GradidoCreation' import { GradidoTransfer } from './3_3/GradidoTransfer' +import { RegisterAddress } from './3_3/RegisterAddress' import { TransactionBody } from './3_3/TransactionBody' export class TransactionBodyBuilder { @@ -99,9 +101,16 @@ export class TransactionBodyBuilder { return this } + public fromUserAccountDraft(userAccountDraft: UserAccountDraft, account: Account): this { + this.body = new TransactionBody(userAccountDraft) + this.body.registerAddress = new RegisterAddress(userAccountDraft, account) + this.body.data = 'registerAddress' + return this + } + public fromTransactionDraft(transactionDraft: TransactionDraft): TransactionBodyBuilder { this.body = new TransactionBody(transactionDraft) - // TODO: load pubkeys for sender and recipient user from db + // TODO: load public keys for sender and recipient user from db switch (transactionDraft.type) { case InputTransactionType.CREATION: if (!this.recipientAccount) { diff --git a/dlt-connector/src/data/proto/transactionBody.logic.ts b/dlt-connector/src/data/proto/transactionBody.logic.ts new file mode 100644 index 000000000..69d7e565e --- /dev/null +++ b/dlt-connector/src/data/proto/transactionBody.logic.ts @@ -0,0 +1,59 @@ +import { InputTransactionType } from '@/graphql/enum/InputTransactionType' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' + +import { CrossGroupType } from './3_3/enum/CrossGroupType' + +export const determineCrossGroupType = ({ + user, + linkedUser, + type, +}: TransactionDraft): CrossGroupType => { + if ( + !linkedUser.communityUuid || + !user.communityUuid || + linkedUser.communityUuid === '' || + user.communityUuid === '' || + user.communityUuid === linkedUser.communityUuid || + type === InputTransactionType.CREATION + ) { + return CrossGroupType.LOCAL + } else if (type === InputTransactionType.SEND) { + return CrossGroupType.INBOUND + } else if (type === InputTransactionType.RECEIVE) { + return CrossGroupType.OUTBOUND + } + throw new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'cannot determine CrossGroupType', + ) +} + +export const determineOtherGroup = ( + type: CrossGroupType, + { user, linkedUser }: TransactionDraft, +): string => { + switch (type) { + case CrossGroupType.LOCAL: + return '' + case CrossGroupType.INBOUND: + if (!linkedUser.communityUuid || linkedUser.communityUuid === '') { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing linkedUser community id for cross group transaction', + ) + } + return linkedUser.communityUuid + case CrossGroupType.OUTBOUND: + if (!user.communityUuid || user.communityUuid === '') { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing user community id for cross group transaction', + ) + } + return user.communityUuid + case CrossGroupType.CROSS: + throw new TransactionError(TransactionErrorType.NOT_IMPLEMENTED_YET, 'not implemented yet') + } +} diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts new file mode 100644 index 000000000..91ac7bd73 --- /dev/null +++ b/dlt-connector/src/graphql/resolver/AccountsResolver.ts @@ -0,0 +1,60 @@ +import { Arg, Mutation, Query, Resolver } from 'type-graphql' +import { QueryFailedError } from 'typeorm' + +import { TransactionRecipe } from '@model/TransactionRecipe' + +import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' +import { UserRepository } from '@/data/User.repository' +import { RegisterAddressContext } from '@/interactions/backendToDb/account/RegisterAddress.context' +import { logger } from '@/logging/logger' +import { TransactionLoggingView } from '@/logging/TransactionLogging.view' +import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' +import { getDataSource } from '@/typeorm/DataSource' + +import { TransactionErrorType } from '../enum/TransactionErrorType' +import { UserAccountDraft } from '../input/UserAccountDraft' +import { UserIdentifier } from '../input/UserIdentifier' +import { TransactionError } from '../model/TransactionError' +import { TransactionResult } from '../model/TransactionResult' + +@Resolver() +export class AccountResolver { + @Query(() => Boolean) + async isAccountExist(@Arg('data') userIdentifier: UserIdentifier): Promise { + logger.info('isAccountExist', userIdentifier) + return !!(await UserRepository.findAccountByUserIdentifier(userIdentifier)) + } + + @Mutation(() => TransactionResult) + async registerAddress( + @Arg('data') + userAccountDraft: UserAccountDraft, + ): Promise { + const registerAddressContext = new RegisterAddressContext(userAccountDraft) + try { + const { transaction, account } = await registerAddressContext.run() + await getDataSource().transaction(async (transactionalEntityManager) => { + await transactionalEntityManager.save(account) + await transactionalEntityManager.save(transaction) + logger.debug('store register address transaction', new TransactionLoggingView(transaction)) + }) + InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) + return new TransactionResult(new TransactionRecipe(transaction)) + } catch (err) { + if (err instanceof QueryFailedError) { + logger.error('error saving user or new account or transaction into db: %s', err) + return new TransactionResult( + new TransactionError( + TransactionErrorType.DB_ERROR, + 'error saving user or new account or transaction into db', + ), + ) + } else if (err instanceof TransactionError) { + return new TransactionResult(err) + } else { + logger.error('error in register address: ', err) + throw err + } + } + } +} diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index 7cc619400..3f34584a9 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -4,7 +4,7 @@ import { TransactionDraft } from '@input/TransactionDraft' import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' import { TransactionRepository } from '@/data/Transaction.repository' -import { CreateTransactionRecipeContext } from '@/interactions/backendToDb/transaction/CreateTransationRecipe.context' +import { CreateTransactionRecipeContext } from '@/interactions/backendToDb/transaction/CreateTransactionRecipe.context' import { BackendTransactionLoggingView } from '@/logging/BackendTransactionLogging.view' import { logger } from '@/logging/logger' import { TransactionLoggingView } from '@/logging/TransactionLogging.view' diff --git a/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts b/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts new file mode 100644 index 000000000..196c0daf4 --- /dev/null +++ b/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts @@ -0,0 +1,63 @@ +import { Account } from '@entity/Account' +import { Transaction } from '@entity/Transaction' +import { User } from '@entity/User' + +import { AccountFactory } from '@/data/Account.factory' +import { CommunityRepository } from '@/data/Community.repository' +import { KeyPair } from '@/data/KeyPair' +import { UserFactory } from '@/data/User.factory' +import { UserLogic } from '@/data/User.logic' +import { UserRepository } from '@/data/User.repository' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' +import { TransactionError } from '@/graphql/model/TransactionError' +import { logger } from '@/logging/logger' + +import { CreateTransactionRecipeContext } from '../transaction/CreateTransactionRecipe.context' + +export interface TransactionWithAccount { + transaction: Transaction + account: Account +} + +export class RegisterAddressContext { + // eslint-disable-next-line no-useless-constructor + public constructor(private userAccountDraft: UserAccountDraft) {} + + public async run(): Promise { + const communityKeyPair = await CommunityRepository.loadHomeCommunityKeyPair() + const user = await this.loadOrCreateUser(communityKeyPair) + if (this.isAccountAlreadyExistOnUser(user)) { + throw new TransactionError( + TransactionErrorType.ALREADY_EXIST, + 'account for this user already exist!', + ) + } + logger.info('add user and account', this.userAccountDraft) + const account = this.createAccount(new UserLogic(user).calculateKeyPair(communityKeyPair)) + account.user = user + const createTransactionContext = new CreateTransactionRecipeContext(this.userAccountDraft, { + account, + }) + await createTransactionContext.run() + return { transaction: createTransactionContext.getTransactionRecipe(), account } + } + + public isAccountAlreadyExistOnUser(user: User): boolean { + return !!user.accounts?.find( + (value) => value.derivationIndex === this.userAccountDraft.user.accountNr, + ) + } + + public async loadOrCreateUser(communityKeyPair: KeyPair): Promise { + let user = await UserRepository.findByGradidoId(this.userAccountDraft.user, { accounts: true }) + if (!user) { + user = UserFactory.create(this.userAccountDraft, communityKeyPair) + } + return user + } + + public createAccount(userKeyPair: KeyPair): Account { + return AccountFactory.createAccountFromUserAccountDraft(this.userAccountDraft, userKeyPair) + } +} diff --git a/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts b/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts index 5d7bec94c..ad259b372 100644 --- a/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts +++ b/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts @@ -15,7 +15,7 @@ import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' import { LogError } from '@/server/LogError' import { getDataSource } from '@/typeorm/DataSource' -import { CreateTransactionRecipeContext } from '../transaction/CreateTransationRecipe.context' +import { CreateTransactionRecipeContext } from '../transaction/CreateTransactionRecipe.context' import { CommunityRole } from './Community.role' @@ -44,7 +44,9 @@ export class HomeCommunityRole extends CommunityRole { this.self.aufAccount = AccountFactory.createAufAccount(keyPair, this.self.createdAt) this.self.gmwAccount = AccountFactory.createGmwAccount(keyPair, this.self.createdAt) - const transactionRecipeContext = new CreateTransactionRecipeContext(communityDraft, this.self) + const transactionRecipeContext = new CreateTransactionRecipeContext(communityDraft, { + community: this.self, + }) await transactionRecipeContext.run() this.transactionRecipe = transactionRecipeContext.getTransactionRecipe() } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts b/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts new file mode 100644 index 000000000..812f6a7f0 --- /dev/null +++ b/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts @@ -0,0 +1,15 @@ +import { Transaction } from '@entity/Transaction' + +import { TransactionBuilder } from '@/data/Transaction.builder' + +export class AbstractTransactionRecipeRole { + protected transactionBuilder: TransactionBuilder + + public constructor() { + this.transactionBuilder = new TransactionBuilder() + } + + public getTransaction(): Transaction { + return this.transactionBuilder.getTransaction() + } +} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/TransactionRecipe.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts similarity index 87% rename from dlt-connector/src/interactions/backendToDb/transaction/TransactionRecipe.role.ts rename to dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts index f1be50c75..a4145cd44 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/TransactionRecipe.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts @@ -1,29 +1,22 @@ import { Community } from '@entity/Community' -import { Transaction } from '@entity/Transaction' import { AccountLogic } from '@/data/Account.logic' import { KeyPair } from '@/data/KeyPair' import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' -import { TransactionBuilder } from '@/data/Transaction.builder' import { UserRepository } from '@/data/User.repository' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { TransactionError } from '@/graphql/model/TransactionError' import { AbstractTransactionRole } from './AbstractTransaction.role' +import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' -export class TransactionRecipeRole { - protected transactionBuilder: TransactionBuilder - - public constructor() { - this.transactionBuilder = new TransactionBuilder() - } - +export class BalanceChangingTransactionRecipeRole extends AbstractTransactionRecipeRole { public async create( transactionDraft: TransactionDraft, transactionTypeRole: AbstractTransactionRole, - ): Promise { + ): Promise { const signingUser = transactionTypeRole.getSigningUser() const recipientUser = transactionTypeRole.getRecipientUser() @@ -82,8 +75,4 @@ export class TransactionRecipeRole { } return this.transactionBuilder.getCommunity() } - - public getTransaction(): Transaction { - return this.transactionBuilder.getTransaction() - } } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts index 75b885f2f..34d56cce0 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts @@ -4,13 +4,13 @@ import { KeyPair } from '@/data/KeyPair' import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionRecipeRole } from './TransactionRecipe.role' +import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' -export class CommunityRootTransactionRole extends TransactionRecipeRole { - public createFromCommunityRoot( +export class CommunityRootTransactionRole extends AbstractTransactionRecipeRole { + public create( communityDraft: CommunityDraft, community: Community, - ): CommunityRootTransactionRole { + ): AbstractTransactionRecipeRole { // create proto transaction body const transactionBody = new TransactionBodyBuilder() .fromCommunityDraft(communityDraft, community) diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts index e5535f3f7..117645bd1 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts @@ -15,7 +15,7 @@ import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' -import { CreateTransactionRecipeContext } from './CreateTransationRecipe.context' +import { CreateTransactionRecipeContext } from './CreateTransactionRecipe.context' // eslint-disable-next-line import/order import { communitySeed } from '@test/seeding/Community.seed' diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransationRecipe.context.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts similarity index 61% rename from dlt-connector/src/interactions/backendToDb/transaction/CreateTransationRecipe.context.ts rename to dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts index 8fa3dc443..42e633a18 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransationRecipe.context.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts @@ -1,3 +1,4 @@ +import { Account } from '@entity/Account' import { Community } from '@entity/Community' import { Transaction } from '@entity/Transaction' @@ -5,30 +6,38 @@ import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { TransactionError } from '@/graphql/model/TransactionError' import { AbstractTransactionRole } from './AbstractTransaction.role' +import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' +import { BalanceChangingTransactionRecipeRole } from './BalanceChangingTransactionRecipeRole' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' import { ReceiveTransactionRole } from './ReceiveTransaction.role' +import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { SendTransactionRole } from './SendTransaction.role' -import { TransactionRecipeRole } from './TransactionRecipe.role' /** * @DCI-Context * Context for create and add Transaction Recipe to DB */ +export interface AdditionalData { + community?: Community + account?: Account +} + export class CreateTransactionRecipeContext { - private transactionRecipeRole: TransactionRecipeRole + private transactionRecipe: AbstractTransactionRecipeRole // eslint-disable-next-line no-useless-constructor public constructor( - private draft: CommunityDraft | TransactionDraft, - private community?: Community, + private draft: CommunityDraft | TransactionDraft | UserAccountDraft, + private data?: AdditionalData, ) {} public getTransactionRecipe(): Transaction { - return this.transactionRecipeRole.getTransaction() + return this.transactionRecipe.getTransaction() } /** @@ -36,7 +45,7 @@ export class CreateTransactionRecipeContext { */ public async run(): Promise { if (this.draft instanceof TransactionDraft) { - this.transactionRecipeRole = new TransactionRecipeRole() + const transactionRecipeRole = new BalanceChangingTransactionRecipeRole() // contain logic for translation from backend to dlt-connector format let transactionTypeRole: AbstractTransactionRole switch (this.draft.type) { @@ -50,15 +59,24 @@ export class CreateTransactionRecipeContext { transactionTypeRole = new ReceiveTransactionRole(this.draft) break } - await this.transactionRecipeRole.create(this.draft, transactionTypeRole) + await transactionRecipeRole.create(this.draft, transactionTypeRole) return true } else if (this.draft instanceof CommunityDraft) { - if (!this.community) { + if (!this.data?.community) { throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'community was not set') } - this.transactionRecipeRole = new CommunityRootTransactionRole().createFromCommunityRoot( + this.transactionRecipe = new CommunityRootTransactionRole().create( this.draft, - this.community, + this.data.community, + ) + return true + } else if (this.draft instanceof UserAccountDraft) { + if (!this.data?.account) { + throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'account was not set') + } + this.transactionRecipe = await new RegisterAddressTransactionRole().create( + this.draft, + this.data.account, ) return true } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts new file mode 100644 index 000000000..84de6b5df --- /dev/null +++ b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts @@ -0,0 +1,29 @@ +import { Account } from '@entity/Account' + +import { AccountLogic } from '@/data/Account.logic' +import { CommunityRepository } from '@/data/Community.repository' +import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' +import { TransactionError } from '@/graphql/model/TransactionError' + +import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' + +export class RegisterAddressTransactionRole extends AbstractTransactionRecipeRole { + async create( + userAccountDraft: UserAccountDraft, + account: Account, + ): Promise { + const bodyBuilder = new TransactionBodyBuilder() + const communityKeyPair = await CommunityRepository.loadHomeCommunityKeyPair() + const signingKeyPair = new AccountLogic(account).calculateKeyPair(communityKeyPair) + if (!signingKeyPair) { + throw new TransactionError(TransactionErrorType.NOT_FOUND, "couldn't found signing key pair") + } + this.transactionBuilder + .fromTransactionBodyBuilder(bodyBuilder.fromUserAccountDraft(userAccountDraft, account)) + .setSignature(signingKeyPair.sign(this.transactionBuilder.getTransaction().bodyBytes)) + .setSigningAccount(account) + return this + } +} diff --git a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts index 94a8e4f9d..520c4e143 100644 --- a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts +++ b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts @@ -14,7 +14,7 @@ import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { logger } from '@/logging/logger' -import { CreateTransactionRecipeContext } from '../backendToDb/transaction/CreateTransationRecipe.context' +import { CreateTransactionRecipeContext } from '../backendToDb/transaction/CreateTransactionRecipe.context' import { TransmitToIotaContext } from './TransmitToIota.context' From e4dcd7f0ce8b658b8ca163eb1f1c9a30384dc35a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 14 May 2024 11:55:21 +0200 Subject: [PATCH 02/23] add register address code to backend --- .../apis/dltConnector/DltConnectorClient.ts | 64 ++++++++++++++++++- .../src/apis/dltConnector/enum/AccountType.ts | 9 +++ .../dltConnector/model/UserAccountDraft.ts | 9 +++ backend/src/graphql/resolver/UserResolver.ts | 7 ++ 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 backend/src/apis/dltConnector/enum/AccountType.ts create mode 100644 backend/src/apis/dltConnector/model/UserAccountDraft.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 765d09fb4..4cdbffddf 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -1,4 +1,5 @@ import { Transaction as DbTransaction } from '@entity/Transaction' +import { User } from '@entity/User' import { gql, GraphQLClient } from 'graphql-request' import { CONFIG } from '@/config' @@ -6,13 +7,31 @@ import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' +import { AccountType } from './enum/AccountType' import { TransactionResult } from './model/TransactionResult' +import { UserAccountDraft } from './model/UserAccountDraft' import { UserIdentifier } from './model/UserIdentifier' const sendTransaction = gql` mutation ($input: TransactionInput!) { sendTransaction(data: $input) { - dltTransactionIdHex + error { + message + name + } + succeed + } + } +` + +const registerAddress = gql` + mutation ($input: UserAccountDraft!) { + registerAddress(data: $input) { + error { + message + name + } + succeed } } ` @@ -63,7 +82,10 @@ export class DltConnectorClient { if (!DltConnectorClient.instance.client) { try { DltConnectorClient.instance.client = new GraphQLClient(CONFIG.DLT_CONNECTOR_URL, { - method: 'GET', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, jsonSerializer: { parse: JSON.parse, stringify: JSON.stringify, @@ -118,7 +140,45 @@ export class DltConnectorClient { } return succeed } catch (e) { + console.log("catch response dlt:", e) throw new LogError('Error send sending transaction to dlt-connector: ', e) } } + + public async registerAddress(dbUser: User): Promise { + console.log('dlt:registerAddress') + const params = { + input: { + user: { + uuid: dbUser.gradidoID, + communityUuid: dbUser.communityUuid, + accountNr: 1, + } as UserIdentifier, + createdAt: dbUser.createdAt.toISOString(), + accountType: AccountType.COMMUNITY_HUMAN, + } as UserAccountDraft, + } + try { + console.log('before send with', params) + const { + data: { registerAddress: result }, + } = await this.client.rawRequest<{ registerAddress: TransactionResult }>( + registerAddress, + params, + ) + console.log('after send') + console.log('result: ', result) + logger.info('send register address transaction to dlt-connector', { + params, + result, + }) + if (result.error) { + logger.error('Error sending register address transaction to dlt-connector', result.error) + } + return result + } catch (e) { + console.log('exception', e) + logger.error('Exception sending register address transaction to dlt-connector', e) + } + } } diff --git a/backend/src/apis/dltConnector/enum/AccountType.ts b/backend/src/apis/dltConnector/enum/AccountType.ts new file mode 100644 index 000000000..a54703fbd --- /dev/null +++ b/backend/src/apis/dltConnector/enum/AccountType.ts @@ -0,0 +1,9 @@ +export enum AccountType { + NONE = 'NONE', // if no address was found + COMMUNITY_HUMAN = 'COMMUNITY_HUMAN', // creation account for human + COMMUNITY_GMW = 'COMMUNITY_GMW', // community public budget account + COMMUNITY_AUF = 'COMMUNITY_AUF', // community compensation and environment founds account + COMMUNITY_PROJECT = 'COMMUNITY_PROJECT', // no creations allowed + SUBACCOUNT = 'SUBACCOUNT', // no creations allowed + CRYPTO_ACCOUNT = 'CRYPTO_ACCOUNT', // user control his keys, no creations +} diff --git a/backend/src/apis/dltConnector/model/UserAccountDraft.ts b/backend/src/apis/dltConnector/model/UserAccountDraft.ts new file mode 100644 index 000000000..f4aff4cb4 --- /dev/null +++ b/backend/src/apis/dltConnector/model/UserAccountDraft.ts @@ -0,0 +1,9 @@ +import { AccountType } from '@/apis/dltConnector/enum/AccountType' + +import { UserIdentifier } from './UserIdentifier' + +export interface UserAccountDraft { + user: UserIdentifier + createdAt: string + accountType: AccountType +} diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 3f70ce112..8c7d56985 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -30,6 +30,7 @@ import { SearchAdminUsersResult } from '@model/AdminUser' import { User } from '@model/User' import { UserAdmin, SearchUsersResult } from '@model/UserAdmin' +import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' import { subscribe } from '@/apis/KlicktippController' import { encode } from '@/auth/JWT' import { RIGHTS } from '@/auth/RIGHTS' @@ -359,6 +360,12 @@ export class UserResolver { } logger.info('createUser() successful...') + const dltConnector = DltConnectorClient.getInstance() + if (dltConnector) { + const r = await dltConnector.registerAddress(dbUser) + console.log('result from dlt', r) + } + if (redeemCode) { eventRegisterRedeem.affectedUser = dbUser eventRegisterRedeem.actingUser = dbUser From 9ce8dfd493b3780fd80f1b1ae41bf5337a030710 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 14 May 2024 11:56:07 +0200 Subject: [PATCH 03/23] refactor dlt-connector a bit, fix some wrong code --- dlt-connector/src/config/index.ts | 2 +- dlt-connector/src/data/Community.repository.ts | 6 ++++++ dlt-connector/src/graphql/resolver/AccountsResolver.ts | 8 ++++++-- dlt-connector/src/graphql/schema.ts | 3 ++- .../backendToDb/account/RegisterAddress.context.ts | 4 +++- .../transaction/CreateTransactionRecipe.context.ts | 4 ++++ .../transaction/RegisterAddressTransaction.role.ts | 3 +++ 7 files changed, 25 insertions(+), 5 deletions(-) diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 6b4fdae9a..9cbdac441 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -4,7 +4,7 @@ dotenv.config() const constants = { LOG4JS_CONFIG: 'log4js-config.json', - DB_VERSION: '0003-refactor_transaction_recipe', + DB_VERSION: '0004-fix_spelling', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', CONFIG_VERSION: { diff --git a/dlt-connector/src/data/Community.repository.ts b/dlt-connector/src/data/Community.repository.ts index 78023b15e..dca283a67 100644 --- a/dlt-connector/src/data/Community.repository.ts +++ b/dlt-connector/src/data/Community.repository.ts @@ -73,4 +73,10 @@ export const CommunityRepository = getDataSource() } return new KeyPair(community) }, + + async loadHomeCommunity(): Promise { + return await this.findOneOrFail({ + where: { foreign: false }, + }) + }, }) diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts index 91ac7bd73..b90b5561c 100644 --- a/dlt-connector/src/graphql/resolver/AccountsResolver.ts +++ b/dlt-connector/src/graphql/resolver/AccountsResolver.ts @@ -1,11 +1,11 @@ +import { TransactionRecipe } from '@model/TransactionRecipe' import { Arg, Mutation, Query, Resolver } from 'type-graphql' import { QueryFailedError } from 'typeorm' -import { TransactionRecipe } from '@model/TransactionRecipe' - import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' import { UserRepository } from '@/data/User.repository' import { RegisterAddressContext } from '@/interactions/backendToDb/account/RegisterAddress.context' +import { AccountLoggingView } from '@/logging/AccountLogging.view' import { logger } from '@/logging/logger' import { TransactionLoggingView } from '@/logging/TransactionLogging.view' import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' @@ -33,6 +33,10 @@ export class AccountResolver { const registerAddressContext = new RegisterAddressContext(userAccountDraft) try { const { transaction, account } = await registerAddressContext.run() + logger.info('register address', { + account: new AccountLoggingView(account), + transaction: new TransactionLoggingView(transaction), + }) await getDataSource().transaction(async (transactionalEntityManager) => { await transactionalEntityManager.save(account) await transactionalEntityManager.save(transaction) diff --git a/dlt-connector/src/graphql/schema.ts b/dlt-connector/src/graphql/schema.ts index bbd61c63f..a756b1ac9 100755 --- a/dlt-connector/src/graphql/schema.ts +++ b/dlt-connector/src/graphql/schema.ts @@ -2,13 +2,14 @@ import { Decimal } from 'decimal.js-light' import { GraphQLSchema } from 'graphql' import { buildSchema } from 'type-graphql' +import { AccountResolver } from './resolver/AccountsResolver' import { CommunityResolver } from './resolver/CommunityResolver' import { TransactionResolver } from './resolver/TransactionsResolver' import { DecimalScalar } from './scalar/Decimal' export const schema = async (): Promise => { return buildSchema({ - resolvers: [TransactionResolver, CommunityResolver], + resolvers: [TransactionResolver, CommunityResolver, AccountResolver], scalarsMap: [{ type: Decimal, scalar: DecimalScalar }], validate: { validationError: { target: false }, diff --git a/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts b/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts index 196c0daf4..c84cb0149 100644 --- a/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts +++ b/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts @@ -25,7 +25,8 @@ export class RegisterAddressContext { public constructor(private userAccountDraft: UserAccountDraft) {} public async run(): Promise { - const communityKeyPair = await CommunityRepository.loadHomeCommunityKeyPair() + const community = await CommunityRepository.loadHomeCommunity() + const communityKeyPair = new KeyPair(community) const user = await this.loadOrCreateUser(communityKeyPair) if (this.isAccountAlreadyExistOnUser(user)) { throw new TransactionError( @@ -37,6 +38,7 @@ export class RegisterAddressContext { const account = this.createAccount(new UserLogic(user).calculateKeyPair(communityKeyPair)) account.user = user const createTransactionContext = new CreateTransactionRecipeContext(this.userAccountDraft, { + community, account, }) await createTransactionContext.run() diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts index 42e633a18..abd87616b 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts @@ -74,9 +74,13 @@ export class CreateTransactionRecipeContext { if (!this.data?.account) { throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'account was not set') } + if (!this.data.community) { + throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'community was not set') + } this.transactionRecipe = await new RegisterAddressTransactionRole().create( this.draft, this.data.account, + this.data.community, ) return true } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts index 84de6b5df..8b342b1fd 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts @@ -1,4 +1,5 @@ import { Account } from '@entity/Account' +import { Community } from '@entity/Community' import { AccountLogic } from '@/data/Account.logic' import { CommunityRepository } from '@/data/Community.repository' @@ -13,6 +14,7 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRecipeRol async create( userAccountDraft: UserAccountDraft, account: Account, + community: Community, ): Promise { const bodyBuilder = new TransactionBodyBuilder() const communityKeyPair = await CommunityRepository.loadHomeCommunityKeyPair() @@ -22,6 +24,7 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRecipeRol } this.transactionBuilder .fromTransactionBodyBuilder(bodyBuilder.fromUserAccountDraft(userAccountDraft, account)) + .setCommunity(community) .setSignature(signingKeyPair.sign(this.transactionBuilder.getTransaction().bodyBytes)) .setSigningAccount(account) return this From 64008b1564316ba5806393375460f9adb4535824 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 14 May 2024 12:48:25 +0200 Subject: [PATCH 04/23] fix test and lint --- .../apis/dltConnector/DltConnectorClient.ts | 6 --- .../src/graphql/resolver/AccountsResolver.ts | 3 +- .../CreateTransactionRecipe.context.test.ts | 44 ++++++++++++++++++- .../CreateTransactionRecipe.context.ts | 6 ++- dlt-connector/test/seeding/Community.seed.ts | 2 +- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 4cdbffddf..c8d5e4276 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -140,13 +140,11 @@ export class DltConnectorClient { } return succeed } catch (e) { - console.log("catch response dlt:", e) throw new LogError('Error send sending transaction to dlt-connector: ', e) } } public async registerAddress(dbUser: User): Promise { - console.log('dlt:registerAddress') const params = { input: { user: { @@ -159,15 +157,12 @@ export class DltConnectorClient { } as UserAccountDraft, } try { - console.log('before send with', params) const { data: { registerAddress: result }, } = await this.client.rawRequest<{ registerAddress: TransactionResult }>( registerAddress, params, ) - console.log('after send') - console.log('result: ', result) logger.info('send register address transaction to dlt-connector', { params, result, @@ -177,7 +172,6 @@ export class DltConnectorClient { } return result } catch (e) { - console.log('exception', e) logger.error('Exception sending register address transaction to dlt-connector', e) } } diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts index b90b5561c..7f782af89 100644 --- a/dlt-connector/src/graphql/resolver/AccountsResolver.ts +++ b/dlt-connector/src/graphql/resolver/AccountsResolver.ts @@ -1,7 +1,8 @@ -import { TransactionRecipe } from '@model/TransactionRecipe' import { Arg, Mutation, Query, Resolver } from 'type-graphql' import { QueryFailedError } from 'typeorm' +import { TransactionRecipe } from '@model/TransactionRecipe' + import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' import { UserRepository } from '@/data/User.repository' import { RegisterAddressContext } from '@/interactions/backendToDb/account/RegisterAddress.context' diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts index 117645bd1..3d3998db1 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts @@ -1,5 +1,6 @@ import 'reflect-metadata' import { Account } from '@entity/Account' +import { Community } from '@entity/Community' import { Decimal } from 'decimal.js-light' import { v4 } from 'uuid' @@ -8,11 +9,14 @@ import { TestDB } from '@test/TestDB' import { CONFIG } from '@/config' import { KeyPair } from '@/data/KeyPair' import { Mnemonic } from '@/data/Mnemonic' +import { AddressType } from '@/data/proto/3_3/enum/AddressType' import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' import { TransactionType } from '@/data/proto/3_3/enum/TransactionType' import { TransactionBody } from '@/data/proto/3_3/TransactionBody' +import { AccountType } from '@/graphql/enum/AccountType' import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' import { CreateTransactionRecipeContext } from './CreateTransactionRecipe.context' @@ -39,6 +43,7 @@ let moderator: UserSet let firstUser: UserSet let secondUser: UserSet let foreignUser: UserSet +let homeCommunity: Community const topic = iotaTopicFromCommunityUUID(homeCommunityUuid) const foreignTopic = iotaTopicFromCommunityUUID(foreignCommunityUuid) @@ -46,7 +51,7 @@ const foreignTopic = iotaTopicFromCommunityUUID(foreignCommunityUuid) describe('interactions/backendToDb/transaction/Create Transaction Recipe Context Test', () => { beforeAll(async () => { await TestDB.instance.setupTestDB() - await communitySeed(homeCommunityUuid, false) + homeCommunity = await communitySeed(homeCommunityUuid, false) await communitySeed(foreignCommunityUuid, true, foreignKeyPair) moderator = createUserSet(homeCommunityUuid, keyPair) @@ -66,6 +71,43 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context await TestDB.instance.teardownTestDB() }) + it('register address transaction', async () => { + const userAccountDraft = new UserAccountDraft() + userAccountDraft.accountType = AccountType.COMMUNITY_HUMAN + userAccountDraft.createdAt = new Date().toISOString() + userAccountDraft.user = firstUser.identifier + const context = new CreateTransactionRecipeContext(userAccountDraft, { + account: firstUser.account, + community: homeCommunity, + }) + await context.run() + const transaction = context.getTransactionRecipe() + expect(transaction).toMatchObject({ + type: TransactionType.REGISTER_ADDRESS, + protocolVersion: '3.3', + community: { + rootPubkey: keyPair.publicKey, + foreign: 0, + iotaTopic: topic, + }, + signingAccount: { + derive2Pubkey: firstUser.account.derive2Pubkey, + }, + }) + + const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) + expect(body.registerAddress).toBeDefined() + if (!body.registerAddress) throw new Error() + + expect(body).toMatchObject({ + type: CrossGroupType.LOCAL, + registerAddress: { + derivationIndex: 1, + addressType: AddressType.COMMUNITY_HUMAN, + }, + }) + }) + it('creation transaction', async () => { const creationTransactionDraft = new TransactionDraft() creationTransactionDraft.amount = new Decimal('2000') diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts index abd87616b..eb6d6dffd 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts @@ -45,7 +45,6 @@ export class CreateTransactionRecipeContext { */ public async run(): Promise { if (this.draft instanceof TransactionDraft) { - const transactionRecipeRole = new BalanceChangingTransactionRecipeRole() // contain logic for translation from backend to dlt-connector format let transactionTypeRole: AbstractTransactionRole switch (this.draft.type) { @@ -59,7 +58,10 @@ export class CreateTransactionRecipeContext { transactionTypeRole = new ReceiveTransactionRole(this.draft) break } - await transactionRecipeRole.create(this.draft, transactionTypeRole) + this.transactionRecipe = await new BalanceChangingTransactionRecipeRole().create( + this.draft, + transactionTypeRole, + ) return true } else if (this.draft instanceof CommunityDraft) { if (!this.data?.community) { diff --git a/dlt-connector/test/seeding/Community.seed.ts b/dlt-connector/test/seeding/Community.seed.ts index a1b042ef2..9c492eedb 100644 --- a/dlt-connector/test/seeding/Community.seed.ts +++ b/dlt-connector/test/seeding/Community.seed.ts @@ -20,7 +20,7 @@ export const communitySeed = async ( const community = await Community.findOneOrFail({ where: { iotaTopic } }) if (foreign && keyPair) { - // that isn't entirely correct, normally only the public key from foreign community is know, and will be come form blockchain + // that isn't entirely correct, normally only the public key from foreign community is known, and will be come form blockchain keyPair.fillInCommunityKeys(community) await community.save() } From 0bb04a845ae66abe369cc8f4ba1b5bdd217b6299 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 20 Sep 2024 17:22:41 +0200 Subject: [PATCH 05/23] refactor with gradido-blockchain-js --- .../apis/dltConnector/DltConnectorClient.ts | 4 + dlt-connector/.env.dist | 5 + dlt-connector/.env.template | 5 + dlt-connector/package.json | 6 +- dlt-connector/src/config/index.ts | 14 +- dlt-connector/src/data/Account.factory.ts | 11 +- dlt-connector/src/data/Account.test.ts | 26 +- .../src/data/BackendTransaction.factory.ts | 13 - .../src/data/BackendTransaction.repository.ts | 7 - .../src/data/Community.repository.ts | 4 +- dlt-connector/src/data/KeyPair.ts | 119 +- dlt-connector/src/data/Mnemonic.ts | 48 - dlt-connector/src/data/Transaction.builder.ts | 102 +- .../src/data/Transaction.logic.test.ts | 323 -- dlt-connector/src/data/Transaction.logic.ts | 200 -- .../src/data/proto/3_3/CommunityRoot.ts | 35 - .../data/proto/3_3/ConfirmedTransaction.ts | 41 - .../data/proto/3_3/GradidoCreation.test.ts | 22 - .../src/data/proto/3_3/GradidoCreation.ts | 53 - .../data/proto/3_3/GradidoDeferredTransfer.ts | 42 - .../src/data/proto/3_3/GradidoTransaction.ts | 48 - .../src/data/proto/3_3/GradidoTransfer.ts | 49 - .../src/data/proto/3_3/GroupFriendsUpdate.ts | 23 - .../src/data/proto/3_3/RegisterAddress.ts | 49 - .../src/data/proto/3_3/SignatureMap.ts | 14 - .../src/data/proto/3_3/SignaturePair.ts | 15 - .../src/data/proto/3_3/Timestamp.test.ts | 16 - dlt-connector/src/data/proto/3_3/Timestamp.ts | 27 - .../data/proto/3_3/TimestampSeconds.test.ts | 14 - .../src/data/proto/3_3/TimestampSeconds.ts | 20 - .../src/data/proto/3_3/TransactionBody.ts | 157 - .../src/data/proto/3_3/TransferAmount.ts | 16 - dlt-connector/src/data/proto/3_3/const.ts | 1 - .../src/data/proto/3_3/enum/AddressType.ts | 14 - .../src/data/proto/3_3/enum/CrossGroupType.ts | 22 - .../data/proto/3_3/enum/TransactionType.ts | 4 +- .../src/data/proto/AbstractTransaction.ts | 5 - .../src/data/proto/TransactionBody.builder.ts | 147 - .../src/data/proto/transactionBody.logic.ts | 59 - .../src/graphql/enum/TransactionErrorType.ts | 1 + .../src/graphql/model/TransactionRecipe.ts | 6 +- .../src/graphql/resolver/CommunityResolver.ts | 3 +- .../graphql/resolver/TransactionsResolver.ts | 33 +- dlt-connector/src/index.ts | 19 +- .../community/HomeCommunity.role.ts | 1 + .../transaction/AbstractTransaction.role.ts | 55 +- .../BalanceChangingTransactionRecipeRole.ts | 74 +- .../CommunityRootTransaction.role.ts | 27 +- .../CreateTransactionRecipe.context.test.ts | 146 +- .../CreateTransactionRecipe.context.ts | 4 +- .../transaction/CreationTransaction.role.ts | 25 +- .../transaction/ReceiveTransaction.role.ts | 21 - .../RegisterAddressTransaction.role.ts | 30 +- .../transaction/SendTransaction.role.ts | 26 +- .../AbstractTransactionRecipe.role.ts | 78 +- .../InboundTransactionRecipe.role.ts | 12 +- .../LocalTransactionRecipe.role.ts | 13 +- .../OutboundTransactionRecipeRole.ts | 6 +- .../TransmitToIota.context.test.ts | 18 +- .../transmitToIota/TransmitToIota.context.ts | 32 +- .../src/logging/AbstractLogging.view.ts | 13 +- .../src/logging/AccountLogging.view.ts | 9 +- .../src/logging/CommunityRootLogging.view.ts | 18 - .../ConfirmedTransactionLogging.view.ts | 24 - .../logging/GradidoCreationLogging.view.ts | 18 - .../GradidoDeferredTransferLogging.view.ts | 18 - .../logging/GradidoTransactionLogging.view.ts | 29 - .../logging/GradidoTransferLogging.view.ts | 18 - .../logging/GroupFriendsUpdateLogging.view.ts | 16 - .../logging/RegisterAddressLogging.view.ts | 22 - .../src/logging/SignatureMapLogging.view.ts | 17 - .../src/logging/SignaturePairLogging.view.ts | 18 - .../logging/TransactionBodyLogging.view.ts | 46 - .../src/logging/TransferAmountLogging.view.ts | 18 - .../src/utils/derivationHelper.test.ts | 6 - dlt-connector/src/utils/typeConverter.test.ts | 24 +- dlt-connector/src/utils/typeConverter.ts | 101 +- dlt-connector/yarn.lock | 2783 +++++++++-------- .../BackendTransaction.ts | 3 +- .../Transaction.ts | 3 +- .../entity/0004-fix_spelling/Transaction.ts | 3 +- .../Community.ts | 64 + .../Transaction.ts | 109 + dlt-database/entity/BackendTransaction.ts | 1 - dlt-database/entity/Community.ts | 2 +- dlt-database/entity/Transaction.ts | 2 +- dlt-database/entity/index.ts | 2 - ...05-refactor_with_gradido_blockchain_lib.ts | 28 + dlt-database/yarn.lock | 2017 ++++++------ 89 files changed, 3340 insertions(+), 4502 deletions(-) delete mode 100644 dlt-connector/src/data/BackendTransaction.factory.ts delete mode 100644 dlt-connector/src/data/BackendTransaction.repository.ts delete mode 100644 dlt-connector/src/data/Mnemonic.ts delete mode 100644 dlt-connector/src/data/Transaction.logic.test.ts delete mode 100644 dlt-connector/src/data/Transaction.logic.ts delete mode 100644 dlt-connector/src/data/proto/3_3/CommunityRoot.ts delete mode 100644 dlt-connector/src/data/proto/3_3/ConfirmedTransaction.ts delete mode 100644 dlt-connector/src/data/proto/3_3/GradidoCreation.test.ts delete mode 100644 dlt-connector/src/data/proto/3_3/GradidoCreation.ts delete mode 100644 dlt-connector/src/data/proto/3_3/GradidoDeferredTransfer.ts delete mode 100644 dlt-connector/src/data/proto/3_3/GradidoTransaction.ts delete mode 100644 dlt-connector/src/data/proto/3_3/GradidoTransfer.ts delete mode 100644 dlt-connector/src/data/proto/3_3/GroupFriendsUpdate.ts delete mode 100644 dlt-connector/src/data/proto/3_3/RegisterAddress.ts delete mode 100644 dlt-connector/src/data/proto/3_3/SignatureMap.ts delete mode 100644 dlt-connector/src/data/proto/3_3/SignaturePair.ts delete mode 100644 dlt-connector/src/data/proto/3_3/Timestamp.test.ts delete mode 100644 dlt-connector/src/data/proto/3_3/Timestamp.ts delete mode 100644 dlt-connector/src/data/proto/3_3/TimestampSeconds.test.ts delete mode 100644 dlt-connector/src/data/proto/3_3/TimestampSeconds.ts delete mode 100644 dlt-connector/src/data/proto/3_3/TransactionBody.ts delete mode 100644 dlt-connector/src/data/proto/3_3/TransferAmount.ts delete mode 100644 dlt-connector/src/data/proto/3_3/const.ts delete mode 100644 dlt-connector/src/data/proto/3_3/enum/AddressType.ts delete mode 100644 dlt-connector/src/data/proto/3_3/enum/CrossGroupType.ts delete mode 100644 dlt-connector/src/data/proto/AbstractTransaction.ts delete mode 100644 dlt-connector/src/data/proto/TransactionBody.builder.ts delete mode 100644 dlt-connector/src/data/proto/transactionBody.logic.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/ReceiveTransaction.role.ts delete mode 100644 dlt-connector/src/logging/CommunityRootLogging.view.ts delete mode 100644 dlt-connector/src/logging/ConfirmedTransactionLogging.view.ts delete mode 100644 dlt-connector/src/logging/GradidoCreationLogging.view.ts delete mode 100644 dlt-connector/src/logging/GradidoDeferredTransferLogging.view.ts delete mode 100644 dlt-connector/src/logging/GradidoTransactionLogging.view.ts delete mode 100644 dlt-connector/src/logging/GradidoTransferLogging.view.ts delete mode 100644 dlt-connector/src/logging/GroupFriendsUpdateLogging.view.ts delete mode 100644 dlt-connector/src/logging/RegisterAddressLogging.view.ts delete mode 100644 dlt-connector/src/logging/SignatureMapLogging.view.ts delete mode 100644 dlt-connector/src/logging/SignaturePairLogging.view.ts delete mode 100644 dlt-connector/src/logging/TransactionBodyLogging.view.ts delete mode 100644 dlt-connector/src/logging/TransferAmountLogging.view.ts create mode 100644 dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts create mode 100644 dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts delete mode 100644 dlt-database/entity/BackendTransaction.ts create mode 100644 dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index c8d5e4276..85e8bfb0a 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -104,6 +104,10 @@ export class DltConnectorClient { * and update dltTransactionId of transaction in db with iota message id */ public async transmitTransaction(transaction: DbTransaction): Promise { + // we don't need the receive transactions, there contain basically the same data as the send transactions + if ((transaction.typeId as TransactionTypeId) === TransactionTypeId.RECEIVE) { + return true + } const typeString = getTransactionTypeString(transaction.typeId) // no negative values in dlt connector, gradido concept don't use negative values so the code don't use it too const amountString = transaction.amount.abs().toString() diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index 50e9fe8e1..164e23036 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -21,6 +21,11 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log # DLT-Connector DLT_CONNECTOR_PORT=6010 +# Gradido Blockchain +GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=21ffbbc616fe +GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=a51ef8ac7ef1abf162fb7a65261acd7a +GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD=YourPassword + # Route to Backend BACKEND_SERVER_URL=http://localhost:4000 JWT_SECRET=secret123 \ No newline at end of file diff --git a/dlt-connector/.env.template b/dlt-connector/.env.template index 2e123ca81..d7d46dad7 100644 --- a/dlt-connector/.env.template +++ b/dlt-connector/.env.template @@ -19,5 +19,10 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log # DLT-Connector DLT_CONNECTOR_PORT=$DLT_CONNECTOR_PORT +# Gradido Blockchain +GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=$GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET +GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=$GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY +GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD=$GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD + # Route to Backend BACKEND_SERVER_URL=http://localhost:4000 \ No newline at end of file diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 30cd4b33b..b9de6338b 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -19,17 +19,15 @@ "@apollo/server": "^4.7.5", "@apollo/utils.fetcher": "^3.0.0", "@iota/client": "^2.2.4", - "bip32-ed25519": "^0.0.4", - "bip39": "^3.1.0", "body-parser": "^1.20.2", "class-validator": "^0.14.0", "cors": "^2.8.5", "cross-env": "^7.0.3", - "decimal.js-light": "^2.5.1", "dlt-database": "file:../dlt-database", "dotenv": "10.0.0", "express": "4.17.1", "express-slow-down": "^2.0.1", + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#master", "graphql": "^16.7.1", "graphql-request": "^6.1.0", "graphql-scalars": "^1.22.2", @@ -37,9 +35,7 @@ "jose": "^5.2.2", "log4js": "^6.7.1", "nodemon": "^2.0.20", - "protobufjs": "^7.2.5", "reflect-metadata": "^0.1.13", - "sodium-native": "^4.0.4", "tsconfig-paths": "^4.1.2", "type-graphql": "^2.0.0-beta.2", "uuid": "^9.0.1" diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 9cbdac441..f2f01cd8d 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -4,12 +4,12 @@ dotenv.config() const constants = { LOG4JS_CONFIG: 'log4js-config.json', - DB_VERSION: '0004-fix_spelling', + DB_VERSION: '0005-refactor_with_gradido_blockchain_lib', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', CONFIG_VERSION: { DEFAULT: 'DEFAULT', - EXPECTED: 'v6.2024-02-20', + EXPECTED: 'v7.2024-09-24', CURRENT: '', }, } @@ -39,6 +39,15 @@ const dltConnector = { DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT ?? 6010, } +const gradidoBlockchain = { + GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET: + process.env.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET ?? 'invalid', + GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY: + process.env.GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY ?? 'invalid', + GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD: + process.env.GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD, +} + const backendServer = { BACKEND_SERVER_URL: process.env.BACKEND_SERVER_URL ?? 'http://backend:4000', } @@ -61,5 +70,6 @@ export const CONFIG = { ...database, ...iota, ...dltConnector, + ...gradidoBlockchain, ...backendServer, } diff --git a/dlt-connector/src/data/Account.factory.ts b/dlt-connector/src/data/Account.factory.ts index a8c1f162d..fc20a0acc 100644 --- a/dlt-connector/src/data/Account.factory.ts +++ b/dlt-connector/src/data/Account.factory.ts @@ -1,8 +1,13 @@ +/* eslint-disable camelcase */ import { Account } from '@entity/Account' import Decimal from 'decimal.js-light' +import { + AddressType, + AddressType_COMMUNITY_AUF, + AddressType_COMMUNITY_GMW, +} from 'gradido-blockchain-js' import { KeyPair } from '@/data/KeyPair' -import { AddressType } from '@/data/proto/3_3/enum/AddressType' import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { hardenDerivationIndex } from '@/utils/derivationHelper' import { accountTypeToAddressType } from '@/utils/typeConverter' @@ -44,7 +49,7 @@ export class AccountFactory { return AccountFactory.createAccount( createdAt, hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), - AddressType.COMMUNITY_GMW, + AddressType_COMMUNITY_GMW, keyPair, ) } @@ -53,7 +58,7 @@ export class AccountFactory { return AccountFactory.createAccount( createdAt, hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), - AddressType.COMMUNITY_AUF, + AddressType_COMMUNITY_AUF, keyPair, ) } diff --git a/dlt-connector/src/data/Account.test.ts b/dlt-connector/src/data/Account.test.ts index f28065cce..130908de6 100644 --- a/dlt-connector/src/data/Account.test.ts +++ b/dlt-connector/src/data/Account.test.ts @@ -1,8 +1,15 @@ +/* eslint-disable camelcase */ import 'reflect-metadata' import { Decimal } from 'decimal.js-light' import { TestDB } from '@test/TestDB' +import { + AddressType_COMMUNITY_AUF, + AddressType_COMMUNITY_GMW, + AddressType_COMMUNITY_HUMAN, +} from 'gradido-blockchain-js' + import { AccountType } from '@/graphql/enum/AccountType' import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { UserIdentifier } from '@/graphql/input/UserIdentifier' @@ -11,7 +18,6 @@ import { AccountFactory } from './Account.factory' import { AccountRepository } from './Account.repository' import { KeyPair } from './KeyPair' import { Mnemonic } from './Mnemonic' -import { AddressType } from './proto/3_3/enum/AddressType' import { UserFactory } from './User.factory' import { UserLogic } from './User.logic' @@ -37,14 +43,14 @@ describe('data/Account test factory and repository', () => { }) it('test createAccount', () => { - const account = AccountFactory.createAccount(now, 1, AddressType.COMMUNITY_HUMAN, keyPair1) + const account = AccountFactory.createAccount(now, 1, AddressType_COMMUNITY_HUMAN, keyPair1) expect(account).toMatchObject({ derivationIndex: 1, derive2Pubkey: Buffer.from( 'cb88043ef4833afc01d6ed9b34e1aa48e79dce5ff97c07090c6600ec05f6d994', 'hex', ), - type: AddressType.COMMUNITY_HUMAN, + type: AddressType_COMMUNITY_HUMAN, createdAt: now, balanceCreatedAt: now, balanceOnConfirmation: new Decimal(0), @@ -65,7 +71,7 @@ describe('data/Account test factory and repository', () => { 'cb88043ef4833afc01d6ed9b34e1aa48e79dce5ff97c07090c6600ec05f6d994', 'hex', ), - type: AddressType.COMMUNITY_HUMAN, + type: AddressType_COMMUNITY_HUMAN, createdAt: now, balanceCreatedAt: now, balanceOnConfirmation: new Decimal(0), @@ -81,7 +87,7 @@ describe('data/Account test factory and repository', () => { '05f0060357bb73bd290283870fc47a10b3764f02ca26938479ed853f46145366', 'hex', ), - type: AddressType.COMMUNITY_GMW, + type: AddressType_COMMUNITY_GMW, createdAt: now, balanceCreatedAt: now, balanceOnConfirmation: new Decimal(0), @@ -97,7 +103,7 @@ describe('data/Account test factory and repository', () => { '6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', 'hex', ), - type: AddressType.COMMUNITY_AUF, + type: AddressType_COMMUNITY_AUF, createdAt: now, balanceCreatedAt: now, balanceOnConfirmation: new Decimal(0), @@ -151,7 +157,7 @@ describe('data/Account test factory and repository', () => { '0fa996b73b624592fe326b8500cb1e3f10026112b374d84c87d097f4d489c019', 'hex', ), - type: AddressType.COMMUNITY_GMW, + type: AddressType_COMMUNITY_GMW, }), expect.objectContaining({ derivationIndex: 2147483650, @@ -159,7 +165,7 @@ describe('data/Account test factory and repository', () => { '6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', 'hex', ), - type: AddressType.COMMUNITY_AUF, + type: AddressType_COMMUNITY_AUF, }), ]), ) @@ -176,7 +182,7 @@ describe('data/Account test factory and repository', () => { '6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', 'hex', ), - type: AddressType.COMMUNITY_AUF, + type: AddressType_COMMUNITY_AUF, }) }) @@ -190,7 +196,7 @@ describe('data/Account test factory and repository', () => { '2099c004a26e5387c9fbbc9bb0f552a9642d3fd7c710ae5802b775d24ff36f93', 'hex', ), - type: AddressType.COMMUNITY_HUMAN, + type: AddressType_COMMUNITY_HUMAN, }) }) }) diff --git a/dlt-connector/src/data/BackendTransaction.factory.ts b/dlt-connector/src/data/BackendTransaction.factory.ts deleted file mode 100644 index 365da0693..000000000 --- a/dlt-connector/src/data/BackendTransaction.factory.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BackendTransaction } from '@entity/BackendTransaction' - -import { TransactionDraft } from '@/graphql/input/TransactionDraft' - -export class BackendTransactionFactory { - public static createFromTransactionDraft(transactionDraft: TransactionDraft): BackendTransaction { - const backendTransaction = BackendTransaction.create() - backendTransaction.backendTransactionId = transactionDraft.backendTransactionId - backendTransaction.typeId = transactionDraft.type - backendTransaction.createdAt = new Date(transactionDraft.createdAt) - return backendTransaction - } -} diff --git a/dlt-connector/src/data/BackendTransaction.repository.ts b/dlt-connector/src/data/BackendTransaction.repository.ts deleted file mode 100644 index b4e566659..000000000 --- a/dlt-connector/src/data/BackendTransaction.repository.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BackendTransaction } from '@entity/BackendTransaction' - -import { getDataSource } from '@/typeorm/DataSource' - -export const BackendTransactionRepository = getDataSource() - .getRepository(BackendTransaction) - .extend({}) diff --git a/dlt-connector/src/data/Community.repository.ts b/dlt-connector/src/data/Community.repository.ts index dca283a67..a9fdf4e09 100644 --- a/dlt-connector/src/data/Community.repository.ts +++ b/dlt-connector/src/data/Community.repository.ts @@ -66,9 +66,9 @@ export const CommunityRepository = getDataSource() async loadHomeCommunityKeyPair(): Promise { const community = await this.findOneOrFail({ where: { foreign: false }, - select: { rootChaincode: true, rootPubkey: true, rootPrivkey: true }, + select: { rootChaincode: true, rootPubkey: true, rootEncryptedPrivkey: true }, }) - if (!community.rootChaincode || !community.rootPrivkey) { + if (!community.rootChaincode || !community.rootEncryptedPrivkey) { throw new LogError('Missing chaincode or private key for home community') } return new KeyPair(community) diff --git a/dlt-connector/src/data/KeyPair.ts b/dlt-connector/src/data/KeyPair.ts index dc2dd1bab..61207ee7e 100644 --- a/dlt-connector/src/data/KeyPair.ts +++ b/dlt-connector/src/data/KeyPair.ts @@ -1,40 +1,52 @@ import { Community } from '@entity/Community' - // https://www.npmjs.com/package/bip32-ed25519 +import { + KeyPairEd25519, + MemoryBlock, + Passphrase, + SecretKeyCryptography, + SignaturePair, +} from 'gradido-blockchain-js' + +import { CONFIG } from '@/config' import { LogError } from '@/server/LogError' -import { toPublic, derivePrivate, sign, verify, generateFromSeed } from 'bip32-ed25519' - -import { Mnemonic } from './Mnemonic' -import { SignaturePair } from './proto/3_3/SignaturePair' - /** * Class Managing Key Pair and also generate, sign and verify signature with it */ export class KeyPair { - private _publicKey: Buffer - private _chainCode: Buffer - private _privateKey: Buffer - + private _ed25519KeyPair: KeyPairEd25519 /** - * @param input: Mnemonic = Mnemonic or Passphrase which work as seed for generating algorithms - * @param input: Buffer = extended private key, returned from bip32-ed25519 generateFromSeed or from derivePrivate + * @param input: KeyPairEd25519 = already loaded KeyPairEd25519 + * @param input: Passphrase = Passphrase which work as seed for generating algorithms + * @param input: MemoryBlock = a seed at least 32 byte * @param input: Community = community entity with keys loaded from db - * */ - public constructor(input: Mnemonic | Buffer | Community) { - if (input instanceof Mnemonic) { - this.loadFromExtendedPrivateKey(generateFromSeed(input.seed)) - } else if (input instanceof Buffer) { - this.loadFromExtendedPrivateKey(input) + public constructor(input: KeyPairEd25519 | Passphrase | MemoryBlock | Community) { + let keyPair: KeyPairEd25519 | null = null + if (input instanceof KeyPairEd25519) { + keyPair = input + } else if (input instanceof Passphrase) { + keyPair = KeyPairEd25519.create(input) + } else if (input instanceof MemoryBlock) { + keyPair = KeyPairEd25519.create(input) } else if (input instanceof Community) { - if (!input.rootPrivkey || !input.rootChaincode || !input.rootPubkey) { - throw new LogError('missing private key or chaincode or public key in commmunity entity') + if (!input.rootEncryptedPrivkey || !input.rootChaincode || !input.rootPubkey) { + throw new LogError( + 'missing encrypted private key or chaincode or public key in commmunity entity', + ) } - this._privateKey = input.rootPrivkey - this._publicKey = input.rootPubkey - this._chainCode = input.rootChaincode + const secretBox = this.createSecretBox(input.iotaTopic) + keyPair = new KeyPairEd25519( + new MemoryBlock(input.rootPubkey), + secretBox.decrypt(new MemoryBlock(input.rootEncryptedPrivkey)), + new MemoryBlock(input.rootChaincode), + ) } + if (!keyPair) { + throw new LogError("couldn't create KeyPairEd25519 from input") + } + this._ed25519KeyPair = keyPair } /** @@ -42,47 +54,54 @@ export class KeyPair { * @param community */ public fillInCommunityKeys(community: Community) { - community.rootPubkey = this._publicKey - community.rootPrivkey = this._privateKey - community.rootChaincode = this._chainCode - } - - private loadFromExtendedPrivateKey(extendedPrivateKey: Buffer) { - if (extendedPrivateKey.length !== 96) { - throw new LogError('invalid extended private key') - } - this._privateKey = extendedPrivateKey.subarray(0, 64) - this._chainCode = extendedPrivateKey.subarray(64, 96) - this._publicKey = toPublic(extendedPrivateKey).subarray(0, 32) - } - - public getExtendPrivateKey(): Buffer { - return Buffer.concat([this._privateKey, this._chainCode]) - } - - public getExtendPublicKey(): Buffer { - return Buffer.concat([this._publicKey, this._chainCode]) + const secretBox = this.createSecretBox(community.iotaTopic) + community.rootPubkey = this._ed25519KeyPair.getPublicKey()?.data() + community.rootEncryptedPrivkey = this._ed25519KeyPair.getCryptedPrivKey(secretBox).data() + community.rootChaincode = this._ed25519KeyPair.getChainCode()?.data() } public get publicKey(): Buffer { - return this._publicKey + const publicKey = this._ed25519KeyPair.getPublicKey() + if (!publicKey) { + throw new LogError('invalid key pair, get empty public key') + } + return publicKey.data() + } + + public get keyPair(): KeyPairEd25519 { + return this._ed25519KeyPair } public derive(path: number[]): KeyPair { - const extendedPrivateKey = this.getExtendPrivateKey() return new KeyPair( path.reduce( - (extendPrivateKey: Buffer, node: number) => derivePrivate(extendPrivateKey, node), - extendedPrivateKey, + (keyPair: KeyPairEd25519, node: number) => keyPair.deriveChild(node), + this._ed25519KeyPair, ), ) } public sign(message: Buffer): Buffer { - return sign(message, this.getExtendPrivateKey()) + return this._ed25519KeyPair.sign(new MemoryBlock(message)).data() } - public static verify(message: Buffer, { signature, pubKey }: SignaturePair): boolean { - return verify(message, signature, pubKey) + public static verify(message: Buffer, signaturePair: SignaturePair): boolean { + const publicKeyPair = new KeyPairEd25519(signaturePair.getPubkey()) + const signature = signaturePair.getSignature() + if (!signature) { + throw new LogError('missing signature') + } + return publicKeyPair.verify(new MemoryBlock(message), signature) + } + + private createSecretBox(salt: string): SecretKeyCryptography { + if (!CONFIG.GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD) { + throw new LogError( + 'missing GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD in env or config', + ) + } + const secretBox = new SecretKeyCryptography() + secretBox.createKey(salt, CONFIG.GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD) + return secretBox } } diff --git a/dlt-connector/src/data/Mnemonic.ts b/dlt-connector/src/data/Mnemonic.ts deleted file mode 100644 index e23864e60..000000000 --- a/dlt-connector/src/data/Mnemonic.ts +++ /dev/null @@ -1,48 +0,0 @@ -// https://www.npmjs.com/package/bip39 -import { entropyToMnemonic, mnemonicToSeedSync } from 'bip39' -// eslint-disable-next-line camelcase -import { randombytes_buf } from 'sodium-native' - -import { LogError } from '@/server/LogError' - -export class Mnemonic { - private _passphrase = '' - public constructor(seed?: Buffer | string) { - if (seed) { - Mnemonic.validateSeed(seed) - this._passphrase = entropyToMnemonic(seed) - return - } - const entropy = Buffer.alloc(256) - randombytes_buf(entropy) - this._passphrase = entropyToMnemonic(entropy) - } - - public get passphrase(): string { - return this._passphrase - } - - public get seed(): Buffer { - return mnemonicToSeedSync(this._passphrase) - } - - public static validateSeed(seed: Buffer | string): void { - let seedBuffer: Buffer - if (!Buffer.isBuffer(seed)) { - seedBuffer = Buffer.from(seed, 'hex') - } else { - seedBuffer = seed - } - if (seedBuffer.length < 16 || seedBuffer.length > 32 || seedBuffer.length % 4 !== 0) { - throw new LogError( - 'invalid seed, must be in binary between 16 and 32 Bytes, Power of 4, for more infos: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki#generating-the-mnemonic', - { - seedBufferHex: seedBuffer.toString('hex'), - toShort: seedBuffer.length < 16, - toLong: seedBuffer.length > 32, - powerOf4: seedBuffer.length % 4, - }, - ) - } - } -} diff --git a/dlt-connector/src/data/Transaction.builder.ts b/dlt-connector/src/data/Transaction.builder.ts index f46f02a29..a07ed8589 100644 --- a/dlt-connector/src/data/Transaction.builder.ts +++ b/dlt-connector/src/data/Transaction.builder.ts @@ -1,18 +1,17 @@ import { Account } from '@entity/Account' import { Community } from '@entity/Community' import { Transaction } from '@entity/Transaction' +import { + GradidoTransaction, + InteractionSerialize, + InteractionToJson, + TransactionBody, +} from 'gradido-blockchain-js' -import { GradidoTransaction } from '@/data/proto/3_3/GradidoTransaction' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { LogError } from '@/server/LogError' -import { bodyBytesToTransactionBody, transactionBodyToBodyBytes } from '@/utils/typeConverter' -import { AccountRepository } from './Account.repository' -import { BackendTransactionFactory } from './BackendTransaction.factory' import { CommunityRepository } from './Community.repository' -import { TransactionBodyBuilder } from './proto/TransactionBody.builder' export class TransactionBuilder { private transaction: Transaction @@ -97,16 +96,6 @@ export class TransactionBuilder { return this } - public addBackendTransaction(transactionDraft: TransactionDraft): TransactionBuilder { - if (!this.transaction.backendTransactions) { - this.transaction.backendTransactions = [] - } - this.transaction.backendTransactions.push( - BackendTransactionFactory.createFromTransactionDraft(transactionDraft), - ) - return this - } - public async setCommunityFromUser(user: UserIdentifier): Promise { // get sender community const community = await CommunityRepository.getCommunityForUserIdentifier(user) @@ -122,58 +111,43 @@ export class TransactionBuilder { return this.setOtherCommunity(otherCommunity) } - public async fromGradidoTransactionSearchForAccounts( - gradidoTransaction: GradidoTransaction, - ): Promise { - this.transaction.bodyBytes = Buffer.from(gradidoTransaction.bodyBytes) - const transactionBody = bodyBytesToTransactionBody(this.transaction.bodyBytes) - this.fromTransactionBody(transactionBody) - - const firstSigPair = gradidoTransaction.getFirstSignature() - // TODO: adapt if transactions with more than one signatures where added - - // get recipient and signer accounts if not already set - this.transaction.signingAccount ??= await AccountRepository.findAccountByPublicKey( - firstSigPair.pubKey, - ) - this.transaction.recipientAccount ??= await AccountRepository.findAccountByPublicKey( - transactionBody.getRecipientPublicKey(), - ) - this.transaction.signature = Buffer.from(firstSigPair.signature) - - return this + public fromGradidoTransaction(transaction: GradidoTransaction): TransactionBuilder { + const body = transaction.getTransactionBody() + if (!body) { + throw new LogError('missing transaction body on Gradido Transaction') + } + // set first signature + const firstSignature = transaction.getSignatureMap().getSignaturePairs().get(0).getSignature() + if (!firstSignature) { + throw new LogError('error missing first signature') + } + this.transaction.signature = firstSignature.data() + return this.fromTransactionBody(body, transaction.getBodyBytes()?.data()) } - public fromGradidoTransaction(gradidoTransaction: GradidoTransaction): TransactionBuilder { - this.transaction.bodyBytes = Buffer.from(gradidoTransaction.bodyBytes) - const transactionBody = bodyBytesToTransactionBody(this.transaction.bodyBytes) - this.fromTransactionBody(transactionBody) - - const firstSigPair = gradidoTransaction.getFirstSignature() - // TODO: adapt if transactions with more than one signatures where added - this.transaction.signature = Buffer.from(firstSigPair.signature) - - return this - } - - public fromTransactionBody(transactionBody: TransactionBody): TransactionBuilder { - transactionBody.fillTransactionRecipe(this.transaction) - this.transaction.bodyBytes ??= transactionBodyToBodyBytes(transactionBody) - return this - } - - public fromTransactionBodyBuilder( - transactionBodyBuilder: TransactionBodyBuilder, + public fromTransactionBody( + transactionBody: TransactionBody, + bodyBytes: Buffer | null | undefined, ): TransactionBuilder { - const signingAccount = transactionBodyBuilder.getSigningAccount() - if (signingAccount) { - this.setSigningAccount(signingAccount) + if (!bodyBytes) { + bodyBytes = new InteractionSerialize(transactionBody).run()?.data() } - const recipientAccount = transactionBodyBuilder.getRecipientAccount() - if (recipientAccount) { - this.setRecipientAccount(recipientAccount) + if (!bodyBytes) { + throw new LogError( + 'cannot serialize TransactionBody', + JSON.parse(new InteractionToJson(transactionBody).run()), + ) } - this.fromTransactionBody(transactionBodyBuilder.getTransactionBody()) + this.transaction.type = transactionBody.getTransactionType() + this.transaction.createdAt = new Date(transactionBody.getCreatedAt().getDate()) + this.transaction.protocolVersion = transactionBody.getVersionNumber() + + const transferAmount = transactionBody.getTransferAmount() + this.transaction.amount = transferAmount + ? transferAmount.getAmount().getGradidoCent() + : undefined + + this.transaction.bodyBytes ??= bodyBytes return this } } diff --git a/dlt-connector/src/data/Transaction.logic.test.ts b/dlt-connector/src/data/Transaction.logic.test.ts deleted file mode 100644 index b5ef73de2..000000000 --- a/dlt-connector/src/data/Transaction.logic.test.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { Community } from '@entity/Community' -import { Transaction } from '@entity/Transaction' -import { Decimal } from 'decimal.js-light' - -import { logger } from '@/logging/logger' - -import { CommunityRoot } from './proto/3_3/CommunityRoot' -import { CrossGroupType } from './proto/3_3/enum/CrossGroupType' -import { GradidoCreation } from './proto/3_3/GradidoCreation' -import { GradidoDeferredTransfer } from './proto/3_3/GradidoDeferredTransfer' -import { GradidoTransfer } from './proto/3_3/GradidoTransfer' -import { RegisterAddress } from './proto/3_3/RegisterAddress' -import { TransactionBody } from './proto/3_3/TransactionBody' -import { TransactionLogic } from './Transaction.logic' - -let a: Transaction -let b: Transaction - -describe('data/transaction.logic', () => { - describe('isBelongTogether', () => { - beforeEach(() => { - const now = new Date() - let body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.transfer = new GradidoTransfer() - body.otherGroup = 'recipient group' - - a = new Transaction() - a.community = new Community() - a.communityId = 1 - a.otherCommunityId = 2 - a.id = 1 - a.signingAccountId = 1 - a.recipientAccountId = 2 - a.createdAt = now - a.amount = new Decimal('100') - a.signature = Buffer.alloc(64) - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - - body = new TransactionBody() - body.type = CrossGroupType.INBOUND - body.transfer = new GradidoTransfer() - body.otherGroup = 'sending group' - - b = new Transaction() - b.community = new Community() - b.communityId = 2 - b.otherCommunityId = 1 - b.id = 2 - b.signingAccountId = 1 - b.recipientAccountId = 2 - b.createdAt = now - b.amount = new Decimal('100') - b.signature = Buffer.alloc(64) - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - }) - - const spy = jest.spyOn(logger, 'info') - - it('true', () => { - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(true) - }) - - it('false because of same id', () => { - b.id = 1 - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith('id is the same, it is the same transaction!') - }) - - it('false because of different signing accounts', () => { - b.signingAccountId = 17 - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - 'transaction a and b are not pairs', - expect.objectContaining({}), - ) - }) - - it('false because of different recipient accounts', () => { - b.recipientAccountId = 21 - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - 'transaction a and b are not pairs', - expect.objectContaining({}), - ) - }) - - it('false because of different community ids', () => { - b.communityId = 6 - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - 'transaction a and b are not pairs', - expect.objectContaining({}), - ) - }) - - it('false because of different other community ids', () => { - b.otherCommunityId = 3 - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - 'transaction a and b are not pairs', - expect.objectContaining({}), - ) - }) - - it('false because of different createdAt', () => { - b.createdAt = new Date('2021-01-01T17:12') - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - 'transaction a and b are not pairs', - expect.objectContaining({}), - ) - }) - - describe('false because of mismatching cross group type', () => { - const body = new TransactionBody() - it('a is LOCAL', () => { - body.type = CrossGroupType.LOCAL - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenNthCalledWith(7, 'no one can be LOCAL') - expect(spy).toHaveBeenLastCalledWith( - "cross group types don't match", - expect.objectContaining({}), - ) - }) - - it('b is LOCAL', () => { - body.type = CrossGroupType.LOCAL - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenNthCalledWith(9, 'no one can be LOCAL') - expect(spy).toHaveBeenLastCalledWith( - "cross group types don't match", - expect.objectContaining({}), - ) - }) - - it('both are INBOUND', () => { - body.type = CrossGroupType.INBOUND - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "cross group types don't match", - expect.objectContaining({}), - ) - }) - - it('both are OUTBOUND', () => { - body.type = CrossGroupType.OUTBOUND - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "cross group types don't match", - expect.objectContaining({}), - ) - }) - - it('a is CROSS', () => { - body.type = CrossGroupType.CROSS - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "cross group types don't match", - expect.objectContaining({}), - ) - }) - - it('b is CROSS', () => { - body.type = CrossGroupType.CROSS - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "cross group types don't match", - expect.objectContaining({}), - ) - }) - - it('true with a as INBOUND and b as OUTBOUND', () => { - let body = TransactionBody.fromBodyBytes(a.bodyBytes) - body.type = CrossGroupType.INBOUND - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - body = TransactionBody.fromBodyBytes(b.bodyBytes) - body.type = CrossGroupType.OUTBOUND - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(true) - }) - }) - - describe('false because of transaction type not suitable for cross group transactions', () => { - const body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - it('without transaction type (broken TransactionBody)', () => { - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(() => logic.isBelongTogether(b)).toThrowError("couldn't determine transaction type") - }) - - it('not the same transaction types', () => { - const body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.registerAddress = new RegisterAddress() - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "transaction types don't match", - expect.objectContaining({}), - ) - }) - - it('community root cannot be a cross group transaction', () => { - let body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.communityRoot = new CommunityRoot() - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - body = new TransactionBody() - body.type = CrossGroupType.INBOUND - body.communityRoot = new CommunityRoot() - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "TransactionType COMMUNITY_ROOT couldn't be a CrossGroup Transaction", - ) - }) - - it('Gradido Creation cannot be a cross group transaction', () => { - let body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.creation = new GradidoCreation() - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - body = new TransactionBody() - body.type = CrossGroupType.INBOUND - body.creation = new GradidoCreation() - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "TransactionType GRADIDO_CREATION couldn't be a CrossGroup Transaction", - ) - }) - - it('Deferred Transfer cannot be a cross group transaction', () => { - let body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.deferredTransfer = new GradidoDeferredTransfer() - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - body = new TransactionBody() - body.type = CrossGroupType.INBOUND - body.deferredTransfer = new GradidoDeferredTransfer() - b.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith( - "TransactionType GRADIDO_DEFERRED_TRANSFER couldn't be a CrossGroup Transaction", - ) - }) - }) - - describe('false because of wrong amount', () => { - it('amount missing on a', () => { - a.amount = undefined - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith('missing amount') - }) - - it('amount missing on b', () => { - b.amount = undefined - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith('missing amount') - }) - - it('amount not the same', () => { - a.amount = new Decimal('101') - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith('amounts mismatch', expect.objectContaining({})) - }) - }) - - it('false because otherGroup are the same', () => { - const body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.transfer = new GradidoTransfer() - body.otherGroup = 'sending group' - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith('otherGroups are the same', expect.objectContaining({})) - }) - - it('false because of different memos', () => { - const body = new TransactionBody() - body.type = CrossGroupType.OUTBOUND - body.transfer = new GradidoTransfer() - body.otherGroup = 'recipient group' - body.memo = 'changed memo' - a.bodyBytes = Buffer.from(TransactionBody.encode(body).finish()) - const logic = new TransactionLogic(a) - expect(logic.isBelongTogether(b)).toBe(false) - expect(spy).toHaveBeenLastCalledWith('memo differ', expect.objectContaining({})) - }) - }) -}) diff --git a/dlt-connector/src/data/Transaction.logic.ts b/dlt-connector/src/data/Transaction.logic.ts deleted file mode 100644 index c62f78f50..000000000 --- a/dlt-connector/src/data/Transaction.logic.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { Transaction } from '@entity/Transaction' -import { Not } from 'typeorm' - -import { logger } from '@/logging/logger' -import { TransactionBodyLoggingView } from '@/logging/TransactionBodyLogging.view' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' -import { LogError } from '@/server/LogError' - -import { CrossGroupType } from './proto/3_3/enum/CrossGroupType' -import { TransactionType } from './proto/3_3/enum/TransactionType' -import { TransactionBody } from './proto/3_3/TransactionBody' - -export class TransactionLogic { - protected transactionBody: TransactionBody | undefined - - // eslint-disable-next-line no-useless-constructor - public constructor(private self: Transaction) {} - - /** - * search for transaction pair for Cross Group Transaction - * @returns - */ - public async findPairTransaction(): Promise { - const type = this.getBody().type - if (type === CrossGroupType.LOCAL) { - throw new LogError("local transaction don't has a pairing transaction") - } - - // check if already was loaded from db - if (this.self.pairingTransaction) { - return this.self.pairingTransaction - } - - if (this.self.pairingTransaction) { - const pairingTransaction = await Transaction.findOneBy({ id: this.self.pairingTransaction }) - if (pairingTransaction) { - return pairingTransaction - } - } - // check if we find some in db - const sameCreationDateTransactions = await Transaction.findBy({ - createdAt: this.self.createdAt, - id: Not(this.self.id), - }) - if ( - sameCreationDateTransactions.length === 1 && - this.isBelongTogether(sameCreationDateTransactions[0]) - ) { - return sameCreationDateTransactions[0] - } - // this approach only work if all entities get ids really incremented by one - if (type === CrossGroupType.OUTBOUND) { - const prevTransaction = await Transaction.findOneBy({ id: this.self.id - 1 }) - if (prevTransaction && this.isBelongTogether(prevTransaction)) { - return prevTransaction - } - } else if (type === CrossGroupType.INBOUND) { - const nextTransaction = await Transaction.findOneBy({ id: this.self.id + 1 }) - if (nextTransaction && this.isBelongTogether(nextTransaction)) { - return nextTransaction - } - } - throw new LogError("couldn't find valid pairing transaction", { - id: this.self.id, - type: CrossGroupType[type], - transactionCountWithSameCreatedAt: sameCreationDateTransactions.length, - }) - } - - /** - * check if two transactions belong together - * are they pairs for a cross group transaction - * @param otherTransaction - */ - public isBelongTogether(otherTransaction: Transaction): boolean { - if (this.self.id === otherTransaction.id) { - logger.info('id is the same, it is the same transaction!') - return false - } - - if ( - this.self.signingAccountId !== otherTransaction.signingAccountId || - this.self.recipientAccountId !== otherTransaction.recipientAccountId || - this.self.communityId !== otherTransaction.otherCommunityId || - this.self.otherCommunityId !== otherTransaction.communityId || - this.self.createdAt.getTime() !== otherTransaction.createdAt.getTime() - ) { - logger.info('transaction a and b are not pairs', { - a: new TransactionLoggingView(this.self).toJSON(), - b: new TransactionLoggingView(otherTransaction).toJSON(), - }) - return false - } - const body = this.getBody() - const otherBody = TransactionBody.fromBodyBytes(otherTransaction.bodyBytes) - /** - * both must be Cross or - * one can be OUTBOUND and one can be INBOUND - * no one can be LOCAL - */ - - if (!this.validCrossGroupTypes(body.type, otherBody.type)) { - logger.info("cross group types don't match", { - a: new TransactionBodyLoggingView(body).toJSON(), - b: new TransactionBodyLoggingView(otherBody).toJSON(), - }) - return false - } - const type = body.getTransactionType() - const otherType = otherBody.getTransactionType() - if (!type || !otherType) { - throw new LogError("couldn't determine transaction type", { - a: new TransactionBodyLoggingView(body).toJSON(), - b: new TransactionBodyLoggingView(otherBody).toJSON(), - }) - } - if (type !== otherType) { - logger.info("transaction types don't match", { - a: new TransactionBodyLoggingView(body).toJSON(), - b: new TransactionBodyLoggingView(otherBody).toJSON(), - }) - return false - } - if ( - [ - TransactionType.COMMUNITY_ROOT, - TransactionType.GRADIDO_CREATION, - TransactionType.GRADIDO_DEFERRED_TRANSFER, - ].includes(type) - ) { - logger.info(`TransactionType ${TransactionType[type]} couldn't be a CrossGroup Transaction`) - return false - } - if ( - [ - TransactionType.GRADIDO_CREATION, - TransactionType.GRADIDO_TRANSFER, - TransactionType.GRADIDO_DEFERRED_TRANSFER, - ].includes(type) - ) { - if (!this.self.amount || !otherTransaction.amount) { - logger.info('missing amount') - return false - } - if (this.self.amount.cmp(otherTransaction.amount.toString())) { - logger.info('amounts mismatch', { - a: this.self.amount.toString(), - b: otherTransaction.amount.toString(), - }) - return false - } - } - if (body.otherGroup === otherBody.otherGroup) { - logger.info('otherGroups are the same', { - a: new TransactionBodyLoggingView(body).toJSON(), - b: new TransactionBodyLoggingView(otherBody).toJSON(), - }) - return false - } - if (body.memo !== otherBody.memo) { - logger.info('memo differ', { - a: new TransactionBodyLoggingView(body).toJSON(), - b: new TransactionBodyLoggingView(otherBody).toJSON(), - }) - return false - } - return true - } - - /** - * both must be CROSS or - * one can be OUTBOUND and one can be INBOUND - * no one can be LOCAL - * @return true if crossGroupTypes are valid - */ - protected validCrossGroupTypes(a: CrossGroupType, b: CrossGroupType): boolean { - logger.debug('compare ', { - a: CrossGroupType[a], - b: CrossGroupType[b], - }) - if (a === CrossGroupType.LOCAL || b === CrossGroupType.LOCAL) { - logger.info('no one can be LOCAL') - return false - } - if ( - (a === CrossGroupType.INBOUND && b === CrossGroupType.OUTBOUND) || - (a === CrossGroupType.OUTBOUND && b === CrossGroupType.INBOUND) - ) { - return true // One can be INBOUND and one can be OUTBOUND - } - return a === CrossGroupType.CROSS && b === CrossGroupType.CROSS - } - - public getBody(): TransactionBody { - if (!this.transactionBody) { - this.transactionBody = TransactionBody.fromBodyBytes(this.self.bodyBytes) - } - return this.transactionBody - } -} diff --git a/dlt-connector/src/data/proto/3_3/CommunityRoot.ts b/dlt-connector/src/data/proto/3_3/CommunityRoot.ts deleted file mode 100644 index c03460741..000000000 --- a/dlt-connector/src/data/proto/3_3/CommunityRoot.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Community } from '@entity/Community' -import { Transaction } from '@entity/Transaction' -import { Field, Message } from 'protobufjs' - -import { AbstractTransaction } from '../AbstractTransaction' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class CommunityRoot extends Message implements AbstractTransaction { - public constructor(community?: Community) { - if (community) { - super({ - rootPubkey: community.rootPubkey, - gmwPubkey: community.gmwAccount?.derive2Pubkey, - aufPubkey: community.aufAccount?.derive2Pubkey, - }) - } else { - super() - } - } - - @Field.d(1, 'bytes') - public rootPubkey: Buffer - - // community public budget account - @Field.d(2, 'bytes') - public gmwPubkey: Buffer - - // community compensation and environment founds account - @Field.d(3, 'bytes') - public aufPubkey: Buffer - - // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars - public fillTransactionRecipe(recipe: Transaction): void {} -} diff --git a/dlt-connector/src/data/proto/3_3/ConfirmedTransaction.ts b/dlt-connector/src/data/proto/3_3/ConfirmedTransaction.ts deleted file mode 100644 index d59b991e8..000000000 --- a/dlt-connector/src/data/proto/3_3/ConfirmedTransaction.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Field, Message } from 'protobufjs' - -import { base64ToBuffer } from '@/utils/typeConverter' - -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 ConfirmedTransaction extends Message { - static fromBase64(base64: string): ConfirmedTransaction { - return ConfirmedTransaction.decode(new Uint8Array(base64ToBuffer(base64))) - } - - @Field.d(1, 'uint64') - id: Long - - @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/data/proto/3_3/GradidoCreation.test.ts b/dlt-connector/src/data/proto/3_3/GradidoCreation.test.ts deleted file mode 100644 index 06011838c..000000000 --- a/dlt-connector/src/data/proto/3_3/GradidoCreation.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import 'reflect-metadata' -import { TransactionErrorType } from '@enum/TransactionErrorType' - -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { TransactionError } from '@/graphql/model/TransactionError' - -import { GradidoCreation } from './GradidoCreation' - -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/data/proto/3_3/GradidoCreation.ts b/dlt-connector/src/data/proto/3_3/GradidoCreation.ts deleted file mode 100644 index 0fa08eff5..000000000 --- a/dlt-connector/src/data/proto/3_3/GradidoCreation.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Account } from '@entity/Account' -import { Transaction } from '@entity/Transaction' -import { Decimal } from 'decimal.js-light' -import { Field, Message } from 'protobufjs' - -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { TransactionError } from '@/graphql/model/TransactionError' - -import { AbstractTransaction } from '../AbstractTransaction' - -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 implements AbstractTransaction { - constructor(transaction?: TransactionDraft, recipientAccount?: Account) { - if (transaction) { - if (!transaction.targetDate) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing targetDate for contribution', - ) - } - super({ - recipient: new TransferAmount({ - amount: transaction.amount.toString(), - pubkey: recipientAccount?.derive2Pubkey, - }), - targetDate: new TimestampSeconds(new Date(transaction.targetDate)), - }) - } else { - super() - } - } - - // recipient: TransferAmount contain - // - recipient public key - // - amount - // - communityId // only set if not the same as recipient community - @Field.d(1, TransferAmount) - public recipient: TransferAmount - - @Field.d(3, 'TimestampSeconds') - public targetDate: TimestampSeconds - - public fillTransactionRecipe(recipe: Transaction): void { - recipe.amount = new Decimal(this.recipient.amount ?? 0) - } -} diff --git a/dlt-connector/src/data/proto/3_3/GradidoDeferredTransfer.ts b/dlt-connector/src/data/proto/3_3/GradidoDeferredTransfer.ts deleted file mode 100644 index f48719b16..000000000 --- a/dlt-connector/src/data/proto/3_3/GradidoDeferredTransfer.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Transaction } from '@entity/Transaction' -import Decimal from 'decimal.js-light' -import { Field, Message } from 'protobufjs' - -import { AbstractTransaction } from '../AbstractTransaction' - -import { GradidoTransfer } from './GradidoTransfer' -import { TimestampSeconds } from './TimestampSeconds' - -// 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 -export class GradidoDeferredTransfer - // eslint-disable-next-line no-use-before-define - extends Message - implements AbstractTransaction -{ - // 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, 'TimestampSeconds') - public timeout: TimestampSeconds - - // split for n recipient - // max gradido per recipient? or per transaction with cool down? - - public fillTransactionRecipe(recipe: Transaction): void { - recipe.amount = new Decimal(this.transfer.sender.amount ?? 0) - } -} diff --git a/dlt-connector/src/data/proto/3_3/GradidoTransaction.ts b/dlt-connector/src/data/proto/3_3/GradidoTransaction.ts deleted file mode 100644 index f4274407b..000000000 --- a/dlt-connector/src/data/proto/3_3/GradidoTransaction.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Field, Message } from 'protobufjs' - -import { LogError } from '@/server/LogError' - -import { SignatureMap } from './SignatureMap' -import { SignaturePair } from './SignaturePair' -import { TransactionBody } from './TransactionBody' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class GradidoTransaction extends Message { - constructor(body?: TransactionBody) { - if (body) { - super({ - sigMap: new SignatureMap(), - bodyBytes: Buffer.from(TransactionBody.encode(body).finish()), - }) - } else { - super() - } - } - - @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 - - getFirstSignature(): SignaturePair { - const sigPair = this.sigMap.sigPair - if (sigPair.length !== 1) { - throw new LogError("signature count don't like expected") - } - return sigPair[0] - } - - getTransactionBody(): TransactionBody { - return TransactionBody.fromBodyBytes(this.bodyBytes) - } -} diff --git a/dlt-connector/src/data/proto/3_3/GradidoTransfer.ts b/dlt-connector/src/data/proto/3_3/GradidoTransfer.ts deleted file mode 100644 index 7e9da40bd..000000000 --- a/dlt-connector/src/data/proto/3_3/GradidoTransfer.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Account } from '@entity/Account' -import { Transaction } from '@entity/Transaction' -import Decimal from 'decimal.js-light' -import { Field, Message } from 'protobufjs' - -import { TransactionDraft } from '@/graphql/input/TransactionDraft' - -import { AbstractTransaction } from '../AbstractTransaction' - -import { TransferAmount } from './TransferAmount' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class GradidoTransfer extends Message implements AbstractTransaction { - constructor( - transaction?: TransactionDraft, - signingAccount?: Account, - recipientAccount?: Account, - coinOrigin?: string, - ) { - if (transaction) { - super({ - sender: new TransferAmount({ - amount: transaction.amount.toString(), - pubkey: signingAccount?.derive2Pubkey, - communityId: coinOrigin, - }), - recipient: recipientAccount?.derive2Pubkey, - }) - } else { - super() - } - } - - // sender: TransferAmount contain - // - sender public key - // - amount - // - communityId // only set if not the same as sender and recipient community - @Field.d(1, TransferAmount) - public sender: TransferAmount - - // the recipient public key - @Field.d(2, 'bytes') - public recipient: Buffer - - public fillTransactionRecipe(recipe: Transaction): void { - recipe.amount = new Decimal(this.sender?.amount ?? 0) - } -} diff --git a/dlt-connector/src/data/proto/3_3/GroupFriendsUpdate.ts b/dlt-connector/src/data/proto/3_3/GroupFriendsUpdate.ts deleted file mode 100644 index b64e80a73..000000000 --- a/dlt-connector/src/data/proto/3_3/GroupFriendsUpdate.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { Transaction } from '@entity/Transaction' -import { Field, Message } from 'protobufjs' - -import { AbstractTransaction } from '../AbstractTransaction' - -// 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 implements AbstractTransaction { - // 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 - - public fillTransactionRecipe(recipe: Transaction): void { - throw new Error('Method not implemented.') - } -} diff --git a/dlt-connector/src/data/proto/3_3/RegisterAddress.ts b/dlt-connector/src/data/proto/3_3/RegisterAddress.ts deleted file mode 100644 index 08cb39868..000000000 --- a/dlt-connector/src/data/proto/3_3/RegisterAddress.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { Account } from '@entity/Account' -import { Transaction } from '@entity/Transaction' -import { User } from '@entity/User' -import { Field, Message } from 'protobufjs' - -import { AddressType } from '@/data/proto/3_3/enum/AddressType' -import { AccountType } from '@/graphql/enum/AccountType' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { accountTypeToAddressType } from '@/utils/typeConverter' - -import { AbstractTransaction } from '../AbstractTransaction' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class RegisterAddress extends Message implements AbstractTransaction { - constructor(transaction?: UserAccountDraft, account?: Account) { - if (transaction) { - super({ addressType: accountTypeToAddressType(transaction.accountType) }) - if (account) { - this.derivationIndex = account.derivationIndex - this.accountPubkey = account.derive2Pubkey - if (account.user) { - this.userPubkey = account.user.derive1Pubkey - } - } - } else { - super() - } - } - - @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 accountPubkey: Buffer - - @Field.d(5, 'uint32') - public derivationIndex?: number - - public fillTransactionRecipe(_recipe: Transaction): void {} -} diff --git a/dlt-connector/src/data/proto/3_3/SignatureMap.ts b/dlt-connector/src/data/proto/3_3/SignatureMap.ts deleted file mode 100644 index daf69f05f..000000000 --- a/dlt-connector/src/data/proto/3_3/SignatureMap.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Field, Message } from '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 { - constructor() { - super({ sigPair: [] }) - } - - @Field.d(1, SignaturePair, 'repeated') - public sigPair: SignaturePair[] -} diff --git a/dlt-connector/src/data/proto/3_3/SignaturePair.ts b/dlt-connector/src/data/proto/3_3/SignaturePair.ts deleted file mode 100644 index 80a61a871..000000000 --- a/dlt-connector/src/data/proto/3_3/SignaturePair.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Field, Message } from '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 - - public validate(): boolean { - return this.pubKey.length === 32 && this.signature.length === 64 - } -} diff --git a/dlt-connector/src/data/proto/3_3/Timestamp.test.ts b/dlt-connector/src/data/proto/3_3/Timestamp.test.ts deleted file mode 100644 index 39f6fd2c8..000000000 --- a/dlt-connector/src/data/proto/3_3/Timestamp.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -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/data/proto/3_3/Timestamp.ts b/dlt-connector/src/data/proto/3_3/Timestamp.ts deleted file mode 100644 index 91cf06581..000000000 --- a/dlt-connector/src/data/proto/3_3/Timestamp.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Field, Message } from '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/data/proto/3_3/TimestampSeconds.test.ts b/dlt-connector/src/data/proto/3_3/TimestampSeconds.test.ts deleted file mode 100644 index 92dc79130..000000000 --- a/dlt-connector/src/data/proto/3_3/TimestampSeconds.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -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/data/proto/3_3/TimestampSeconds.ts b/dlt-connector/src/data/proto/3_3/TimestampSeconds.ts deleted file mode 100644 index 6d175c6f3..000000000 --- a/dlt-connector/src/data/proto/3_3/TimestampSeconds.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Field, Message } from '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/data/proto/3_3/TransactionBody.ts b/dlt-connector/src/data/proto/3_3/TransactionBody.ts deleted file mode 100644 index 934e05cfc..000000000 --- a/dlt-connector/src/data/proto/3_3/TransactionBody.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { Transaction } from '@entity/Transaction' -import { Field, Message, OneOf } from 'protobufjs' - -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { TransactionError } from '@/graphql/model/TransactionError' -import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' -import { timestampToDate } from '@/utils/typeConverter' - -import { AbstractTransaction } from '../AbstractTransaction' -import { determineCrossGroupType, determineOtherGroup } from '../transactionBody.logic' - -import { CommunityRoot } from './CommunityRoot' -import { PROTO_TRANSACTION_BODY_VERSION_NUMBER } from './const' -import { CrossGroupType } from './enum/CrossGroupType' -import { TransactionType } from './enum/TransactionType' -import { GradidoCreation } from './GradidoCreation' -import { GradidoDeferredTransfer } from './GradidoDeferredTransfer' -import { GradidoTransfer } from './GradidoTransfer' -import { GroupFriendsUpdate } from './GroupFriendsUpdate' -import { RegisterAddress } from './RegisterAddress' -import { Timestamp } from './Timestamp' - -// https://www.npmjs.com/package/@apollo/protobufjs -// eslint-disable-next-line no-use-before-define -export class TransactionBody extends Message { - public constructor(transaction?: TransactionDraft | CommunityDraft | UserAccountDraft) { - if (transaction) { - let type = CrossGroupType.LOCAL - let otherGroup = '' - if (transaction instanceof TransactionDraft) { - type = determineCrossGroupType(transaction) - otherGroup = determineOtherGroup(type, transaction) - } - - super({ - memo: 'Not implemented yet', - createdAt: new Timestamp(new Date(transaction.createdAt)), - versionNumber: PROTO_TRANSACTION_BODY_VERSION_NUMBER, - type, - otherGroup, - }) - } else { - super() - } - } - - public static fromBodyBytes(bodyBytes: Buffer) { - try { - return TransactionBody.decode(new Uint8Array(bodyBytes)) - } catch (error) { - logger.error('error decoding body from gradido transaction: %s', error) - throw new TransactionError( - TransactionErrorType.PROTO_DECODE_ERROR, - 'cannot decode body from gradido transaction', - ) - } - } - - @Field.d(1, 'string') - public memo: string - - @Field.d(2, Timestamp) - public createdAt: Timestamp - - @Field.d(3, 'string') - public versionNumber: string - - @Field.d(4, CrossGroupType) - public type: CrossGroupType - - @Field.d(5, 'string') - public otherGroup: string - - @OneOf.d( - 'gradidoTransfer', - 'gradidoCreation', - 'groupFriendsUpdate', - 'registerAddress', - 'gradidoDeferredTransfer', - 'communityRoot', - ) - 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 - - @Field.d(11, 'CommunityRoot') - communityRoot?: CommunityRoot - - public getTransactionType(): TransactionType | undefined { - if (this.transfer) return TransactionType.GRADIDO_TRANSFER - else if (this.creation) return TransactionType.GRADIDO_CREATION - else if (this.groupFriendsUpdate) return TransactionType.GROUP_FRIENDS_UPDATE - else if (this.registerAddress) return TransactionType.REGISTER_ADDRESS - else if (this.deferredTransfer) return TransactionType.GRADIDO_DEFERRED_TRANSFER - else if (this.communityRoot) return TransactionType.COMMUNITY_ROOT - } - - // The `TransactionBody` class utilizes Protobuf's `OneOf` field structure which, according to Protobuf documentation - // (https://protobuf.dev/programming-guides/proto3/#oneof), allows only one field within the group to be set at a time. - // Therefore, accessing the `getTransactionDetails()` method returns the first initialized value among the defined fields, - // each of which should be of type AbstractTransaction. It's important to note that due to the nature of Protobuf's `OneOf`, - // only one type from the defined options can be set within the object obtained from Protobuf. - // - // If multiple fields are set in a single object, the method `getTransactionDetails()` will return the first defined value - // based on the order of checks. Developers should handle this behavior according to the expected Protobuf structure. - public getTransactionDetails(): AbstractTransaction | undefined { - if (this.transfer) return this.transfer - if (this.creation) return this.creation - if (this.groupFriendsUpdate) return this.groupFriendsUpdate - if (this.registerAddress) return this.registerAddress - if (this.deferredTransfer) return this.deferredTransfer - if (this.communityRoot) return this.communityRoot - } - - public fillTransactionRecipe(recipe: Transaction): void { - recipe.createdAt = timestampToDate(this.createdAt) - recipe.protocolVersion = this.versionNumber - const transactionType = this.getTransactionType() - if (!transactionType) { - throw new LogError("invalid TransactionBody couldn't determine transaction type") - } - recipe.type = transactionType.valueOf() - this.getTransactionDetails()?.fillTransactionRecipe(recipe) - } - - public getRecipientPublicKey(): Buffer | undefined { - if (this.transfer) { - // this.transfer.recipient contains the publicKey of the recipient - return this.transfer.recipient - } - if (this.creation) { - return this.creation.recipient.pubkey - } - if (this.deferredTransfer) { - // this.deferredTransfer.transfer.recipient contains the publicKey of the recipient - return this.deferredTransfer.transfer.recipient - } - return undefined - } -} diff --git a/dlt-connector/src/data/proto/3_3/TransferAmount.ts b/dlt-connector/src/data/proto/3_3/TransferAmount.ts deleted file mode 100644 index 42da65256..000000000 --- a/dlt-connector/src/data/proto/3_3/TransferAmount.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Field, Message } from '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 -} diff --git a/dlt-connector/src/data/proto/3_3/const.ts b/dlt-connector/src/data/proto/3_3/const.ts deleted file mode 100644 index 9733e14a2..000000000 --- a/dlt-connector/src/data/proto/3_3/const.ts +++ /dev/null @@ -1 +0,0 @@ -export const PROTO_TRANSACTION_BODY_VERSION_NUMBER = '3.3' diff --git a/dlt-connector/src/data/proto/3_3/enum/AddressType.ts b/dlt-connector/src/data/proto/3_3/enum/AddressType.ts deleted file mode 100644 index eace1e022..000000000 --- a/dlt-connector/src/data/proto/3_3/enum/AddressType.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Enum for protobuf - * used from RegisterAddress to determine account type - * master implementation: https://github.com/gradido/gradido_protocol/blob/master/proto/gradido/register_address.proto - */ -export enum AddressType { - NONE = 0, // if no address was found - 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/data/proto/3_3/enum/CrossGroupType.ts b/dlt-connector/src/data/proto/3_3/enum/CrossGroupType.ts deleted file mode 100644 index fee592e57..000000000 --- a/dlt-connector/src/data/proto/3_3/enum/CrossGroupType.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Enum for protobuf - * Determine Cross Group type of Transactions - * LOCAL: no cross group transactions, sender and recipient community are the same, only one transaction - * INBOUND: cross group transaction, Inbound part. On recipient community chain. Recipient side by Transfer Transactions - * OUTBOUND: cross group transaction, Outbound part. On sender community chain. Sender side by Transfer Transactions - * CROSS: for cross group transaction which haven't a direction like group friend update - * master implementation: https://github.com/gradido/gradido_protocol/blob/master/proto/gradido/transaction_body.proto - * - * Transaction Handling differ from database focused backend - * In Backend for each transfer transaction there are always two entries in db, - * on for sender user and one for recipient user despite storing basically the same data two times - * In Blockchain Implementation there only two transactions on cross group transactions, one for - * the sender community chain, one for the recipient community chain - * if the transaction stay in the community there is only one transaction - */ -export enum CrossGroupType { - LOCAL = 0, - INBOUND = 1, - OUTBOUND = 2, - CROSS = 3, -} diff --git a/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts b/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts index c50f33bec..07bf5c393 100644 --- a/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts +++ b/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts @@ -4,8 +4,8 @@ * for storing type in db as number */ export enum TransactionType { - GRADIDO_TRANSFER = 1, - GRADIDO_CREATION = 2, + GRADIDO_CREATION = 1, + GRADIDO_TRANSFER = 2, GROUP_FRIENDS_UPDATE = 3, REGISTER_ADDRESS = 4, GRADIDO_DEFERRED_TRANSFER = 5, diff --git a/dlt-connector/src/data/proto/AbstractTransaction.ts b/dlt-connector/src/data/proto/AbstractTransaction.ts deleted file mode 100644 index ac089b096..000000000 --- a/dlt-connector/src/data/proto/AbstractTransaction.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Transaction } from '@entity/Transaction' - -export abstract class AbstractTransaction { - public abstract fillTransactionRecipe(recipe: Transaction): void -} diff --git a/dlt-connector/src/data/proto/TransactionBody.builder.ts b/dlt-connector/src/data/proto/TransactionBody.builder.ts deleted file mode 100644 index cfc1e808b..000000000 --- a/dlt-connector/src/data/proto/TransactionBody.builder.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { Account } from '@entity/Account' -import { Community } from '@entity/Community' - -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { LogError } from '@/server/LogError' - -import { CommunityRoot } from './3_3/CommunityRoot' -import { CrossGroupType } from './3_3/enum/CrossGroupType' -import { GradidoCreation } from './3_3/GradidoCreation' -import { GradidoTransfer } from './3_3/GradidoTransfer' -import { RegisterAddress } from './3_3/RegisterAddress' -import { TransactionBody } from './3_3/TransactionBody' - -export class TransactionBodyBuilder { - private signingAccount?: Account - private recipientAccount?: Account - private body: TransactionBody | undefined - - // https://refactoring.guru/design-patterns/builder/typescript/example - /** - * A fresh builder instance should contain a blank product object, which is - * used in further assembly. - */ - constructor() { - this.reset() - } - - public reset(): void { - this.body = undefined - this.signingAccount = undefined - this.recipientAccount = undefined - } - - /** - * Concrete Builders are supposed to provide their own methods for - * retrieving results. That's because various types of builders may create - * entirely different products that don't follow the same interface. - * Therefore, such methods cannot be declared in the base Builder interface - * (at least in a statically typed programming language). - * - * Usually, after returning the end result to the client, a builder instance - * is expected to be ready to start producing another product. That's why - * it's a usual practice to call the reset method at the end of the - * `getProduct` method body. However, this behavior is not mandatory, and - * you can make your builders wait for an explicit reset call from the - * client code before disposing of the previous result. - */ - public build(): TransactionBody { - const result = this.getTransactionBody() - this.reset() - return result - } - - public getTransactionBody(): TransactionBody { - if (!this.body) { - throw new LogError( - 'cannot build Transaction Body, missing information, please call at least fromTransactionDraft or fromCommunityDraft', - ) - } - return this.body - } - - public getSigningAccount(): Account | undefined { - return this.signingAccount - } - - public getRecipientAccount(): Account | undefined { - return this.recipientAccount - } - - public setSigningAccount(signingAccount: Account): TransactionBodyBuilder { - this.signingAccount = signingAccount - return this - } - - public setRecipientAccount(recipientAccount: Account): TransactionBodyBuilder { - this.recipientAccount = recipientAccount - return this - } - - public setCrossGroupType(type: CrossGroupType): this { - if (!this.body) { - throw new LogError( - 'body is undefined, please call fromTransactionDraft or fromCommunityDraft before', - ) - } - this.body.type = type - return this - } - - public setOtherGroup(otherGroup: string): this { - if (!this.body) { - throw new LogError( - 'body is undefined, please call fromTransactionDraft or fromCommunityDraft before', - ) - } - this.body.otherGroup = otherGroup - return this - } - - public fromUserAccountDraft(userAccountDraft: UserAccountDraft, account: Account): this { - this.body = new TransactionBody(userAccountDraft) - this.body.registerAddress = new RegisterAddress(userAccountDraft, account) - this.body.data = 'registerAddress' - return this - } - - public fromTransactionDraft(transactionDraft: TransactionDraft): TransactionBodyBuilder { - this.body = new TransactionBody(transactionDraft) - // TODO: load public keys for sender and recipient user from db - switch (transactionDraft.type) { - case InputTransactionType.CREATION: - if (!this.recipientAccount) { - throw new LogError('missing recipient account for creation transaction!') - } - this.body.creation = new GradidoCreation(transactionDraft, this.recipientAccount) - this.body.data = 'gradidoCreation' - break - case InputTransactionType.SEND: - case InputTransactionType.RECEIVE: - if (!this.recipientAccount || !this.signingAccount) { - throw new LogError('missing signing and/or recipient account for transfer transaction!') - } - this.body.transfer = new GradidoTransfer( - transactionDraft, - this.signingAccount, - this.recipientAccount, - ) - this.body.data = 'gradidoTransfer' - break - } - return this - } - - public fromCommunityDraft( - communityDraft: CommunityDraft, - community: Community, - ): TransactionBodyBuilder { - this.body = new TransactionBody(communityDraft) - this.body.communityRoot = new CommunityRoot(community) - this.body.data = 'communityRoot' - return this - } -} diff --git a/dlt-connector/src/data/proto/transactionBody.logic.ts b/dlt-connector/src/data/proto/transactionBody.logic.ts deleted file mode 100644 index 69d7e565e..000000000 --- a/dlt-connector/src/data/proto/transactionBody.logic.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { TransactionError } from '@/graphql/model/TransactionError' - -import { CrossGroupType } from './3_3/enum/CrossGroupType' - -export const determineCrossGroupType = ({ - user, - linkedUser, - type, -}: TransactionDraft): CrossGroupType => { - if ( - !linkedUser.communityUuid || - !user.communityUuid || - linkedUser.communityUuid === '' || - user.communityUuid === '' || - user.communityUuid === linkedUser.communityUuid || - type === InputTransactionType.CREATION - ) { - return CrossGroupType.LOCAL - } else if (type === InputTransactionType.SEND) { - return CrossGroupType.INBOUND - } else if (type === InputTransactionType.RECEIVE) { - return CrossGroupType.OUTBOUND - } - throw new TransactionError( - TransactionErrorType.NOT_IMPLEMENTED_YET, - 'cannot determine CrossGroupType', - ) -} - -export const determineOtherGroup = ( - type: CrossGroupType, - { user, linkedUser }: TransactionDraft, -): string => { - switch (type) { - case CrossGroupType.LOCAL: - return '' - case CrossGroupType.INBOUND: - if (!linkedUser.communityUuid || linkedUser.communityUuid === '') { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing linkedUser community id for cross group transaction', - ) - } - return linkedUser.communityUuid - case CrossGroupType.OUTBOUND: - if (!user.communityUuid || user.communityUuid === '') { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing user community id for cross group transaction', - ) - } - return user.communityUuid - case CrossGroupType.CROSS: - throw new TransactionError(TransactionErrorType.NOT_IMPLEMENTED_YET, 'not implemented yet') - } -} diff --git a/dlt-connector/src/graphql/enum/TransactionErrorType.ts b/dlt-connector/src/graphql/enum/TransactionErrorType.ts index 1b01bc0da..5a8a2a06b 100644 --- a/dlt-connector/src/graphql/enum/TransactionErrorType.ts +++ b/dlt-connector/src/graphql/enum/TransactionErrorType.ts @@ -12,6 +12,7 @@ export enum TransactionErrorType { INVALID_SIGNATURE = 'Invalid Signature', LOGIC_ERROR = 'Logic Error', NOT_FOUND = 'Not found', + VALIDATION_ERROR = 'Validation Error', } registerEnumType(TransactionErrorType, { diff --git a/dlt-connector/src/graphql/model/TransactionRecipe.ts b/dlt-connector/src/graphql/model/TransactionRecipe.ts index 263ccce4a..78fa7fc31 100644 --- a/dlt-connector/src/graphql/model/TransactionRecipe.ts +++ b/dlt-connector/src/graphql/model/TransactionRecipe.ts @@ -7,7 +7,7 @@ import { getEnumValue } from '@/utils/typeConverter' @ObjectType() export class TransactionRecipe { - public constructor({ id, createdAt, type, community }: Transaction) { + public constructor({ id, createdAt, type, community, signature }: Transaction) { const transactionType = getEnumValue(TransactionType, type) if (!transactionType) { throw new LogError('invalid transaction, type is missing') @@ -16,6 +16,7 @@ export class TransactionRecipe { this.createdAt = createdAt.toString() this.type = transactionType.toString() this.topic = community.iotaTopic + this.signatureHex = signature.toString('hex') } @Field(() => Int) @@ -29,4 +30,7 @@ export class TransactionRecipe { @Field(() => String) topic: string + + @Field(() => String) + signatureHex: string } diff --git a/dlt-connector/src/graphql/resolver/CommunityResolver.ts b/dlt-connector/src/graphql/resolver/CommunityResolver.ts index 741de2e6d..dd9db2b23 100644 --- a/dlt-connector/src/graphql/resolver/CommunityResolver.ts +++ b/dlt-connector/src/graphql/resolver/CommunityResolver.ts @@ -1,11 +1,10 @@ -import { Resolver, Query, Arg, Mutation, Args } from 'type-graphql' - import { CommunityArg } from '@arg/CommunityArg' import { TransactionErrorType } from '@enum/TransactionErrorType' import { CommunityDraft } from '@input/CommunityDraft' import { Community } from '@model/Community' import { TransactionError } from '@model/TransactionError' import { TransactionResult } from '@model/TransactionResult' +import { Resolver, Query, Arg, Mutation, Args } from 'type-graphql' import { CommunityRepository } from '@/data/Community.repository' import { AddCommunityContext } from '@/interactions/backendToDb/community/AddCommunity.context' diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index 3f34584a9..8302a872f 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -5,12 +5,11 @@ import { TransactionDraft } from '@input/TransactionDraft' import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' import { TransactionRepository } from '@/data/Transaction.repository' import { CreateTransactionRecipeContext } from '@/interactions/backendToDb/transaction/CreateTransactionRecipe.context' -import { BackendTransactionLoggingView } from '@/logging/BackendTransactionLogging.view' import { logger } from '@/logging/logger' import { TransactionLoggingView } from '@/logging/TransactionLogging.view' import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' -import { LogError } from '@/server/LogError' +import { TransactionErrorType } from '../enum/TransactionErrorType' import { TransactionError } from '../model/TransactionError' import { TransactionRecipe } from '../model/TransactionRecipe' import { TransactionResult } from '../model/TransactionResult' @@ -24,30 +23,30 @@ export class TransactionResolver { ): Promise { const createTransactionRecipeContext = new CreateTransactionRecipeContext(transactionDraft) try { - await createTransactionRecipeContext.run() + const result = await createTransactionRecipeContext.run() + if (!result) { + return new TransactionResult( + new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'cannot work with this parameters', + ), + ) + } const transactionRecipe = createTransactionRecipeContext.getTransactionRecipe() // check if a transaction with this signature already exist const existingRecipe = await TransactionRepository.findBySignature( transactionRecipe.signature, ) if (existingRecipe) { - // transaction recipe with this signature already exist, we need only to store the backendTransaction - if (transactionRecipe.backendTransactions.length !== 1) { - throw new LogError('unexpected backend transaction count', { - count: transactionRecipe.backendTransactions.length, - transactionId: transactionRecipe.id, - }) - } - const backendTransaction = transactionRecipe.backendTransactions[0] - backendTransaction.transactionId = transactionRecipe.id - logger.debug( - 'store backendTransaction', - new BackendTransactionLoggingView(backendTransaction), + return new TransactionResult( + new TransactionError( + TransactionErrorType.ALREADY_EXIST, + 'Transaction with same signature already exist', + ), ) - await backendTransaction.save() } else { logger.debug('store transaction recipe', new TransactionLoggingView(transactionRecipe)) - // we can store the transaction and with that automatic the backend transaction + // we store the transaction await transactionRecipe.save() } InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index bfbff10c3..8d140faf3 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import 'reflect-metadata' +import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' + import { CONFIG } from '@/config' import { BackendClient } from './client/BackendClient' import { CommunityRepository } from './data/Community.repository' -import { Mnemonic } from './data/Mnemonic' import { CommunityDraft } from './graphql/input/CommunityDraft' import { AddCommunityContext } from './interactions/backendToDb/community/AddCommunity.context' import { logger } from './logging/logger' @@ -39,8 +40,22 @@ async function waitForServer( async function main() { if (CONFIG.IOTA_HOME_COMMUNITY_SEED) { - Mnemonic.validateSeed(CONFIG.IOTA_HOME_COMMUNITY_SEED) + try { + const seed = MemoryBlock.fromHex(CONFIG.IOTA_HOME_COMMUNITY_SEED) + if (seed.size() < 32) { + throw new Error('seed need to be greater than 32 Bytes') + } + } catch (_) { + throw new LogError( + 'IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long', + ) + } } + // load crypto keys for gradido blockchain lib + loadCryptoKeys( + MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), + MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY), + ) // eslint-disable-next-line no-console console.log(`DLT_CONNECTOR_PORT=${CONFIG.DLT_CONNECTOR_PORT}`) const { app } = await createServer() diff --git a/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts b/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts index ad259b372..050b245e3 100644 --- a/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts +++ b/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts @@ -18,6 +18,7 @@ import { getDataSource } from '@/typeorm/DataSource' import { CreateTransactionRecipeContext } from '../transaction/CreateTransactionRecipe.context' import { CommunityRole } from './Community.role' +import { TransactionLoggingView } from '@/logging/TransactionLogging.view' export class HomeCommunityRole extends CommunityRole { private transactionRecipe: Transaction diff --git a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts index 89bdbbedf..2b815cd7a 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts @@ -1,9 +1,12 @@ -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' +/* eslint-disable camelcase */ +import { Account } from '@entity/Account' +import { GradidoTransactionBuilder } from 'gradido-blockchain-js' + +import { UserRepository } from '@/data/User.repository' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { TransactionError } from '@/graphql/model/TransactionError' -import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' export abstract class AbstractTransactionRole { // eslint-disable-next-line no-useless-constructor @@ -11,7 +14,7 @@ export abstract class AbstractTransactionRole { abstract getSigningUser(): UserIdentifier abstract getRecipientUser(): UserIdentifier - abstract getCrossGroupType(): CrossGroupType + abstract getGradidoTransactionBuilder(): Promise public isCrossGroupTransaction(): boolean { return ( @@ -20,44 +23,14 @@ export abstract class AbstractTransactionRole { ) } - /** - * otherGroup is the group/community on which this part of the transaction isn't stored - * Alice from 'gdd1' Send 10 GDD to Bob in 'gdd2' - * OUTBOUND came from sender, stored on sender community blockchain - * OUTBOUND: stored on 'gdd1', otherGroup: 'gdd2' - * INBOUND: goes to receiver, stored on receiver community blockchain - * INBOUND: stored on 'gdd2', otherGroup: 'gdd1' - * @returns iota topic - */ - public getOtherGroup(): string { - let user: UserIdentifier - const type = this.getCrossGroupType() - switch (type) { - case CrossGroupType.LOCAL: - return '' - case CrossGroupType.INBOUND: - user = this.getSigningUser() - if (!user.communityUuid) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing sender/signing user community id for cross group transaction', - ) - } - return iotaTopicFromCommunityUUID(user.communityUuid) - case CrossGroupType.OUTBOUND: - user = this.getRecipientUser() - if (!user.communityUuid) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing recipient user community id for cross group transaction', - ) - } - return iotaTopicFromCommunityUUID(user.communityUuid) - default: - throw new TransactionError( - TransactionErrorType.NOT_IMPLEMENTED_YET, - `type not implemented yet ${type}`, - ) + public async loadUser(user: UserIdentifier): Promise { + const account = await UserRepository.findAccountByUserIdentifier(user) + if (!account) { + throw new TransactionError( + TransactionErrorType.NOT_FOUND, + "couldn't found user account in db", + ) } + return account } } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts b/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts index a4145cd44..659c62c22 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts @@ -1,13 +1,7 @@ -import { Community } from '@entity/Community' - +/* eslint-disable camelcase */ import { AccountLogic } from '@/data/Account.logic' import { KeyPair } from '@/data/KeyPair' -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' -import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' -import { UserRepository } from '@/data/User.repository' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { TransactionError } from '@/graphql/model/TransactionError' import { AbstractTransactionRole } from './AbstractTransaction.role' import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' @@ -17,62 +11,30 @@ export class BalanceChangingTransactionRecipeRole extends AbstractTransactionRec transactionDraft: TransactionDraft, transactionTypeRole: AbstractTransactionRole, ): Promise { - const signingUser = transactionTypeRole.getSigningUser() - const recipientUser = transactionTypeRole.getRecipientUser() - // loading signing and recipient account - // TODO: look for ways to use only one db call for both - const signingAccount = await UserRepository.findAccountByUserIdentifier(signingUser) - if (!signingAccount) { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, - "couldn't found sender user account in db", - ) - } - const recipientAccount = await UserRepository.findAccountByUserIdentifier(recipientUser) - if (!recipientAccount) { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, - "couldn't found recipient user account in db", - ) - } - // create proto transaction body - const transactionBodyBuilder = new TransactionBodyBuilder() - .setSigningAccount(signingAccount) - .setRecipientAccount(recipientAccount) - .fromTransactionDraft(transactionDraft) - .setCrossGroupType(transactionTypeRole.getCrossGroupType()) - .setOtherGroup(transactionTypeRole.getOtherGroup()) + const signingAccount = await transactionTypeRole.loadUser(transactionTypeRole.getSigningUser()) + const recipientAccount = await transactionTypeRole.loadUser( + transactionTypeRole.getRecipientUser(), + ) + const accountLogic = new AccountLogic(signingAccount) + await this.transactionBuilder.setCommunityFromUser(transactionDraft.user) + const communityKeyPair = new KeyPair(this.transactionBuilder.getCommunity()) + + const gradidoTransactionBuilder = await transactionTypeRole.getGradidoTransactionBuilder() + const transaction = gradidoTransactionBuilder + .setCreatedAt(new Date(transactionDraft.createdAt)) + .sign(accountLogic.calculateKeyPair(communityKeyPair).keyPair) + .build() // build transaction entity this.transactionBuilder - .fromTransactionBodyBuilder(transactionBodyBuilder) - .addBackendTransaction(transactionDraft) + .fromGradidoTransaction(transaction) + .setRecipientAccount(recipientAccount) + .setSigningAccount(signingAccount) - await this.transactionBuilder.setCommunityFromUser(transactionDraft.user) - if (recipientUser.communityUuid !== signingUser.communityUuid) { + if (transactionTypeRole.isCrossGroupTransaction()) { await this.transactionBuilder.setOtherCommunityFromUser(transactionDraft.linkedUser) } - const transaction = this.transactionBuilder.getTransaction() - const communityKeyPair = new KeyPair( - this.getSigningCommunity(transactionTypeRole.getCrossGroupType()), - ) - const accountLogic = new AccountLogic(signingAccount) - // sign - this.transactionBuilder.setSignature( - accountLogic.calculateKeyPair(communityKeyPair).sign(transaction.bodyBytes), - ) return this } - - public getSigningCommunity(crossGroupType: CrossGroupType): Community { - if (crossGroupType === CrossGroupType.INBOUND) { - const otherCommunity = this.transactionBuilder.getOtherCommunity() - if (!otherCommunity) { - throw new TransactionError(TransactionErrorType.NOT_FOUND, 'missing other community') - } - return otherCommunity - } - return this.transactionBuilder.getCommunity() - } } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts index 34d56cce0..cdd953d4c 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts @@ -1,7 +1,9 @@ import { Community } from '@entity/Community' +// eslint-disable-next-line camelcase +import { MemoryBlock, GradidoTransactionBuilder } from 'gradido-blockchain-js' import { KeyPair } from '@/data/KeyPair' -import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' +// import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' @@ -11,15 +13,26 @@ export class CommunityRootTransactionRole extends AbstractTransactionRecipeRole communityDraft: CommunityDraft, community: Community, ): AbstractTransactionRecipeRole { + if ( + !community.rootPubkey || + !community.gmwAccount?.derive2Pubkey || + !community.aufAccount?.derive2Pubkey + ) { + throw new Error('missing one of the public keys for community') + } // create proto transaction body - const transactionBody = new TransactionBodyBuilder() - .fromCommunityDraft(communityDraft, community) + const transaction = new GradidoTransactionBuilder() + .setCommunityRoot( + new MemoryBlock(community.rootPubkey), + new MemoryBlock(community.gmwAccount?.derive2Pubkey), + new MemoryBlock(community.aufAccount?.derive2Pubkey), + ) + .setCreatedAt(new Date(communityDraft.createdAt)) + .sign(new KeyPair(community).keyPair) .build() + // build transaction entity - this.transactionBuilder.fromTransactionBody(transactionBody).setCommunity(community) - const transaction = this.transactionBuilder.getTransaction() - // sign - this.transactionBuilder.setSignature(new KeyPair(community).sign(transaction.bodyBytes)) + this.transactionBuilder.fromGradidoTransaction(transaction).setCommunity(community) return this } } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts index 3d3998db1..a38d9952f 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts @@ -1,18 +1,23 @@ +/* eslint-disable camelcase */ import 'reflect-metadata' import { Account } from '@entity/Account' import { Community } from '@entity/Community' -import { Decimal } from 'decimal.js-light' +import { + AddressType_COMMUNITY_HUMAN, + CrossGroupType_INBOUND, + CrossGroupType_LOCAL, + CrossGroupType_OUTBOUND, + InteractionDeserialize, + MemoryBlock, + TransactionType_CREATION, +} from 'gradido-blockchain-js' import { v4 } from 'uuid' import { TestDB } from '@test/TestDB' import { CONFIG } from '@/config' import { KeyPair } from '@/data/KeyPair' -import { Mnemonic } from '@/data/Mnemonic' -import { AddressType } from '@/data/proto/3_3/enum/AddressType' -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' import { TransactionType } from '@/data/proto/3_3/enum/TransactionType' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' import { AccountType } from '@/graphql/enum/AccountType' import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' @@ -34,9 +39,9 @@ CONFIG.IOTA_HOME_COMMUNITY_SEED = '034b0229a2ba4e98e1cc5e8767dca886279b484303ffa const homeCommunityUuid = v4() const foreignCommunityUuid = v4() -const keyPair = new KeyPair(new Mnemonic(CONFIG.IOTA_HOME_COMMUNITY_SEED)) +const keyPair = new KeyPair(MemoryBlock.fromHex(CONFIG.IOTA_HOME_COMMUNITY_SEED)) const foreignKeyPair = new KeyPair( - new Mnemonic('5d4e163c078cc6b51f5c88f8422bc8f21d1d59a284515ab1ea79e1c176ebec50'), + MemoryBlock.fromHex('5d4e163c078cc6b51f5c88f8422bc8f21d1d59a284515ab1ea79e1c176ebec50'), ) let moderator: UserSet @@ -94,16 +99,17 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context derive2Pubkey: firstUser.account.derive2Pubkey, }, }) - - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) - expect(body.registerAddress).toBeDefined() - if (!body.registerAddress) throw new Error() + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() + expect(body?.isRegisterAddress()).toBeTruthy() expect(body).toMatchObject({ - type: CrossGroupType.LOCAL, + type: CrossGroupType_LOCAL, registerAddress: { derivationIndex: 1, - addressType: AddressType.COMMUNITY_HUMAN, + addressType: AddressType_COMMUNITY_HUMAN, }, }) }) @@ -121,9 +127,8 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context await context.run() const transaction = context.getTransactionRecipe() - // console.log(new TransactionLoggingView(transaction)) expect(transaction).toMatchObject({ - type: TransactionType.GRADIDO_CREATION, + type: TransactionType_CREATION, protocolVersion: '3.3', community: { rootPubkey: keyPair.publicKey, @@ -144,15 +149,23 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context ], }) - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() // console.log(new TransactionBodyLoggingView(body)) - expect(body.creation).toBeDefined() - if (!body.creation) throw new Error() - const bodyReceiverPubkey = Buffer.from(body.creation.recipient.pubkey) - expect(bodyReceiverPubkey.compare(firstUser.account.derive2Pubkey)).toBe(0) + expect(body?.isCreation()).toBeTruthy() + + expect( + body + ?.getCreation() + ?.getRecipient() + .getPubkey() + ?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), + ).toBeTruthy() expect(body).toMatchObject({ - type: CrossGroupType.LOCAL, + type: CrossGroupType_LOCAL, creation: { recipient: { amount: '2000', @@ -196,16 +209,23 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context ], }) - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() // console.log(new TransactionBodyLoggingView(body)) - expect(body.transfer).toBeDefined() - if (!body.transfer) throw new Error() - expect(Buffer.from(body.transfer.recipient).compare(secondUser.account.derive2Pubkey)).toBe(0) - expect(Buffer.from(body.transfer.sender.pubkey).compare(firstUser.account.derive2Pubkey)).toBe( - 0, - ) + expect(body?.isTransfer()).toBeTruthy() + const transfer = body?.getTransfer() + expect(transfer).not.toBeNull() + expect( + transfer?.getRecipient()?.equal(new MemoryBlock(secondUser.account.derive2Pubkey)), + ).toBeTruthy() + expect( + transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), + ).toBeTruthy() + expect(body).toMatchObject({ - type: CrossGroupType.LOCAL, + type: CrossGroupType_LOCAL, transfer: { sender: { amount: '100', @@ -248,16 +268,22 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context ], }) - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) - // console.log(new TransactionBodyLoggingView(body)) - expect(body.transfer).toBeDefined() - if (!body.transfer) throw new Error() - expect(Buffer.from(body.transfer.recipient).compare(secondUser.account.derive2Pubkey)).toBe(0) - expect(Buffer.from(body.transfer.sender.pubkey).compare(firstUser.account.derive2Pubkey)).toBe( - 0, - ) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() + expect(body?.isTransfer()).toBeTruthy() + const transfer = body?.getTransfer() + expect(transfer).not.toBeNull() + expect( + transfer?.getRecipient()?.equal(new MemoryBlock(secondUser.account.derive2Pubkey)), + ).toBeTruthy() + expect( + transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), + ).toBeTruthy() + expect(body).toMatchObject({ - type: CrossGroupType.LOCAL, + type: CrossGroupType_LOCAL, transfer: { sender: { amount: '100', @@ -304,16 +330,22 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context }, ], }) - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() // console.log(new TransactionBodyLoggingView(body)) - expect(body.transfer).toBeDefined() - if (!body.transfer) throw new Error() - expect(Buffer.from(body.transfer.recipient).compare(foreignUser.account.derive2Pubkey)).toBe(0) - expect(Buffer.from(body.transfer.sender.pubkey).compare(firstUser.account.derive2Pubkey)).toBe( - 0, - ) + expect(body?.isTransfer()).toBeTruthy() + const transfer = body?.getTransfer() + expect(transfer).not.toBeNull() + expect( + transfer?.getRecipient()?.equal(new MemoryBlock(foreignUser.account.derive2Pubkey)), + ).toBeTruthy() + expect( + transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), + ).toBeTruthy() expect(body).toMatchObject({ - type: CrossGroupType.OUTBOUND, + type: CrossGroupType_OUTBOUND, otherGroup: foreignTopic, transfer: { sender: { @@ -361,16 +393,22 @@ describe('interactions/backendToDb/transaction/Create Transaction Recipe Context }, ], }) - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() // console.log(new TransactionBodyLoggingView(body)) - expect(body.transfer).toBeDefined() - if (!body.transfer) throw new Error() - expect(Buffer.from(body.transfer.recipient).compare(foreignUser.account.derive2Pubkey)).toBe(0) - expect(Buffer.from(body.transfer.sender.pubkey).compare(firstUser.account.derive2Pubkey)).toBe( - 0, - ) + expect(body?.isTransfer()).toBeTruthy() + const transfer = body?.getTransfer() + expect(transfer).not.toBeNull() + expect( + transfer?.getRecipient()?.equal(new MemoryBlock(foreignUser.account.derive2Pubkey)), + ).toBeTruthy() + expect( + transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), + ).toBeTruthy() expect(body).toMatchObject({ - type: CrossGroupType.INBOUND, + type: CrossGroupType_INBOUND, otherGroup: topic, transfer: { sender: { diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts index eb6d6dffd..10bb3f4f6 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts @@ -14,7 +14,6 @@ import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' import { BalanceChangingTransactionRecipeRole } from './BalanceChangingTransactionRecipeRole' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' -import { ReceiveTransactionRole } from './ReceiveTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { SendTransactionRole } from './SendTransaction.role' @@ -55,8 +54,7 @@ export class CreateTransactionRecipeContext { transactionTypeRole = new SendTransactionRole(this.draft) break case InputTransactionType.RECEIVE: - transactionTypeRole = new ReceiveTransactionRole(this.draft) - break + return false } this.transactionRecipe = await new BalanceChangingTransactionRecipeRole().create( this.draft, diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts index f11518d02..40648b566 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts @@ -1,7 +1,8 @@ +/* eslint-disable camelcase */ import { Community } from '@entity/Community' +import { MemoryBlock, GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' import { CommunityRepository } from '@/data/Community.repository' -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { TransactionError } from '@/graphql/model/TransactionError' @@ -19,15 +20,31 @@ export class CreationTransactionRole extends AbstractTransactionRole { return this.self.user } - public getCrossGroupType(): CrossGroupType { - return CrossGroupType.LOCAL + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const recipientUser = await this.loadUser(this.self.user) + if (!this.self.targetDate) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'missing targetDate for contribution', + ) + } + return builder + .setTransactionCreation( + new TransferAmount( + new MemoryBlock(recipientUser.derive2Pubkey), + this.self.amount.toString(), + ), + new Date(this.self.targetDate), + ) + .setMemo('dummy memo for creation') } public async getCommunity(): Promise { if (this.self.user.communityUuid !== this.self.linkedUser.communityUuid) { throw new TransactionError( TransactionErrorType.LOGIC_ERROR, - 'mismatch community uuids on creation transaction', + 'mismatch community uuids on contribution', ) } const community = await CommunityRepository.getCommunityForUserIdentifier(this.self.user) diff --git a/dlt-connector/src/interactions/backendToDb/transaction/ReceiveTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/ReceiveTransaction.role.ts deleted file mode 100644 index bf7c69f0e..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/ReceiveTransaction.role.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' - -import { AbstractTransactionRole } from './AbstractTransaction.role' - -export class ReceiveTransactionRole extends AbstractTransactionRole { - public getSigningUser(): UserIdentifier { - return this.self.linkedUser - } - - public getRecipientUser(): UserIdentifier { - return this.self.user - } - - public getCrossGroupType(): CrossGroupType { - if (this.isCrossGroupTransaction()) { - return CrossGroupType.INBOUND - } - return CrossGroupType.LOCAL - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts index 8b342b1fd..f2a41a72f 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts @@ -1,9 +1,14 @@ import { Account } from '@entity/Account' import { Community } from '@entity/Community' +import { + // eslint-disable-next-line camelcase + AddressType_COMMUNITY_HUMAN, + MemoryBlock, + GradidoTransactionBuilder, +} from 'gradido-blockchain-js' import { AccountLogic } from '@/data/Account.logic' import { CommunityRepository } from '@/data/Community.repository' -import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { TransactionError } from '@/graphql/model/TransactionError' @@ -15,17 +20,32 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRecipeRol userAccountDraft: UserAccountDraft, account: Account, community: Community, - ): Promise { - const bodyBuilder = new TransactionBodyBuilder() + ): Promise { + const user = account.user + if (!user) { + throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'missing user for account') + } + const gradidoTransactionBuilder = new GradidoTransactionBuilder() const communityKeyPair = await CommunityRepository.loadHomeCommunityKeyPair() const signingKeyPair = new AccountLogic(account).calculateKeyPair(communityKeyPair) if (!signingKeyPair) { throw new TransactionError(TransactionErrorType.NOT_FOUND, "couldn't found signing key pair") } + const transaction = gradidoTransactionBuilder + .setRegisterAddress( + new MemoryBlock(user.derive1Pubkey), + AddressType_COMMUNITY_HUMAN, + null, + new MemoryBlock(account.derive2Pubkey), + ) + .setCreatedAt(new Date(userAccountDraft.createdAt)) + .sign(signingKeyPair.keyPair) + .sign(communityKeyPair.keyPair) + .build() + this.transactionBuilder - .fromTransactionBodyBuilder(bodyBuilder.fromUserAccountDraft(userAccountDraft, account)) + .fromGradidoTransaction(transaction) .setCommunity(community) - .setSignature(signingKeyPair.sign(this.transactionBuilder.getTransaction().bodyBytes)) .setSigningAccount(account) return this } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts index 927efdc24..874656cda 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts @@ -1,4 +1,13 @@ -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' +/* eslint-disable camelcase */ +import { + CrossGroupType, + CrossGroupType_LOCAL, + CrossGroupType_OUTBOUND, + MemoryBlock, + GradidoTransactionBuilder, + TransferAmount, +} from 'gradido-blockchain-js' + import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { AbstractTransactionRole } from './AbstractTransaction.role' @@ -12,10 +21,15 @@ export class SendTransactionRole extends AbstractTransactionRole { return this.self.linkedUser } - public getCrossGroupType(): CrossGroupType { - if (this.isCrossGroupTransaction()) { - return CrossGroupType.OUTBOUND - } - return CrossGroupType.LOCAL + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const signingUser = await this.loadUser(this.self.user) + const recipientUser = await this.loadUser(this.self.linkedUser) + return builder + .setTransactionTransfer( + new TransferAmount(new MemoryBlock(signingUser.derive2Pubkey), this.self.amount.toString()), + new MemoryBlock(recipientUser.derive2Pubkey), + ) + .setMemo('dummy memo for transfer') } } diff --git a/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts b/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts index 23fd9d275..e8730f8e3 100644 --- a/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts +++ b/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts @@ -1,68 +1,78 @@ +/* eslint-disable camelcase */ import { Transaction } from '@entity/Transaction' +import { + GradidoTransaction, + GradidoTransactionBuilder, + InteractionSerialize, + InteractionValidate, + MemoryBlock, + TransactionType_COMMUNITY_ROOT, + ValidateType_SINGLE, +} from 'gradido-blockchain-js' import { sendMessage as iotaSendMessage } from '@/client/IotaClient' -import { KeyPair } from '@/data/KeyPair' -import { GradidoTransaction } from '@/data/proto/3_3/GradidoTransaction' -import { SignaturePair } from '@/data/proto/3_3/SignaturePair' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionError } from '@/graphql/model/TransactionError' -import { GradidoTransactionLoggingView } from '@/logging/GradidoTransactionLogging.view' import { logger } from '@/logging/logger' export abstract class AbstractTransactionRecipeRole { - protected transactionBody: TransactionBody - public constructor(protected self: Transaction) { - this.transactionBody = TransactionBody.fromBodyBytes(this.self.bodyBytes) - } + // eslint-disable-next-line no-useless-constructor + public constructor(protected self: Transaction) {} public abstract transmitToIota(): Promise + public abstract getCrossGroupTypeName(): string - protected getGradidoTransaction(): GradidoTransaction { - const transaction = new GradidoTransaction(this.transactionBody) + public validate(transactionBuilder: GradidoTransactionBuilder): GradidoTransaction { + const transaction = transactionBuilder.build() + try { + // throw an exception when something is wrong + const validator = new InteractionValidate(transaction) + validator.run(ValidateType_SINGLE) + } catch (e) { + if (e instanceof Error) { + throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e.message) + } else if (typeof e === 'string') { + throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e) + } else { + throw e + } + } + return transaction + } + + protected getGradidoTransactionBuilder(): GradidoTransactionBuilder { if (!this.self.signature) { throw new TransactionError( TransactionErrorType.MISSING_PARAMETER, 'missing signature in transaction recipe', ) } - const signaturePair = new SignaturePair() - if (this.self.signature.length !== 64) { - throw new TransactionError(TransactionErrorType.INVALID_SIGNATURE, "signature isn't 64 bytes") - } - signaturePair.signature = this.self.signature - if (this.transactionBody.communityRoot) { - const publicKey = this.self.community.rootPubkey + let publicKey: Buffer | undefined + if (this.self.type === TransactionType_COMMUNITY_ROOT) { + publicKey = this.self.community.rootPubkey if (!publicKey) { throw new TransactionError( TransactionErrorType.MISSING_PARAMETER, 'missing community public key for community root transaction', ) } - signaturePair.pubKey = publicKey } else if (this.self.signingAccount) { - const publicKey = this.self.signingAccount.derive2Pubkey + publicKey = this.self.signingAccount.derive2Pubkey if (!publicKey) { throw new TransactionError( TransactionErrorType.MISSING_PARAMETER, 'missing signing account public key for transaction', ) } - signaturePair.pubKey = publicKey } else { throw new TransactionError( TransactionErrorType.NOT_FOUND, "signingAccount not exist and it isn't a community root transaction", ) } - if (signaturePair.validate()) { - transaction.sigMap.sigPair.push(signaturePair) - } - if (!KeyPair.verify(transaction.bodyBytes, signaturePair)) { - logger.debug('invalid signature', new GradidoTransactionLoggingView(transaction)) - throw new TransactionError(TransactionErrorType.INVALID_SIGNATURE, 'signature is invalid') - } - return transaction + return new GradidoTransactionBuilder() + .setTransactionBody(new MemoryBlock(this.self.bodyBytes)) + .addSignaturePair(new MemoryBlock(publicKey), new MemoryBlock(this.self.signature)) } /** @@ -76,9 +86,15 @@ export abstract class AbstractTransactionRecipeRole { topic: string, ): Promise { // protobuf serializing function - const messageBuffer = GradidoTransaction.encode(gradidoTransaction).finish() + const serialized = new InteractionSerialize(gradidoTransaction).run() + if (!serialized) { + throw new TransactionError( + TransactionErrorType.PROTO_ENCODE_ERROR, + 'cannot serialize transaction', + ) + } const resultMessage = await iotaSendMessage( - messageBuffer, + Uint8Array.from(serialized.data()), Uint8Array.from(Buffer.from(topic, 'hex')), ) logger.info('transmitted Gradido Transaction to Iota', { diff --git a/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts b/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts index 2f18b48ac..afa171a37 100644 --- a/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts +++ b/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts @@ -1,6 +1,6 @@ import { Transaction } from '@entity/Transaction' +import { MemoryBlock } from 'gradido-blockchain-js' -import { TransactionLogic } from '@/data/Transaction.logic' import { logger } from '@/logging/logger' import { TransactionLoggingView } from '@/logging/TransactionLogging.view' import { LogError } from '@/server/LogError' @@ -12,9 +12,13 @@ import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipe.role' * need to set gradido id from OUTBOUND transaction! */ export class InboundTransactionRecipeRole extends AbstractTransactionRecipeRole { + public getCrossGroupTypeName(): string { + return 'INBOUND' + } + public async transmitToIota(): Promise { logger.debug('transmit INBOUND transaction to iota', new TransactionLoggingView(this.self)) - const gradidoTransaction = this.getGradidoTransaction() + const builder = this.getGradidoTransactionBuilder() const pairingTransaction = await new TransactionLogic(this.self).findPairTransaction() if (!pairingTransaction.iotaMessageId || pairingTransaction.iotaMessageId.length !== 32) { throw new LogError( @@ -22,7 +26,7 @@ export class InboundTransactionRecipeRole extends AbstractTransactionRecipeRole new TransactionLoggingView(pairingTransaction), ) } - gradidoTransaction.parentMessageId = pairingTransaction.iotaMessageId + builder.setParentMessageId(new MemoryBlock(pairingTransaction.iotaMessageId)) this.self.pairingTransactionId = pairingTransaction.id this.self.pairingTransaction = pairingTransaction pairingTransaction.pairingTransactionId = this.self.id @@ -32,7 +36,7 @@ export class InboundTransactionRecipeRole extends AbstractTransactionRecipeRole } this.self.iotaMessageId = await this.sendViaIota( - gradidoTransaction, + this.validate(builder), this.self.otherCommunity.iotaTopic, ) return this.self diff --git a/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts b/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts index 60cc58ff7..10f862d9a 100644 --- a/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts +++ b/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts @@ -1,23 +1,22 @@ import { Transaction } from '@entity/Transaction' -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' import { logger } from '@/logging/logger' import { TransactionLoggingView } from '@/logging/TransactionLogging.view' import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipe.role' export class LocalTransactionRecipeRole extends AbstractTransactionRecipeRole { + public getCrossGroupTypeName(): string { + return 'LOCAL' + } + public async transmitToIota(): Promise { - let transactionCrossGroupTypeName = 'LOCAL' - if (this.transactionBody) { - transactionCrossGroupTypeName = CrossGroupType[this.transactionBody.type] - } logger.debug( - `transmit ${transactionCrossGroupTypeName} transaction to iota`, + `transmit ${this.getCrossGroupTypeName()} transaction to iota`, new TransactionLoggingView(this.self), ) this.self.iotaMessageId = await this.sendViaIota( - this.getGradidoTransaction(), + this.validate(this.getGradidoTransactionBuilder()), this.self.community.iotaTopic, ) return this.self diff --git a/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts b/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts index a54cd8ec3..d3b0b67c4 100644 --- a/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts +++ b/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts @@ -3,4 +3,8 @@ import { LocalTransactionRecipeRole } from './LocalTransactionRecipe.role' /** * Outbound Transaction on sender community, mark the gradidos as sended out of community */ -export class OutboundTransactionRecipeRole extends LocalTransactionRecipeRole {} +export class OutboundTransactionRecipeRole extends LocalTransactionRecipeRole { + public getCrossGroupTypeName(): string { + return 'OUTBOUND' + } +} diff --git a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts index 520c4e143..f366be2b4 100644 --- a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts +++ b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts @@ -1,6 +1,7 @@ import 'reflect-metadata' import { Account } from '@entity/Account' import { Decimal } from 'decimal.js-light' +import { CrossGroupType_INBOUND, CrossGroupType_OUTBOUND, InteractionDeserialize, InteractionToJson, InteractionValidate, MemoryBlock } from 'gradido-blockchain-js' import { v4 } from 'uuid' import { TestDB } from '@test/TestDB' @@ -8,8 +9,6 @@ import { TestDB } from '@test/TestDB' import { CONFIG } from '@/config' import { KeyPair } from '@/data/KeyPair' import { Mnemonic } from '@/data/Mnemonic' -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { logger } from '@/logging/logger' @@ -76,7 +75,7 @@ describe('interactions/transmitToIota/TransmitToIotaContext', () => { it('LOCAL transaction', async () => { const creationTransactionDraft = new TransactionDraft() - creationTransactionDraft.amount = new Decimal('2000') + creationTransactionDraft.amount = new Decimal('1000') creationTransactionDraft.backendTransactionId = 1 creationTransactionDraft.createdAt = new Date().toISOString() creationTransactionDraft.linkedUser = moderator.identifier @@ -116,8 +115,11 @@ describe('interactions/transmitToIota/TransmitToIotaContext', () => { await transactionRecipeContext.run() const transaction = transactionRecipeContext.getTransactionRecipe() await transaction.save() - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) - expect(body.type).toBe(CrossGroupType.OUTBOUND) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body).not.toBeNull() + expect(body?.getType()).toEqual(CrossGroupType_OUTBOUND) const context = new TransmitToIotaContext(transaction) const debugSpy = jest.spyOn(logger, 'debug') await context.run() @@ -148,8 +150,10 @@ describe('interactions/transmitToIota/TransmitToIotaContext', () => { const transaction = transactionRecipeContext.getTransactionRecipe() await transaction.save() // console.log(new TransactionLoggingView(transaction)) - const body = TransactionBody.fromBodyBytes(transaction.bodyBytes) - expect(body.type).toBe(CrossGroupType.INBOUND) + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const body = deserializer.getTransactionBody() + expect(body?.getType()).toEqual(CrossGroupType_INBOUND) const context = new TransmitToIotaContext(transaction) const debugSpy = jest.spyOn(logger, 'debug') diff --git a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts index e58cd7e89..69c9ade3f 100644 --- a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts +++ b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts @@ -1,7 +1,15 @@ +/* eslint-disable camelcase */ import { Transaction } from '@entity/Transaction' +import { + CrossGroupType_INBOUND, + CrossGroupType_LOCAL, + CrossGroupType_OUTBOUND, + InteractionDeserialize, + MemoryBlock, +} from 'gradido-blockchain-js' -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionError } from '@/graphql/model/TransactionError' import { logger } from '@/logging/logger' import { TransactionLoggingView } from '@/logging/TransactionLogging.view' import { LogError } from '@/server/LogError' @@ -21,19 +29,27 @@ export class TransmitToIotaContext { private transactionRecipeRole: AbstractTransactionRecipeRole public constructor(transaction: Transaction) { - const transactionBody = TransactionBody.fromBodyBytes(transaction.bodyBytes) - switch (transactionBody.type) { - case CrossGroupType.LOCAL: + const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) + deserializer.run() + const transactionBody = deserializer.getTransactionBody() + if (!transactionBody) { + throw new TransactionError( + TransactionErrorType.PROTO_DECODE_ERROR, + 'error decoding body bytes', + ) + } + switch (transactionBody.getType()) { + case CrossGroupType_LOCAL: this.transactionRecipeRole = new LocalTransactionRecipeRole(transaction) break - case CrossGroupType.INBOUND: + case CrossGroupType_INBOUND: this.transactionRecipeRole = new InboundTransactionRecipeRole(transaction) break - case CrossGroupType.OUTBOUND: + case CrossGroupType_OUTBOUND: this.transactionRecipeRole = new OutboundTransactionRecipeRole(transaction) break default: - throw new LogError('unknown cross group type', transactionBody.type) + throw new LogError('unknown cross group type', transactionBody.getType()) } } diff --git a/dlt-connector/src/logging/AbstractLogging.view.ts b/dlt-connector/src/logging/AbstractLogging.view.ts index ad52e6530..e5f439b5d 100644 --- a/dlt-connector/src/logging/AbstractLogging.view.ts +++ b/dlt-connector/src/logging/AbstractLogging.view.ts @@ -1,10 +1,7 @@ import util from 'util' import { Decimal } from 'decimal.js-light' - -import { Timestamp } from '@/data/proto/3_3/Timestamp' -import { TimestampSeconds } from '@/data/proto/3_3/TimestampSeconds' -import { timestampSecondsToDate, timestampToDate } from '@/utils/typeConverter' +import { Timestamp, TimestampSeconds } from 'gradido-blockchain-js' export abstract class AbstractLoggingView { protected bufferStringFormat: BufferEncoding = 'hex' @@ -36,14 +33,14 @@ export abstract class AbstractLoggingView { } protected timestampSecondsToDateString(timestamp: TimestampSeconds): string | undefined { - if (timestamp && timestamp.seconds) { - return timestampSecondsToDate(timestamp).toISOString() + if (timestamp && timestamp.getSeconds()) { + return timestamp.getDate().toISOString() } } protected timestampToDateString(timestamp: Timestamp): string | undefined { - if (timestamp && (timestamp.seconds || timestamp.nanoSeconds)) { - return timestampToDate(timestamp).toISOString() + if (timestamp && (timestamp.getSeconds() || timestamp.getNanos())) { + return timestamp.getDate().toISOString() } } } diff --git a/dlt-connector/src/logging/AccountLogging.view.ts b/dlt-connector/src/logging/AccountLogging.view.ts index 0c97ce469..f1a7abe20 100644 --- a/dlt-connector/src/logging/AccountLogging.view.ts +++ b/dlt-connector/src/logging/AccountLogging.view.ts @@ -1,7 +1,8 @@ import { Account } from '@entity/Account' +import { addressTypeToString } from 'gradido-blockchain-js' -import { AddressType } from '@/data/proto/3_3/enum/AddressType' -import { getEnumValue } from '@/utils/typeConverter' +import { AccountType } from '@/graphql/enum/AccountType' +import { accountTypeToAddressType } from '@/utils/typeConverter' import { AbstractLoggingView } from './AbstractLogging.view' import { UserLoggingView } from './UserLogging.view' @@ -17,7 +18,9 @@ export class AccountLoggingView extends AbstractLoggingView { user: this.account.user ? new UserLoggingView(this.account.user).toJSON() : null, derivationIndex: this.account.derivationIndex, derive2Pubkey: this.account.derive2Pubkey.toString(this.bufferStringFormat), - type: getEnumValue(AddressType, this.account.type), + type: addressTypeToString( + accountTypeToAddressType(this.account.type as unknown as AccountType), + ), createdAt: this.dateToString(this.account.createdAt), confirmedAt: this.dateToString(this.account.confirmedAt), balanceOnConfirmation: this.decimalToString(this.account.balanceOnConfirmation), diff --git a/dlt-connector/src/logging/CommunityRootLogging.view.ts b/dlt-connector/src/logging/CommunityRootLogging.view.ts deleted file mode 100644 index ba2869755..000000000 --- a/dlt-connector/src/logging/CommunityRootLogging.view.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommunityRoot } from '@/data/proto/3_3/CommunityRoot' - -import { AbstractLoggingView } from './AbstractLogging.view' - -export class CommunityRootLoggingView extends AbstractLoggingView { - public constructor(private self: CommunityRoot) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - rootPubkey: Buffer.from(this.self.rootPubkey).toString(this.bufferStringFormat), - gmwPubkey: Buffer.from(this.self.gmwPubkey).toString(this.bufferStringFormat), - aufPubkey: Buffer.from(this.self.aufPubkey).toString(this.bufferStringFormat), - } - } -} diff --git a/dlt-connector/src/logging/ConfirmedTransactionLogging.view.ts b/dlt-connector/src/logging/ConfirmedTransactionLogging.view.ts deleted file mode 100644 index 8e894a35a..000000000 --- a/dlt-connector/src/logging/ConfirmedTransactionLogging.view.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ConfirmedTransaction } from '@/data/proto/3_3/ConfirmedTransaction' -import { timestampSecondsToDate } from '@/utils/typeConverter' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { GradidoTransactionLoggingView } from './GradidoTransactionLogging.view' - -export class ConfirmedTransactionLoggingView extends AbstractLoggingView { - public constructor(private self: ConfirmedTransaction) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - id: this.self.id.toString(), - transaction: new GradidoTransactionLoggingView(this.self.transaction).toJSON(), - confirmedAt: this.dateToString(timestampSecondsToDate(this.self.confirmedAt)), - versionNumber: this.self.versionNumber, - runningHash: Buffer.from(this.self.runningHash).toString(this.bufferStringFormat), - messageId: Buffer.from(this.self.messageId).toString(this.bufferStringFormat), - accountBalance: this.self.accountBalance, - } - } -} diff --git a/dlt-connector/src/logging/GradidoCreationLogging.view.ts b/dlt-connector/src/logging/GradidoCreationLogging.view.ts deleted file mode 100644 index 43e14b887..000000000 --- a/dlt-connector/src/logging/GradidoCreationLogging.view.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { GradidoCreation } from '@/data/proto/3_3/GradidoCreation' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { TransferAmountLoggingView } from './TransferAmountLogging.view' - -export class GradidoCreationLoggingView extends AbstractLoggingView { - public constructor(private self: GradidoCreation) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - recipient: new TransferAmountLoggingView(this.self.recipient).toJSON(), - targetDate: this.timestampSecondsToDateString(this.self.targetDate), - } - } -} diff --git a/dlt-connector/src/logging/GradidoDeferredTransferLogging.view.ts b/dlt-connector/src/logging/GradidoDeferredTransferLogging.view.ts deleted file mode 100644 index 89a1f1a29..000000000 --- a/dlt-connector/src/logging/GradidoDeferredTransferLogging.view.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { GradidoDeferredTransfer } from '@/data/proto/3_3/GradidoDeferredTransfer' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { GradidoTransferLoggingView } from './GradidoTransferLogging.view' - -export class GradidoDeferredTransferLoggingView extends AbstractLoggingView { - public constructor(private self: GradidoDeferredTransfer) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - ...new GradidoTransferLoggingView(this.self.transfer).toJSON(), - ...{ timeout: this.timestampSecondsToDateString(this.self.timeout) }, - } - } -} diff --git a/dlt-connector/src/logging/GradidoTransactionLogging.view.ts b/dlt-connector/src/logging/GradidoTransactionLogging.view.ts deleted file mode 100644 index f23c0b05e..000000000 --- a/dlt-connector/src/logging/GradidoTransactionLogging.view.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { GradidoTransaction } from '@/data/proto/3_3/GradidoTransaction' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { SignatureMapLoggingView } from './SignatureMapLogging.view' -import { TransactionBodyLoggingView } from './TransactionBodyLogging.view' - -export class GradidoTransactionLoggingView extends AbstractLoggingView { - public constructor(private self: GradidoTransaction) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - let transactionBody: TransactionBody | null | unknown = null - try { - transactionBody = new TransactionBodyLoggingView(this.self.getTransactionBody()) - } catch (e) { - transactionBody = e - } - return { - sigMap: new SignatureMapLoggingView(this.self.sigMap).toJSON(), - bodyBytes: transactionBody, - parentMessageId: this.self.parentMessageId - ? Buffer.from(this.self.parentMessageId).toString(this.bufferStringFormat) - : undefined, - } - } -} diff --git a/dlt-connector/src/logging/GradidoTransferLogging.view.ts b/dlt-connector/src/logging/GradidoTransferLogging.view.ts deleted file mode 100644 index 84b5fe604..000000000 --- a/dlt-connector/src/logging/GradidoTransferLogging.view.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { GradidoTransfer } from '@/data/proto/3_3/GradidoTransfer' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { TransferAmountLoggingView } from './TransferAmountLogging.view' - -export class GradidoTransferLoggingView extends AbstractLoggingView { - public constructor(private self: GradidoTransfer) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - sender: new TransferAmountLoggingView(this.self.sender), - recipient: Buffer.from(this.self.recipient).toString(this.bufferStringFormat), - } - } -} diff --git a/dlt-connector/src/logging/GroupFriendsUpdateLogging.view.ts b/dlt-connector/src/logging/GroupFriendsUpdateLogging.view.ts deleted file mode 100644 index 8d1159d82..000000000 --- a/dlt-connector/src/logging/GroupFriendsUpdateLogging.view.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { GroupFriendsUpdate } from '@/data/proto/3_3/GroupFriendsUpdate' - -import { AbstractLoggingView } from './AbstractLogging.view' - -export class GroupFriendsUpdateLoggingView extends AbstractLoggingView { - public constructor(private self: GroupFriendsUpdate) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - colorFusion: this.self.colorFusion, - } - } -} diff --git a/dlt-connector/src/logging/RegisterAddressLogging.view.ts b/dlt-connector/src/logging/RegisterAddressLogging.view.ts deleted file mode 100644 index bb857e2b8..000000000 --- a/dlt-connector/src/logging/RegisterAddressLogging.view.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AddressType } from '@/data/proto/3_3/enum/AddressType' -import { RegisterAddress } from '@/data/proto/3_3/RegisterAddress' -import { getEnumValue } from '@/utils/typeConverter' - -import { AbstractLoggingView } from './AbstractLogging.view' - -export class RegisterAddressLoggingView extends AbstractLoggingView { - public constructor(private self: RegisterAddress) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - userPublicKey: Buffer.from(this.self.userPubkey).toString(this.bufferStringFormat), - addressType: getEnumValue(AddressType, this.self.addressType), - nameHash: Buffer.from(this.self.nameHash).toString(this.bufferStringFormat), - accountPublicKey: Buffer.from(this.self.accountPubkey).toString(this.bufferStringFormat), - derivationIndex: this.self.derivationIndex, - } - } -} diff --git a/dlt-connector/src/logging/SignatureMapLogging.view.ts b/dlt-connector/src/logging/SignatureMapLogging.view.ts deleted file mode 100644 index 93feb46f9..000000000 --- a/dlt-connector/src/logging/SignatureMapLogging.view.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { SignatureMap } from '@/data/proto/3_3/SignatureMap' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { SignaturePairLoggingView } from './SignaturePairLogging.view' - -export class SignatureMapLoggingView extends AbstractLoggingView { - public constructor(private self: SignatureMap) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - sigPair: this.self.sigPair.map((value) => new SignaturePairLoggingView(value).toJSON()), - } - } -} diff --git a/dlt-connector/src/logging/SignaturePairLogging.view.ts b/dlt-connector/src/logging/SignaturePairLogging.view.ts deleted file mode 100644 index e88406098..000000000 --- a/dlt-connector/src/logging/SignaturePairLogging.view.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { SignaturePair } from '@/data/proto/3_3/SignaturePair' - -import { AbstractLoggingView } from './AbstractLogging.view' - -export class SignaturePairLoggingView extends AbstractLoggingView { - public constructor(private self: SignaturePair) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - pubkey: Buffer.from(this.self.pubKey).toString(this.bufferStringFormat), - signature: - Buffer.from(this.self.signature).subarray(0, 31).toString(this.bufferStringFormat) + '..', - } - } -} diff --git a/dlt-connector/src/logging/TransactionBodyLogging.view.ts b/dlt-connector/src/logging/TransactionBodyLogging.view.ts deleted file mode 100644 index 0c287b0a5..000000000 --- a/dlt-connector/src/logging/TransactionBodyLogging.view.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { CrossGroupType } from '@/data/proto/3_3/enum/CrossGroupType' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' -import { getEnumValue } from '@/utils/typeConverter' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { CommunityRootLoggingView } from './CommunityRootLogging.view' -import { GradidoCreationLoggingView } from './GradidoCreationLogging.view' -import { GradidoDeferredTransferLoggingView } from './GradidoDeferredTransferLogging.view' -import { GradidoTransferLoggingView } from './GradidoTransferLogging.view' -import { GroupFriendsUpdateLoggingView } from './GroupFriendsUpdateLogging.view' -import { RegisterAddressLoggingView } from './RegisterAddressLogging.view' - -export class TransactionBodyLoggingView extends AbstractLoggingView { - public constructor(private self: TransactionBody) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - memo: this.self.memo, - createdAt: this.timestampToDateString(this.self.createdAt), - versionNumber: this.self.versionNumber, - type: getEnumValue(CrossGroupType, this.self.type), - otherGroup: this.self.otherGroup, - transfer: this.self.transfer - ? new GradidoTransferLoggingView(this.self.transfer).toJSON() - : undefined, - creation: this.self.creation - ? new GradidoCreationLoggingView(this.self.creation).toJSON() - : undefined, - groupFriendsUpdate: this.self.groupFriendsUpdate - ? new GroupFriendsUpdateLoggingView(this.self.groupFriendsUpdate).toJSON() - : undefined, - registerAddress: this.self.registerAddress - ? new RegisterAddressLoggingView(this.self.registerAddress).toJSON() - : undefined, - deferredTransfer: this.self.deferredTransfer - ? new GradidoDeferredTransferLoggingView(this.self.deferredTransfer).toJSON() - : undefined, - communityRoot: this.self.communityRoot - ? new CommunityRootLoggingView(this.self.communityRoot).toJSON() - : undefined, - } - } -} diff --git a/dlt-connector/src/logging/TransferAmountLogging.view.ts b/dlt-connector/src/logging/TransferAmountLogging.view.ts deleted file mode 100644 index 2384bfdb4..000000000 --- a/dlt-connector/src/logging/TransferAmountLogging.view.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { TransferAmount } from '@/data/proto/3_3/TransferAmount' - -import { AbstractLoggingView } from './AbstractLogging.view' - -export class TransferAmountLoggingView extends AbstractLoggingView { - public constructor(private self: TransferAmount) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - pubkey: Buffer.from(this.self.pubkey).toString(this.bufferStringFormat), - amount: this.self.amount, - communityId: this.self.communityId, - } - } -} diff --git a/dlt-connector/src/utils/derivationHelper.test.ts b/dlt-connector/src/utils/derivationHelper.test.ts index f14b99cdf..6d3d690ee 100644 --- a/dlt-connector/src/utils/derivationHelper.test.ts +++ b/dlt-connector/src/utils/derivationHelper.test.ts @@ -1,16 +1,10 @@ import 'reflect-metadata' -import { Timestamp } from '../data/proto/3_3/Timestamp' import { hardenDerivationIndex, HARDENED_KEY_BITMASK } from './derivationHelper' -import { timestampToDate } from './typeConverter' describe('utils', () => { it('test bitmask for hardened keys', () => { const derivationIndex = hardenDerivationIndex(1) expect(derivationIndex).toBeGreaterThan(HARDENED_KEY_BITMASK) }) - it('test TimestampToDate', () => { - const date = new Date('2011-04-17T12:01:10.109') - expect(timestampToDate(new Timestamp(date))).toEqual(date) - }) }) diff --git a/dlt-connector/src/utils/typeConverter.test.ts b/dlt-connector/src/utils/typeConverter.test.ts index 4caee94bb..05fb903b6 100644 --- a/dlt-connector/src/utils/typeConverter.test.ts +++ b/dlt-connector/src/utils/typeConverter.test.ts @@ -1,14 +1,6 @@ import 'reflect-metadata' -import { Timestamp } from '@/data/proto/3_3/Timestamp' - -import { - base64ToBuffer, - iotaTopicFromCommunityUUID, - timestampSecondsToDate, - timestampToDate, - uuid4ToBuffer, -} from './typeConverter' +import { base64ToBuffer, iotaTopicFromCommunityUUID, uuid4ToBuffer } from './typeConverter' describe('utils/typeConverter', () => { it('uuid4ToBuffer', () => { @@ -23,20 +15,6 @@ describe('utils/typeConverter', () => { ) }) - it('timestampToDate', () => { - const now = new Date('Thu, 05 Oct 2023 11:55:18.102 +0000') - const timestamp = new Timestamp(now) - expect(timestamp.seconds).toBe(Math.round(now.getTime() / 1000)) - expect(timestampToDate(timestamp)).toEqual(now) - }) - - it('timestampSecondsToDate', () => { - const now = new Date('Thu, 05 Oct 2023 11:55:18.102 +0000') - const timestamp = new Timestamp(now) - expect(timestamp.seconds).toBe(Math.round(now.getTime() / 1000)) - expect(timestampSecondsToDate(timestamp)).toEqual(new Date('Thu, 05 Oct 2023 11:55:18 +0000')) - }) - it('base64ToBuffer', () => { expect(base64ToBuffer('MTizWQMR/fCoI+FzyqlIe30nXCP6sHEGtLE2TLA4r/0=')).toStrictEqual( Buffer.from('3138b3590311fdf0a823e173caa9487b7d275c23fab07106b4b1364cb038affd', 'hex'), diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index 52dcd2a98..9290fdd82 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -1,14 +1,17 @@ +/* eslint-disable camelcase */ +import { + AddressType, + AddressType_COMMUNITY_AUF, + AddressType_COMMUNITY_GMW, + AddressType_COMMUNITY_HUMAN, + AddressType_COMMUNITY_PROJECT, + AddressType_CRYPTO_ACCOUNT, + AddressType_NONE, + AddressType_SUBACCOUNT, +} from 'gradido-blockchain-js' import { crypto_generichash as cryptoHash } from 'sodium-native' -import { AddressType } from '@/data/proto/3_3/enum/AddressType' -import { Timestamp } from '@/data/proto/3_3/Timestamp' -import { TimestampSeconds } from '@/data/proto/3_3/TimestampSeconds' -import { TransactionBody } from '@/data/proto/3_3/TransactionBody' import { AccountType } from '@/graphql/enum/AccountType' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionError } from '@/graphql/model/TransactionError' -import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' export const uuid4ToBuffer = (uuid: string): Buffer => { // Remove dashes from the UUIDv4 string @@ -26,44 +29,10 @@ export const iotaTopicFromCommunityUUID = (communityUUID: string): string => { return hash.toString('hex') } -export const timestampToDate = (timestamp: Timestamp): Date => { - let milliseconds = timestamp.nanoSeconds / 1000000 - milliseconds += timestamp.seconds * 1000 - return new Date(milliseconds) -} - -export const timestampSecondsToDate = (timestamp: TimestampSeconds): Date => { - return new Date(timestamp.seconds * 1000) -} - export const base64ToBuffer = (base64: string): Buffer => { return Buffer.from(base64, 'base64') } -export const bodyBytesToTransactionBody = (bodyBytes: Buffer): TransactionBody => { - try { - return TransactionBody.decode(new Uint8Array(bodyBytes)) - } catch (error) { - logger.error('error decoding body from gradido transaction: %s', error) - throw new TransactionError( - TransactionErrorType.PROTO_DECODE_ERROR, - 'cannot decode body from gradido transaction', - ) - } -} - -export const transactionBodyToBodyBytes = (transactionBody: TransactionBody): Buffer => { - try { - return Buffer.from(TransactionBody.encode(transactionBody).finish()) - } catch (error) { - logger.error('error encoding transaction body to body bytes', error) - throw new TransactionError( - TransactionErrorType.PROTO_ENCODE_ERROR, - 'cannot encode transaction body', - ) - } -} - export function getEnumValue>( enumType: T, value: number | string, @@ -81,27 +50,39 @@ export function getEnumValue>( } export const accountTypeToAddressType = (type: AccountType): AddressType => { - const typeString: string = AccountType[type] - const addressType: AddressType = AddressType[typeString as keyof typeof AddressType] - - if (!addressType) { - throw new LogError("couldn't find corresponding AddressType for AccountType", { - accountType: type, - addressTypes: Object.keys(AddressType), - }) + switch (type) { + case AccountType.COMMUNITY_AUF: + return AddressType_COMMUNITY_AUF + case AccountType.COMMUNITY_GMW: + return AddressType_COMMUNITY_GMW + case AccountType.COMMUNITY_HUMAN: + return AddressType_COMMUNITY_HUMAN + case AccountType.COMMUNITY_PROJECT: + return AddressType_COMMUNITY_PROJECT + case AccountType.CRYPTO_ACCOUNT: + return AddressType_CRYPTO_ACCOUNT + case AccountType.SUBACCOUNT: + return AddressType_SUBACCOUNT + default: + return AddressType_NONE } - return addressType } export const addressTypeToAccountType = (type: AddressType): AccountType => { - const typeString: string = AddressType[type] - const accountType: AccountType = AccountType[typeString as keyof typeof AccountType] - - if (!accountType) { - throw new LogError("couldn't find corresponding AccountType for AddressType", { - addressTypes: type, - accountType: Object.keys(AccountType), - }) + switch (type) { + case AddressType_COMMUNITY_AUF: + return AccountType.COMMUNITY_AUF + case AddressType_COMMUNITY_GMW: + return AccountType.COMMUNITY_GMW + case AddressType_COMMUNITY_HUMAN: + return AccountType.COMMUNITY_HUMAN + case AddressType_COMMUNITY_PROJECT: + return AccountType.COMMUNITY_PROJECT + case AddressType_CRYPTO_ACCOUNT: + return AccountType.CRYPTO_ACCOUNT + case AddressType_SUBACCOUNT: + return AccountType.SUBACCOUNT + default: + return AccountType.NONE } - return accountType } diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 3188c39a0..33c00a820 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -2,18 +2,13 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@apollo/cache-control-types@^1.0.3": version "1.0.3" @@ -49,9 +44,9 @@ "@apollo/utils.logger" "^2.0.0" "@apollo/server@^4.7.5": - 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== + version "4.11.0" + resolved "https://registry.yarnpkg.com/@apollo/server/-/server-4.11.0.tgz#21c0f10ad805192a5485e58ed5c5b3dbe2243174" + integrity sha512-SWDvbbs0wl2zYhKG6aGLxwTJ72xpqp0awb2lotNpfezd9VcAvzaUizzKQqocephin2uMoaA8MguoyBmgtPzNWw== dependencies: "@apollo/cache-control-types" "^1.0.3" "@apollo/server-gateway-interface" "^1.1.1" @@ -64,12 +59,10 @@ "@apollo/utils.usagereporting" "^2.1.0" "@apollo/utils.withrequired" "^2.0.0" "@graphql-tools/schema" "^9.0.0" - "@josephg/resolvable" "^1.0.0" "@types/express" "^4.17.13" "@types/express-serve-static-core" "^4.17.30" "@types/node-fetch" "^2.6.1" async-retry "^1.2.1" - body-parser "^1.20.0" cors "^2.8.5" express "^4.17.1" loglevel "^1.6.8" @@ -106,9 +99,9 @@ integrity sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A== "@apollo/utils.fetcher@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.fetcher/-/utils.fetcher-3.0.0.tgz#1eb49f95a09fc7e34f9e000af29ff5ec05f808bf" - integrity sha512-WL4pabs5TwWyl2ho0DMk5uRtsD4ORsP/7po83y03CrkCCBAB+E4cs6OteLPaQtizYGiBfMpANxWi11Cy3pwsUA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.fetcher/-/utils.fetcher-3.1.0.tgz#0639c30a5ac57e3e62784b180495023f5e886fe0" + integrity sha512-Z3QAyrsQkvrdTuHAFwWDNd+0l50guwoQUoaDQssLOjkmnmVuvXlJykqlEJolio+4rFwBnWdoY1ByFdKaQEcm7A== "@apollo/utils.isnodelike@^2.0.0", "@apollo/utils.isnodelike@^2.0.1": version "2.0.1" @@ -167,155 +160,131 @@ 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.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== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" - integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.0" - "@babel/parser" "^7.23.0" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@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== +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" -"@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== +"@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.24.8", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" -"@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" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: - "@babel/types" "^7.22.5" - -"@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== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - 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.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@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.23.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -331,14 +300,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -352,7 +335,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -366,7 +349,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -394,7 +377,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -402,51 +392,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.8" -"@babel/runtime@^7.21.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== +"@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== dependencies: - regenerator-runtime "^0.14.0" + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" -"@babel/template@^7.22.15", "@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== +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2", "@babel/traverse@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.23.0", "@babel/traverse@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -477,14 +457,14 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.9.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.0.tgz#7ccb5f58703fa61ffdcbf39e2c604a109e781162" - integrity sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ== + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== -"@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== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -496,15 +476,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.50.0": - version "8.50.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484" - integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@faker-js/faker@^8.0.2": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.1.0.tgz#e14896f1c57af2495e341dc4c7bf04125c8aeafd" - integrity sha512-38DT60rumHfBYynif3lmtxMqMqmsOQIxQgEuPZxCk2yUYN0eqWpTACgxi0VpidvsJB8CRxCpvP7B3anK85FjtQ== +"@faker-js/faker@^8.4.1": + version "8.4.1" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.4.1.tgz#5d5e8aee8fce48f5e189bf730ebd1f758f491451" + integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== "@graphql-tools/merge@^8.4.1": version "8.4.2" @@ -514,31 +494,31 @@ "@graphql-tools/utils" "^9.2.1" tslib "^2.4.0" -"@graphql-tools/merge@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.0.tgz#b0a3636c82716454bff88e9bb40108b0471db281" - integrity sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q== +"@graphql-tools/merge@^9.0.6": + version "9.0.7" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.7.tgz#e37dd9491e65c00fb124f47073121d32dc6735d1" + integrity sha512-lbTrIuXIbUSmSumHkPRY1QX0Z8JEtmRhnIrkH7vkfeEmf0kNn/nCWvJwqokm5U7L+a+DA1wlRM4slIlbfXjJBA== dependencies: - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/utils" "^10.5.4" tslib "^2.4.0" "@graphql-tools/mock@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-9.0.0.tgz#9d4cd3d41333b2c09fee4f248a236aa959906b82" - integrity sha512-Vbb4RNTT9T3fXjmzACcflOh79vKBaC/J21eCJ0eug1ZdaM2QXVHQ3lxE6HNOlAENHXjwJINz1AnKsvF3bpeSKA== + version "9.0.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-9.0.4.tgz#6eb52a3f63646ea359ece60916b67c2cbc4fb9d4" + integrity sha512-/pfrBoL6QkKBrJcaOZ/2FtfoAYmiQE+L6Up3hWbSWjg1XJfecjqptLTcM2Wf0dmHAFkjCK1k4QVNHMmGJ94IOA== dependencies: - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/schema" "^10.0.4" + "@graphql-tools/utils" "^10.2.1" fast-json-stable-stringify "^2.1.0" tslib "^2.4.0" -"@graphql-tools/schema@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" - integrity sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg== +"@graphql-tools/schema@^10.0.4": + version "10.0.6" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.6.tgz#48391195ea4557ef5b6f77950bcbf529dc5f4e7e" + integrity sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ== dependencies: - "@graphql-tools/merge" "^9.0.0" - "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/merge" "^9.0.6" + "@graphql-tools/utils" "^10.5.4" tslib "^2.4.0" value-or-promise "^1.0.12" @@ -552,12 +532,13 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/utils@^10.0.0": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.6.tgz#8a809d6bc0df27ffe8964696f182af2383b5974b" - integrity sha512-hZMjl/BbX10iagovakgf3IiqArx8TPsotq5pwBld37uIX1JiZoSbgbCIFol7u55bh32o6cfDEiiJgfAD5fbeyQ== +"@graphql-tools/utils@^10.2.1", "@graphql-tools/utils@^10.5.4": + version "10.5.4" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.5.4.tgz#214d815632a774f2db56bcaf7cfbd615ef858078" + integrity sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ== dependencies: "@graphql-typed-document-node/core" "^3.1.1" + cross-inspect "1.0.1" dset "^3.1.2" tslib "^2.4.0" @@ -574,13 +555,31 @@ resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== -"@humanwhocodes/config-array@^0.11.11": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== +"@graphql-yoga/subscription@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@graphql-yoga/subscription/-/subscription-5.0.1.tgz#affe9b4bca4303300cc9492d30dfbe9f089fe0e8" + integrity sha512-1wCB1DfAnaLzS+IdoOzELGGnx1ODEg9nzQXFh4u2j02vAnne6d+v4A7HIH9EqzVdPLoAaMKXCZUUdKs+j3z1fg== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@graphql-yoga/typed-event-target" "^3.0.0" + "@repeaterjs/repeater" "^3.0.4" + "@whatwg-node/events" "^0.1.0" + tslib "^2.5.2" + +"@graphql-yoga/typed-event-target@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@graphql-yoga/typed-event-target/-/typed-event-target-3.0.0.tgz#57dc42e052d8294555d26ee61854d72a0236fee0" + integrity sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg== + dependencies: + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.5.2" + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -588,10 +587,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@iota/client@^2.2.4": version "2.2.4" @@ -798,34 +797,29 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@josephg/resolvable@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@josephg/resolvable/-/resolvable-1.0.1.tgz#69bc4db754d79e1a2f17a650d3466e038d94a5eb" - integrity sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg== - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@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== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@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== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -835,19 +829,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - 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== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@noble/hashes@^1.2.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -869,6 +858,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -927,6 +921,16 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@repeaterjs/repeater@^3.0.4": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.6.tgz#be23df0143ceec3c69f8b6c2517971a5578fdaa2" + integrity sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -952,9 +956,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" @@ -972,9 +976,9 @@ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" - integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -983,53 +987,53 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" - integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" - integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" - integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/cors@^2.8.13": - version "2.8.14" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" - integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== dependencies: "@types/node" "*" "@types/express-serve-static-core@^4.17.30", "@types/express-serve-static-core@^4.17.33": - version "4.17.37" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" - integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1037,9 +1041,9 @@ "@types/send" "*" "@types/express@^4.17.13": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" - integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -1047,33 +1051,33 @@ "@types/serve-static" "*" "@types/graceful-fs@^4.1.2": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" - integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" - integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" - integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" @@ -1086,9 +1090,9 @@ pretty-format "^27.0.0" "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -1100,47 +1104,46 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/mysql@^2.15.8": - version "2.15.21" - resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.21.tgz#7516cba7f9d077f980100c85fd500c8210bd5e45" - integrity sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg== + version "2.15.26" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.26.tgz#f0de1484b9e2354d587e7d2bd17a873cc8300836" + integrity sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ== dependencies: "@types/node" "*" "@types/node-fetch@^2.6.1": - version "2.6.6" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" - integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== + version "2.6.11" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== dependencies: "@types/node" "*" form-data "^4.0.0" -"@types/node@*", "@types/node@^20.4.9": - version "20.7.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.7.0.tgz#c03de4572f114a940bc2ca909a33ddb2b925e470" - integrity sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg== - -"@types/node@>=13.7.0": - version "20.8.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" - integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== +"@types/node@*": + version "22.5.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.5.tgz#52f939dd0f65fc552a4ad0b392f3c466cc5d7a44" + integrity sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA== dependencies: - undici-types "~5.25.1" + undici-types "~6.19.2" "@types/node@^18.11.18": - version "18.18.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.0.tgz#bd19d5133a6e5e2d0152ec079ac27c120e7f1763" - integrity sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw== + version "18.19.50" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.50.tgz#8652b34ee7c0e7e2004b3f08192281808d41bf5a" + integrity sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg== + dependencies: + undici-types "~5.26.4" + +"@types/node@^20.14.0": + version "20.16.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" + integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== + dependencies: + undici-types "~6.19.2" "@types/prettier@^2.1.5": version "2.7.3" @@ -1148,68 +1151,68 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.16" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" + integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/semver@^7.3.12", "@types/semver@^7.5.0": - version "7.5.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" - integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== +"@types/semver@^7.3.12", "@types/semver@^7.5.6": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/send@*": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" - integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-static@*": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" - integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: "@types/http-errors" "*" - "@types/mime" "*" "@types/node" "*" + "@types/send" "*" "@types/sodium-native@^2.3.5": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@types/sodium-native/-/sodium-native-2.3.6.tgz#2730191204978a1a96ec7de2f2653ef3e4f7927a" - integrity sha512-MMQ0aR90G9A8WiynSaNsUnzzlkw6akTqYz+OBEgSH/Y3+91X/bkkP3lOJROogLSQMoONM81IX49yVmakEWw6ZA== + version "2.3.9" + resolved "https://registry.yarnpkg.com/@types/sodium-native/-/sodium-native-2.3.9.tgz#50b790bd837aaf20c3880cb31b45244142ff00d4" + integrity sha512-jZIg5ltGH1okmnH3FrLQsgwjcjOVozMSHwSiEm1/LpMekhOMHbQqp21P4H24mizh1BjwI6Q8qmphmD/HJuAqWg== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/uuid@^8.3.4": version "8.3.4" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== -"@types/validator@^13.7.10": - version "13.11.2" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.2.tgz#a2502325a3c0bd29f36dbac3b763223edd801e17" - integrity sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ== +"@types/validator@^13.11.8": + version "13.12.2" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.12.2.tgz#760329e756e18a4aab82fc502b51ebdfebbe49f5" + integrity sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA== "@types/yargs-parser@*": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" - integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^16.0.0": - version "16.0.6" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.6.tgz#cc0c63684d68d23498cf0b5f32aa4c3fb437c638" - integrity sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A== + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== dependencies: "@types/yargs-parser" "*" @@ -1297,16 +1300,23 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@whatwg-node/events@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.2.tgz#23f7c7ad887d7fd448e9ce3261eac9ef319ddd7c" + integrity sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ== + dependencies: + tslib "^2.6.3" + abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - accepts@~1.3.7, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1334,19 +1344,21 @@ acorn-walk@^7.1.1: integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^8.11.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== agent-base@6: version "6.0.2" @@ -1383,9 +1395,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" @@ -1434,6 +1446,19 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + are-we-there-yet@~1.1.2: version "1.1.7" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" @@ -1469,28 +1494,29 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -1498,18 +1524,19 @@ 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.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== +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" -array.prototype.flat@^1.3.1: +array.prototype.flat@^1.3.2: 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== @@ -1519,7 +1546,7 @@ array.prototype.flat@^1.3.1: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: +array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== @@ -1529,17 +1556,18 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.2: - 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== +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== 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" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" async-retry@^1.2.1: @@ -1554,10 +1582,21 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@^1.6.5: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" babel-jest@^27.5.1: version "27.5.1" @@ -1595,22 +1634,25 @@ babel-plugin-jest-hoist@^27.5.1: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^27.5.1: version "27.5.1" @@ -1636,25 +1678,16 @@ bignumber.js@9.0.0: integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bip32-ed25519@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/bip32-ed25519/-/bip32-ed25519-0.0.4.tgz#218943e212c2d3152dfd6f3a929305e3fe86534c" - integrity sha512-KfazzGVLwl70WZ1r98dO+8yaJRTGgWHL9ITn4bXHQi2mB4cT3Hjh53tXWUpEWE1zKCln7PbyX8Z337VapAOb5w== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: - bn.js "^5.1.1" - elliptic "^6.4.1" - hash.js "^1.1.7" - -bip39@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3" - integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A== - dependencies: - "@noble/hashes" "^1.2.0" + file-uri-to-path "1.0.0" bl@^4.0.3: version "4.1.0" @@ -1665,16 +1698,6 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -1691,28 +1714,10 @@ body-parser@1.19.0: raw-body "2.4.0" type-is "~1.6.17" -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^1.20.0, body-parser@^1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== +body-parser@1.20.3, body-parser@^1.20.2: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -1722,7 +1727,7 @@ body-parser@^1.20.0, body-parser@^1.20.2: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.11.0" + qs "6.13.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -1742,32 +1747,27 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + fill-range "^7.1.1" browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.21.9: - version "4.22.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.0.tgz#6adc8116589ccea8a99d0df79c5de2436199abdb" - integrity sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA== +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001539" - electron-to-chromium "^1.4.530" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" bs-logger@0.x: version "0.2.6" @@ -1810,9 +1810,9 @@ builtins@^1.0.3: integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== builtins@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" + integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== dependencies: semver "^7.0.0" @@ -1826,13 +1826,16 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -1849,10 +1852,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001539: - version "1.0.30001540" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001540.tgz#a316ca4f2ae673ab02ff0ec533334016d56ff658" - integrity sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw== +caniuse-lite@^1.0.30001646: + version "1.0.30001662" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz#3574b22dfec54a3f3b6787331da1040fe8e763ec" + integrity sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA== chalk@^2.4.2: version "2.4.2" @@ -1882,9 +1885,9 @@ chardet@^0.7.0: integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1901,24 +1904,29 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== class-validator@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.0.tgz#40ed0ecf3c83b2a8a6a320f4edb607be0f0df159" - integrity sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A== + version "0.14.1" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.14.1.tgz#ff2411ed8134e9d76acfeb14872884448be98110" + integrity sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ== dependencies: - "@types/validator" "^13.7.10" - libphonenumber-js "^1.10.14" - validator "^13.7.0" + "@types/validator" "^13.11.8" + libphonenumber-js "^1.10.53" + validator "^13.9.0" cli-cursor@^3.1.0: version "3.1.0" @@ -1962,6 +1970,25 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +cmake-js@^7.2.1: + version "7.3.0" + resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-7.3.0.tgz#6fd6234b7aeec4545c1c806f9e3f7ffacd9798b2" + integrity sha512-dXs2zq9WxrV87bpJ+WbnGKv8WUBXDw8blNiwNHoRe/it+ptscxhQHKB1SJXa1w+kocLMeP28Tk4/eTCezg4o+w== + dependencies: + axios "^1.6.5" + debug "^4" + fs-extra "^11.2.0" + lodash.isplainobject "^4.0.6" + memory-stream "^1.0.0" + node-api-headers "^1.1.0" + npmlog "^6.0.2" + rc "^1.2.7" + semver "^7.5.4" + tar "^6.2.0" + url-join "^4.0.1" + which "^2.0.2" + yargs "^17.7.2" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -2001,6 +2028,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2035,6 +2067,11 @@ command-line-usage@^6.1.0: table-layout "^1.0.2" typical "^5.2.0" +commander@^2.9.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2045,7 +2082,7 @@ consola@^3.2.3: resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== @@ -2089,10 +2126,10 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== core-util-is@~1.0.0: version "1.0.3" @@ -2126,6 +2163,13 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" +cross-inspect@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cross-inspect/-/cross-inspect-1.0.1.tgz#15f6f65e4ca963cf4cc1a2b5fef18f6ca328712b" + integrity sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A== + dependencies: + tslib "^2.4.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2166,18 +2210,43 @@ data-urls@^2.0.0: whatwg-mimetype "^2.3.0" whatwg-url "^8.0.0" -date-fns@^2.29.3: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: - "@babel/runtime" "^7.21.0" + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" date-format@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== +dayjs@^1.11.9: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2185,12 +2254,12 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^3.2.7: version "3.2.7" @@ -2236,16 +2305,16 @@ 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== -define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -2279,10 +2348,10 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -destr@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.1.tgz#2fc7bddc256fed1183e03f8d148391dde4023cb2" - integrity sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA== +destr@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" + integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== destroy@1.2.0: version "1.2.0" @@ -2362,49 +2431,41 @@ dotenv@10.0.0, dotenv@^10.0.0: integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== dotenv@^16.0.3: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== dset@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" - integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== + version "3.1.4" + resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.4.tgz#f8eaf5f023f068a036d08cd07dc9ffb7d0065248" + integrity sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ebec@^1.1.0, ebec@^1.1.1: +ebec@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ebec/-/ebec-1.1.1.tgz#683a0dc82a77e86349e05b24c43d7233a6d0f840" integrity sha512-JZ1vcvPQtR+8LGbZmbjG21IxLQq/v47iheJqn2F6yB2CgnGfn8ZVg3myHrf3buIZS8UCwQK0jOSIb3oHX7aH8g== dependencies: smob "^1.4.0" +ebec@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/ebec/-/ebec-2.3.0.tgz#9b5b423f1196a0cd414e041111f2b1d146308bd5" + integrity sha512-bt+0tSL7223VU3PSVi0vtNLZ8pO1AfWolcPPMk2a/a5H+o/ZU9ky0n3A0zhrR4qzJTN61uPsGIO4ShhOukdzxA== + ee-first@1.1.1: version "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.530: - version "1.4.531" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.531.tgz#22966d894c4680726c17cf2908ee82ff5d26ac25" - integrity sha512-H6gi5E41Rn3/mhKlPaT1aIMg/71hTAqn0gYEllSuw9igNWtvQwu185jiCZoZD29n7Zukgh7GVZ3zGf0XvkhqjQ== - -elliptic@^6.4.1: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" +electron-to-chromium@^1.5.4: + version "1.5.26" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.26.tgz#449b4fa90e83ab98abbe3b6a96c8ee395de94452" + integrity sha512-Z+OMe9M/V6Ep9n/52+b7lkvYEps26z4Yz3vjWL1V61W0q+VLF1pOHhMY17sa4roz4AWmULSI8E6SAojZA5L0YQ== emittery@^0.8.1: version "0.8.1" @@ -2426,6 +2487,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2433,14 +2499,21 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^5.12.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.15.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" +envix@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/envix/-/envix-1.5.0.tgz#bbb7ceba6f098a272ef2044e606789844d08c1db" + integrity sha512-IOxTKT+tffjxgvX2O5nq6enbkv6kBQ/QdMy18bZWo0P0rKPvsRp2/EypIPwTvJfnmk3VdOlq/KcRSZCswefM/w== + dependencies: + std-env "^3.7.0" + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -2448,66 +2521,92 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" - integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.12" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - 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" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.11" + which-typed-array "^1.1.15" -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: +es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - has "^1.0.3" + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -2518,10 +2617,10 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.1, escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -2564,7 +2663,7 @@ eslint-config-standard@^17.0.0: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== -eslint-import-resolver-node@^0.3.7: +eslint-import-resolver-node@^0.3.9: 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== @@ -2574,29 +2673,30 @@ eslint-import-resolver-node@^0.3.7: resolve "^1.22.4" eslint-import-resolver-typescript@^3.5.4: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + version "3.6.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== 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" - is-core-module "^2.11.0" + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" is-glob "^4.0.3" -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== +eslint-module-utils@^2.8.1, eslint-module-utils@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" + integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== dependencies: debug "^3.2.7" eslint-plugin-dci-lint@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-dci-lint/-/eslint-plugin-dci-lint-0.3.0.tgz#dcd73c50505b589b415017cdb72716f98e9495c3" - integrity sha512-BhgrwJ5k3eMN41NwCZ/tYQGDTMOrHXpH8XOfRZrGtPqmlnOZCVGWow+KyZMz0/wOFVpXx/q9B0y7R7qtU7lnqg== + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-dci-lint/-/eslint-plugin-dci-lint-0.3.2.tgz#7ac9a9fb8e8c79b9b58267eb396e03a1430f09a7" + integrity sha512-I+hqMQ5Cbxrws9V3R7dC4p9hUDcZ0N1my+aBqteivGhgNDQp/RUQ63PhIgFZvL4KRiyBIZUPsmrXJMJjt0OVzw== eslint-plugin-es@^4.1.0: version "4.1.0" @@ -2607,32 +2707,33 @@ eslint-plugin-es@^4.1.0: regexpp "^3.0.0" eslint-plugin-import@^2.27.5: - 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== + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.6" - array.prototype.findlastindex "^1.2.2" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.8.0" - has "^1.0.3" - is-core-module "^2.13.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.6" - object.groupby "^1.0.0" - object.values "^1.1.6" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" - tsconfig-paths "^3.14.2" + tsconfig-paths "^3.15.0" eslint-plugin-jest@^27.2.1: - version "27.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.4.0.tgz#3926cca723c40c3d7a3fe0e1fd911eff5e681f50" - integrity sha512-ukVeKmMPAUA5SWjHenvyyXnirKfHKMdOsTZdn5tZx5EW05HGVQwBohigjFZGGj3zuv1cV6hc82FvWv6LdIbkgg== + version "27.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz#7c98a33605e1d8b8442ace092b60e9919730000b" + integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== dependencies: "@typescript-eslint/utils" "^5.10.0" @@ -2658,9 +2759,9 @@ eslint-plugin-prettier@^4.2.1: prettier-linter-helpers "^1.0.0" eslint-plugin-promise@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" + integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== eslint-plugin-security@^1.7.1: version "1.7.1" @@ -2715,17 +2816,18 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.37.0: - version "8.50.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2" - integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.50.0" - "@humanwhocodes/config-array" "^0.11.11" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2772,9 +2874,9 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -2820,6 +2922,13 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execspawn@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/execspawn/-/execspawn-1.0.1.tgz#8286f9dde7cecde7905fbdc04e24f368f23f8da6" + integrity sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg== + dependencies: + util-extend "^1.0.1" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2841,14 +2950,14 @@ expect@^27.5.1: jest-message-util "^27.5.1" express-rate-limit@7: - version "7.1.5" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.1.5.tgz#af4c81143a945ea97f2599d13957440a0ddbfcfe" - integrity sha512-/iVogxu7ueadrepw1bS0X0kaRC/U0afwiYRSLg68Ts+p4Dc85Q5QKsOnPS/QUjPMHvOJQtBDrZgvkOzf8ejUYw== + version "7.4.0" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.4.0.tgz#5db412b8de83fa07ddb40f610c585ac8c1dab988" + integrity sha512-v1204w3cXu5gCDmAvgvzI6qjzZzoMWKnyVDk3ACgfswTQLYiGen+r8w0VnXnGMmzEN/g8fwIQ4JrFFd4ZP6ssg== express-slow-down@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/express-slow-down/-/express-slow-down-2.0.1.tgz#60c4515467314675d89c54ec608e2d586aa30f87" - integrity sha512-zRogSZhNXJYKDBekhgFfFXGrOngH7Fub7Mx2g8OQ4RUBwSJP/3TVEKMgSGR/WlneT0mJ6NBUnidHhIELGVPe3w== + version "2.0.3" + resolved "https://registry.yarnpkg.com/express-slow-down/-/express-slow-down-2.0.3.tgz#7b953a15c95105386d78370f8d172d88bb225dd6" + integrity sha512-vATCiFd8uQHtTeK5/Q0nLUukhZh+RV5zkcHxLQr0X5dEFVEYqzVXEe48nW23Z49fwtR+ApD9zn9sZRisTCR99w== dependencies: express-rate-limit "7" @@ -2889,36 +2998,36 @@ express@4.17.1: vary "~1.1.2" express@^4.17.1: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + version "4.21.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.0.tgz#d57cb706d49623d4ac27833f1cbc466b668eb915" + integrity sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.1" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.5.0" + cookie "0.6.0" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.10" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -2944,10 +3053,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.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== +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2966,9 +3075,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -2993,20 +3102,25 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -3050,11 +3164,11 @@ find-up@^5.0.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" @@ -3063,10 +3177,15 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.2.7: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +flatted@^3.2.7, flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -3076,9 +3195,9 @@ for-each@^0.3.3: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" @@ -3116,6 +3235,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -3125,6 +3253,13 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3135,10 +3270,10 @@ fsevents@^2.3.2, fsevents@~2.3.2: 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" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6: version "1.1.6" @@ -3155,6 +3290,20 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3186,15 +3335,16 @@ 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.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== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-package-type@^0.1.0: version "0.1.0" @@ -3206,18 +3356,19 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" -get-tsconfig@^4.5.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== dependencies: resolve-pkg-maps "^1.0.0" @@ -3247,16 +3398,17 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.3.3: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.3" @@ -3270,35 +3422,25 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.22.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.22.0.tgz#0c9fcb9c48a2494fbb5edbfee644285543eba9d8" - integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" @@ -3324,6 +3466,16 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +"gradido-blockchain-js@git+https://github.com/gradido/gradido-blockchain-js#master": + version "0.0.1" + resolved "git+https://github.com/gradido/gradido-blockchain-js#02aaeefc015c8ec8b1a2c453d75e7c2cf803a7c2" + dependencies: + bindings "^1.5.0" + nan "^2.20.0" + node-addon-api "^7.1.1" + node-gyp-build "^4.8.1" + prebuildify "git+https://github.com/einhornimmond/prebuildify#cmake_js" + graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" @@ -3345,23 +3497,16 @@ graphql-request@^6.1.0: cross-fetch "^3.1.5" graphql-scalars@^1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.22.2.tgz#6326e6fe2d0ad4228a9fea72a977e2bf26b86362" - integrity sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ== + version "1.23.0" + resolved "https://registry.yarnpkg.com/graphql-scalars/-/graphql-scalars-1.23.0.tgz#486785d1a6f9449277054a92afc7e1fb73f459d6" + integrity sha512-YTRNcwitkn8CqYcleKOx9IvedA8JIERn8BRq21nlKgOr4NEcTaWEG0sT+H92eF3ALTFbPgsqfft4cw+MGgv0Gg== dependencies: tslib "^2.5.0" -graphql-subscriptions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz#11ec181d475852d8aec879183e8e1eb94f2eb79a" - integrity sha512-s6k2b8mmt9gF9pEfkxsaO1lTxaySfKoEJzEfmwguBbQ//Oq23hIXCfR1hm4kdh5hnR20RdwB+s3BCb+0duHSZA== - dependencies: - iterall "^1.3.0" - graphql@^16.7.1: - version "16.8.1" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" - integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== + version "16.9.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" + integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== handlebars@^4.7.6: version "4.7.8" @@ -3390,49 +3535,41 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.1" - -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" + function-bind "^1.1.2" helmet@^7.1.0: version "7.1.0" @@ -3444,15 +3581,6 @@ highlight.js@^10.7.1: resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -3545,9 +3673,9 @@ ignore-by-default@^1.0.1: integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -3558,9 +3686,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -3617,13 +3745,13 @@ inquirer@^7.3.3: strip-ansi "^6.0.0" through "^2.3.6" -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" ipaddr.js@1.9.1: @@ -3631,14 +3759,13 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -3667,17 +3794,31 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-bun-module@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc" + integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q== + dependencies: + semver "^7.6.3" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "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, 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== +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - has "^1.0.3" + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" is-date-object@^1.0.1: version "1.0.5" @@ -3715,10 +3856,10 @@ 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-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" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -3755,12 +3896,12 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.1" @@ -3781,12 +3922,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - 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== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-typedarray@^1.0.0: version "1.0.0" @@ -3816,9 +3957,9 @@ isexe@^2.0.0: integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: version "5.2.1" @@ -3850,22 +3991,17 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterall@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" - integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== - -jackspeak@^2.3.5: - version "2.3.5" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.5.tgz#443f237f9eeeb0d7c6ec34835ef5289bb4acb068" - integrity sha512-Ratx+B8WeXLAtRJn26hrhY8S1+Jz6pxPMrkrdkgb/NstTNiqMhX0/oFVu5wX+g5n6JlEu2LPsDJmY8nRP4+alw== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -4276,15 +4412,15 @@ jest@^27.2.4: import-local "^3.0.2" jest-cli "^27.5.1" -jiti@^1.19.3: - version "1.20.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== +jiti@^1.21.6: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== jose@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/jose/-/jose-5.2.2.tgz#b91170e9ba6dbe609b0c0a86568f9a1fbe4335c0" - integrity sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg== + version "5.9.2" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.2.tgz#22a22da06edb8fb9e583aa24bafc1e8457b4db92" + integrity sha512-ILI2xx/I57b20sd7rHZvgiiQrmp2mcotwsAH+5ajbpFQbrYVQdNHYlQhoA5cFb78CgtBOxtC05TeA+mcgkuCqQ== js-tokens@^4.0.0: version "4.0.0" @@ -4383,10 +4519,19 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.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== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -4408,10 +4553,10 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -libphonenumber-js@^1.10.14: - version "1.10.44" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.44.tgz#6709722461173e744190494aaaec9c1c690d8ca8" - integrity sha512-svlRdNBI5WgBjRC20GrCfbFiclbF0Cx+sCcQob/C1r57nsoq0xg8r65QbTyVyweQIlB33P+Uahyho6EMYgcOyQ== +libphonenumber-js@^1.10.53: + version "1.11.8" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.8.tgz#697fdd36500a97bc672d7927d867edf34b4bd2a7" + integrity sha512-0fv/YKpJBAgXKy0kaS3fnqoUVN8901vUYAKIGD/MWZaDfhJt1nZjPL3ZzdZBt/G8G8Hw2J1xOIrXWdNHFHPAvg== lines-and-columns@^1.1.6: version "1.2.4" @@ -4432,16 +4577,17 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -locter@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/locter/-/locter-1.2.2.tgz#a52e870236cd9383c1e0e3012f33a4c3f2a6f9d8" - integrity sha512-9C/TDHlFdZUlVtBXUmpXhHaO4V9uGYqWKIHag+2ToPQ22j3VEqg7tz8ZI1iWkHmBUGXS4wKXavzWATwFjxhirw== +locter@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/locter/-/locter-2.1.1.tgz#31be1c81db8268162c4c3e4d2700df3f7ed235cc" + integrity sha512-trTg69NVZkfo/70BW7cXAZkFEFDWlQwPcNUO1aDZs/HhOzt7jBPSWldGqK/RXQDmb2tWCpPdRmrHMSXPRm3B2w== dependencies: - destr "^2.0.0" - ebec "^1.1.1" + destr "^2.0.3" + ebec "^2.3.0" + fast-glob "^3.3.2" flat "^5.0.2" - glob "^10.3.3" - jiti "^1.19.3" + jiti "^1.21.6" + yaml "^2.5.0" lodash.camelcase@^4.3.0: version "4.3.0" @@ -4453,6 +4599,11 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4485,20 +4636,15 @@ log4js@^6.7.1: streamroller "^3.1.5" loglevel@^1.6.8: - version "1.8.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" - integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" + integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -long@^5.0.0: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== - lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -4506,6 +4652,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4525,11 +4676,6 @@ 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== -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -4559,11 +4705,23 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +memory-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-stream/-/memory-stream-1.0.0.tgz#481dfd259ccdf57b03ec2c9632960044180e73c2" + integrity sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww== + dependencies: + readable-stream "^3.4.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -4580,11 +4738,11 @@ methods@~1.1.2: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: @@ -4614,16 +4772,6 @@ mimic-response@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -4631,17 +4779,10 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -4650,16 +4791,41 @@ minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mkdirp@^2.1.3: version "2.1.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" @@ -4675,12 +4841,7 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4730,6 +4891,11 @@ named-placeholders@^1.1.2: dependencies: lru-cache "^7.14.1" +nan@^2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" + integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== + napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" @@ -4790,11 +4956,28 @@ node-abi@^2.21.0: dependencies: semver "^5.4.1" +node-abi@^3.3.0: + version "3.68.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.68.0.tgz#8f37fb02ecf4f43ebe694090dcb52e0c4cc4ba25" + integrity sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A== + dependencies: + semver "^7.3.5" + node-abort-controller@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== +node-addon-api@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + +node-api-headers@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.3.0.tgz#bb32c6b3e33fb0004bd93c66787bf00998c834ea" + integrity sha512-8Bviwtw4jNhv0B2qDjj4M5e6GyAuGtxsmZTrFJu3S3Z0+oHwIgSUdIKkKJmZd+EbMo7g3v4PLBbrjxwmZOqMBg== + node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -4802,20 +4985,20 @@ node-fetch@^2.6.12, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-gyp-build@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== +node-gyp-build@^4.8.1: + version "4.8.2" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" + integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== node-int64@^0.4.0: version "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.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== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== nodemon@^2.0.20: version "2.0.22" @@ -4833,18 +5016,25 @@ nodemon@^2.0.20: touch "^3.1.0" undefsafe "^2.0.5" -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-path@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" + integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== + dependencies: + which "^1.2.10" + +npm-run-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-3.1.0.tgz#7f91be317f6a466efed3c9f2980ad8a4ee8b0fa5" + integrity sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg== + dependencies: + path-key "^3.0.0" + npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -4852,6 +5042,15 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" + integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== + dependencies: + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" + npmlog@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -4862,68 +5061,78 @@ npmlog@^4.0.1: gauge "~2.7.3" set-blocking "~2.0.0" +npmlog@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.2.0: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" -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== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -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== +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" -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== +object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" on-finished@2.4.1: version "2.4.1" @@ -4954,16 +5163,16 @@ onetime@^5.1.0, onetime@^5.1.2: mimic-fn "^2.1.0" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" os-tmpdir@~1.0.2: version "1.0.2" @@ -5003,6 +5212,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -5070,14 +5284,19 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" - integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^9.1.1 || ^10.0.0" + lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" + integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -5088,10 +5307,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -5110,6 +5329,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + prebuild-install@^6.1.2: version "6.1.4" resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" @@ -5129,6 +5353,20 @@ prebuild-install@^6.1.2: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +"prebuildify@git+https://github.com/einhornimmond/prebuildify#cmake_js": + version "6.0.1" + resolved "git+https://github.com/einhornimmond/prebuildify#91f4e765611fcc1e8123df0c8fc84aec5ab55b31" + dependencies: + cmake-js "^7.2.1" + execspawn "^1.0.1" + minimist "^1.2.5" + mkdirp-classic "^0.5.3" + node-abi "^3.3.0" + npm-run-path "^3.1.0" + npm-which "^3.0.1" + pump "^3.0.0" + tar-fs "^2.1.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5168,24 +5406,6 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -protobufjs@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" - integrity sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/node" ">=13.7.0" - long "^5.0.0" - proxy-addr@~2.0.5, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -5194,6 +5414,11 @@ proxy-addr@~2.0.5, proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -5205,24 +5430,24 @@ pstree.remy@^1.1.8: integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" qs@6.7.0: version "6.7.0" @@ -5262,16 +5487,6 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - raw-body@2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" @@ -5323,7 +5538,7 @@ readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -5345,28 +5560,29 @@ reduce-flatten@^2.0.0: integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== reflect-metadata@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +reflect-metadata@^0.2.1, reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== regexp-tree@~0.1.1: version "0.1.27" 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.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpp@^3.0.0: version "3.2.0" @@ -5411,9 +5627,9 @@ resolve.exports@^1.1.0: integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" @@ -5438,9 +5654,9 @@ reusify@^1.0.4: integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" @@ -5468,13 +5684,13 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -safe-array-concat@^1.0.1: - 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== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -5488,13 +5704,13 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-regex@^2.1.1: @@ -5516,12 +5732,10 @@ 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.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== - dependencies: - lru-cache "^6.0.0" +semver@7.x, semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^5.4.1, semver@^5.7.1: version "5.7.2" @@ -5557,10 +5771,10 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -5591,29 +5805,42 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.18.0" + send "0.19.0" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" setprototypeof@1.1.1: version "1.1.1" @@ -5645,16 +5872,17 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== +side-channel@^1.0.4, side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: 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== @@ -5695,17 +5923,10 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -smob@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.1.tgz#66270e7df6a7527664816c5b577a23f17ba6f5b5" - integrity sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ== - -sodium-native@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/sodium-native/-/sodium-native-4.0.4.tgz#561b7c39c97789f8202d6fd224845fe2e8cd6879" - integrity sha512-faqOKw4WQKK7r/ybn6Lqo1F9+L5T6NlBJJYvpxbZPetpWylUVqz449mvlwIBKBqxEHbWakWuOlUt8J3Qpc4sWw== - dependencies: - node-gyp-build "^4.6.0" +smob@^1.4.0, smob@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab" + integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig== source-map-support@^0.5.6: version "0.5.21" @@ -5734,9 +5955,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -5747,9 +5968,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.15" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" - integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== + version "3.0.20" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== sprintf-js@~1.0.2: version "1.0.3" @@ -5783,6 +6004,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +std-env@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== + streamroller@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" @@ -5800,7 +6026,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5818,6 +6044,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -5827,32 +6062,33 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - 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== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -5868,7 +6104,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5882,6 +6118,13 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -5968,7 +6211,7 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@^2.0.0: +tar-fs@^2.0.0, tar-fs@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== @@ -5989,6 +6232,18 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +tar@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -6075,16 +6330,14 @@ toml@^3.0.0: integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" + version "3.1.1" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" + integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -6118,17 +6371,17 @@ ts-jest@^27.0.5: yargs-parser "20.x" ts-mysql-migrate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ts-mysql-migrate/-/ts-mysql-migrate-1.0.2.tgz#736d37c3aa3fef92f226b869098e939950d0e18c" - integrity sha512-zDW6iQsfPCJfQ3JMhfUGjhy8aK+VNTvPrXmJH66PB2EGEvyn4m7x2nBdhDNhKuwYU9LMxW1p+l39Ei+btXNpxA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/ts-mysql-migrate/-/ts-mysql-migrate-1.1.2.tgz#6f280f4684cb95440ffa7254b926b494badb8cf3" + integrity sha512-jwhVaMrYBNNhAoZ5XISxzqbnXTHqwazqu/r1UQ6kUaGNPGL43ZFnBiXVj4Gm3pfe3xtCGIaNInehDfdDuigPgw== dependencies: "@types/mysql" "^2.15.8" mysql "^2.18.1" ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -6149,10 +6402,10 @@ 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.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== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -6173,10 +6426,10 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.2, tslib@^2.6.3: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tsutils@^3.21.0: version "3.21.0" @@ -6215,16 +6468,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.3" - resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-2.0.0-beta.3.tgz#71a796845dbb3f3cca5dfb97a38ffe30ee5aa1ea" - integrity sha512-5HEiQaWHPYhPmbJuMmT+IZgjsnbNWsW37osUISwgr5EpcHZ4krLl8eBoOfjFya4mxAWYshlpSO1ahaucJQqM5g== + version "2.0.0-rc.2" + resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-2.0.0-rc.2.tgz#1086ef889737bd21a9f0ed0fb1041dce2d918e92" + integrity sha512-DJ8erG1cmjteMrOhFIkBHOqRM+L+wCJxvNjbbj1Y+q2r4HZkB1qOSS4ZD4AaoAfRPAp1yU23gMtmzf0jen/FFA== dependencies: - "@types/node" "^20.4.9" - "@types/semver" "^7.5.0" + "@graphql-yoga/subscription" "^5.0.0" + "@types/node" "^20.14.0" + "@types/semver" "^7.5.6" graphql-query-complexity "^0.12.0" - graphql-subscriptions "^2.0.0" semver "^7.5.4" - tslib "^2.6.0" + tslib "^2.6.2" type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" @@ -6234,44 +6487,49 @@ 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== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -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== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -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== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -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" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -6281,35 +6539,36 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typeorm-extension@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/typeorm-extension/-/typeorm-extension-3.0.2.tgz#34e7256bc24e070b204442ff497a5d28e38341e5" - integrity sha512-hV67zcFuJo1o3mslgbPTwCQMeMKAsV4ZcdPZiXDrbY+km6rdsbhIycn1iRfSfbb69aHeKPcbc/tpdJLXsdhBqg== + version "3.6.1" + resolved "https://registry.yarnpkg.com/typeorm-extension/-/typeorm-extension-3.6.1.tgz#e40711951db48ed59e22ccdebcc43d5527acf5e8" + integrity sha512-OyjYrjtu2VgtjU1vJiUcQ5A+auNWgUtSBfZ4rWgMdsBBkzGpOjFKkPrA6B2RdngJfk9KOGNaw34XI0EATw+LqQ== dependencies: - "@faker-js/faker" "^8.0.2" + "@faker-js/faker" "^8.4.1" consola "^3.2.3" - locter "^1.2.2" + envix "^1.5.0" + locter "^2.1.0" pascal-case "^3.1.2" rapiq "^0.9.0" - reflect-metadata "^0.1.13" - smob "^1.4.0" + reflect-metadata "^0.2.2" + smob "^1.5.0" yargs "^17.7.2" typeorm@^0.3.16, typeorm@^0.3.17: - version "0.3.17" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949" - integrity sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig== + version "0.3.20" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" + integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== dependencies: "@sqltools/formatter" "^1.2.5" app-root-path "^3.1.0" buffer "^6.0.3" chalk "^4.1.2" cli-highlight "^2.1.11" - date-fns "^2.29.3" + dayjs "^1.11.9" debug "^4.3.4" dotenv "^16.0.3" - glob "^8.1.0" + glob "^10.3.10" mkdirp "^2.1.3" - reflect-metadata "^0.1.13" + reflect-metadata "^0.2.1" sha.js "^2.4.11" tslib "^2.5.0" uuid "^9.0.0" @@ -6331,9 +6590,9 @@ typical@^5.2.0: integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -6350,10 +6609,15 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== universalify@^0.1.0: version "0.1.2" @@ -6365,18 +6629,23 @@ universalify@^0.2.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2: version "4.4.1" @@ -6385,6 +6654,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -6398,6 +6672,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -6442,10 +6721,10 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -validator@^13.7.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" - integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== +validator@^13.9.0: + version "13.12.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.12.0.tgz#7d78e76ba85504da3fee4fd1922b385914d4b35f" + integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== value-or-promise@^1.0.12: version "1.0.12" @@ -6538,31 +6817,43 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -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== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" -which@^2.0.1: +which@^1.2.10: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: +wide-align@^1.1.0, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== dependencies: string-width "^1.0.2 || 2 || 3 || 4" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -6576,7 +6867,16 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6610,9 +6910,9 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7.4.6: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xml-name-validator@^3.0.0: version "3.0.0" @@ -6639,6 +6939,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== + yargs-parser@20.x, yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts b/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts index c84a15f41..77744a6d4 100644 --- a/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts +++ b/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts @@ -2,7 +2,8 @@ import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, ManyToOne, JoinColu import { Decimal } from 'decimal.js-light' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Transaction } from '../Transaction' +// BackendTransaction was removed in newer migrations, so only the version from this folder can be linked +import { Transaction } from './Transaction' @Entity('backend_transactions') export class BackendTransaction extends BaseEntity { diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts b/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts index 4947c2a2d..b520b27f8 100644 --- a/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts +++ b/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts @@ -13,7 +13,8 @@ import { Decimal } from 'decimal.js-light' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' import { Account } from '../Account' import { Community } from '../Community' -import { BackendTransaction } from '../BackendTransaction' +// BackendTransaction was removed in newer migrations, so only the version from this folder can be linked +import { BackendTransaction } from './BackendTransaction' @Entity('transactions') export class Transaction extends BaseEntity { diff --git a/dlt-database/entity/0004-fix_spelling/Transaction.ts b/dlt-database/entity/0004-fix_spelling/Transaction.ts index 4d5a304da..f3f4427f7 100644 --- a/dlt-database/entity/0004-fix_spelling/Transaction.ts +++ b/dlt-database/entity/0004-fix_spelling/Transaction.ts @@ -13,7 +13,8 @@ import { Decimal } from 'decimal.js-light' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' import { Account } from '../Account' import { Community } from '../Community' -import { BackendTransaction } from '../BackendTransaction' +// BackendTransaction was removed in newer migrations, so only the version from this folder can be linked +import { BackendTransaction } from '../0003-refactor_transaction_recipe/BackendTransaction' @Entity('transactions') export class Transaction extends BaseEntity { diff --git a/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts b/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts new file mode 100644 index 000000000..f19790ff1 --- /dev/null +++ b/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts @@ -0,0 +1,64 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + JoinColumn, + OneToOne, + OneToMany, + BaseEntity, +} from 'typeorm' +import { Account } from '../Account' +import { Transaction } from '../Transaction' +import { AccountCommunity } from '../AccountCommunity' + +@Entity('communities') +export class Community extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'iota_topic', collation: 'utf8mb4_unicode_ci', unique: true }) + iotaTopic: string + + @Column({ name: 'root_pubkey', type: 'binary', length: 32, unique: true, nullable: true }) + rootPubkey?: Buffer + + @Column({ name: 'root_privkey', type: 'binary', length: 80, nullable: true }) + rootEncryptedPrivkey?: Buffer + + @Column({ name: 'root_chaincode', type: 'binary', length: 32, nullable: true }) + rootChaincode?: Buffer + + @Column({ type: 'tinyint', default: true }) + foreign: boolean + + @Column({ name: 'gmw_account_id', type: 'int', unsigned: true, nullable: true }) + gmwAccountId?: number + + @OneToOne(() => Account, { cascade: true }) + @JoinColumn({ name: 'gmw_account_id' }) + gmwAccount?: Account + + @Column({ name: 'auf_account_id', type: 'int', unsigned: true, nullable: true }) + aufAccountId?: number + + @OneToOne(() => Account, { cascade: true }) + @JoinColumn({ name: 'auf_account_id' }) + aufAccount?: Account + + @Column({ name: 'created_at', type: 'datetime', precision: 3 }) + createdAt: Date + + // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here + @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) + confirmedAt?: Date + + @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.community) + @JoinColumn({ name: 'community_id' }) + accountCommunities: AccountCommunity[] + + @OneToMany(() => Transaction, (transaction) => transaction.community) + transactions?: Transaction[] + + @OneToMany(() => Transaction, (transaction) => transaction.otherCommunity) + friendCommunitiesTransactions?: Transaction[] +} diff --git a/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts b/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts new file mode 100644 index 000000000..eae5a6405 --- /dev/null +++ b/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts @@ -0,0 +1,109 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + ManyToOne, + OneToOne, + JoinColumn, + BaseEntity, +} from 'typeorm' + +import { Account } from '../Account' +import { Community } from '../Community' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) + id: number + + @Column({ name: 'iota_message_id', type: 'binary', length: 32, nullable: true }) + iotaMessageId?: Buffer + + @OneToOne(() => Transaction, { cascade: ['update'] }) + // eslint-disable-next-line no-use-before-define + pairingTransaction?: Transaction + + @Column({ name: 'pairing_transaction_id', type: 'bigint', unsigned: true, nullable: true }) + pairingTransactionId?: number + + // if transaction has a sender than it is also the sender account + @ManyToOne(() => Account, (account) => account.transactionSigning) + @JoinColumn({ name: 'signing_account_id' }) + signingAccount?: Account + + @Column({ name: 'signing_account_id', type: 'int', unsigned: true, nullable: true }) + signingAccountId?: number + + @ManyToOne(() => Account, (account) => account.transactionRecipient) + @JoinColumn({ name: 'recipient_account_id' }) + recipientAccount?: Account + + @Column({ name: 'recipient_account_id', type: 'int', unsigned: true, nullable: true }) + recipientAccountId?: number + + @ManyToOne(() => Community, (community) => community.transactions, { + eager: true, + }) + @JoinColumn({ name: 'community_id' }) + community: Community + + @Column({ name: 'community_id', type: 'int', unsigned: true }) + communityId: number + + @ManyToOne(() => Community, (community) => community.friendCommunitiesTransactions) + @JoinColumn({ name: 'other_community_id' }) + otherCommunity?: Community + + @Column({ name: 'other_community_id', type: 'int', unsigned: true, nullable: true }) + otherCommunityId?: number + + @Column({ + type: 'bigint', + nullable: true, + }) + amount?: number + + // account balance for sender based on creation date + @Column({ + name: 'account_balance_on_creation', + type: 'bigint', + nullable: true, + }) + accountBalanceOnCreation?: number + + @Column({ type: 'tinyint' }) + type: number + + @Column({ name: 'created_at', type: 'datetime', precision: 3 }) + createdAt: Date + + @Column({ name: 'body_bytes', type: 'blob' }) + bodyBytes: Buffer + + @Column({ type: 'binary', length: 64, unique: true }) + signature: Buffer + + @Column({ name: 'protocol_version', type: 'varchar', length: 255, default: '1' }) + protocolVersion: string + + @Column({ type: 'bigint', nullable: true }) + nr?: number + + @Column({ name: 'running_hash', type: 'binary', length: 48, nullable: true }) + runningHash?: Buffer + + // account balance for sender based on confirmation date (iota milestone) + @Column({ + name: 'account_balance_on_confirmation', + type: 'bigint', + nullable: true, + }) + accountBalanceOnConfirmation?: number + + @Column({ name: 'iota_milestone', type: 'bigint', nullable: true }) + iotaMilestone?: number + + // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here + @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) + confirmedAt?: Date +} diff --git a/dlt-database/entity/BackendTransaction.ts b/dlt-database/entity/BackendTransaction.ts deleted file mode 100644 index 6ec68427d..000000000 --- a/dlt-database/entity/BackendTransaction.ts +++ /dev/null @@ -1 +0,0 @@ -export { BackendTransaction } from './0003-refactor_transaction_recipe/BackendTransaction' diff --git a/dlt-database/entity/Community.ts b/dlt-database/entity/Community.ts index cb4d34c43..e31bb1e5a 100644 --- a/dlt-database/entity/Community.ts +++ b/dlt-database/entity/Community.ts @@ -1 +1 @@ -export { Community } from './0003-refactor_transaction_recipe/Community' +export { Community } from './0005-refactor_with_gradido_blockchain_lib/Community' diff --git a/dlt-database/entity/Transaction.ts b/dlt-database/entity/Transaction.ts index 9db8e6747..4c22b275f 100644 --- a/dlt-database/entity/Transaction.ts +++ b/dlt-database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0004-fix_spelling/Transaction' +export { Transaction } from './0005-refactor_with_gradido_blockchain_lib/Transaction' diff --git a/dlt-database/entity/index.ts b/dlt-database/entity/index.ts index b1215263d..ba7ea2663 100644 --- a/dlt-database/entity/index.ts +++ b/dlt-database/entity/index.ts @@ -1,6 +1,5 @@ import { Account } from './Account' import { AccountCommunity } from './AccountCommunity' -import { BackendTransaction } from './BackendTransaction' import { Community } from './Community' import { InvalidTransaction } from './InvalidTransaction' import { Migration } from './Migration' @@ -10,7 +9,6 @@ import { User } from './User' export const entities = [ AccountCommunity, Account, - BackendTransaction, Community, InvalidTransaction, Migration, diff --git a/dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts b/dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts new file mode 100644 index 000000000..453c131ba --- /dev/null +++ b/dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts @@ -0,0 +1,28 @@ +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + `ALTER TABLE \`communities\` CHANGE COLUMN \`root_privkey\` \`root_encrypted_privkey\` binary(80) NULL DEFAULT NULL;`, + ) + await queryFn( + `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_confirmation\` int NULL DEFAULT 0;`, + ) + await queryFn( + `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_creation\` int NULL DEFAULT 0;`, + ) + await queryFn(`ALTER TABLE \`transactions\` MODIFY COLUMN \`amount\` int NULL DEFAULT 0;`) + await queryFn(`DROP TABLE \`backend_transactions\`;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + `ALTER TABLE \`communities\` CHANGE COLUMN \`root_encrypted_privkey\` \`root_privkey\` binary(64) NULL DEFAULT NULL;`, + ) + await queryFn( + `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_confirmation\` decimal(40, 20) NULL DEFAULT 0.00000000000000000000;`, + ) + await queryFn( + `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_creation\` decimal(40, 20) NULL DEFAULT 0.00000000000000000000;`, + ) + await queryFn( + `ALTER TABLE \`transactions\` MODIFY COLUMN \`amount\` decimal(40, 20) NULL DEFAULT NULL;`, + ) +} diff --git a/dlt-database/yarn.lock b/dlt-database/yarn.lock index ac35e1eaa..f4e8c4086 100644 --- a/dlt-database/yarn.lock +++ b/dlt-database/yarn.lock @@ -2,24 +2,12 @@ # yarn lockfile v1 -"@babel/runtime@^7.21.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" - integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: - regenerator-runtime "^0.13.11" - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.6.1": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz#118511f316e2e87ee4294761868e254d3da47960" - integrity sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" + "@jridgewell/trace-mapping" "0.3.9" "@eslint-community/eslint-plugin-eslint-comments@^3.2.1": version "3.2.1" @@ -36,19 +24,19 @@ 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.11.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" + integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -56,18 +44,18 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.42.0": - version "8.42.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6" - integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== -"@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== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": @@ -75,10 +63,40 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -101,17 +119,15 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@pkgr/utils@^2.3.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.1.tgz#adf291d0357834c410ce80af16e711b56c7b1cd3" - integrity sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.2.12" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.5.0" +"@nolyfill/is-core-module@1.0.39": + version "1.0.39" + resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" + integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@sqltools/formatter@^1.2.5": version "1.2.5" @@ -119,24 +135,24 @@ integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== "@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/faker@^5.5.9": version "5.5.9" @@ -144,9 +160,9 @@ integrity sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA== "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" @@ -154,26 +170,28 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mysql@^2.15.8": - version "2.15.19" - resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.19.tgz#d158927bb7c1a78f77e56de861a3b15cae0e7aed" - integrity sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ== + version "2.15.26" + resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.26.tgz#f0de1484b9e2354d587e7d2bd17a873cc8300836" + integrity sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ== dependencies: "@types/node" "*" "@types/node@*": - version "16.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.1.tgz#c6b9198178da504dfca1fd0be9b2e1002f1586f0" - integrity sha512-ncRdc45SoYJ2H4eWU9ReDfp3vtFqDYhjOsKlFFUDEn8V1Bgr2RjYal8YT5byfadWIRluhPFU6JiDOl0H6Sl87A== + version "22.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" + integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== + dependencies: + undici-types "~6.19.2" "@types/node@^16.10.3": - version "16.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" - integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== + version "16.18.106" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.106.tgz#62228200da6d98365d2de5601f7230cdf041f0e2" + integrity sha512-YTgQUcpdXRc7iiEMutkkXl9WUx5lGUCVYvnfRg9CV+IA4l9epctEhCTbaw4KgzXaKYv8emvFJkEM65+MkNUhsQ== "@types/semver@^7.3.12": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/uuid@^8.3.4": version "8.3.4" @@ -181,110 +199,112 @@ integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== "@typescript-eslint/eslint-plugin@^5.57.1": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz#2604cfaf2b306e120044f901e20c8ed926debf15" - integrity sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.9" - "@typescript-eslint/type-utils" "5.59.9" - "@typescript-eslint/utils" "5.59.9" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.57.1": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.9.tgz#a85c47ccdd7e285697463da15200f9a8561dd5fa" - integrity sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.59.9" - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/typescript-estree" "5.59.9" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz#eadce1f2733389cdb58c49770192c0f95470d2f4" - integrity sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/visitor-keys" "5.59.9" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz#53bfaae2e901e6ac637ab0536d1754dfef4dafc2" - integrity sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.59.9" - "@typescript-eslint/utils" "5.59.9" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.9.tgz#3b4e7ae63718ce1b966e0ae620adc4099a6dcc52" - integrity sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz#6bfea844e468427b5e72034d33c9fffc9557392b" - integrity sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/visitor-keys" "5.59.9" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.9.tgz#adee890107b5ffe02cd46fdaa6c2125fb3c6c7c4" - integrity sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.9" - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/typescript-estree" "5.59.9" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz#9f86ef8e95aca30fb5a705bb7430f95fc58b146d" - integrity sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.59.9" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" - integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" -acorn@^8.4.1: - version "8.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" - integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -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== @@ -294,16 +314,16 @@ ajv@^6.10.0, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -311,10 +331,15 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== app-root-path@^3.1.0: version "3.1.0" @@ -331,23 +356,24 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" -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== +array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -355,30 +381,58 @@ 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.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + 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.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== 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" -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" balanced-match@^1.0.0: version "1.0.2" @@ -390,23 +444,11 @@ 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== - bignumber.js@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== -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" @@ -422,12 +464,12 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" buffer@^6.0.3: version "6.0.3" @@ -438,26 +480,22 @@ buffer@^6.0.3: ieee754 "^1.2.1" builtins@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" + integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== 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== +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: - run-applescript "^5.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" callsites@^3.0.0: version "3.1.0" @@ -517,12 +555,12 @@ color-name@~1.1.4: concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== create-require@^1.1.0: version "1.1.1" @@ -536,7 +574,7 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -550,12 +588,37 @@ crypto@^1.0.1: resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== -date-fns@^2.29.3: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: - "@babel/runtime" "^7.21.0" + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dayjs@^1.11.9: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== debug@^3.2.7: version "3.2.7" @@ -564,17 +627,10 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -584,52 +640,32 @@ decimal.js-light@^2.5.1: integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== deep-is@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -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== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" -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: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -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" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" -denque@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" - integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== +denque@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== diff@^4.0.1: version "4.0.2" @@ -663,78 +699,119 @@ dotenv@^10.0.0: integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== dotenv@^16.0.3: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -enhanced-resolve@^5.12.0: - version "5.14.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" - integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enhanced-resolve@^5.15.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -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.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - get-symbol-description "^1.0.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.13" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - 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-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.15" -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: +es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - has "^1.0.3" + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -746,14 +823,14 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" @@ -761,42 +838,42 @@ escape-string-regexp@^4.0.0: integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 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" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" 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== +eslint-import-resolver-node@^0.3.9: + 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.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" + integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - get-tsconfig "^4.5.0" - globby "^13.1.3" - is-core-module "^2.11.0" + "@nolyfill/is-core-module" "1.0.39" + debug "^4.3.5" + enhanced-resolve "^5.15.0" + eslint-module-utils "^2.8.1" + fast-glob "^3.3.2" + get-tsconfig "^4.7.5" + is-bun-module "^1.0.2" is-glob "^4.0.3" - synckit "^0.8.5" -eslint-module-utils@^2.7.4: - 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== +eslint-module-utils@^2.8.0, eslint-module-utils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz#2ecad69d71e1fa81f17f7f24d5d3e46b168de663" + integrity sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg== dependencies: debug "^3.2.7" @@ -809,25 +886,27 @@ 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.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" eslint-plugin-n@^15.7.0: version "15.7.0" @@ -851,9 +930,9 @@ eslint-plugin-prettier@^4.2.1: prettier-linter-helpers "^1.0.0" eslint-plugin-promise@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" + integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== eslint-plugin-security@^1.7.1: version "1.7.1" @@ -870,10 +949,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" @@ -902,32 +981,33 @@ 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.42.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291" - integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.42.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.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.5.2" + 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" @@ -937,7 +1017,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" @@ -947,24 +1026,23 @@ eslint@^8.37.0: lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +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.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -981,59 +1059,29 @@ estraverse@^4.1.1: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - 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" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.9, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -1049,12 +1097,12 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.12.0.tgz#ed7b6ab5d62393fb2cc591c853652a5c318bf794" - integrity sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg== + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -1065,10 +1113,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -1081,17 +1129,18 @@ 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.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== for-each@^0.3.3: version "0.3.3" @@ -1100,27 +1149,35 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreground-child@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -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== +function.prototype.name@^1.1.6: + 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== @@ -1137,42 +1194,30 @@ 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: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" + es-errors "^1.3.0" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" -get-tsconfig@^4.5.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.6.0.tgz#e977690993a42f3e320e932427502a40f7af6d05" - integrity sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg== +get-tsconfig@^4.7.5: + version "4.8.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.0.tgz#125dc13a316f61650a12b20c97c11b8fd996fedd" + integrity sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw== dependencies: resolve-pkg-maps "^1.0.0" @@ -1190,42 +1235,44 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^7.1.3: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - 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.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: - define-properties "^1.1.3" + define-properties "^1.2.1" + gopd "^1.0.1" globby@^11.1.0: version "11.1.0" @@ -1239,17 +1286,6 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^13.1.3: - version "13.1.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - 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" @@ -1262,22 +1298,12 @@ graceful-fs@^4.2.4: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - graphemer@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-bigints@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== @@ -1287,58 +1313,43 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.1, has-symbols@^1.0.2: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" -has-symbols@^1.0.3: +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== + +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" highlight.js@^10.7.1: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== -human-signals@^2.1.0: - version "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.6.2: +iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -1350,17 +1361,12 @@ ieee754@^1.2.1: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.1.1: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^5.2.0, ignore@^5.2.4: - version "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== @@ -1371,12 +1377,12 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -1386,23 +1392,22 @@ inherits@2, inherits@^2.0.1, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-bigint@^1.0.1: version "1.0.4" @@ -1419,22 +1424,31 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.3, is-callable@^1.2.7: +is-bun-module@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.1.0.tgz#a66b9830869437f6cdad440ba49ab6e4dc837269" + integrity sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA== + dependencies: + semver "^7.6.3" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-callable@^1.1.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -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, is-core-module@^2.13.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - has "^1.0.3" + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" is-date-object@^1.0.1: version "1.0.5" @@ -1443,56 +1457,32 @@ 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" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.3: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 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" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" @@ -1509,7 +1499,7 @@ is-path-inside@^3.0.3: is-property@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= + integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== is-regex@^1.1.4: version "1.1.4" @@ -1519,22 +1509,12 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - 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== + call-bind "^1.0.7" is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -1550,16 +1530,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: 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== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== 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.14" is-weakref@^1.0.2: version "1.0.2" @@ -1568,22 +1544,29 @@ 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" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" js-yaml@^4.1.0: version "4.1.0" @@ -1592,6 +1575,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +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-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -1600,7 +1588,7 @@ json-schema-traverse@^0.4.1: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" @@ -1609,6 +1597,13 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -1634,13 +1629,10 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -lru-cache@^4.1.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^6.0.0: version "6.0.0" @@ -1649,70 +1641,53 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.3" + picomatch "^2.3.1" -mimic-fn@^2.1.0: - version "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== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mkdirp@^2.1.3: version "2.1.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" @@ -1729,13 +1704,13 @@ ms@^2.1.1: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mysql2@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.0.tgz#600f5cc27e397dfb77b59eac93666434f88e8079" - integrity sha512-0t5Ivps5Tdy5YHk5NdKwQhe/4Qyn2pload+S+UooDBvsqngtzujG1BaTWBihQLfeKO3t3122/GtusBtmHEHqww== + version "2.3.3" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0" + integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA== dependencies: - denque "^1.4.1" + denque "^2.0.1" generate-function "^2.3.1" - iconv-lite "^0.6.2" + iconv-lite "^0.6.3" long "^4.0.0" lru-cache "^6.0.0" named-placeholders "^1.1.2" @@ -1762,11 +1737,11 @@ mz@^2.4.0: thenify-all "^1.0.0" named-placeholders@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8" - integrity sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" + integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== dependencies: - lru-cache "^4.1.3" + lru-cache "^7.14.1" natural-compare-lite@^1.4.0: version "1.4.0" @@ -1776,103 +1751,79 @@ natural-compare-lite@^1.4.0: natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - 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" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== -object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== - -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" 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.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - 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.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + word-wrap "^1.2.5" p-limit@^3.0.2: version "3.1.0" @@ -1888,6 +1839,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -1920,37 +1876,40 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" 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" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== prelude-ls@^1.2.1: version "1.2.1" @@ -1974,15 +1933,10 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" @@ -2003,28 +1957,29 @@ readable-stream@2.3.7: util-deprecate "~1.0.1" reflect-metadata@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + version "0.1.14" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" + integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +reflect-metadata@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== regexp-tree@~0.1.1: version "0.1.27" 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: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpp@^3.0.0: version "3.2.0" @@ -2034,7 +1989,7 @@ regexpp@^3.0.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-from@^4.0.0: version "4.0.0" @@ -2046,12 +2001,12 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -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.22.1, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 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" @@ -2067,13 +2022,6 @@ 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-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -2081,6 +2029,16 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + 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" @@ -2091,13 +2049,13 @@ safe-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-regex@^2.1.1: @@ -2112,22 +2070,42 @@ safe-regex@^2.1.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +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== -semver@^7.0.0, semver@^7.3.7, semver@^7.3.8: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" +semver@^7.0.0, semver@^7.3.7, semver@^7.3.8, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== seq-queue@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" - integrity sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4= + integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== + +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" sha.js@^2.4.11: version "2.4.11" @@ -2150,49 +2128,36 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" -signal-exit@^3.0.3, signal-exit@^3.0.7: - 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== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== slash@^3.0.0: version "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== - sqlstring@2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" - integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A= + integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== sqlstring@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.2.tgz#cdae7169389a1375b18e885f2e60b3e460809514" - integrity sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" + integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2201,32 +2166,51 @@ string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -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== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@~1.1.1: version "1.1.1" @@ -2235,36 +2219,33 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-final-newline@^2.0.0: - version "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== @@ -2281,14 +2262,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -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" - tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -2297,12 +2270,12 @@ tapable@^2.2.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" @@ -2313,11 +2286,6 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -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== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2334,11 +2302,11 @@ ts-mysql-migrate@^1.0.2: mysql "^2.18.1" ts-node@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.2.1.tgz#4cc93bea0a7aba2179497e65bb08ddfc198b3ab5" - integrity sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw== + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: - "@cspotcode/source-map-support" "0.6.1" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -2349,12 +2317,13 @@ ts-node@^10.2.1: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tsconfig-paths@^3.14.1: - 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== +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.2" @@ -2367,9 +2336,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tsutils@^3.21.0: version "3.21.0" @@ -2390,40 +2359,75 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -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" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typeorm@^0.3.16: - version "0.3.17" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949" - integrity sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig== + version "0.3.20" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" + integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== dependencies: "@sqltools/formatter" "^1.2.5" app-root-path "^3.1.0" buffer "^6.0.3" chalk "^4.1.2" cli-highlight "^2.1.11" - date-fns "^2.29.3" + dayjs "^1.11.9" debug "^4.3.4" dotenv "^16.0.3" - glob "^8.1.0" + glob "^10.3.10" mkdirp "^2.1.3" - reflect-metadata "^0.1.13" + reflect-metadata "^0.2.1" sha.js "^2.4.11" tslib "^2.5.0" uuid "^9.0.0" yargs "^17.6.2" typescript@^4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== unbox-primitive@^1.0.2: version "1.0.2" @@ -2435,10 +2439,10 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -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== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== uri-js@^4.2.2: version "4.4.1" @@ -2450,7 +2454,7 @@ uri-js@^4.2.2: util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" @@ -2458,9 +2462,14 @@ uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== which-boxed-primitive@^1.0.2: version "1.0.2" @@ -2473,17 +2482,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.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" + has-tostringtag "^1.0.2" which@^2.0.1: version "2.0.2" @@ -2492,10 +2500,19 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrap-ansi@^7.0.0: version "7.0.0" @@ -2506,21 +2523,25 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From d269fb4799c2ac594952477daae83ddb4eb56587 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 21 Sep 2024 09:42:44 +0200 Subject: [PATCH 06/23] add dlt_users table analog to dlt_transactions --- .../0087-add_dlt_users_table/DltUser.ts | 33 ++++ .../entity/0087-add_dlt_users_table/User.ts | 181 ++++++++++++++++++ database/entity/DltUser.ts | 1 + database/entity/User.ts | 2 +- database/entity/index.ts | 2 + database/logging/DltUserLogging.view.ts | 23 +++ .../migrations/0087-add_dlt_users_table.ts | 19 ++ 7 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 database/entity/0087-add_dlt_users_table/DltUser.ts create mode 100644 database/entity/0087-add_dlt_users_table/User.ts create mode 100644 database/entity/DltUser.ts create mode 100644 database/logging/DltUserLogging.view.ts create mode 100644 database/migrations/0087-add_dlt_users_table.ts diff --git a/database/entity/0087-add_dlt_users_table/DltUser.ts b/database/entity/0087-add_dlt_users_table/DltUser.ts new file mode 100644 index 000000000..ca916e128 --- /dev/null +++ b/database/entity/0087-add_dlt_users_table/DltUser.ts @@ -0,0 +1,33 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { User } from '../User' + +@Entity('dlt_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class DltUser extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: false }) + userId: number + + @Column({ + name: 'message_id', + length: 64, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + messageId: string + + @Column({ name: 'verified', type: 'bool', nullable: false, default: false }) + verified: boolean + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @Column({ name: 'verified_at', nullable: true, default: null, type: 'datetime' }) + verifiedAt: Date | null + + @OneToOne(() => User, (user) => user.dltUser) + @JoinColumn({ name: 'user_id' }) + user?: User | null +} diff --git a/database/entity/0087-add_dlt_users_table/User.ts b/database/entity/0087-add_dlt_users_table/User.ts new file mode 100644 index 000000000..8d5466241 --- /dev/null +++ b/database/entity/0087-add_dlt_users_table/User.ts @@ -0,0 +1,181 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToMany, + JoinColumn, + OneToOne, + Geometry, + ManyToOne, +} from 'typeorm' +import { Contribution } from '../Contribution' +import { ContributionMessage } from '../ContributionMessage' +import { UserContact } from '../UserContact' +import { UserRole } from '../UserRole' +import { GeometryTransformer } from '../../src/typeorm/GeometryTransformer' +import { Community } from '../Community' +import { DltUser } from '../DltUser' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ type: 'bool', default: false }) + foreign: boolean + + @Column({ + name: 'gradido_id', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + gradidoID: string + + @Column({ + name: 'community_uuid', + type: 'char', + length: 36, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + communityUuid: string + + @ManyToOne(() => Community, (community) => community.users) + @JoinColumn({ name: 'community_uuid', referencedColumnName: 'communityUuid' }) + community: Community | null + + @Column({ + name: 'alias', + length: 20, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + alias: string + + @OneToOne(() => UserContact, (emailContact: UserContact) => emailContact.user) + @JoinColumn({ name: 'email_id' }) + emailContact: UserContact + + @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) + emailId: number | null + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ name: 'gms_publish_name', type: 'int', unsigned: true, nullable: false, default: 0 }) + gmsPublishName: number + + @Column({ name: 'humhub_publish_name', type: 'int', unsigned: true, nullable: false, default: 0 }) + humhubPublishName: number + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @DeleteDateColumn({ name: 'deleted_at', nullable: true }) + deletedAt: Date | null + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ + name: 'password_encryption_type', + type: 'int', + unsigned: true, + nullable: false, + default: 0, + }) + passwordEncryptionType: number + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ type: 'bool', default: false }) + hideAmountGDD: boolean + + @Column({ type: 'bool', default: false }) + hideAmountGDT: boolean + + @OneToMany(() => UserRole, (userRole) => userRole.user) + @JoinColumn({ name: 'user_id' }) + userRoles: UserRole[] + + @Column({ name: 'referrer_id', type: 'int', unsigned: true, nullable: true, default: null }) + referrerId?: number | null + + @Column({ + name: 'contribution_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + contributionLinkId?: number | null + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ name: 'gms_allowed', type: 'bool', default: true }) + gmsAllowed: boolean + + @Column({ + name: 'location', + type: 'geometry', + default: null, + nullable: true, + transformer: GeometryTransformer, + }) + location: Geometry | null + + @Column({ + name: 'gms_publish_location', + type: 'int', + unsigned: true, + nullable: false, + default: 2, + }) + gmsPublishLocation: number + + @Column({ name: 'gms_registered', type: 'bool', default: false }) + gmsRegistered: boolean + + @Column({ name: 'gms_registered_at', type: 'datetime', default: null, nullable: true }) + gmsRegisteredAt: Date | null + + @Column({ name: 'humhub_allowed', type: 'bool', default: false }) + humhubAllowed: boolean + + @OneToMany(() => Contribution, (contribution) => contribution.user) + @JoinColumn({ name: 'user_id' }) + contributions?: Contribution[] + + @OneToMany(() => ContributionMessage, (message) => message.user) + @JoinColumn({ name: 'user_id' }) + messages?: ContributionMessage[] + + @OneToMany(() => UserContact, (userContact: UserContact) => userContact.user) + @JoinColumn({ name: 'user_id' }) + userContacts?: UserContact[] + + @OneToOne(() => DltUser, (dlt) => dlt.userId) + @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) + dltUser?: DltUser | null +} diff --git a/database/entity/DltUser.ts b/database/entity/DltUser.ts new file mode 100644 index 000000000..29c835233 --- /dev/null +++ b/database/entity/DltUser.ts @@ -0,0 +1 @@ +export { DltUser } from './0087-add_dlt_users_table/DltUser' diff --git a/database/entity/User.ts b/database/entity/User.ts index 993d983ef..5267c24cc 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0084-introduce_humhub_registration/User' +export { User } from './0087-add_dlt_users_table/User' diff --git a/database/entity/index.ts b/database/entity/index.ts index 3352abdb4..a5a988490 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -13,6 +13,7 @@ import { Community } from './Community' import { FederatedCommunity } from './FederatedCommunity' import { UserRole } from './UserRole' import { DltTransaction } from './DltTransaction' +import { DltUser } from './DltUser' import { PendingTransaction } from './0071-add-pending_transactions-table/PendingTransaction' export const entities = [ @@ -21,6 +22,7 @@ export const entities = [ ContributionLink, ContributionMessage, DltTransaction, + DltUser, Event, FederatedCommunity, LoginElopageBuys, diff --git a/database/logging/DltUserLogging.view.ts b/database/logging/DltUserLogging.view.ts new file mode 100644 index 000000000..c98c3f351 --- /dev/null +++ b/database/logging/DltUserLogging.view.ts @@ -0,0 +1,23 @@ +import { DltUser } from '../entity/DltUser' +import { AbstractLoggingView } from './AbstractLogging.view' +import { UserLoggingView } from './UserLogging.view' + +export class DltUserLoggingView extends AbstractLoggingView { + public constructor(private self: DltUser) { + super() + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public toJSON(): any { + return { + id: this.self.id, + user: this.self.user + ? new UserLoggingView(this.self.user).toJSON() + : { id: this.self.userId }, + messageId: this.self.messageId, + verified: this.self.verified, + createdAt: this.dateToString(this.self.createdAt), + verifiedAt: this.dateToString(this.self.verifiedAt), + } + } +} diff --git a/database/migrations/0087-add_dlt_users_table.ts b/database/migrations/0087-add_dlt_users_table.ts new file mode 100644 index 000000000..fdb310c67 --- /dev/null +++ b/database/migrations/0087-add_dlt_users_table.ts @@ -0,0 +1,19 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE dlt_users ( + id int unsigned NOT NULL AUTO_INCREMENT, + user_id int(10) unsigned NOT NULL, + message_id varchar(64) NULL DEFAULT NULL, + verified tinyint(4) NOT NULL DEFAULT 0, + created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + verified_at datetime(3), + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE dlt_users;`) +} From 68cb7b368bcc30cc0af05c035fd53baf83d1ba49 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 21 Sep 2024 15:49:32 +0200 Subject: [PATCH 07/23] refactor dlt connector usage, reduce complexity --- .../apis/dltConnector/DltConnectorClient.ts | 16 +-- .../dltConnector/model/TransactionRecipe.ts | 3 +- .../graphql/resolver/ContributionResolver.ts | 9 +- .../resolver/TransactionLinkResolver.ts | 3 +- .../graphql/resolver/TransactionResolver.ts | 9 +- backend/src/graphql/resolver/UserResolver.ts | 9 +- .../util/sendTransactionsToDltConnector.ts | 81 -------------- backend/src/index.ts | 5 + .../sendTransactionsToDltConnector.test.ts | 0 .../tasks/sendTransactionsToDltConnector.ts | 101 ++++++++++++++++++ backend/src/util/InterruptiveSleep.ts | 31 ++++++ backend/src/util/InterruptiveSleepManager.ts | 67 ++++++++++++ 12 files changed, 230 insertions(+), 104 deletions(-) delete mode 100644 backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts rename backend/src/{graphql/resolver/util => tasks}/sendTransactionsToDltConnector.test.ts (100%) create mode 100644 backend/src/tasks/sendTransactionsToDltConnector.ts create mode 100644 backend/src/util/InterruptiveSleep.ts create mode 100644 backend/src/util/InterruptiveSleepManager.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 85e8bfb0a..4737d95bc 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -103,10 +103,12 @@ 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): Promise { + public async transmitTransaction( + transaction: DbTransaction, + ): Promise { // we don't need the receive transactions, there contain basically the same data as the send transactions if ((transaction.typeId as TransactionTypeId) === TransactionTypeId.RECEIVE) { - return true + return } const typeString = getTransactionTypeString(transaction.typeId) // no negative values in dlt connector, gradido concept don't use negative values so the code don't use it too @@ -132,17 +134,15 @@ export class DltConnectorClient { // TODO: add account nr for user after they have also more than one account in backend logger.debug('transmit transaction to dlt connector', params) const { - data: { - sendTransaction: { error, succeed }, - }, + data: { sendTransaction: result }, } = await this.client.rawRequest<{ sendTransaction: TransactionResult }>( sendTransaction, params, ) - if (error) { - throw new Error(error.message) + if (result.error) { + throw new Error(result.error.message) } - return succeed + return result } catch (e) { throw new LogError('Error send sending transaction to dlt-connector: ', e) } diff --git a/backend/src/apis/dltConnector/model/TransactionRecipe.ts b/backend/src/apis/dltConnector/model/TransactionRecipe.ts index edd7deadb..504ff2044 100644 --- a/backend/src/apis/dltConnector/model/TransactionRecipe.ts +++ b/backend/src/apis/dltConnector/model/TransactionRecipe.ts @@ -1,8 +1,7 @@ import { TransactionType } from '@dltConnector/enum/TransactionType' export interface TransactionRecipe { - id: number createdAt: string type: TransactionType - topic: string + messageIdHex: string } diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 5684835e4..145d70a3f 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -43,6 +43,10 @@ import { Context, getUser, getClientTimezoneOffset } from '@/server/context' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { calculateDecay } from '@/util/decay' +import { + InterruptiveSleepManager, + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, +} from '@/util/InterruptiveSleepManager' import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' import { fullName } from '@/util/utilities' @@ -50,7 +54,6 @@ import { findContribution } from './util/contributions' import { getUserCreation, validateContribution, getOpenCreations } from './util/creations' import { findContributions } from './util/findContributions' import { getLastTransaction } from './util/getLastTransaction' -import { sendTransactionsToDltConnector } from './util/sendTransactionsToDltConnector' @Resolver() export class ContributionResolver { @@ -473,8 +476,8 @@ export class ContributionResolver { await queryRunner.commitTransaction() - // trigger to send transaction via dlt-connector - void sendTransactionsToDltConnector() + // notify dlt-connector loop for new work + InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) logger.info('creation commited successfuly.') void sendContributionConfirmedEmail({ diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 63134a9a8..0ef7f0586 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -38,10 +38,11 @@ import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' import { fullName } from '@/util/utilities' import { calculateBalance } from '@/util/validate' +import { sendTransactionsToDltConnector } from '../../tasks/sendTransactionsToDltConnector' + import { executeTransaction } from './TransactionResolver' import { getUserCreation, validateContribution } from './util/creations' import { getLastTransaction } from './util/getLastTransaction' -import { sendTransactionsToDltConnector } from './util/sendTransactionsToDltConnector' import { transactionLinkList } from './util/transactionLinkList' // TODO: do not export, test it inside the resolver diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 1889e3be0..1d652adfe 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -32,6 +32,10 @@ import { Context, getUser } from '@/server/context' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { communityUser } from '@/util/communityUser' +import { + InterruptiveSleepManager, + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, +} from '@/util/InterruptiveSleepManager' import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' import { fullName } from '@/util/utilities' import { calculateBalance } from '@/util/validate' @@ -47,7 +51,6 @@ import { processXComCommittingSendCoins, processXComPendingSendCoins, } from './util/processXComSendCoins' -import { sendTransactionsToDltConnector } from './util/sendTransactionsToDltConnector' import { storeForeignUser } from './util/storeForeignUser' import { transactionLinkSummary } from './util/transactionLinkSummary' @@ -177,8 +180,8 @@ export const executeTransaction = async ( transactionReceive.amount, ) - // trigger to send transaction via dlt-connector - void sendTransactionsToDltConnector() + // notify dlt-connector loop for new work + InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Transaction was not successful', e) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 93c63e659..6ddd15705 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -30,7 +30,6 @@ import { GmsUserAuthenticationResult } from '@model/GmsUserAuthenticationResult' import { User } from '@model/User' import { UserAdmin, SearchUsersResult } from '@model/UserAdmin' -import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' import { updateGmsUser } from '@/apis/gms/GmsClient' import { GmsUser } from '@/apis/gms/model/GmsUser' import { HumHubClient } from '@/apis/humhub/HumHubClient' @@ -67,6 +66,7 @@ import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { communityDbUser } from '@/util/communityUser' import { hasElopageBuys } from '@/util/hasElopageBuys' +import { InterruptiveSleepManager, TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/util/InterruptiveSleepManager' import { getTimeDurationObject, printTimeDuration } from '@/util/time' import random from 'random-bigint' @@ -385,11 +385,8 @@ export class UserResolver { } logger.info('createUser() successful...') - const dltConnector = DltConnectorClient.getInstance() - if (dltConnector) { - const r = await dltConnector.registerAddress(dbUser) - console.log('result from dlt', r) - } + // notify dlt-connector loop for new work + InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) if (redeemCode) { eventRegisterRedeem.affectedUser = dbUser diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts deleted file mode 100644 index 733c12594..000000000 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { IsNull } from '@dbTools/typeorm' -import { DltTransaction } from '@entity/DltTransaction' -import { Transaction } from '@entity/Transaction' - -import { DltConnectorClient } from '@dltConnector/DltConnectorClient' - -import { backendLogger as logger } from '@/server/logger' -import { Monitor, MonitorNames } from '@/util/Monitor' - -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)) { - // mark this block for occuption to prevent concurrency - Monitor.lockIt(MonitorNames.SEND_DLT_TRANSACTIONS) - - try { - await createDltTransactions() - const dltConnector = DltConnectorClient.getInstance() - if (dltConnector) { - logger.debug('with sending to DltConnector...') - const dltTransactions = await DltTransaction.find({ - where: { messageId: IsNull() }, - relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - for (const dltTx of dltTransactions) { - if (!dltTx.transaction) { - continue - } - try { - const result = await dltConnector.transmitTransaction(dltTx.transaction) - // message id isn't known at this point of time, because transaction will not direct sended to iota, - // it will first go to db and then sended, if no transaction is in db before - if (result) { - dltTx.messageId = 'sended' - await DltTransaction.save(dltTx) - logger.info('store messageId=%s in dltTx=%d', dltTx.messageId, dltTx.id) - } - } catch (e) { - logger.error( - `error while sending to dlt-connector or writing messageId of dltTx=${dltTx.id}`, - e, - ) - } - } - } else { - logger.info('sending to DltConnector currently not configured...') - } - } catch (e) { - logger.error('error on sending transactions to dlt-connector.', e) - } finally { - // releae Monitor occupation - Monitor.releaseIt(MonitorNames.SEND_DLT_TRANSACTIONS) - } - } else { - logger.info('sendTransactionsToDltConnector currently locked by monitor...') - } -} - -async function createDltTransactions(): Promise { - const dltqb = DltTransaction.createQueryBuilder().select('transactions_id') - const newTransactions: Transaction[] = await Transaction.createQueryBuilder() - .select('id') - .addSelect('balance_date') - .where('id NOT IN (' + dltqb.getSql() + ')') - // eslint-disable-next-line camelcase - .orderBy({ balance_date: 'ASC', id: 'ASC' }) - .getRawMany() - - const dltTxArray: DltTransaction[] = [] - let idx = 0 - while (newTransactions.length > dltTxArray.length) { - // timing problems with for(let idx = 0; idx < newTransactions.length; idx++) { - const dltTx = DltTransaction.create() - dltTx.transactionId = newTransactions[idx++].id - await DltTransaction.save(dltTx) - dltTxArray.push(dltTx) - } -} diff --git a/backend/src/index.ts b/backend/src/index.ts index 86f78326d..5cb3574e4 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,6 +1,7 @@ import { CONFIG } from './config' import { startValidateCommunities } from './federation/validateCommunities' import { createServer } from './server/createServer' +import { sendTransactionsToDltConnector } from './tasks/sendTransactionsToDltConnector' async function main() { const { app } = await createServer() @@ -13,6 +14,10 @@ async function main() { console.log(`GraphIQL available at http://localhost:${CONFIG.PORT}`) } }) + // task is running the whole time for transmitting transaction via dlt-connector to iota + // can be notified with InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) + // that a new transaction or user was stored in db + void sendTransactionsToDltConnector() void startValidateCommunities(Number(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER)) } diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts b/backend/src/tasks/sendTransactionsToDltConnector.test.ts similarity index 100% rename from backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts rename to backend/src/tasks/sendTransactionsToDltConnector.test.ts diff --git a/backend/src/tasks/sendTransactionsToDltConnector.ts b/backend/src/tasks/sendTransactionsToDltConnector.ts new file mode 100644 index 000000000..26535e082 --- /dev/null +++ b/backend/src/tasks/sendTransactionsToDltConnector.ts @@ -0,0 +1,101 @@ +import { DltTransaction } from '@entity/DltTransaction' +import { DltUser } from '@entity/DltUser' +import { Transaction } from '@entity/Transaction' +import { User } from '@entity/User' + +import { DltConnectorClient } from '@dltConnector/DltConnectorClient' + +import { backendLogger as logger } from '@/server/logger' +import { + InterruptiveSleepManager, + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, +} from '@/util/InterruptiveSleepManager' + +let running = true + +export const stopSendTransactionsToDltConnector = (): void => { + running = false +} + +export async function sendTransactionsToDltConnector(): Promise { + const dltConnector = DltConnectorClient.getInstance() + if (!dltConnector) { + logger.info('sending to DltConnector currently not configured...') + running = false + return + } + logger.info('start sendTransactionsToDltConnector task') + + // eslint-disable-next-line no-unmodified-loop-condition + while (running) { + try { + // loop while work could be found + while (true) { + const pendingTransaction = await findNextPendingTransaction() + if (pendingTransaction instanceof User) { + const result = await dltConnector.registerAddress(pendingTransaction) + if (result?.succeed && result.recipe) { + const dltUser = DltUser.create() + dltUser.userId = pendingTransaction.id + dltUser.messageId = result.recipe.messageIdHex + // wait until saved, necessary before next call to findNextPendingTransaction + await DltUser.save(dltUser) + logger.info('store dltUser: messageId=%s in dltTx=%d', dltUser.messageId, dltUser.id) + } + } else if (pendingTransaction instanceof Transaction) { + const result = await dltConnector.transmitTransaction(pendingTransaction) + if (result?.succeed && result.recipe) { + const dltTransaction = DltTransaction.create() + dltTransaction.transactionId = pendingTransaction.id + dltTransaction.messageId = result.recipe.messageIdHex + // wait until saved, necessary before next call to findNextPendingTransaction + await DltTransaction.save(dltTransaction) + logger.info( + 'store dltTransaction: messageId=%s in dltTx=%d', + dltTransaction.messageId, + dltTransaction.id, + ) + } + } else { + // nothing to do, break inner loop and sleep until new work has arrived + break + } + } + await InterruptiveSleepManager.getInstance().sleep( + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, + 1000, + ) + } catch (e) { + logger.error(`error while sending to dlt-connector or writing messageId`, e) + } + } +} + +async function findNextPendingTransaction(): Promise { + const lastTransactionPromise: Promise = Transaction.createQueryBuilder() + .select() + .leftJoin(DltTransaction, 'dltTransaction', 'transaction.id = dltTransaction.transactionId') + .where('dltTransaction.transactionId IS NULL') + // eslint-disable-next-line camelcase + .orderBy({ balance_date: 'ASC', id: 'ASC' }) + .limit(1) + .getRawOne() + + const lastUserPromise: Promise = User.createQueryBuilder() + .leftJoin(DltUser, 'dltUser', 'user.id = dltUser.userId') + .where('dltUser.userId IS NULL') + // eslint-disable-next-line camelcase + .orderBy({ created_at: 'ASC', id: 'ASC' }) + .limit(1) + .getRawOne() + + const results = await Promise.all([lastTransactionPromise, lastUserPromise]) + if (results[0] && results[1]) { + return results[0].balanceDate < results[1].createdAt ? results[0] : results[1] + } else if (results[0]) { + return results[0] + } else if (results[1]) { + return results[1] + } + return null +} diff --git a/backend/src/util/InterruptiveSleep.ts b/backend/src/util/InterruptiveSleep.ts new file mode 100644 index 000000000..c21e57db9 --- /dev/null +++ b/backend/src/util/InterruptiveSleep.ts @@ -0,0 +1,31 @@ +/** + * Sleep, that can be interrupted + * call sleep only for msSteps and than check if interrupt was called + */ +export class InterruptiveSleep { + private interruptSleep = false + private msSteps = 10 + + constructor(msSteps: number) { + this.msSteps = msSteps + } + + public interrupt(): void { + this.interruptSleep = true + } + + private static _sleep(ms: number) { + return new Promise((resolve) => { + setTimeout(resolve, ms) + }) + } + + public async sleep(ms: number): Promise { + let waited = 0 + this.interruptSleep = false + while (waited < ms && !this.interruptSleep) { + await InterruptiveSleep._sleep(this.msSteps) + waited += this.msSteps + } + } +} diff --git a/backend/src/util/InterruptiveSleepManager.ts b/backend/src/util/InterruptiveSleepManager.ts new file mode 100644 index 000000000..246269623 --- /dev/null +++ b/backend/src/util/InterruptiveSleepManager.ts @@ -0,0 +1,67 @@ +import { LogError } from '@/server/LogError' + +import { InterruptiveSleep } from './InterruptiveSleep' + +// Source: https://refactoring.guru/design-patterns/singleton/typescript/example +// and ../federation/client/FederationClientFactory.ts +/** + * Managing Instances of interruptive sleep it is inspired from conditions from c++ multithreading + * It is used for separate worker threads which will go to sleep after they haven't anything todo left, + * but with this Manager and InterruptiveSleep Object it sleeps only stepSize and check if something interrupted his sleep, + * so he can check for new work + */ +export const TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY = 'transmitToIota' + +// eslint-disable-next-line @typescript-eslint/no-extraneous-class +export class InterruptiveSleepManager { + // eslint-disable-next-line no-use-before-define + private static instance: InterruptiveSleepManager + private interruptiveSleep: Map = new Map() + private stepSizeMilliseconds = 10 + + /** + * The Singleton's constructor should always be private to prevent direct + * construction calls with the `new` operator. + */ + // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function + private constructor() {} + + /** + * The static method that controls the access to the singleton instance. + * + * This implementation let you subclass the Singleton class while keeping + * just one instance of each subclass around. + */ + public static getInstance(): InterruptiveSleepManager { + if (!InterruptiveSleepManager.instance) { + InterruptiveSleepManager.instance = new InterruptiveSleepManager() + } + return InterruptiveSleepManager.instance + } + + /** + * only for new created InterruptiveSleepManager Entries! + * @param step size in ms in which new! InterruptiveSleepManager check if they where triggered + */ + public setStepSize(ms: number) { + this.stepSizeMilliseconds = ms + } + + public interrupt(key: string): void { + const interruptiveSleep = this.interruptiveSleep.get(key) + if (interruptiveSleep) { + interruptiveSleep.interrupt() + } + } + + public sleep(key: string, ms: number): Promise { + if (!this.interruptiveSleep.has(key)) { + this.interruptiveSleep.set(key, new InterruptiveSleep(this.stepSizeMilliseconds)) + } + const interruptiveSleep = this.interruptiveSleep.get(key) + if (!interruptiveSleep) { + throw new LogError('map entry not exist after setting it') + } + return interruptiveSleep.sleep(ms) + } +} From 2727b6ebe99e31993f686a903a18afc8282c538c Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sun, 22 Sep 2024 16:35:15 +0200 Subject: [PATCH 08/23] add new send to iota interaction --- dlt-connector/.env.dist | 4 +- dlt-connector/.env.template | 4 +- dlt-connector/package.json | 1 + dlt-connector/src/client/GradidoNode.ts | 124 ++++++++++++++++++ dlt-connector/src/config/index.ts | 7 +- .../src/data/Community.repository.ts | 10 +- .../src/graphql/model/TransactionRecipe.ts | 31 ++--- .../src/graphql/resolver/CommunityResolver.ts | 4 +- dlt-connector/src/index.ts | 25 ++-- .../community/AddCommunity.context.ts | 4 +- .../CreateTransactionRecipe.context.test.ts | 6 +- .../AbstractKeyPair.role.ts | 5 + .../AbstractRemoteKeyPair.role.ts | 5 + .../keyPairCalculation/AccountKeyPair.role.ts | 13 ++ .../ForeignCommunityKeyPair.role.ts | 31 +++++ .../HomeCommunityKeyPair.role.ts | 22 ++++ .../KeyPairCalculation.context.ts | 56 ++++++++ .../RemoteAccountKeyPair.role.ts | 35 +++++ .../keyPairCalculation/UserKeyPair.role.ts | 28 ++++ .../sendToIota/AbstractTransaction.role.ts | 7 + .../CommunityRootTransaction.role.ts | 47 +++++++ .../sendToIota/CreationTransaction.role.ts | 39 ++++++ .../RegisterAddressTransaction.role.ts | 40 ++++++ .../sendToIota/SendToIota.context.ts | 116 ++++++++++++++++ .../sendToIota/TransferTransaction.role.ts | 44 +++++++ .../src/manager/KeyPairCacheManager.ts | 66 ++++++++++ dlt-connector/src/utils/derivationHelper.ts | 2 + dlt-connector/src/utils/typeConverter.test.ts | 4 +- dlt-connector/src/utils/typeConverter.ts | 30 ++++- dlt-connector/test/seeding/Community.seed.ts | 4 +- dlt-connector/yarn.lock | 33 +++-- 31 files changed, 779 insertions(+), 68 deletions(-) create mode 100644 dlt-connector/src/client/GradidoNode.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/AbstractKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts create mode 100644 dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts create mode 100644 dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts create mode 100644 dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts create mode 100644 dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts create mode 100644 dlt-connector/src/interactions/sendToIota/SendToIota.context.ts create mode 100644 dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts create mode 100644 dlt-connector/src/manager/KeyPairCacheManager.ts diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index 164e23036..8ad78348d 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -21,10 +21,12 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log # DLT-Connector DLT_CONNECTOR_PORT=6010 +# Gradido Node Server URL +NODE_SERVER_URL=http://localhost:8340 + # Gradido Blockchain GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=21ffbbc616fe GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=a51ef8ac7ef1abf162fb7a65261acd7a -GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD=YourPassword # Route to Backend BACKEND_SERVER_URL=http://localhost:4000 diff --git a/dlt-connector/.env.template b/dlt-connector/.env.template index d7d46dad7..15c2ae5a9 100644 --- a/dlt-connector/.env.template +++ b/dlt-connector/.env.template @@ -19,10 +19,12 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log # DLT-Connector DLT_CONNECTOR_PORT=$DLT_CONNECTOR_PORT +# Gradido Node Server URL +NODE_SERVER_URL=$NODE_SERVER_URL + # Gradido Blockchain GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=$GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=$GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY -GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD=$GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD # Route to Backend BACKEND_SERVER_URL=http://localhost:4000 \ No newline at end of file diff --git a/dlt-connector/package.json b/dlt-connector/package.json index cf29417f5..ca889b833 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -33,6 +33,7 @@ "graphql-scalars": "^1.22.2", "helmet": "^7.1.0", "jose": "^5.2.2", + "jsonrpc-ts-client": "^0.2.3", "log4js": "^6.7.1", "nodemon": "^2.0.20", "reflect-metadata": "^0.1.13", diff --git a/dlt-connector/src/client/GradidoNode.ts b/dlt-connector/src/client/GradidoNode.ts new file mode 100644 index 000000000..92a211768 --- /dev/null +++ b/dlt-connector/src/client/GradidoNode.ts @@ -0,0 +1,124 @@ +/* eslint-disable camelcase */ +import { AddressType, ConfirmedTransaction, stringToAddressType } from 'gradido-blockchain-js' +import JsonRpcClient from 'jsonrpc-ts-client' +import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' + +import { CONFIG } from '@/config' +import { logger } from '@/logging/logger' +import { LogError } from '@/server/LogError' +import { confirmedTransactionFromBase64, getEnumValue } from '@/utils/typeConverter' + +const client = new JsonRpcClient({ + url: CONFIG.NODE_SERVER_URL, +}) +/* +enum JsonRPCErrorCodes { + NONE = 0, + GRADIDO_NODE_ERROR = -10000, + UNKNOWN_GROUP = -10001, + NOT_IMPLEMENTED = -10002, + TRANSACTION_NOT_FOUND = -10003, + // default errors from json rpc standard: https://www.jsonrpc.org/specification + // -32700 Parse error Invalid JSON was received by the server. + PARSE_ERROR = -32700, + // -32600 Invalid Request The JSON sent is not a valid Request object. + INVALID_REQUEST = -32600, + // -32601 Method not found The method does not exist / is not available. + METHODE_NOT_FOUND = -32601, + // -32602 Invalid params Invalid method parameter(s). + INVALID_PARAMS = -32602, + // -32603 Internal error Internal JSON - RPC error. + INTERNAL_ERROR = -32603, + // -32000 to -32099 Server error Reserved for implementation-defined server-errors. +} +*/ + +interface ConfirmedTransactionList { + transactions: string[] + timeUsed: string +} + +interface ConfirmedTransactionResponse { + transaction: string + timeUsed: string +} + +interface AddressTypeResult { + addressType: string +} + +function resolveResponse(response: JsonRpcEitherResponse, onSuccess: (result: T) => R): R { + if (response.isSuccess()) { + return onSuccess(response.result) + } else if (response.isError()) { + throw new LogError('error by json rpc request to gradido node server', response.error) + } + throw new LogError('no success and no error', response) +} + +async function getTransactions( + fromTransactionId: number, + maxResultCount: number, + iotaTopic: string, +): Promise { + const parameter = { + format: 'base64', + fromTransactionId, + maxResultCount, + communityId: iotaTopic, + } + logger.info('call getTransactions on Node Server via jsonrpc 2.0 with ', parameter) + const response = await client.exec('getTransactions', parameter) // sends payload {jsonrpc: '2.0', params: ...} + return resolveResponse(response, (result: ConfirmedTransactionList) => { + logger.debug('GradidoNode used time', result.timeUsed) + return result.transactions.map((transactionBase64) => + confirmedTransactionFromBase64(transactionBase64), + ) + }) +} + +async function getTransaction( + transactionId: number | Buffer, + iotaTopic: string, +): Promise { + logger.info('call gettransaction on Node Server via jsonrpc 2.0') + const response = await client.exec('gettransaction', { + format: 'base64', + communityId: iotaTopic, + transactionId: typeof transactionId === 'number' ? transactionId : undefined, + iotaMessageId: transactionId instanceof Buffer ? transactionId.toString('hex') : undefined, + }) + return resolveResponse(response, (result: ConfirmedTransactionResponse) => { + logger.debug('GradidoNode used time', result.timeUsed) + return result.transaction && result.transaction !== '' + ? confirmedTransactionFromBase64(result.transaction) + : undefined + }) +} + +async function getLastTransaction(iotaTopic: string): Promise { + logger.info('call getlasttransaction on Node Server via jsonrpc 2.0') + const response = await client.exec('getlasttransaction', { + format: 'base64', + communityId: iotaTopic, + }) + return resolveResponse(response, (result: ConfirmedTransactionResponse) => { + logger.debug('GradidoNode used time', result.timeUsed) + return result.transaction && result.transaction !== '' + ? confirmedTransactionFromBase64(result.transaction) + : undefined + }) +} + +async function getAddressType(pubkey: Buffer, iotaTopic: string): Promise { + logger.info('call getaddresstype on Node Server via jsonrpc 2.0') + const response = await client.exec('getaddresstype', { + pubkey: pubkey.toString('hex'), + communityId: iotaTopic, + }) + return resolveResponse(response, (result: AddressTypeResult) => + stringToAddressType(result.addressType), + ) +} + +export { getTransaction, getLastTransaction, getTransactions, getAddressType } diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index f2f01cd8d..ff50eb3fe 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -39,13 +39,15 @@ const dltConnector = { DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT ?? 6010, } +const nodeServer = { + NODE_SERVER_URL: process.env.NODE_SERVER_URL ?? 'http://localhost:8340', +} + const gradidoBlockchain = { GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET: process.env.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET ?? 'invalid', GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY: process.env.GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY ?? 'invalid', - GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD: - process.env.GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD, } const backendServer = { @@ -70,6 +72,7 @@ export const CONFIG = { ...database, ...iota, ...dltConnector, + ...nodeServer, ...gradidoBlockchain, ...backendServer, } diff --git a/dlt-connector/src/data/Community.repository.ts b/dlt-connector/src/data/Community.repository.ts index a9fdf4e09..eb52fb38c 100644 --- a/dlt-connector/src/data/Community.repository.ts +++ b/dlt-connector/src/data/Community.repository.ts @@ -8,7 +8,7 @@ import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { TransactionError } from '@/graphql/model/TransactionError' import { LogError } from '@/server/LogError' import { getDataSource } from '@/typeorm/DataSource' -import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' +import { uuid4ToHash } from '@/utils/typeConverter' import { KeyPair } from './KeyPair' @@ -17,7 +17,7 @@ export const CommunityRepository = getDataSource() .extend({ async isExist(community: CommunityDraft | string): Promise { const iotaTopic = - community instanceof CommunityDraft ? iotaTopicFromCommunityUUID(community.uuid) : community + community instanceof CommunityDraft ? uuid4ToHash(community.uuid) : community const result = await this.find({ where: { iotaTopic }, }) @@ -27,7 +27,7 @@ export const CommunityRepository = getDataSource() async findByCommunityArg({ uuid, foreign, confirmed }: CommunityArg): Promise { return await this.find({ where: { - ...(uuid && { iotaTopic: iotaTopicFromCommunityUUID(uuid) }), + ...(uuid && { iotaTopic: uuid4ToHash(uuid) }), ...(foreign && { foreign }), ...(confirmed && { confirmedAt: Not(IsNull()) }), }, @@ -35,7 +35,7 @@ export const CommunityRepository = getDataSource() }, async findByCommunityUuid(communityUuid: string): Promise { - return await this.findOneBy({ iotaTopic: iotaTopicFromCommunityUUID(communityUuid) }) + return await this.findOneBy({ iotaTopic: uuid4ToHash(communityUuid) }) }, async findByIotaTopic(iotaTopic: string): Promise { @@ -54,7 +54,7 @@ export const CommunityRepository = getDataSource() } return ( (await this.findOneBy({ - iotaTopic: iotaTopicFromCommunityUUID(identifier.communityUuid), + iotaTopic: uuid4ToHash(identifier.communityUuid), })) ?? undefined ) }, diff --git a/dlt-connector/src/graphql/model/TransactionRecipe.ts b/dlt-connector/src/graphql/model/TransactionRecipe.ts index 78fa7fc31..eae7f1a6f 100644 --- a/dlt-connector/src/graphql/model/TransactionRecipe.ts +++ b/dlt-connector/src/graphql/model/TransactionRecipe.ts @@ -1,26 +1,20 @@ -import { Transaction } from '@entity/Transaction' -import { Field, Int, ObjectType } from 'type-graphql' +import { GradidoTransaction, MemoryBlock, transactionTypeToString } from 'gradido-blockchain-js' +import { Field, ObjectType } from 'type-graphql' -import { TransactionType } from '@/data/proto/3_3/enum/TransactionType' import { LogError } from '@/server/LogError' -import { getEnumValue } from '@/utils/typeConverter' @ObjectType() export class TransactionRecipe { - public constructor({ id, createdAt, type, community, signature }: Transaction) { - const transactionType = getEnumValue(TransactionType, type) - if (!transactionType) { - throw new LogError('invalid transaction, type is missing') + public constructor(transaction: GradidoTransaction, messageId: MemoryBlock) { + const body = transaction.getTransactionBody() + if (!body) { + throw new LogError('invalid gradido transaction, cannot geht valid TransactionBody') } - this.id = id - this.createdAt = createdAt.toString() - this.type = transactionType.toString() - this.topic = community.iotaTopic - this.signatureHex = signature.toString('hex') - } - @Field(() => Int) - id: number + this.createdAt = body.getCreatedAt().getDate().toString() + this.type = transactionTypeToString(body?.getTransactionType()) + this.messageIdHex = messageId.convertToHex() + } @Field(() => String) createdAt: string @@ -29,8 +23,5 @@ export class TransactionRecipe { type: string @Field(() => String) - topic: string - - @Field(() => String) - signatureHex: string + messageIdHex: string } diff --git a/dlt-connector/src/graphql/resolver/CommunityResolver.ts b/dlt-connector/src/graphql/resolver/CommunityResolver.ts index dd9db2b23..848dd0733 100644 --- a/dlt-connector/src/graphql/resolver/CommunityResolver.ts +++ b/dlt-connector/src/graphql/resolver/CommunityResolver.ts @@ -10,7 +10,7 @@ import { CommunityRepository } from '@/data/Community.repository' import { AddCommunityContext } from '@/interactions/backendToDb/community/AddCommunity.context' import { logger } from '@/logging/logger' import { LogError } from '@/server/LogError' -import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' +import { uuid4ToHash } from '@/utils/typeConverter' @Resolver() export class CommunityResolver { @@ -46,7 +46,7 @@ export class CommunityResolver { communityDraft: CommunityDraft, ): Promise { logger.info('addCommunity', communityDraft) - const topic = iotaTopicFromCommunityUUID(communityDraft.uuid) + const topic = uuid4ToHash(communityDraft.uuid) // check if community was already written to db if (await CommunityRepository.isExist(topic)) { return new TransactionResult( diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 8d140faf3..b61157dfb 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -6,10 +6,10 @@ import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' import { CONFIG } from '@/config' import { BackendClient } from './client/BackendClient' -import { CommunityRepository } from './data/Community.repository' import { CommunityDraft } from './graphql/input/CommunityDraft' import { AddCommunityContext } from './interactions/backendToDb/community/AddCommunity.context' import { logger } from './logging/logger' +import { KeyPairCacheManager } from './manager/KeyPairCacheManager' import createServer from './server/createServer' import { LogError } from './server/LogError' import { stopTransmitToIota, transmitToIota } from './tasks/transmitToIota' @@ -61,20 +61,17 @@ async function main() { const { app } = await createServer() // ask backend for home community if we haven't one - try { - await CommunityRepository.loadHomeCommunityKeyPair() - } catch (e) { - const backend = BackendClient.getInstance() - if (!backend) { - throw new LogError('cannot create backend client') - } - // wait for backend server to be ready - await waitForServer(backend, 2500, 10) - - const communityDraft = await backend.getHomeCommunityDraft() - const addCommunityContext = new AddCommunityContext(communityDraft) - await addCommunityContext.run() + const backend = BackendClient.getInstance() + if (!backend) { + throw new LogError('cannot create backend client') } + // wait for backend server to be ready + await waitForServer(backend, 2500, 10) + + const communityDraft = await backend.getHomeCommunityDraft() + KeyPairCacheManager.getInstance().setHomeCommunityUUID(communityDraft.uuid) + const addCommunityContext = new AddCommunityContext(communityDraft) + await addCommunityContext.run() // loop run all the time, check for new transaction for sending to iota void transmitToIota() diff --git a/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts b/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts index bc8f90c32..16bfd8513 100644 --- a/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts +++ b/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts @@ -1,5 +1,5 @@ import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' +import { uuid4ToHash } from '@/utils/typeConverter' import { CommunityRole } from './Community.role' import { ForeignCommunityRole } from './ForeignCommunity.role' @@ -15,7 +15,7 @@ export class AddCommunityContext { private iotaTopic: string public constructor(private communityDraft: CommunityDraft, iotaTopic?: string) { if (!iotaTopic) { - this.iotaTopic = iotaTopicFromCommunityUUID(this.communityDraft.uuid) + this.iotaTopic = uuid4ToHash(this.communityDraft.uuid) } else { this.iotaTopic = iotaTopic } diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts index a38d9952f..6671e6e78 100644 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts +++ b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts @@ -22,7 +22,7 @@ import { AccountType } from '@/graphql/enum/AccountType' import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' +import { uuid4ToHash } from '@/utils/typeConverter' import { CreateTransactionRecipeContext } from './CreateTransactionRecipe.context' @@ -50,8 +50,8 @@ let secondUser: UserSet let foreignUser: UserSet let homeCommunity: Community -const topic = iotaTopicFromCommunityUUID(homeCommunityUuid) -const foreignTopic = iotaTopicFromCommunityUUID(foreignCommunityUuid) +const topic = uuid4ToHash(homeCommunityUuid) +const foreignTopic = uuid4ToHash(foreignCommunityUuid) describe('interactions/backendToDb/transaction/Create Transaction Recipe Context Test', () => { beforeAll(async () => { diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AbstractKeyPair.role.ts new file mode 100644 index 000000000..cd17a3832 --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/AbstractKeyPair.role.ts @@ -0,0 +1,5 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +export abstract class AbstractKeyPairRole { + public abstract generateKeyPair(): KeyPairEd25519 +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts new file mode 100644 index 000000000..1450d9cdb --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts @@ -0,0 +1,5 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +export abstract class AbstractRemoteKeyPairRole { + public abstract retrieveKeyPair(): Promise +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts new file mode 100644 index 000000000..517d33ae1 --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts @@ -0,0 +1,13 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { AbstractKeyPairRole } from './AbstractKeyPair.role' + +export class AccountKeyPairRole extends AbstractKeyPairRole { + public constructor(private accountNr: number, private userKeyPair: KeyPairEd25519) { + super() + } + + public generateKeyPair(): KeyPairEd25519 { + return this.userKeyPair.deriveChild(this.accountNr) + } +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts new file mode 100644 index 000000000..68dd65a21 --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -0,0 +1,31 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { getTransaction } from '@/client/GradidoNode' +import { LogError } from '@/server/LogError' +import { uuid4ToHash } from '@/utils/typeConverter' + +import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' + +export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { + public constructor(private communityUuid: string) { + super() + } + + public async retrieveKeyPair(): Promise { + const firstTransaction = await getTransaction(1, uuid4ToHash(this.communityUuid).convertToHex()) + if (!firstTransaction) { + throw new LogError( + "GradidoNode Server don't know this community with uuid " + this.communityUuid, + ) + } + const transactionBody = firstTransaction.getGradidoTransaction()?.getTransactionBody() + if (!transactionBody || !transactionBody.isCommunityRoot()) { + throw new LogError('get invalid confirmed transaction from gradido node') + } + const communityRoot = transactionBody.getCommunityRoot() + if (!communityRoot) { + throw new LogError('invalid confirmed transaction') + } + return new KeyPairEd25519(communityRoot.getPubkey()) + } +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts new file mode 100644 index 000000000..b888351cd --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts @@ -0,0 +1,22 @@ +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' + +import { CONFIG } from '@/config' +import { LogError } from '@/server/LogError' + +import { AbstractKeyPairRole } from './AbstractKeyPair.role' + +export class HomeCommunityKeyPairRole extends AbstractKeyPairRole { + public generateKeyPair(): KeyPairEd25519 { + if (!CONFIG.IOTA_HOME_COMMUNITY_SEED) { + throw new LogError( + 'IOTA_HOME_COMMUNITY_SEED is missing either in config or as environment variable', + ) + } + const seed = MemoryBlock.fromHex(CONFIG.IOTA_HOME_COMMUNITY_SEED) + const keyPair = KeyPairEd25519.create(seed) + if (!keyPair) { + throw new LogError("couldn't create keyPair from IOTA_HOME_COMMUNITY_SEED") + } + return keyPair + } +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts new file mode 100644 index 000000000..8e6466df5 --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -0,0 +1,56 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' + +import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' +import { AccountKeyPairRole } from './AccountKeyPair.role' +import { ForeignCommunityKeyPairRole } from './ForeignCommunityKeyPair.role' +import { HomeCommunityKeyPairRole } from './HomeCommunityKeyPair.role' +import { RemoteAccountKeyPairRole } from './RemoteAccountKeyPair.role' +import { UserKeyPairRole } from './UserKeyPair.role' + +/** + * @DCI-Context + * Context for calculating key pair for signing transactions + */ +export async function KeyPairCalculation(input: UserIdentifier | string): Promise { + const cache = KeyPairCacheManager.getInstance() + const keyPair = cache.findKeyPair(input) + if (keyPair) { + return keyPair + } + let communityUUID: string + if (input instanceof UserIdentifier) { + communityUUID = input.communityUuid + } else { + communityUUID = input + } + + if (cache.getHomeCommunityUUID() !== communityUUID) { + // it isn't home community so we can only retrieve public keys + let role: AbstractRemoteKeyPairRole + if (input instanceof UserIdentifier) { + role = new RemoteAccountKeyPairRole(input) + } else { + role = new ForeignCommunityKeyPairRole(input) + } + const keyPair = await role.retrieveKeyPair() + cache.addKeyPair(input, keyPair) + return keyPair + } + + let communityKeyPair = cache.findKeyPair(communityUUID) + if (!communityKeyPair) { + communityKeyPair = new HomeCommunityKeyPairRole().generateKeyPair() + cache.addKeyPair(communityUUID, communityKeyPair) + } + if (input instanceof UserIdentifier) { + const userKeyPair = new UserKeyPairRole(input, communityKeyPair).generateKeyPair() + const accountNr = input.accountNr ?? 1 + const accountKeyPair = new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() + cache.addKeyPair(input, accountKeyPair) + return accountKeyPair + } + return communityKeyPair +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts new file mode 100644 index 000000000..1cc9c9891 --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -0,0 +1,35 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { getTransactions } from '@/client/GradidoNode' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { LogError } from '@/server/LogError' +import { uuid4ToHash } from '@/utils/typeConverter' + +import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' + +export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { + public constructor(private user: UserIdentifier) { + super() + } + + public async retrieveKeyPair(): Promise { + const nameHash = uuid4ToHash(this.user.uuid) + const confirmedTransactions = await getTransactions( + 0, + 30, + uuid4ToHash(this.user.communityUuid).convertToHex(), + ) + for (let i = 0; i < confirmedTransactions.length; i++) { + const transactionBody = confirmedTransactions[i].getGradidoTransaction()?.getTransactionBody() + if (transactionBody && transactionBody.isRegisterAddress()) { + const registerAddress = transactionBody.getRegisterAddress() + if (registerAddress && registerAddress.getNameHash()?.equal(nameHash)) { + return new KeyPairEd25519(registerAddress.getAccountPublicKey()) + } + } + } + throw new LogError( + 'cannot find remote user in first 30 transaction from remote blockchain, please wait for better recover implementation', + ) + } +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts new file mode 100644 index 000000000..473b203cd --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -0,0 +1,28 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { hardenDerivationIndex } from '@/utils/derivationHelper' +import { uuid4ToBuffer } from '@/utils/typeConverter' + +import { AbstractKeyPairRole } from './AbstractKeyPair.role' + +export class UserKeyPairRole extends AbstractKeyPairRole { + public constructor(private user: UserIdentifier, private communityKeys: KeyPairEd25519) { + super() + } + + public generateKeyPair(): KeyPairEd25519 { + // example gradido id: 03857ac1-9cc2-483e-8a91-e5b10f5b8d16 => + // wholeHex: '03857ac19cc2483e8a91e5b10f5b8d16'] + const wholeHex = uuid4ToBuffer(this.user.uuid) + const parts = [] + for (let i = 0; i < 4; i++) { + parts[i] = hardenDerivationIndex(wholeHex.subarray(i * 4, (i + 1) * 4).readUInt32BE()) + } + // parts: [2206563009, 2629978174, 2324817329, 2405141782] + return parts.reduce( + (keyPair: KeyPairEd25519, node: number) => keyPair.deriveChild(node), + this.communityKeys, + ) + } +} diff --git a/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts new file mode 100644 index 000000000..ac9120e3d --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts @@ -0,0 +1,7 @@ +import { GradidoTransactionBuilder } from 'gradido-blockchain-js' + +export abstract class AbstractTransactionRole { + abstract getGradidoTransactionBuilder(): Promise + abstract getSenderCommunityUuid(): string + abstract getRecipientCommunityUuid(): string +} diff --git a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts new file mode 100644 index 000000000..713a2b906 --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts @@ -0,0 +1,47 @@ +import { GradidoTransactionBuilder } from 'gradido-blockchain-js' + +import { CommunityDraft } from '@/graphql/input/CommunityDraft' +import { LogError } from '@/server/LogError' +import { + AUF_ACCOUNT_DERIVATION_INDEX, + GMW_ACCOUNT_DERIVATION_INDEX, + hardenDerivationIndex, +} from '@/utils/derivationHelper' + +import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' + +import { AbstractTransactionRole } from './AbstractTransaction.role' + +export class CommunityRootTransactionRole extends AbstractTransactionRole { + constructor(private self: CommunityDraft) { + super() + } + + getSenderCommunityUuid(): string { + return this.self.uuid + } + + getRecipientCommunityUuid(): string { + throw new LogError('cannot be used as cross group transaction') + } + + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const communityKeyPair = await KeyPairCalculation(this.self.uuid) + const gmwKeyPair = communityKeyPair.deriveChild( + hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), + ) + const aufKeyPair = communityKeyPair.deriveChild( + hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), + ) + builder + .setCreatedAt(new Date(this.self.createdAt)) + .setCommunityRoot( + communityKeyPair.getPublicKey(), + gmwKeyPair.getPublicKey(), + aufKeyPair.getPublicKey(), + ) + .sign(communityKeyPair) + return builder + } +} diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts new file mode 100644 index 000000000..0e80e19a4 --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -0,0 +1,39 @@ +import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' + +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { LogError } from '@/server/LogError' + +import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' + +import { AbstractTransactionRole } from './AbstractTransaction.role' + +export class CreationTransactionRole extends AbstractTransactionRole { + constructor(private self: TransactionDraft) { + super() + } + + getSenderCommunityUuid(): string { + return this.self.user.communityUuid + } + + getRecipientCommunityUuid(): string { + throw new LogError('cannot be used as cross group transaction') + } + + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const recipientKeyPair = await KeyPairCalculation(this.self.user) + const signerKeyPair = await KeyPairCalculation(this.self.linkedUser) + if (!this.self.targetDate) { + throw new LogError('target date missing for creation transaction') + } + builder + .setCreatedAt(new Date(this.self.createdAt)) + .setTransactionCreation( + new TransferAmount(recipientKeyPair.getPublicKey(), this.self.amount.toString()), + new Date(this.self.targetDate), + ) + .sign(signerKeyPair) + return builder + } +} diff --git a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts new file mode 100644 index 000000000..498e71bf7 --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -0,0 +1,40 @@ +/* eslint-disable camelcase */ +import { AddressType_COMMUNITY_HUMAN, GradidoTransactionBuilder } from 'gradido-blockchain-js' + +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' +import { LogError } from '@/server/LogError' +import { uuid4ToHash } from '@/utils/typeConverter' + +import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' + +import { AbstractTransactionRole } from './AbstractTransaction.role' + +export class RegisterAddressTransactionRole extends AbstractTransactionRole { + constructor(private self: UserAccountDraft) { + super() + } + + getSenderCommunityUuid(): string { + return this.self.user.communityUuid + } + + getRecipientCommunityUuid(): string { + throw new LogError('cannot yet be used as cross group transaction') + } + + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const communityKeyPair = await KeyPairCalculation(this.self.user.communityUuid) + const accountKeyPair = await KeyPairCalculation(this.self.user) + builder + .setCreatedAt(new Date(this.self.createdAt)) + .setRegisterAddress( + accountKeyPair.getPublicKey(), + AddressType_COMMUNITY_HUMAN, + uuid4ToHash(this.self.user.uuid), + ) + .sign(communityKeyPair) + .sign(accountKeyPair) + return builder + } +} diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts new file mode 100644 index 000000000..a10a95c35 --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -0,0 +1,116 @@ +/* eslint-disable camelcase */ +import { + GradidoTransaction, + InteractionSerialize, + InteractionValidate, + MemoryBlock, + ValidateType_SINGLE, +} from 'gradido-blockchain-js' + +import { sendMessage as iotaSendMessage } from '@/client/IotaClient' +import { InputTransactionType } from '@/graphql/enum/InputTransactionType' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { CommunityDraft } from '@/graphql/input/CommunityDraft' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' +import { TransactionError } from '@/graphql/model/TransactionError' +import { TransactionRecipe } from '@/graphql/model/TransactionRecipe' +import { TransactionResult } from '@/graphql/model/TransactionResult' +import { logger } from '@/logging/logger' +import { LogError } from '@/server/LogError' +import { uuid4ToHash } from '@/utils/typeConverter' + +import { AbstractTransactionRole } from './AbstractTransaction.role' +import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' +import { CreationTransactionRole } from './CreationTransaction.role' +import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' +import { TransferTransactionRole } from './TransferTransaction.role' + +/** + * @DCI-Context + * Context for sending transaction to iota + * send every transaction only once to iota! + */ +export async function SendToIotaContext( + input: TransactionDraft | UserAccountDraft | CommunityDraft, +): Promise { + const validate = (transaction: GradidoTransaction): void => { + try { + // throw an exception when something is wrong + const validator = new InteractionValidate(transaction) + validator.run(ValidateType_SINGLE) + } catch (e) { + if (e instanceof Error) { + throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e.message) + } else if (typeof e === 'string') { + throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e) + } else { + throw e + } + } + } + + const sendViaIota = async ( + gradidoTransaction: GradidoTransaction, + topic: string, + ): Promise => { + // protobuf serializing function + const serialized = new InteractionSerialize(gradidoTransaction).run() + if (!serialized) { + throw new TransactionError( + TransactionErrorType.PROTO_ENCODE_ERROR, + 'cannot serialize transaction', + ) + } + const resultMessage = await iotaSendMessage( + Uint8Array.from(serialized.data()), + Uint8Array.from(Buffer.from(topic, 'hex')), + ) + logger.info('transmitted Gradido Transaction to Iota', { + messageId: resultMessage.messageId, + }) + return MemoryBlock.fromHex(resultMessage.messageId) + } + + let role: AbstractTransactionRole + if (input instanceof TransactionDraft) { + if (input.type === InputTransactionType.CREATION) { + role = new CreationTransactionRole(input) + } else if (input.type === InputTransactionType.SEND) { + role = new TransferTransactionRole(input) + } else { + throw new LogError('not supported transaction type') + } + } else if (input instanceof UserAccountDraft) { + role = new RegisterAddressTransactionRole(input) + } else if (input instanceof CommunityDraft) { + role = new CommunityRootTransactionRole(input) + } else { + throw new LogError('not expected input') + } + const builder = await role.getGradidoTransactionBuilder() + if (builder.isCrossCommunityTransaction()) { + const outboundTransaction = builder.buildOutbound() + validate(outboundTransaction) + const outboundIotaMessageId = await sendViaIota( + outboundTransaction, + uuid4ToHash(role.getSenderCommunityUuid()).convertToHex(), + ) + builder.setParentMessageId(outboundIotaMessageId) + const inboundTransaction = builder.buildInbound() + validate(inboundTransaction) + await sendViaIota( + inboundTransaction, + uuid4ToHash(role.getRecipientCommunityUuid()).convertToHex(), + ) + return new TransactionResult(new TransactionRecipe(outboundTransaction, outboundIotaMessageId)) + } else { + const transaction = builder.build() + validate(transaction) + const iotaMessageId = await sendViaIota( + transaction, + uuid4ToHash(role.getSenderCommunityUuid()).convertToHex(), + ) + return new TransactionResult(new TransactionRecipe(transaction, iotaMessageId)) + } +} diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts new file mode 100644 index 000000000..c26f8c61f --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -0,0 +1,44 @@ +import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' + +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { uuid4ToHash } from '@/utils/typeConverter' + +import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' + +import { AbstractTransactionRole } from './AbstractTransaction.role' + +export class TransferTransactionRole extends AbstractTransactionRole { + constructor(private self: TransactionDraft) { + super() + } + + getSenderCommunityUuid(): string { + return this.self.user.communityUuid + } + + getRecipientCommunityUuid(): string { + return this.self.linkedUser.communityUuid + } + + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const senderKeyPair = await KeyPairCalculation(this.self.user) + const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + builder + .setCreatedAt(new Date(this.self.createdAt)) + .setTransactionTransfer( + new TransferAmount(senderKeyPair.getPublicKey(), this.self.amount.toString()), + recipientKeyPair.getPublicKey(), + ) + const senderCommunity = this.self.user.communityUuid + const recipientCommunity = this.self.linkedUser.communityUuid + if (senderCommunity !== recipientCommunity) { + // we have a cross group transaction + builder + .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) + .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) + } + builder.sign(senderKeyPair) + return builder + } +} diff --git a/dlt-connector/src/manager/KeyPairCacheManager.ts b/dlt-connector/src/manager/KeyPairCacheManager.ts new file mode 100644 index 000000000..f5c11e388 --- /dev/null +++ b/dlt-connector/src/manager/KeyPairCacheManager.ts @@ -0,0 +1,66 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { LogError } from '@/server/LogError' + +// Source: https://refactoring.guru/design-patterns/singleton/typescript/example +// and ../federation/client/FederationClientFactory.ts +/** + * A Singleton class defines the `getInstance` method that lets clients access + * the unique singleton instance. + */ +// eslint-disable-next-line @typescript-eslint/no-extraneous-class +export class KeyPairCacheManager { + // eslint-disable-next-line no-use-before-define + private static instance: KeyPairCacheManager + private cache: Map = new Map() + private homeCommunityUUID: string + + /** + * The Singleton's constructor should always be private to prevent direct + * construction calls with the `new` operator. + */ + // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function + private constructor() {} + + /** + * The static method that controls the access to the singleton instance. + * + * This implementation let you subclass the Singleton class while keeping + * just one instance of each subclass around. + */ + public static getInstance(): KeyPairCacheManager { + if (!KeyPairCacheManager.instance) { + KeyPairCacheManager.instance = new KeyPairCacheManager() + } + return KeyPairCacheManager.instance + } + + public setHomeCommunityUUID(uuid: string): void { + this.homeCommunityUUID = uuid + } + + public getHomeCommunityUUID(): string { + return this.homeCommunityUUID + } + + public findKeyPair(input: UserIdentifier | string): KeyPairEd25519 | undefined { + return this.cache.get(this.getKey(input)) + } + + public addKeyPair(input: UserIdentifier | string, keyPair: KeyPairEd25519): void { + const key = this.getKey(input) + if (this.cache.has(key)) { + throw new LogError('key already exist, cannot add', key) + } + this.cache.set(key, keyPair) + } + + protected getKey(input: UserIdentifier | string): string { + if (input instanceof UserIdentifier) { + return input.uuid + } else { + return input + } + } +} diff --git a/dlt-connector/src/utils/derivationHelper.ts b/dlt-connector/src/utils/derivationHelper.ts index 0431ec339..9de785306 100644 --- a/dlt-connector/src/utils/derivationHelper.ts +++ b/dlt-connector/src/utils/derivationHelper.ts @@ -1,4 +1,6 @@ export const HARDENED_KEY_BITMASK = 0x80000000 +export const GMW_ACCOUNT_DERIVATION_INDEX = 1 +export const AUF_ACCOUNT_DERIVATION_INDEX = 2 /* * change derivation index from x => x' diff --git a/dlt-connector/src/utils/typeConverter.test.ts b/dlt-connector/src/utils/typeConverter.test.ts index 05fb903b6..527e9dd17 100644 --- a/dlt-connector/src/utils/typeConverter.test.ts +++ b/dlt-connector/src/utils/typeConverter.test.ts @@ -1,6 +1,6 @@ import 'reflect-metadata' -import { base64ToBuffer, iotaTopicFromCommunityUUID, uuid4ToBuffer } from './typeConverter' +import { base64ToBuffer, uuid4ToHash, uuid4ToBuffer } from './typeConverter' describe('utils/typeConverter', () => { it('uuid4ToBuffer', () => { @@ -10,7 +10,7 @@ describe('utils/typeConverter', () => { }) it('iotaTopicFromCommunityUUID', () => { - expect(iotaTopicFromCommunityUUID('4f28e081-5c39-4dde-b6a4-3bde71de8d65')).toBe( + expect(uuid4ToHash('4f28e081-5c39-4dde-b6a4-3bde71de8d65')).toBe( '3138b3590311fdf0a823e173caa9487b7d275c23fab07106b4b1364cb038affd', ) }) diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index 9290fdd82..198c15042 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -8,10 +8,14 @@ import { AddressType_CRYPTO_ACCOUNT, AddressType_NONE, AddressType_SUBACCOUNT, + ConfirmedTransaction, + DeserializeType_CONFIRMED_TRANSACTION, + InteractionDeserialize, + MemoryBlock, } from 'gradido-blockchain-js' -import { crypto_generichash as cryptoHash } from 'sodium-native' import { AccountType } from '@/graphql/enum/AccountType' +import { LogError } from '@/server/LogError' export const uuid4ToBuffer = (uuid: string): Buffer => { // Remove dashes from the UUIDv4 string @@ -23,10 +27,13 @@ export const uuid4ToBuffer = (uuid: string): Buffer => { return buffer } -export const iotaTopicFromCommunityUUID = (communityUUID: string): string => { - const hash = Buffer.alloc(32) - cryptoHash(hash, uuid4ToBuffer(communityUUID)) - return hash.toString('hex') +export const uuid4ToMemoryBlock = (uuid: string): MemoryBlock => { + // Remove dashes from the UUIDv4 string + return MemoryBlock.fromHex(uuid.replace(/-/g, '')) +} + +export const uuid4ToHash = (communityUUID: string): MemoryBlock => { + return uuid4ToMemoryBlock(communityUUID).calculateHash() } export const base64ToBuffer = (base64: string): Buffer => { @@ -86,3 +93,16 @@ export const addressTypeToAccountType = (type: AddressType): AccountType => { return AccountType.NONE } } + +export const confirmedTransactionFromBase64 = (base64: string): ConfirmedTransaction => { + const deserializer = new InteractionDeserialize( + MemoryBlock.fromBase64(base64), + DeserializeType_CONFIRMED_TRANSACTION, + ) + deserializer.run() + const confirmedTransaction = deserializer.getConfirmedTransaction() + if (!confirmedTransaction) { + throw new LogError("invalid data, couldn't deserialize") + } + return confirmedTransaction +} diff --git a/dlt-connector/test/seeding/Community.seed.ts b/dlt-connector/test/seeding/Community.seed.ts index 9c492eedb..8dee407f3 100644 --- a/dlt-connector/test/seeding/Community.seed.ts +++ b/dlt-connector/test/seeding/Community.seed.ts @@ -3,7 +3,7 @@ import { Community } from '@entity/Community' import { KeyPair } from '@/data/KeyPair' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { AddCommunityContext } from '@/interactions/backendToDb/community/AddCommunity.context' -import { iotaTopicFromCommunityUUID } from '@/utils/typeConverter' +import { uuid4ToHash } from '@/utils/typeConverter' export const communitySeed = async ( uuid: string, @@ -14,7 +14,7 @@ export const communitySeed = async ( homeCommunityDraft.uuid = uuid homeCommunityDraft.foreign = foreign homeCommunityDraft.createdAt = new Date().toISOString() - const iotaTopic = iotaTopicFromCommunityUUID(uuid) + const iotaTopic = uuid4ToHash(uuid) const addCommunityContext = new AddCommunityContext(homeCommunityDraft, iotaTopic) await addCommunityContext.run() diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 33c00a820..64ebb063a 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -1589,6 +1589,13 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + axios@^1.6.5: version "1.7.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" @@ -2254,7 +2261,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -2463,9 +2470,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.5.4: - version "1.5.26" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.26.tgz#449b4fa90e83ab98abbe3b6a96c8ee395de94452" - integrity sha512-Z+OMe9M/V6Ep9n/52+b7lkvYEps26z4Yz3vjWL1V61W0q+VLF1pOHhMY17sa4roz4AWmULSI8E6SAojZA5L0YQ== + version "1.5.27" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.27.tgz#5203ce5d6054857d84ba84d3681cbe59132ade78" + integrity sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw== emittery@^0.8.1: version "0.8.1" @@ -3182,7 +3189,7 @@ flatted@^3.2.7, flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -follow-redirects@^1.15.6: +follow-redirects@^1.14.4, follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== @@ -3468,7 +3475,7 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: "gradido-blockchain-js@git+https://github.com/gradido/gradido-blockchain-js#master": version "0.0.1" - resolved "git+https://github.com/gradido/gradido-blockchain-js#02aaeefc015c8ec8b1a2c453d75e7c2cf803a7c2" + resolved "git+https://github.com/gradido/gradido-blockchain-js#5e7bc50af82d30ef0fdbe48414b1f916c592b6f4" dependencies: bindings "^1.5.0" nan "^2.20.0" @@ -4528,6 +4535,14 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonrpc-ts-client@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/jsonrpc-ts-client/-/jsonrpc-ts-client-0.2.3.tgz#ec50c413d84041564e6c8a4003ab4bb360d5cfcc" + integrity sha512-9uYpKrZKN3/3+9MYA/0vdhl9/esn59u6I9Qj6ohczxKwJ+e7DD4prf3i2nSdAl0Wlw5gBHZOL3wajSa1uiE16g== + dependencies: + axios "^0.24.0" + debug "^4.3.3" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -4554,9 +4569,9 @@ levn@^0.4.1: type-check "~0.4.0" libphonenumber-js@^1.10.53: - version "1.11.8" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.8.tgz#697fdd36500a97bc672d7927d867edf34b4bd2a7" - integrity sha512-0fv/YKpJBAgXKy0kaS3fnqoUVN8901vUYAKIGD/MWZaDfhJt1nZjPL3ZzdZBt/G8G8Hw2J1xOIrXWdNHFHPAvg== + version "1.11.9" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.9.tgz#e653042b11da2b50b7ea3b206fa7ca998436ae99" + integrity sha512-Zs5wf5HaWzW2/inlupe2tstl0I/Tbqo7lH20ZLr6Is58u7Dz2n+gRFGNlj9/gWxFvNfp9+YyDsiegjNhdixB9A== lines-and-columns@^1.1.6: version "1.2.4" From a826eaf83839d9a9a901745f2816fba518e4f2ce Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sun, 22 Sep 2024 17:01:59 +0200 Subject: [PATCH 09/23] cleanup not longer needed code --- dlt-connector/src/data/Account.factory.ts | 65 --- dlt-connector/src/data/Account.logic.ts | 35 -- dlt-connector/src/data/Account.repository.ts | 34 -- dlt-connector/src/data/Account.test.ts | 203 --------- .../src/data/Community.repository.ts | 82 ---- dlt-connector/src/data/KeyPair.ts | 107 ----- dlt-connector/src/data/Transaction.builder.ts | 153 ------- .../src/data/Transaction.repository.ts | 43 -- dlt-connector/src/data/User.factory.ts | 18 - dlt-connector/src/data/User.logic.ts | 42 -- dlt-connector/src/data/User.repository.ts | 32 -- dlt-connector/src/data/const.ts | 1 - .../data/proto/3_3/enum/TransactionType.ts | 13 - .../src/graphql/input/TransactionDraft.ts | 15 +- .../src/graphql/input/UserAccountDraft.ts | 3 +- .../src/graphql/resolver/AccountsResolver.ts | 54 +-- .../src/graphql/resolver/CommunityResolver.ts | 72 --- .../graphql/resolver/TransactionsResolver.ts | 42 +- dlt-connector/src/graphql/scalar/Decimal.ts | 30 -- dlt-connector/src/graphql/schema.ts | 6 +- .../src/graphql/validator/DateString.ts | 20 + .../src/graphql/validator/Decimal.ts | 22 - dlt-connector/src/index.ts | 17 +- .../account/RegisterAddress.context.ts | 65 --- .../community/AddCommunity.context.test.ts | 65 --- .../community/AddCommunity.context.ts | 31 -- .../backendToDb/community/Community.role.ts | 31 -- .../community/ForeignCommunity.role.ts | 4 - .../community/HomeCommunity.role.ts | 73 --- .../transaction/AbstractTransaction.role.ts | 36 -- .../AbstractTransactionRecipeRole.ts | 15 - .../BalanceChangingTransactionRecipeRole.ts | 40 -- .../CommunityRootTransaction.role.ts | 38 -- .../CreateTransactionRecipe.context.test.ts | 420 ------------------ .../CreateTransactionRecipe.context.ts | 89 ---- .../transaction/CreationTransaction.role.ts | 64 --- .../RegisterAddressTransaction.role.ts | 52 --- .../transaction/SendTransaction.role.ts | 35 -- .../RegisterAddressTransaction.role.ts | 6 +- .../AbstractTransactionRecipe.role.ts | 106 ----- .../InboundTransactionRecipe.role.ts | 44 -- .../LocalTransactionRecipe.role.ts | 24 - .../OutboundTransactionRecipeRole.ts | 10 - .../TransmitToIota.context.test.ts | 172 ------- .../transmitToIota/TransmitToIota.context.ts | 73 --- .../src/logging/AbstractLogging.view.ts | 8 - .../src/logging/AccountLogging.view.ts | 32 -- .../logging/BackendTransactionLogging.view.ts | 30 -- .../src/logging/CommunityLogging.view.ts | 24 - .../logging/TransactionDraftLogging.view.ts | 2 +- .../src/logging/TransactionLogging.view.ts | 66 --- dlt-connector/src/logging/UserLogging.view.ts | 20 - .../src/manager/InterruptiveSleepManager.ts | 63 --- dlt-connector/src/tasks/transmitToIota.ts | 49 -- dlt-connector/src/utils/InterruptiveSleep.ts | 31 -- 55 files changed, 65 insertions(+), 2862 deletions(-) delete mode 100644 dlt-connector/src/data/Account.factory.ts delete mode 100644 dlt-connector/src/data/Account.logic.ts delete mode 100644 dlt-connector/src/data/Account.repository.ts delete mode 100644 dlt-connector/src/data/Account.test.ts delete mode 100644 dlt-connector/src/data/Community.repository.ts delete mode 100644 dlt-connector/src/data/KeyPair.ts delete mode 100644 dlt-connector/src/data/Transaction.builder.ts delete mode 100644 dlt-connector/src/data/Transaction.repository.ts delete mode 100644 dlt-connector/src/data/User.factory.ts delete mode 100644 dlt-connector/src/data/User.logic.ts delete mode 100644 dlt-connector/src/data/User.repository.ts delete mode 100644 dlt-connector/src/data/const.ts delete mode 100644 dlt-connector/src/data/proto/3_3/enum/TransactionType.ts delete mode 100644 dlt-connector/src/graphql/resolver/CommunityResolver.ts delete mode 100755 dlt-connector/src/graphql/scalar/Decimal.ts delete mode 100644 dlt-connector/src/graphql/validator/Decimal.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.test.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/community/Community.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/community/ForeignCommunity.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts delete mode 100644 dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts delete mode 100644 dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts delete mode 100644 dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts delete mode 100644 dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts delete mode 100644 dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts delete mode 100644 dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts delete mode 100644 dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts delete mode 100644 dlt-connector/src/logging/AccountLogging.view.ts delete mode 100644 dlt-connector/src/logging/BackendTransactionLogging.view.ts delete mode 100644 dlt-connector/src/logging/CommunityLogging.view.ts delete mode 100644 dlt-connector/src/logging/TransactionLogging.view.ts delete mode 100644 dlt-connector/src/logging/UserLogging.view.ts delete mode 100644 dlt-connector/src/manager/InterruptiveSleepManager.ts delete mode 100644 dlt-connector/src/tasks/transmitToIota.ts delete mode 100644 dlt-connector/src/utils/InterruptiveSleep.ts diff --git a/dlt-connector/src/data/Account.factory.ts b/dlt-connector/src/data/Account.factory.ts deleted file mode 100644 index fc20a0acc..000000000 --- a/dlt-connector/src/data/Account.factory.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* eslint-disable camelcase */ -import { Account } from '@entity/Account' -import Decimal from 'decimal.js-light' -import { - AddressType, - AddressType_COMMUNITY_AUF, - AddressType_COMMUNITY_GMW, -} from 'gradido-blockchain-js' - -import { KeyPair } from '@/data/KeyPair' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { hardenDerivationIndex } from '@/utils/derivationHelper' -import { accountTypeToAddressType } from '@/utils/typeConverter' - -const GMW_ACCOUNT_DERIVATION_INDEX = 1 -const AUF_ACCOUNT_DERIVATION_INDEX = 2 - -export class AccountFactory { - public static createAccount( - createdAt: Date, - derivationIndex: number, - type: AddressType, - parentKeyPair: KeyPair, - ): Account { - const account = Account.create() - account.derivationIndex = derivationIndex - account.derive2Pubkey = parentKeyPair.derive([derivationIndex]).publicKey - account.type = type.valueOf() - account.createdAt = createdAt - account.balanceOnConfirmation = new Decimal(0) - account.balanceOnCreation = new Decimal(0) - account.balanceCreatedAt = createdAt - return account - } - - public static createAccountFromUserAccountDraft( - { createdAt, accountType, user }: UserAccountDraft, - parentKeyPair: KeyPair, - ): Account { - return AccountFactory.createAccount( - new Date(createdAt), - user.accountNr ?? 1, - accountTypeToAddressType(accountType), - parentKeyPair, - ) - } - - public static createGmwAccount(keyPair: KeyPair, createdAt: Date): Account { - return AccountFactory.createAccount( - createdAt, - hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), - AddressType_COMMUNITY_GMW, - keyPair, - ) - } - - public static createAufAccount(keyPair: KeyPair, createdAt: Date): Account { - return AccountFactory.createAccount( - createdAt, - hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), - AddressType_COMMUNITY_AUF, - keyPair, - ) - } -} diff --git a/dlt-connector/src/data/Account.logic.ts b/dlt-connector/src/data/Account.logic.ts deleted file mode 100644 index 9cff66070..000000000 --- a/dlt-connector/src/data/Account.logic.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Account } from '@entity/Account' - -import { LogError } from '@/server/LogError' - -import { KeyPair } from './KeyPair' -import { UserLogic } from './User.logic' - -export class AccountLogic { - // eslint-disable-next-line no-useless-constructor - public constructor(private self: Account) {} - - /** - * calculate account key pair starting from community key pair => derive user key pair => derive account key pair - * @param communityKeyPair - */ - public calculateKeyPair(communityKeyPair: KeyPair): KeyPair { - if (!this.self.user) { - throw new LogError('missing user') - } - const userLogic = new UserLogic(this.self.user) - const accountKeyPair = userLogic - .calculateKeyPair(communityKeyPair) - .derive([this.self.derivationIndex]) - - if ( - this.self.derive2Pubkey && - this.self.derive2Pubkey.compare(accountKeyPair.publicKey) !== 0 - ) { - throw new LogError( - 'The freshly derived public key does not correspond to the stored public key', - ) - } - return accountKeyPair - } -} diff --git a/dlt-connector/src/data/Account.repository.ts b/dlt-connector/src/data/Account.repository.ts deleted file mode 100644 index 6931e6ea6..000000000 --- a/dlt-connector/src/data/Account.repository.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Account } from '@entity/Account' -import { User } from '@entity/User' -import { In } from 'typeorm' - -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { getDataSource } from '@/typeorm/DataSource' - -export const AccountRepository = getDataSource() - .getRepository(Account) - .extend({ - findAccountsByPublicKeys(publicKeys: Buffer[]): Promise { - return this.findBy({ derive2Pubkey: In(publicKeys) }) - }, - - async findAccountByPublicKey(publicKey: Buffer | undefined): Promise { - if (!publicKey) return undefined - return (await this.findOneBy({ derive2Pubkey: Buffer.from(publicKey) })) ?? undefined - }, - - async findAccountByUserIdentifier({ - uuid, - accountNr, - }: UserIdentifier): Promise { - const user = await User.findOne({ - where: { gradidoID: uuid, accounts: { derivationIndex: accountNr ?? 1 } }, - relations: { accounts: true }, - }) - if (user && user.accounts?.length === 1) { - const account = user.accounts[0] - account.user = user - return account - } - }, - }) diff --git a/dlt-connector/src/data/Account.test.ts b/dlt-connector/src/data/Account.test.ts deleted file mode 100644 index 130908de6..000000000 --- a/dlt-connector/src/data/Account.test.ts +++ /dev/null @@ -1,203 +0,0 @@ -/* eslint-disable camelcase */ -import 'reflect-metadata' -import { Decimal } from 'decimal.js-light' - -import { TestDB } from '@test/TestDB' - -import { - AddressType_COMMUNITY_AUF, - AddressType_COMMUNITY_GMW, - AddressType_COMMUNITY_HUMAN, -} from 'gradido-blockchain-js' - -import { AccountType } from '@/graphql/enum/AccountType' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' - -import { AccountFactory } from './Account.factory' -import { AccountRepository } from './Account.repository' -import { KeyPair } from './KeyPair' -import { Mnemonic } from './Mnemonic' -import { UserFactory } from './User.factory' -import { UserLogic } from './User.logic' - -const con = TestDB.instance - -jest.mock('@typeorm/DataSource', () => ({ - getDataSource: jest.fn(() => TestDB.instance.dbConnect), -})) - -describe('data/Account test factory and repository', () => { - const now = new Date() - const keyPair1 = new KeyPair(new Mnemonic('62ef251edc2416f162cd24ab1711982b')) - const keyPair2 = new KeyPair(new Mnemonic('000a0000000002000000000003000070')) - const keyPair3 = new KeyPair(new Mnemonic('00ba541a1000020000000000300bda70')) - const userGradidoID = '6be949ab-8198-4acf-ba63-740089081d61' - - describe('test factory methods', () => { - beforeAll(async () => { - await con.setupTestDB() - }) - afterAll(async () => { - await con.teardownTestDB() - }) - - it('test createAccount', () => { - const account = AccountFactory.createAccount(now, 1, AddressType_COMMUNITY_HUMAN, keyPair1) - expect(account).toMatchObject({ - derivationIndex: 1, - derive2Pubkey: Buffer.from( - 'cb88043ef4833afc01d6ed9b34e1aa48e79dce5ff97c07090c6600ec05f6d994', - 'hex', - ), - type: AddressType_COMMUNITY_HUMAN, - createdAt: now, - balanceCreatedAt: now, - balanceOnConfirmation: new Decimal(0), - balanceOnCreation: new Decimal(0), - }) - }) - - it('test createAccountFromUserAccountDraft', () => { - const userAccountDraft = new UserAccountDraft() - userAccountDraft.createdAt = now.toISOString() - userAccountDraft.accountType = AccountType.COMMUNITY_HUMAN - userAccountDraft.user = new UserIdentifier() - userAccountDraft.user.accountNr = 1 - const account = AccountFactory.createAccountFromUserAccountDraft(userAccountDraft, keyPair1) - expect(account).toMatchObject({ - derivationIndex: 1, - derive2Pubkey: Buffer.from( - 'cb88043ef4833afc01d6ed9b34e1aa48e79dce5ff97c07090c6600ec05f6d994', - 'hex', - ), - type: AddressType_COMMUNITY_HUMAN, - createdAt: now, - balanceCreatedAt: now, - balanceOnConfirmation: new Decimal(0), - balanceOnCreation: new Decimal(0), - }) - }) - - it('test createGmwAccount', () => { - const account = AccountFactory.createGmwAccount(keyPair1, now) - expect(account).toMatchObject({ - derivationIndex: 2147483649, - derive2Pubkey: Buffer.from( - '05f0060357bb73bd290283870fc47a10b3764f02ca26938479ed853f46145366', - 'hex', - ), - type: AddressType_COMMUNITY_GMW, - createdAt: now, - balanceCreatedAt: now, - balanceOnConfirmation: new Decimal(0), - balanceOnCreation: new Decimal(0), - }) - }) - - it('test createAufAccount', () => { - const account = AccountFactory.createAufAccount(keyPair1, now) - expect(account).toMatchObject({ - derivationIndex: 2147483650, - derive2Pubkey: Buffer.from( - '6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', - 'hex', - ), - type: AddressType_COMMUNITY_AUF, - createdAt: now, - balanceCreatedAt: now, - balanceOnConfirmation: new Decimal(0), - balanceOnCreation: new Decimal(0), - }) - }) - }) - - describe('test repository functions', () => { - beforeAll(async () => { - await con.setupTestDB() - await Promise.all([ - AccountFactory.createAufAccount(keyPair1, now).save(), - AccountFactory.createGmwAccount(keyPair1, now).save(), - AccountFactory.createAufAccount(keyPair2, now).save(), - AccountFactory.createGmwAccount(keyPair2, now).save(), - AccountFactory.createAufAccount(keyPair3, now).save(), - AccountFactory.createGmwAccount(keyPair3, now).save(), - ]) - const userAccountDraft = new UserAccountDraft() - userAccountDraft.accountType = AccountType.COMMUNITY_HUMAN - userAccountDraft.createdAt = now.toString() - userAccountDraft.user = new UserIdentifier() - userAccountDraft.user.accountNr = 1 - userAccountDraft.user.uuid = userGradidoID - const user = UserFactory.create(userAccountDraft, keyPair1) - const userLogic = new UserLogic(user) - const account = AccountFactory.createAccountFromUserAccountDraft( - userAccountDraft, - userLogic.calculateKeyPair(keyPair1), - ) - account.user = user - // user is set to cascade: ['insert'] will be saved together with account - await account.save() - }) - afterAll(async () => { - await con.teardownTestDB() - }) - it('test findAccountsByPublicKeys', async () => { - const accounts = await AccountRepository.findAccountsByPublicKeys([ - Buffer.from('6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', 'hex'), - Buffer.from('0fa996b73b624592fe326b8500cb1e3f10026112b374d84c87d097f4d489c019', 'hex'), - Buffer.from('0ffa996b73b624592f26b850b0cb1e3f1026112b374d84c87d017f4d489c0197', 'hex'), // invalid - ]) - expect(accounts).toHaveLength(2) - expect(accounts).toMatchObject( - expect.arrayContaining([ - expect.objectContaining({ - derivationIndex: 2147483649, - derive2Pubkey: Buffer.from( - '0fa996b73b624592fe326b8500cb1e3f10026112b374d84c87d097f4d489c019', - 'hex', - ), - type: AddressType_COMMUNITY_GMW, - }), - expect.objectContaining({ - derivationIndex: 2147483650, - derive2Pubkey: Buffer.from( - '6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', - 'hex', - ), - type: AddressType_COMMUNITY_AUF, - }), - ]), - ) - }) - - it('test findAccountByPublicKey', async () => { - expect( - await AccountRepository.findAccountByPublicKey( - Buffer.from('6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', 'hex'), - ), - ).toMatchObject({ - derivationIndex: 2147483650, - derive2Pubkey: Buffer.from( - '6c749f8693a4a58c948e5ae54df11e2db33d2f98673b56e0cf19c0132614ab59', - 'hex', - ), - type: AddressType_COMMUNITY_AUF, - }) - }) - - it('test findAccountByUserIdentifier', async () => { - const userIdentifier = new UserIdentifier() - userIdentifier.accountNr = 1 - userIdentifier.uuid = userGradidoID - expect(await AccountRepository.findAccountByUserIdentifier(userIdentifier)).toMatchObject({ - derivationIndex: 1, - derive2Pubkey: Buffer.from( - '2099c004a26e5387c9fbbc9bb0f552a9642d3fd7c710ae5802b775d24ff36f93', - 'hex', - ), - type: AddressType_COMMUNITY_HUMAN, - }) - }) - }) -}) diff --git a/dlt-connector/src/data/Community.repository.ts b/dlt-connector/src/data/Community.repository.ts deleted file mode 100644 index eb52fb38c..000000000 --- a/dlt-connector/src/data/Community.repository.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Community } from '@entity/Community' -import { FindOptionsSelect, In, IsNull, Not } from 'typeorm' - -import { CommunityArg } from '@/graphql/arg/CommunityArg' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { TransactionError } from '@/graphql/model/TransactionError' -import { LogError } from '@/server/LogError' -import { getDataSource } from '@/typeorm/DataSource' -import { uuid4ToHash } from '@/utils/typeConverter' - -import { KeyPair } from './KeyPair' - -export const CommunityRepository = getDataSource() - .getRepository(Community) - .extend({ - async isExist(community: CommunityDraft | string): Promise { - const iotaTopic = - community instanceof CommunityDraft ? uuid4ToHash(community.uuid) : community - const result = await this.find({ - where: { iotaTopic }, - }) - return result.length > 0 - }, - - async findByCommunityArg({ uuid, foreign, confirmed }: CommunityArg): Promise { - return await this.find({ - where: { - ...(uuid && { iotaTopic: uuid4ToHash(uuid) }), - ...(foreign && { foreign }), - ...(confirmed && { confirmedAt: Not(IsNull()) }), - }, - }) - }, - - async findByCommunityUuid(communityUuid: string): Promise { - return await this.findOneBy({ iotaTopic: uuid4ToHash(communityUuid) }) - }, - - async findByIotaTopic(iotaTopic: string): Promise { - return await this.findOneBy({ iotaTopic }) - }, - - findCommunitiesByTopics(topics: string[]): Promise { - return this.findBy({ iotaTopic: In(topics) }) - }, - - async getCommunityForUserIdentifier( - identifier: UserIdentifier, - ): Promise { - if (!identifier.communityUuid) { - throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'community uuid not set') - } - return ( - (await this.findOneBy({ - iotaTopic: uuid4ToHash(identifier.communityUuid), - })) ?? undefined - ) - }, - - findAll(select: FindOptionsSelect): Promise { - return this.find({ select }) - }, - - async loadHomeCommunityKeyPair(): Promise { - const community = await this.findOneOrFail({ - where: { foreign: false }, - select: { rootChaincode: true, rootPubkey: true, rootEncryptedPrivkey: true }, - }) - if (!community.rootChaincode || !community.rootEncryptedPrivkey) { - throw new LogError('Missing chaincode or private key for home community') - } - return new KeyPair(community) - }, - - async loadHomeCommunity(): Promise { - return await this.findOneOrFail({ - where: { foreign: false }, - }) - }, - }) diff --git a/dlt-connector/src/data/KeyPair.ts b/dlt-connector/src/data/KeyPair.ts deleted file mode 100644 index 61207ee7e..000000000 --- a/dlt-connector/src/data/KeyPair.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Community } from '@entity/Community' -// https://www.npmjs.com/package/bip32-ed25519 -import { - KeyPairEd25519, - MemoryBlock, - Passphrase, - SecretKeyCryptography, - SignaturePair, -} from 'gradido-blockchain-js' - -import { CONFIG } from '@/config' -import { LogError } from '@/server/LogError' - -/** - * Class Managing Key Pair and also generate, sign and verify signature with it - */ -export class KeyPair { - private _ed25519KeyPair: KeyPairEd25519 - /** - * @param input: KeyPairEd25519 = already loaded KeyPairEd25519 - * @param input: Passphrase = Passphrase which work as seed for generating algorithms - * @param input: MemoryBlock = a seed at least 32 byte - * @param input: Community = community entity with keys loaded from db - */ - public constructor(input: KeyPairEd25519 | Passphrase | MemoryBlock | Community) { - let keyPair: KeyPairEd25519 | null = null - if (input instanceof KeyPairEd25519) { - keyPair = input - } else if (input instanceof Passphrase) { - keyPair = KeyPairEd25519.create(input) - } else if (input instanceof MemoryBlock) { - keyPair = KeyPairEd25519.create(input) - } else if (input instanceof Community) { - if (!input.rootEncryptedPrivkey || !input.rootChaincode || !input.rootPubkey) { - throw new LogError( - 'missing encrypted private key or chaincode or public key in commmunity entity', - ) - } - const secretBox = this.createSecretBox(input.iotaTopic) - keyPair = new KeyPairEd25519( - new MemoryBlock(input.rootPubkey), - secretBox.decrypt(new MemoryBlock(input.rootEncryptedPrivkey)), - new MemoryBlock(input.rootChaincode), - ) - } - if (!keyPair) { - throw new LogError("couldn't create KeyPairEd25519 from input") - } - this._ed25519KeyPair = keyPair - } - - /** - * copy keys to community entity - * @param community - */ - public fillInCommunityKeys(community: Community) { - const secretBox = this.createSecretBox(community.iotaTopic) - community.rootPubkey = this._ed25519KeyPair.getPublicKey()?.data() - community.rootEncryptedPrivkey = this._ed25519KeyPair.getCryptedPrivKey(secretBox).data() - community.rootChaincode = this._ed25519KeyPair.getChainCode()?.data() - } - - public get publicKey(): Buffer { - const publicKey = this._ed25519KeyPair.getPublicKey() - if (!publicKey) { - throw new LogError('invalid key pair, get empty public key') - } - return publicKey.data() - } - - public get keyPair(): KeyPairEd25519 { - return this._ed25519KeyPair - } - - public derive(path: number[]): KeyPair { - return new KeyPair( - path.reduce( - (keyPair: KeyPairEd25519, node: number) => keyPair.deriveChild(node), - this._ed25519KeyPair, - ), - ) - } - - public sign(message: Buffer): Buffer { - return this._ed25519KeyPair.sign(new MemoryBlock(message)).data() - } - - public static verify(message: Buffer, signaturePair: SignaturePair): boolean { - const publicKeyPair = new KeyPairEd25519(signaturePair.getPubkey()) - const signature = signaturePair.getSignature() - if (!signature) { - throw new LogError('missing signature') - } - return publicKeyPair.verify(new MemoryBlock(message), signature) - } - - private createSecretBox(salt: string): SecretKeyCryptography { - if (!CONFIG.GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD) { - throw new LogError( - 'missing GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD in env or config', - ) - } - const secretBox = new SecretKeyCryptography() - secretBox.createKey(salt, CONFIG.GRADIDO_BLOCKCHAIN_PRIVATE_KEY_ENCRYPTION_PASSWORD) - return secretBox - } -} diff --git a/dlt-connector/src/data/Transaction.builder.ts b/dlt-connector/src/data/Transaction.builder.ts deleted file mode 100644 index a07ed8589..000000000 --- a/dlt-connector/src/data/Transaction.builder.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { Account } from '@entity/Account' -import { Community } from '@entity/Community' -import { Transaction } from '@entity/Transaction' -import { - GradidoTransaction, - InteractionSerialize, - InteractionToJson, - TransactionBody, -} from 'gradido-blockchain-js' - -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { LogError } from '@/server/LogError' - -import { CommunityRepository } from './Community.repository' - -export class TransactionBuilder { - private transaction: Transaction - - // https://refactoring.guru/design-patterns/builder/typescript/example - /** - * A fresh builder instance should contain a blank product object, which is - * used in further assembly. - */ - constructor() { - this.reset() - } - - public reset(): void { - this.transaction = Transaction.create() - } - - /** - * Concrete Builders are supposed to provide their own methods for - * retrieving results. That's because various types of builders may create - * entirely different products that don't follow the same interface. - * Therefore, such methods cannot be declared in the base Builder interface - * (at least in a statically typed programming language). - * - * Usually, after returning the end result to the client, a builder instance - * is expected to be ready to start producing another product. That's why - * it's a usual practice to call the reset method at the end of the - * `getProduct` method body. However, this behavior is not mandatory, and - * you can make your builders wait for an explicit reset call from the - * client code before disposing of the previous result. - */ - public build(): Transaction { - const result = this.transaction - this.reset() - return result - } - - // return transaction without calling reset - public getTransaction(): Transaction { - return this.transaction - } - - public getCommunity(): Community { - return this.transaction.community - } - - public getOtherCommunity(): Community | undefined { - return this.transaction.otherCommunity - } - - public setSigningAccount(signingAccount: Account): TransactionBuilder { - this.transaction.signingAccount = signingAccount - return this - } - - public setRecipientAccount(recipientAccount: Account): TransactionBuilder { - this.transaction.recipientAccount = recipientAccount - return this - } - - public setCommunity(community: Community): TransactionBuilder { - this.transaction.community = community - return this - } - - public setOtherCommunity(otherCommunity?: Community): TransactionBuilder { - if (!this.transaction.community) { - throw new LogError('Please set community first!') - } - - this.transaction.otherCommunity = - otherCommunity && - this.transaction.community && - this.transaction.community.id !== otherCommunity.id - ? otherCommunity - : undefined - return this - } - - public setSignature(signature: Buffer): TransactionBuilder { - this.transaction.signature = signature - return this - } - - public async setCommunityFromUser(user: UserIdentifier): Promise { - // get sender community - const community = await CommunityRepository.getCommunityForUserIdentifier(user) - if (!community) { - throw new LogError("couldn't find community for transaction") - } - return this.setCommunity(community) - } - - public async setOtherCommunityFromUser(user: UserIdentifier): Promise { - // get recipient community - const otherCommunity = await CommunityRepository.getCommunityForUserIdentifier(user) - return this.setOtherCommunity(otherCommunity) - } - - public fromGradidoTransaction(transaction: GradidoTransaction): TransactionBuilder { - const body = transaction.getTransactionBody() - if (!body) { - throw new LogError('missing transaction body on Gradido Transaction') - } - // set first signature - const firstSignature = transaction.getSignatureMap().getSignaturePairs().get(0).getSignature() - if (!firstSignature) { - throw new LogError('error missing first signature') - } - this.transaction.signature = firstSignature.data() - return this.fromTransactionBody(body, transaction.getBodyBytes()?.data()) - } - - public fromTransactionBody( - transactionBody: TransactionBody, - bodyBytes: Buffer | null | undefined, - ): TransactionBuilder { - if (!bodyBytes) { - bodyBytes = new InteractionSerialize(transactionBody).run()?.data() - } - if (!bodyBytes) { - throw new LogError( - 'cannot serialize TransactionBody', - JSON.parse(new InteractionToJson(transactionBody).run()), - ) - } - this.transaction.type = transactionBody.getTransactionType() - this.transaction.createdAt = new Date(transactionBody.getCreatedAt().getDate()) - this.transaction.protocolVersion = transactionBody.getVersionNumber() - - const transferAmount = transactionBody.getTransferAmount() - this.transaction.amount = transferAmount - ? transferAmount.getAmount().getGradidoCent() - : undefined - - this.transaction.bodyBytes ??= bodyBytes - return this - } -} diff --git a/dlt-connector/src/data/Transaction.repository.ts b/dlt-connector/src/data/Transaction.repository.ts deleted file mode 100644 index 6ba622c9c..000000000 --- a/dlt-connector/src/data/Transaction.repository.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Transaction } from '@entity/Transaction' -import { IsNull } from 'typeorm' - -import { getDataSource } from '@/typeorm/DataSource' - -// https://www.artima.com/articles/the-dci-architecture-a-new-vision-of-object-oriented-programming -export const TransactionRepository = getDataSource() - .getRepository(Transaction) - .extend({ - findBySignature(signature: Buffer): Promise { - return this.findOneBy({ signature: Buffer.from(signature) }) - }, - findByMessageId(iotaMessageId: string): Promise { - return this.findOneBy({ iotaMessageId: Buffer.from(iotaMessageId, 'hex') }) - }, - async getNextPendingTransaction(): Promise { - return await this.findOne({ - where: { iotaMessageId: IsNull() }, - order: { createdAt: 'ASC' }, - relations: { signingAccount: true }, - }) - }, - findExistingTransactionAndMissingMessageIds(messageIDsHex: string[]): Promise { - return this.createQueryBuilder('Transaction') - .where('HEX(Transaction.iota_message_id) IN (:...messageIDs)', { - messageIDs: messageIDsHex, - }) - .leftJoinAndSelect('Transaction.community', 'Community') - .leftJoinAndSelect('Transaction.otherCommunity', 'OtherCommunity') - .leftJoinAndSelect('Transaction.recipientAccount', 'RecipientAccount') - .leftJoinAndSelect('Transaction.backendTransactions', 'BackendTransactions') - .leftJoinAndSelect('RecipientAccount.user', 'RecipientUser') - .leftJoinAndSelect('Transaction.signingAccount', 'SigningAccount') - .leftJoinAndSelect('SigningAccount.user', 'SigningUser') - .getMany() - }, - removeConfirmedTransaction(transactions: Transaction[]): Transaction[] { - return transactions.filter( - (transaction: Transaction) => - transaction.runningHash === undefined || transaction.runningHash.length === 0, - ) - }, - }) diff --git a/dlt-connector/src/data/User.factory.ts b/dlt-connector/src/data/User.factory.ts deleted file mode 100644 index a8c7f0e71..000000000 --- a/dlt-connector/src/data/User.factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { User } from '@entity/User' - -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' - -import { KeyPair } from './KeyPair' -import { UserLogic } from './User.logic' - -export class UserFactory { - static create(userAccountDraft: UserAccountDraft, parentKeys: KeyPair): User { - const user = User.create() - user.createdAt = new Date(userAccountDraft.createdAt) - user.gradidoID = userAccountDraft.user.uuid - const userLogic = new UserLogic(user) - // store generated pubkey into entity - userLogic.calculateKeyPair(parentKeys) - return user - } -} diff --git a/dlt-connector/src/data/User.logic.ts b/dlt-connector/src/data/User.logic.ts deleted file mode 100644 index 8bffe326e..000000000 --- a/dlt-connector/src/data/User.logic.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { User } from '@entity/User' - -import { LogError } from '@/server/LogError' -import { hardenDerivationIndex } from '@/utils/derivationHelper' -import { uuid4ToBuffer } from '@/utils/typeConverter' - -import { KeyPair } from './KeyPair' - -export class UserLogic { - // eslint-disable-next-line no-useless-constructor - constructor(private user: User) {} - - /** - * - * @param parentKeys from home community for own user - * @returns - */ - - calculateKeyPair = (parentKeys: KeyPair): KeyPair => { - if (!this.user.gradidoID) { - throw new LogError('missing GradidoID for user.', { id: this.user.id }) - } - // example gradido id: 03857ac1-9cc2-483e-8a91-e5b10f5b8d16 => - // wholeHex: '03857ac19cc2483e8a91e5b10f5b8d16'] - const wholeHex = uuid4ToBuffer(this.user.gradidoID) - const parts = [] - for (let i = 0; i < 4; i++) { - parts[i] = hardenDerivationIndex(wholeHex.subarray(i * 4, (i + 1) * 4).readUInt32BE()) - } - // parts: [2206563009, 2629978174, 2324817329, 2405141782] - const keyPair = parentKeys.derive(parts) - if (this.user.derive1Pubkey && this.user.derive1Pubkey.compare(keyPair.publicKey) !== 0) { - throw new LogError( - 'The freshly derived public key does not correspond to the stored public key', - ) - } - if (!this.user.derive1Pubkey) { - this.user.derive1Pubkey = keyPair.publicKey - } - return keyPair - } -} diff --git a/dlt-connector/src/data/User.repository.ts b/dlt-connector/src/data/User.repository.ts deleted file mode 100644 index 1e9e4dcef..000000000 --- a/dlt-connector/src/data/User.repository.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Account } from '@entity/Account' -import { User } from '@entity/User' -import { FindOptionsRelations } from 'typeorm' - -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { getDataSource } from '@/typeorm/DataSource' - -export const UserRepository = getDataSource() - .getRepository(User) - .extend({ - async findAccountByUserIdentifier({ - uuid, - accountNr, - }: UserIdentifier): Promise { - const user = await this.findOne({ - where: { gradidoID: uuid, accounts: { derivationIndex: accountNr ?? 1 } }, - relations: { accounts: true }, - }) - if (user && user.accounts?.length === 1) { - const account = user.accounts[0] - account.user = user - return account - } - }, - - findByGradidoId( - { uuid }: UserIdentifier, - relations?: FindOptionsRelations, - ): Promise { - return User.findOne({ where: { gradidoID: uuid }, relations }) - }, - }) diff --git a/dlt-connector/src/data/const.ts b/dlt-connector/src/data/const.ts deleted file mode 100644 index 82470e8d4..000000000 --- a/dlt-connector/src/data/const.ts +++ /dev/null @@ -1 +0,0 @@ -export const TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY = 'transmitToIota' diff --git a/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts b/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts deleted file mode 100644 index 07bf5c393..000000000 --- a/dlt-connector/src/data/proto/3_3/enum/TransactionType.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * based on TransactionBody data oneOf - * https://github.com/gradido/gradido_protocol/blob/master/proto/gradido/transaction_body.proto - * for storing type in db as number - */ -export enum TransactionType { - GRADIDO_CREATION = 1, - GRADIDO_TRANSFER = 2, - GROUP_FRIENDS_UPDATE = 3, - REGISTER_ADDRESS = 4, - GRADIDO_DEFERRED_TRANSFER = 5, - COMMUNITY_ROOT = 6, -} diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 541797565..59e1ecafd 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -1,11 +1,8 @@ // https://www.npmjs.com/package/@apollo/protobufjs -import { IsEnum, IsObject, IsPositive, ValidateNested } from 'class-validator' -import { Decimal } from 'decimal.js-light' -import { InputType, Field, Int } from 'type-graphql' - import { InputTransactionType } from '@enum/InputTransactionType' -import { isValidDateString } from '@validator/DateString' -import { IsPositiveDecimal } from '@validator/Decimal' +import { isValidDateString, isValidNumberString } from '@validator/DateString' +import { IsEnum, IsObject, IsPositive, ValidateNested } from 'class-validator' +import { InputType, Field, Int } from 'type-graphql' import { UserIdentifier } from './UserIdentifier' @@ -25,9 +22,9 @@ export class TransactionDraft { @IsPositive() backendTransactionId: number - @Field(() => Decimal) - @IsPositiveDecimal() - amount: Decimal + @Field(() => String) + @isValidNumberString() + amount: string @Field(() => InputTransactionType) @IsEnum(InputTransactionType) diff --git a/dlt-connector/src/graphql/input/UserAccountDraft.ts b/dlt-connector/src/graphql/input/UserAccountDraft.ts index 9ae544e32..e10be9574 100644 --- a/dlt-connector/src/graphql/input/UserAccountDraft.ts +++ b/dlt-connector/src/graphql/input/UserAccountDraft.ts @@ -1,10 +1,9 @@ // https://www.npmjs.com/package/@apollo/protobufjs +import { isValidDateString } from '@validator/DateString' import { IsEnum, IsObject, ValidateNested } from 'class-validator' import { InputType, Field } from 'type-graphql' -import { isValidDateString } from '@validator/DateString' - import { AccountType } from '@/graphql/enum/AccountType' import { UserIdentifier } from './UserIdentifier' diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts index 7f782af89..a7f264764 100644 --- a/dlt-connector/src/graphql/resolver/AccountsResolver.ts +++ b/dlt-connector/src/graphql/resolver/AccountsResolver.ts @@ -1,16 +1,12 @@ +/* eslint-disable camelcase */ +import { AddressType_NONE } from 'gradido-blockchain-js' import { Arg, Mutation, Query, Resolver } from 'type-graphql' -import { QueryFailedError } from 'typeorm' -import { TransactionRecipe } from '@model/TransactionRecipe' - -import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' -import { UserRepository } from '@/data/User.repository' -import { RegisterAddressContext } from '@/interactions/backendToDb/account/RegisterAddress.context' -import { AccountLoggingView } from '@/logging/AccountLogging.view' +import { getAddressType } from '@/client/GradidoNode' +import { KeyPairCalculation } from '@/interactions/keyPairCalculation/KeyPairCalculation.context' +import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' import { logger } from '@/logging/logger' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' -import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' -import { getDataSource } from '@/typeorm/DataSource' +import { uuid4ToHash } from '@/utils/typeConverter' import { TransactionErrorType } from '../enum/TransactionErrorType' import { UserAccountDraft } from '../input/UserAccountDraft' @@ -22,8 +18,20 @@ import { TransactionResult } from '../model/TransactionResult' export class AccountResolver { @Query(() => Boolean) async isAccountExist(@Arg('data') userIdentifier: UserIdentifier): Promise { + const accountKeyPair = await KeyPairCalculation(userIdentifier) + const publicKey = accountKeyPair.getPublicKey() + if (!publicKey) { + throw new TransactionResult( + new TransactionError(TransactionErrorType.NOT_FOUND, 'cannot get user public key'), + ) + } + // ask gradido node server for account type, if type !== NONE account exist + const addressType = await getAddressType( + publicKey.data(), + uuid4ToHash(userIdentifier.communityUuid).convertToHex(), + ) logger.info('isAccountExist', userIdentifier) - return !!(await UserRepository.findAccountByUserIdentifier(userIdentifier)) + return addressType !== AddressType_NONE } @Mutation(() => TransactionResult) @@ -31,30 +39,10 @@ export class AccountResolver { @Arg('data') userAccountDraft: UserAccountDraft, ): Promise { - const registerAddressContext = new RegisterAddressContext(userAccountDraft) try { - const { transaction, account } = await registerAddressContext.run() - logger.info('register address', { - account: new AccountLoggingView(account), - transaction: new TransactionLoggingView(transaction), - }) - await getDataSource().transaction(async (transactionalEntityManager) => { - await transactionalEntityManager.save(account) - await transactionalEntityManager.save(transaction) - logger.debug('store register address transaction', new TransactionLoggingView(transaction)) - }) - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) - return new TransactionResult(new TransactionRecipe(transaction)) + return await SendToIotaContext(userAccountDraft) } catch (err) { - if (err instanceof QueryFailedError) { - logger.error('error saving user or new account or transaction into db: %s', err) - return new TransactionResult( - new TransactionError( - TransactionErrorType.DB_ERROR, - 'error saving user or new account or transaction into db', - ), - ) - } else if (err instanceof TransactionError) { + if (err instanceof TransactionError) { return new TransactionResult(err) } else { logger.error('error in register address: ', err) diff --git a/dlt-connector/src/graphql/resolver/CommunityResolver.ts b/dlt-connector/src/graphql/resolver/CommunityResolver.ts deleted file mode 100644 index 848dd0733..000000000 --- a/dlt-connector/src/graphql/resolver/CommunityResolver.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { CommunityArg } from '@arg/CommunityArg' -import { TransactionErrorType } from '@enum/TransactionErrorType' -import { CommunityDraft } from '@input/CommunityDraft' -import { Community } from '@model/Community' -import { TransactionError } from '@model/TransactionError' -import { TransactionResult } from '@model/TransactionResult' -import { Resolver, Query, Arg, Mutation, Args } from 'type-graphql' - -import { CommunityRepository } from '@/data/Community.repository' -import { AddCommunityContext } from '@/interactions/backendToDb/community/AddCommunity.context' -import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' -import { uuid4ToHash } from '@/utils/typeConverter' - -@Resolver() -export class CommunityResolver { - @Query(() => Community) - async community(@Args() communityArg: CommunityArg): Promise { - logger.info('community', communityArg) - const result = await CommunityRepository.findByCommunityArg(communityArg) - if (result.length === 0) { - throw new LogError('cannot find community') - } else if (result.length === 1) { - return new Community(result[0]) - } else { - throw new LogError('find multiple communities') - } - } - - @Query(() => Boolean) - async isCommunityExist(@Args() communityArg: CommunityArg): Promise { - logger.info('isCommunity', communityArg) - return (await CommunityRepository.findByCommunityArg(communityArg)).length === 1 - } - - @Query(() => [Community]) - async communities(@Args() communityArg: CommunityArg): Promise { - logger.info('communities', communityArg) - const result = await CommunityRepository.findByCommunityArg(communityArg) - return result.map((communityEntity) => new Community(communityEntity)) - } - - @Mutation(() => TransactionResult) - async addCommunity( - @Arg('data') - communityDraft: CommunityDraft, - ): Promise { - logger.info('addCommunity', communityDraft) - const topic = uuid4ToHash(communityDraft.uuid) - // check if community was already written to db - if (await CommunityRepository.isExist(topic)) { - return new TransactionResult( - new TransactionError(TransactionErrorType.ALREADY_EXIST, 'community already exist!'), - ) - } - // prepare context for interaction - // shouldn't throw at all - // TODO: write tests to make sure that it doesn't throw - const addCommunityContext = new AddCommunityContext(communityDraft, topic) - try { - // actually run interaction, create community, accounts for foreign community and transactionRecipe - await addCommunityContext.run() - return new TransactionResult() - } catch (error) { - if (error instanceof TransactionError) { - return new TransactionResult(error) - } else { - throw error - } - } - } -} diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index 8302a872f..50636dee3 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,17 +1,9 @@ +import { TransactionDraft } from '@input/TransactionDraft' import { Resolver, Arg, Mutation } from 'type-graphql' -import { TransactionDraft } from '@input/TransactionDraft' +import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' -import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' -import { TransactionRepository } from '@/data/Transaction.repository' -import { CreateTransactionRecipeContext } from '@/interactions/backendToDb/transaction/CreateTransactionRecipe.context' -import { logger } from '@/logging/logger' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' -import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' - -import { TransactionErrorType } from '../enum/TransactionErrorType' import { TransactionError } from '../model/TransactionError' -import { TransactionRecipe } from '../model/TransactionRecipe' import { TransactionResult } from '../model/TransactionResult' @Resolver() @@ -21,36 +13,8 @@ export class TransactionResolver { @Arg('data') transactionDraft: TransactionDraft, ): Promise { - const createTransactionRecipeContext = new CreateTransactionRecipeContext(transactionDraft) try { - const result = await createTransactionRecipeContext.run() - if (!result) { - return new TransactionResult( - new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'cannot work with this parameters', - ), - ) - } - const transactionRecipe = createTransactionRecipeContext.getTransactionRecipe() - // check if a transaction with this signature already exist - const existingRecipe = await TransactionRepository.findBySignature( - transactionRecipe.signature, - ) - if (existingRecipe) { - return new TransactionResult( - new TransactionError( - TransactionErrorType.ALREADY_EXIST, - 'Transaction with same signature already exist', - ), - ) - } else { - logger.debug('store transaction recipe', new TransactionLoggingView(transactionRecipe)) - // we store the transaction - await transactionRecipe.save() - } - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) - return new TransactionResult(new TransactionRecipe(transactionRecipe)) + return await SendToIotaContext(transactionDraft) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { if (error instanceof TransactionError) { diff --git a/dlt-connector/src/graphql/scalar/Decimal.ts b/dlt-connector/src/graphql/scalar/Decimal.ts deleted file mode 100755 index b343f383a..000000000 --- a/dlt-connector/src/graphql/scalar/Decimal.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -import { Decimal } from 'decimal.js-light' -import { GraphQLScalarType, Kind, ValueNode } from 'graphql' - -export const DecimalScalar = new GraphQLScalarType({ - name: 'Decimal', - description: 'The `Decimal` scalar type to represent currency values', - - serialize(value: unknown): string { - if (!(value instanceof Decimal)) { - throw new TypeError(`Value is not a Decimal: ${value}`) - } - return value.toString() - }, - - parseValue(value: unknown): Decimal { - if (typeof value !== 'string') { - throw new TypeError('Decimal values must be strings') - } - return new Decimal(value) - }, - - parseLiteral(ast: ValueNode): Decimal { - if (ast.kind !== Kind.STRING) { - throw new TypeError(`${String(ast)} is not a valid decimal value.`) - } - - return new Decimal(ast.value) - }, -}) diff --git a/dlt-connector/src/graphql/schema.ts b/dlt-connector/src/graphql/schema.ts index a756b1ac9..f0e2f7198 100755 --- a/dlt-connector/src/graphql/schema.ts +++ b/dlt-connector/src/graphql/schema.ts @@ -1,16 +1,12 @@ -import { Decimal } from 'decimal.js-light' import { GraphQLSchema } from 'graphql' import { buildSchema } from 'type-graphql' import { AccountResolver } from './resolver/AccountsResolver' -import { CommunityResolver } from './resolver/CommunityResolver' import { TransactionResolver } from './resolver/TransactionsResolver' -import { DecimalScalar } from './scalar/Decimal' export const schema = async (): Promise => { return buildSchema({ - resolvers: [TransactionResolver, CommunityResolver, AccountResolver], - scalarsMap: [{ type: Decimal, scalar: DecimalScalar }], + resolvers: [TransactionResolver, AccountResolver], validate: { validationError: { target: false }, skipMissingProperties: true, diff --git a/dlt-connector/src/graphql/validator/DateString.ts b/dlt-connector/src/graphql/validator/DateString.ts index 3f46d89ec..2be057194 100644 --- a/dlt-connector/src/graphql/validator/DateString.ts +++ b/dlt-connector/src/graphql/validator/DateString.ts @@ -19,3 +19,23 @@ export function isValidDateString(validationOptions?: ValidationOptions) { }) } } + +export function isValidNumberString(validationOptions?: ValidationOptions) { + // eslint-disable-next-line @typescript-eslint/ban-types + return function (object: Object, propertyName: string) { + registerDecorator({ + name: 'isValidNumberString', + target: object.constructor, + propertyName, + options: validationOptions, + validator: { + validate(value: string): boolean { + return !isNaN(parseFloat(value)) + }, + defaultMessage(): string { + return `${propertyName} must be a valid number string` + }, + }, + }) + } +} \ No newline at end of file diff --git a/dlt-connector/src/graphql/validator/Decimal.ts b/dlt-connector/src/graphql/validator/Decimal.ts deleted file mode 100644 index fd2604514..000000000 --- a/dlt-connector/src/graphql/validator/Decimal.ts +++ /dev/null @@ -1,22 +0,0 @@ -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): boolean { - return value.greaterThan(0) - }, - defaultMessage(args: ValidationArguments): string { - return `The ${propertyName} must be a positive value ${args.property}` - }, - }, - }) - } -} diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index b61157dfb..2dd21b66b 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -7,12 +7,13 @@ import { CONFIG } from '@/config' import { BackendClient } from './client/BackendClient' import { CommunityDraft } from './graphql/input/CommunityDraft' -import { AddCommunityContext } from './interactions/backendToDb/community/AddCommunity.context' import { logger } from './logging/logger' import { KeyPairCacheManager } from './manager/KeyPairCacheManager' import createServer from './server/createServer' import { LogError } from './server/LogError' -import { stopTransmitToIota, transmitToIota } from './tasks/transmitToIota' +import { getTransaction } from './client/GradidoNode' +import { uuid4ToHash } from './utils/typeConverter' +import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' async function waitForServer( backend: BackendClient, @@ -70,11 +71,12 @@ async function main() { const communityDraft = await backend.getHomeCommunityDraft() KeyPairCacheManager.getInstance().setHomeCommunityUUID(communityDraft.uuid) - const addCommunityContext = new AddCommunityContext(communityDraft) - await addCommunityContext.run() - - // loop run all the time, check for new transaction for sending to iota - void transmitToIota() + // ask gradido node if community blockchain was created + const firstTransaction = await getTransaction(1, uuid4ToHash(communityDraft.uuid).convertToHex()) + if (!firstTransaction) { + // if not exist, create community root transaction + await SendToIotaContext(communityDraft) + } app.listen(CONFIG.DLT_CONNECTOR_PORT, () => { // eslint-disable-next-line no-console console.log(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) @@ -82,7 +84,6 @@ async function main() { process.on('exit', () => { // Add shutdown logic here. - stopTransmitToIota() }) } diff --git a/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts b/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts deleted file mode 100644 index c84cb0149..000000000 --- a/dlt-connector/src/interactions/backendToDb/account/RegisterAddress.context.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Account } from '@entity/Account' -import { Transaction } from '@entity/Transaction' -import { User } from '@entity/User' - -import { AccountFactory } from '@/data/Account.factory' -import { CommunityRepository } from '@/data/Community.repository' -import { KeyPair } from '@/data/KeyPair' -import { UserFactory } from '@/data/User.factory' -import { UserLogic } from '@/data/User.logic' -import { UserRepository } from '@/data/User.repository' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { TransactionError } from '@/graphql/model/TransactionError' -import { logger } from '@/logging/logger' - -import { CreateTransactionRecipeContext } from '../transaction/CreateTransactionRecipe.context' - -export interface TransactionWithAccount { - transaction: Transaction - account: Account -} - -export class RegisterAddressContext { - // eslint-disable-next-line no-useless-constructor - public constructor(private userAccountDraft: UserAccountDraft) {} - - public async run(): Promise { - const community = await CommunityRepository.loadHomeCommunity() - const communityKeyPair = new KeyPair(community) - const user = await this.loadOrCreateUser(communityKeyPair) - if (this.isAccountAlreadyExistOnUser(user)) { - throw new TransactionError( - TransactionErrorType.ALREADY_EXIST, - 'account for this user already exist!', - ) - } - logger.info('add user and account', this.userAccountDraft) - const account = this.createAccount(new UserLogic(user).calculateKeyPair(communityKeyPair)) - account.user = user - const createTransactionContext = new CreateTransactionRecipeContext(this.userAccountDraft, { - community, - account, - }) - await createTransactionContext.run() - return { transaction: createTransactionContext.getTransactionRecipe(), account } - } - - public isAccountAlreadyExistOnUser(user: User): boolean { - return !!user.accounts?.find( - (value) => value.derivationIndex === this.userAccountDraft.user.accountNr, - ) - } - - public async loadOrCreateUser(communityKeyPair: KeyPair): Promise { - let user = await UserRepository.findByGradidoId(this.userAccountDraft.user, { accounts: true }) - if (!user) { - user = UserFactory.create(this.userAccountDraft, communityKeyPair) - } - return user - } - - public createAccount(userKeyPair: KeyPair): Account { - return AccountFactory.createAccountFromUserAccountDraft(this.userAccountDraft, userKeyPair) - } -} diff --git a/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.test.ts b/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.test.ts deleted file mode 100644 index d7ec4e9c6..000000000 --- a/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import 'reflect-metadata' -import { Community } from '@entity/Community' - -import { TestDB } from '@test/TestDB' - -import { CONFIG } from '@/config' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' - -import { AddCommunityContext } from './AddCommunity.context' - -CONFIG.IOTA_HOME_COMMUNITY_SEED = '034b0229a2ba4e98e1cc5e8767dca886279b484303ffa73546bd5f5bf0b71285' - -jest.mock('@typeorm/DataSource', () => ({ - getDataSource: jest.fn(() => TestDB.instance.dbConnect), -})) - -describe('interactions/backendToDb/community/AddCommunity Context Test', () => { - beforeAll(async () => { - await TestDB.instance.setupTestDB() - }) - - afterAll(async () => { - await TestDB.instance.teardownTestDB() - }) - - const homeCommunityDraft = new CommunityDraft() - homeCommunityDraft.uuid = 'a2fd0fee-f3ba-4bef-a62a-10a34b0e2754' - homeCommunityDraft.foreign = false - homeCommunityDraft.createdAt = '2024-01-25T13:09:55.339Z' - // calculated from a2fd0fee-f3ba-4bef-a62a-10a34b0e2754 with iotaTopicFromCommunityUUID - const iotaTopic = '7be2ad83f279a3aaf6d62371cb6be301e2e3c7a3efda9c89984e8f6a7865d9ce' - - const foreignCommunityDraft = new CommunityDraft() - foreignCommunityDraft.uuid = '70df8de5-0fb7-4153-a124-4ff86965be9a' - foreignCommunityDraft.foreign = true - foreignCommunityDraft.createdAt = '2024-01-25T13:34:28.020Z' - - it('with home community, without iota topic', async () => { - const context = new AddCommunityContext(homeCommunityDraft) - await context.run() - const homeCommunity = await Community.findOneOrFail({ where: { iotaTopic } }) - expect(homeCommunity).toMatchObject({ - id: 1, - iotaTopic, - foreign: 0, - rootPubkey: Buffer.from( - '07cbf56d4b6b7b188c5f6250c0f4a01d0e44e1d422db1935eb375319ad9f9af0', - 'hex', - ), - createdAt: new Date('2024-01-25T13:09:55.339Z'), - }) - }) - - it('with foreign community', async () => { - const context = new AddCommunityContext(foreignCommunityDraft, 'randomTopic') - await context.run() - const foreignCommunity = await Community.findOneOrFail({ where: { foreign: true } }) - expect(foreignCommunity).toMatchObject({ - id: 2, - iotaTopic: 'randomTopic', - foreign: 1, - createdAt: new Date('2024-01-25T13:34:28.020Z'), - }) - }) -}) diff --git a/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts b/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts deleted file mode 100644 index 16bfd8513..000000000 --- a/dlt-connector/src/interactions/backendToDb/community/AddCommunity.context.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { uuid4ToHash } from '@/utils/typeConverter' - -import { CommunityRole } from './Community.role' -import { ForeignCommunityRole } from './ForeignCommunity.role' -import { HomeCommunityRole } from './HomeCommunity.role' - -/** - * @DCI-Context - * Context for adding community to DB - * using roles to distinct between foreign and home communities - */ -export class AddCommunityContext { - private communityRole: CommunityRole - private iotaTopic: string - public constructor(private communityDraft: CommunityDraft, iotaTopic?: string) { - if (!iotaTopic) { - this.iotaTopic = uuid4ToHash(this.communityDraft.uuid) - } else { - this.iotaTopic = iotaTopic - } - this.communityRole = communityDraft.foreign - ? new ForeignCommunityRole() - : new HomeCommunityRole() - } - - public async run(): Promise { - await this.communityRole.create(this.communityDraft, this.iotaTopic) - await this.communityRole.store() - } -} diff --git a/dlt-connector/src/interactions/backendToDb/community/Community.role.ts b/dlt-connector/src/interactions/backendToDb/community/Community.role.ts deleted file mode 100644 index 2b1514ef2..000000000 --- a/dlt-connector/src/interactions/backendToDb/community/Community.role.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Community } from '@entity/Community' - -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionError } from '@/graphql/model/TransactionError' -import { CommunityLoggingView } from '@/logging/CommunityLogging.view' -import { logger } from '@/logging/logger' - -export abstract class CommunityRole { - protected self: Community - public constructor() { - this.self = Community.create() - } - - public async create(communityDraft: CommunityDraft, topic: string): Promise { - this.self.iotaTopic = topic - this.self.createdAt = new Date(communityDraft.createdAt) - this.self.foreign = communityDraft.foreign - } - - public async store(): Promise { - try { - const community = await this.self.save() - logger.debug('store community', new CommunityLoggingView(community)) - return community - } catch (error) { - logger.error('error saving new community into db: %s', error) - throw new TransactionError(TransactionErrorType.DB_ERROR, 'error saving community into db') - } - } -} diff --git a/dlt-connector/src/interactions/backendToDb/community/ForeignCommunity.role.ts b/dlt-connector/src/interactions/backendToDb/community/ForeignCommunity.role.ts deleted file mode 100644 index cf93deaa5..000000000 --- a/dlt-connector/src/interactions/backendToDb/community/ForeignCommunity.role.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { CommunityRole } from './Community.role' - -// same as base class -export class ForeignCommunityRole extends CommunityRole {} diff --git a/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts b/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts deleted file mode 100644 index 050b245e3..000000000 --- a/dlt-connector/src/interactions/backendToDb/community/HomeCommunity.role.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Community } from '@entity/Community' -import { Transaction } from '@entity/Transaction' - -import { CONFIG } from '@/config' -import { AccountFactory } from '@/data/Account.factory' -import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' -import { KeyPair } from '@/data/KeyPair' -import { Mnemonic } from '@/data/Mnemonic' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionError } from '@/graphql/model/TransactionError' -import { CommunityLoggingView } from '@/logging/CommunityLogging.view' -import { logger } from '@/logging/logger' -import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' -import { LogError } from '@/server/LogError' -import { getDataSource } from '@/typeorm/DataSource' - -import { CreateTransactionRecipeContext } from '../transaction/CreateTransactionRecipe.context' - -import { CommunityRole } from './Community.role' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' - -export class HomeCommunityRole extends CommunityRole { - private transactionRecipe: Transaction - - public async create(communityDraft: CommunityDraft, topic: string): Promise { - super.create(communityDraft, topic) - // generate key pair for signing transactions and deriving all keys for community - let mnemonic: Mnemonic - try { - mnemonic = new Mnemonic(CONFIG.IOTA_HOME_COMMUNITY_SEED ?? undefined) - } catch (e) { - throw new LogError( - 'error creating mnemonic for home community, please fill IOTA_HOME_COMMUNITY_SEED in .env', - { - IOTA_HOME_COMMUNITY_SEED: CONFIG.IOTA_HOME_COMMUNITY_SEED, - error: e, - }, - ) - } - const keyPair = new KeyPair(mnemonic) - keyPair.fillInCommunityKeys(this.self) - - // create auf account and gmw account - this.self.aufAccount = AccountFactory.createAufAccount(keyPair, this.self.createdAt) - this.self.gmwAccount = AccountFactory.createGmwAccount(keyPair, this.self.createdAt) - - const transactionRecipeContext = new CreateTransactionRecipeContext(communityDraft, { - community: this.self, - }) - await transactionRecipeContext.run() - this.transactionRecipe = transactionRecipeContext.getTransactionRecipe() - } - - public async store(): Promise { - try { - const community = await getDataSource().transaction(async (transactionalEntityManager) => { - const community = await transactionalEntityManager.save(this.self) - await transactionalEntityManager.save(this.transactionRecipe) - logger.debug('store home community', new CommunityLoggingView(community)) - return community - }) - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) - return community - } catch (error) { - logger.error('error saving home community into db: %s', error) - throw new TransactionError( - TransactionErrorType.DB_ERROR, - 'error saving home community into db', - ) - } - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts deleted file mode 100644 index 2b815cd7a..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransaction.role.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* eslint-disable camelcase */ -import { Account } from '@entity/Account' -import { GradidoTransactionBuilder } from 'gradido-blockchain-js' - -import { UserRepository } from '@/data/User.repository' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { TransactionError } from '@/graphql/model/TransactionError' - -export abstract class AbstractTransactionRole { - // eslint-disable-next-line no-useless-constructor - public constructor(protected self: TransactionDraft) {} - - abstract getSigningUser(): UserIdentifier - abstract getRecipientUser(): UserIdentifier - abstract getGradidoTransactionBuilder(): Promise - - public isCrossGroupTransaction(): boolean { - return ( - this.self.user.communityUuid !== this.self.linkedUser.communityUuid && - this.self.linkedUser.communityUuid !== '' - ) - } - - public async loadUser(user: UserIdentifier): Promise { - const account = await UserRepository.findAccountByUserIdentifier(user) - if (!account) { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, - "couldn't found user account in db", - ) - } - return account - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts b/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts deleted file mode 100644 index 812f6a7f0..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/AbstractTransactionRecipeRole.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Transaction } from '@entity/Transaction' - -import { TransactionBuilder } from '@/data/Transaction.builder' - -export class AbstractTransactionRecipeRole { - protected transactionBuilder: TransactionBuilder - - public constructor() { - this.transactionBuilder = new TransactionBuilder() - } - - public getTransaction(): Transaction { - return this.transactionBuilder.getTransaction() - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts b/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts deleted file mode 100644 index 659c62c22..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/BalanceChangingTransactionRecipeRole.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable camelcase */ -import { AccountLogic } from '@/data/Account.logic' -import { KeyPair } from '@/data/KeyPair' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' - -import { AbstractTransactionRole } from './AbstractTransaction.role' -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' - -export class BalanceChangingTransactionRecipeRole extends AbstractTransactionRecipeRole { - public async create( - transactionDraft: TransactionDraft, - transactionTypeRole: AbstractTransactionRole, - ): Promise { - // loading signing and recipient account - const signingAccount = await transactionTypeRole.loadUser(transactionTypeRole.getSigningUser()) - const recipientAccount = await transactionTypeRole.loadUser( - transactionTypeRole.getRecipientUser(), - ) - const accountLogic = new AccountLogic(signingAccount) - await this.transactionBuilder.setCommunityFromUser(transactionDraft.user) - const communityKeyPair = new KeyPair(this.transactionBuilder.getCommunity()) - - const gradidoTransactionBuilder = await transactionTypeRole.getGradidoTransactionBuilder() - const transaction = gradidoTransactionBuilder - .setCreatedAt(new Date(transactionDraft.createdAt)) - .sign(accountLogic.calculateKeyPair(communityKeyPair).keyPair) - .build() - - // build transaction entity - this.transactionBuilder - .fromGradidoTransaction(transaction) - .setRecipientAccount(recipientAccount) - .setSigningAccount(signingAccount) - - if (transactionTypeRole.isCrossGroupTransaction()) { - await this.transactionBuilder.setOtherCommunityFromUser(transactionDraft.linkedUser) - } - return this - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts deleted file mode 100644 index cdd953d4c..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/CommunityRootTransaction.role.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Community } from '@entity/Community' -// eslint-disable-next-line camelcase -import { MemoryBlock, GradidoTransactionBuilder } from 'gradido-blockchain-js' - -import { KeyPair } from '@/data/KeyPair' -// import { TransactionBodyBuilder } from '@/data/proto/TransactionBody.builder' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' - -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' - -export class CommunityRootTransactionRole extends AbstractTransactionRecipeRole { - public create( - communityDraft: CommunityDraft, - community: Community, - ): AbstractTransactionRecipeRole { - if ( - !community.rootPubkey || - !community.gmwAccount?.derive2Pubkey || - !community.aufAccount?.derive2Pubkey - ) { - throw new Error('missing one of the public keys for community') - } - // create proto transaction body - const transaction = new GradidoTransactionBuilder() - .setCommunityRoot( - new MemoryBlock(community.rootPubkey), - new MemoryBlock(community.gmwAccount?.derive2Pubkey), - new MemoryBlock(community.aufAccount?.derive2Pubkey), - ) - .setCreatedAt(new Date(communityDraft.createdAt)) - .sign(new KeyPair(community).keyPair) - .build() - - // build transaction entity - this.transactionBuilder.fromGradidoTransaction(transaction).setCommunity(community) - return this - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts deleted file mode 100644 index 6671e6e78..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.test.ts +++ /dev/null @@ -1,420 +0,0 @@ -/* eslint-disable camelcase */ -import 'reflect-metadata' -import { Account } from '@entity/Account' -import { Community } from '@entity/Community' -import { - AddressType_COMMUNITY_HUMAN, - CrossGroupType_INBOUND, - CrossGroupType_LOCAL, - CrossGroupType_OUTBOUND, - InteractionDeserialize, - MemoryBlock, - TransactionType_CREATION, -} from 'gradido-blockchain-js' -import { v4 } from 'uuid' - -import { TestDB } from '@test/TestDB' - -import { CONFIG } from '@/config' -import { KeyPair } from '@/data/KeyPair' -import { TransactionType } from '@/data/proto/3_3/enum/TransactionType' -import { AccountType } from '@/graphql/enum/AccountType' -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { uuid4ToHash } from '@/utils/typeConverter' - -import { CreateTransactionRecipeContext } from './CreateTransactionRecipe.context' - -// eslint-disable-next-line import/order -import { communitySeed } from '@test/seeding/Community.seed' -// eslint-disable-next-line import/order -import { createUserSet, UserSet } from '@test/seeding/UserSet.seed' - -jest.mock('@typeorm/DataSource', () => ({ - getDataSource: jest.fn(() => TestDB.instance.dbConnect), -})) - -CONFIG.IOTA_HOME_COMMUNITY_SEED = '034b0229a2ba4e98e1cc5e8767dca886279b484303ffa73546bd5f5bf0b71285' -const homeCommunityUuid = v4() -const foreignCommunityUuid = v4() - -const keyPair = new KeyPair(MemoryBlock.fromHex(CONFIG.IOTA_HOME_COMMUNITY_SEED)) -const foreignKeyPair = new KeyPair( - MemoryBlock.fromHex('5d4e163c078cc6b51f5c88f8422bc8f21d1d59a284515ab1ea79e1c176ebec50'), -) - -let moderator: UserSet -let firstUser: UserSet -let secondUser: UserSet -let foreignUser: UserSet -let homeCommunity: Community - -const topic = uuid4ToHash(homeCommunityUuid) -const foreignTopic = uuid4ToHash(foreignCommunityUuid) - -describe('interactions/backendToDb/transaction/Create Transaction Recipe Context Test', () => { - beforeAll(async () => { - await TestDB.instance.setupTestDB() - homeCommunity = await communitySeed(homeCommunityUuid, false) - await communitySeed(foreignCommunityUuid, true, foreignKeyPair) - - moderator = createUserSet(homeCommunityUuid, keyPair) - firstUser = createUserSet(homeCommunityUuid, keyPair) - secondUser = createUserSet(homeCommunityUuid, keyPair) - foreignUser = createUserSet(foreignCommunityUuid, foreignKeyPair) - - await Account.save([ - moderator.account, - firstUser.account, - secondUser.account, - foreignUser.account, - ]) - }) - - afterAll(async () => { - await TestDB.instance.teardownTestDB() - }) - - it('register address transaction', async () => { - const userAccountDraft = new UserAccountDraft() - userAccountDraft.accountType = AccountType.COMMUNITY_HUMAN - userAccountDraft.createdAt = new Date().toISOString() - userAccountDraft.user = firstUser.identifier - const context = new CreateTransactionRecipeContext(userAccountDraft, { - account: firstUser.account, - community: homeCommunity, - }) - await context.run() - const transaction = context.getTransactionRecipe() - expect(transaction).toMatchObject({ - type: TransactionType.REGISTER_ADDRESS, - protocolVersion: '3.3', - community: { - rootPubkey: keyPair.publicKey, - foreign: 0, - iotaTopic: topic, - }, - signingAccount: { - derive2Pubkey: firstUser.account.derive2Pubkey, - }, - }) - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - expect(body?.isRegisterAddress()).toBeTruthy() - - expect(body).toMatchObject({ - type: CrossGroupType_LOCAL, - registerAddress: { - derivationIndex: 1, - addressType: AddressType_COMMUNITY_HUMAN, - }, - }) - }) - - it('creation transaction', async () => { - const creationTransactionDraft = new TransactionDraft() - creationTransactionDraft.amount = new Decimal('2000') - creationTransactionDraft.backendTransactionId = 1 - creationTransactionDraft.createdAt = new Date().toISOString() - creationTransactionDraft.linkedUser = moderator.identifier - creationTransactionDraft.user = firstUser.identifier - creationTransactionDraft.type = InputTransactionType.CREATION - creationTransactionDraft.targetDate = new Date().toISOString() - const context = new CreateTransactionRecipeContext(creationTransactionDraft) - await context.run() - const transaction = context.getTransactionRecipe() - - expect(transaction).toMatchObject({ - type: TransactionType_CREATION, - protocolVersion: '3.3', - community: { - rootPubkey: keyPair.publicKey, - foreign: 0, - iotaTopic: topic, - }, - signingAccount: { - derive2Pubkey: moderator.account.derive2Pubkey, - }, - recipientAccount: { - derive2Pubkey: firstUser.account.derive2Pubkey, - }, - amount: new Decimal(2000), - backendTransactions: [ - { - typeId: InputTransactionType.CREATION, - }, - ], - }) - - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - // console.log(new TransactionBodyLoggingView(body)) - expect(body?.isCreation()).toBeTruthy() - - expect( - body - ?.getCreation() - ?.getRecipient() - .getPubkey() - ?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), - ).toBeTruthy() - - expect(body).toMatchObject({ - type: CrossGroupType_LOCAL, - creation: { - recipient: { - amount: '2000', - }, - }, - }) - }) - - it('local send transaction', async () => { - const sendTransactionDraft = new TransactionDraft() - sendTransactionDraft.amount = new Decimal('100') - sendTransactionDraft.backendTransactionId = 2 - sendTransactionDraft.createdAt = new Date().toISOString() - sendTransactionDraft.linkedUser = secondUser.identifier - sendTransactionDraft.user = firstUser.identifier - sendTransactionDraft.type = InputTransactionType.SEND - const context = new CreateTransactionRecipeContext(sendTransactionDraft) - await context.run() - const transaction = context.getTransactionRecipe() - - // console.log(new TransactionLoggingView(transaction)) - expect(transaction).toMatchObject({ - type: TransactionType.GRADIDO_TRANSFER, - protocolVersion: '3.3', - community: { - rootPubkey: keyPair.publicKey, - foreign: 0, - iotaTopic: topic, - }, - signingAccount: { - derive2Pubkey: firstUser.account.derive2Pubkey, - }, - recipientAccount: { - derive2Pubkey: secondUser.account.derive2Pubkey, - }, - amount: new Decimal(100), - backendTransactions: [ - { - typeId: InputTransactionType.SEND, - }, - ], - }) - - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - // console.log(new TransactionBodyLoggingView(body)) - expect(body?.isTransfer()).toBeTruthy() - const transfer = body?.getTransfer() - expect(transfer).not.toBeNull() - expect( - transfer?.getRecipient()?.equal(new MemoryBlock(secondUser.account.derive2Pubkey)), - ).toBeTruthy() - expect( - transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), - ).toBeTruthy() - - expect(body).toMatchObject({ - type: CrossGroupType_LOCAL, - transfer: { - sender: { - amount: '100', - }, - }, - }) - }) - - it('local recv transaction', async () => { - const recvTransactionDraft = new TransactionDraft() - recvTransactionDraft.amount = new Decimal('100') - recvTransactionDraft.backendTransactionId = 3 - recvTransactionDraft.createdAt = new Date().toISOString() - recvTransactionDraft.linkedUser = firstUser.identifier - recvTransactionDraft.user = secondUser.identifier - recvTransactionDraft.type = InputTransactionType.RECEIVE - const context = new CreateTransactionRecipeContext(recvTransactionDraft) - await context.run() - const transaction = context.getTransactionRecipe() - // console.log(new TransactionLoggingView(transaction)) - expect(transaction).toMatchObject({ - type: TransactionType.GRADIDO_TRANSFER, - protocolVersion: '3.3', - community: { - rootPubkey: keyPair.publicKey, - foreign: 0, - iotaTopic: topic, - }, - signingAccount: { - derive2Pubkey: firstUser.account.derive2Pubkey, - }, - recipientAccount: { - derive2Pubkey: secondUser.account.derive2Pubkey, - }, - amount: new Decimal(100), - backendTransactions: [ - { - typeId: InputTransactionType.RECEIVE, - }, - ], - }) - - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - expect(body?.isTransfer()).toBeTruthy() - const transfer = body?.getTransfer() - expect(transfer).not.toBeNull() - expect( - transfer?.getRecipient()?.equal(new MemoryBlock(secondUser.account.derive2Pubkey)), - ).toBeTruthy() - expect( - transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), - ).toBeTruthy() - - expect(body).toMatchObject({ - type: CrossGroupType_LOCAL, - transfer: { - sender: { - amount: '100', - }, - }, - }) - }) - - it('cross group send transaction', async () => { - const crossGroupSendTransactionDraft = new TransactionDraft() - crossGroupSendTransactionDraft.amount = new Decimal('100') - crossGroupSendTransactionDraft.backendTransactionId = 4 - crossGroupSendTransactionDraft.createdAt = new Date().toISOString() - crossGroupSendTransactionDraft.linkedUser = foreignUser.identifier - crossGroupSendTransactionDraft.user = firstUser.identifier - crossGroupSendTransactionDraft.type = InputTransactionType.SEND - const context = new CreateTransactionRecipeContext(crossGroupSendTransactionDraft) - await context.run() - const transaction = context.getTransactionRecipe() - // console.log(new TransactionLoggingView(transaction)) - expect(transaction).toMatchObject({ - type: TransactionType.GRADIDO_TRANSFER, - protocolVersion: '3.3', - community: { - rootPubkey: keyPair.publicKey, - foreign: 0, - iotaTopic: topic, - }, - otherCommunity: { - rootPubkey: foreignKeyPair.publicKey, - foreign: 1, - iotaTopic: foreignTopic, - }, - signingAccount: { - derive2Pubkey: firstUser.account.derive2Pubkey, - }, - recipientAccount: { - derive2Pubkey: foreignUser.account.derive2Pubkey, - }, - amount: new Decimal(100), - backendTransactions: [ - { - typeId: InputTransactionType.SEND, - }, - ], - }) - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - // console.log(new TransactionBodyLoggingView(body)) - expect(body?.isTransfer()).toBeTruthy() - const transfer = body?.getTransfer() - expect(transfer).not.toBeNull() - expect( - transfer?.getRecipient()?.equal(new MemoryBlock(foreignUser.account.derive2Pubkey)), - ).toBeTruthy() - expect( - transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), - ).toBeTruthy() - expect(body).toMatchObject({ - type: CrossGroupType_OUTBOUND, - otherGroup: foreignTopic, - transfer: { - sender: { - amount: '100', - }, - }, - }) - }) - - it('cross group recv transaction', async () => { - const crossGroupRecvTransactionDraft = new TransactionDraft() - crossGroupRecvTransactionDraft.amount = new Decimal('100') - crossGroupRecvTransactionDraft.backendTransactionId = 5 - crossGroupRecvTransactionDraft.createdAt = new Date().toISOString() - crossGroupRecvTransactionDraft.linkedUser = firstUser.identifier - crossGroupRecvTransactionDraft.user = foreignUser.identifier - crossGroupRecvTransactionDraft.type = InputTransactionType.RECEIVE - const context = new CreateTransactionRecipeContext(crossGroupRecvTransactionDraft) - await context.run() - const transaction = context.getTransactionRecipe() - // console.log(new TransactionLoggingView(transaction)) - expect(transaction).toMatchObject({ - type: TransactionType.GRADIDO_TRANSFER, - protocolVersion: '3.3', - community: { - rootPubkey: foreignKeyPair.publicKey, - foreign: 1, - iotaTopic: foreignTopic, - }, - otherCommunity: { - rootPubkey: keyPair.publicKey, - foreign: 0, - iotaTopic: topic, - }, - signingAccount: { - derive2Pubkey: firstUser.account.derive2Pubkey, - }, - recipientAccount: { - derive2Pubkey: foreignUser.account.derive2Pubkey, - }, - amount: new Decimal(100), - backendTransactions: [ - { - typeId: InputTransactionType.RECEIVE, - }, - ], - }) - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - // console.log(new TransactionBodyLoggingView(body)) - expect(body?.isTransfer()).toBeTruthy() - const transfer = body?.getTransfer() - expect(transfer).not.toBeNull() - expect( - transfer?.getRecipient()?.equal(new MemoryBlock(foreignUser.account.derive2Pubkey)), - ).toBeTruthy() - expect( - transfer?.getSender().getPubkey()?.equal(new MemoryBlock(firstUser.account.derive2Pubkey)), - ).toBeTruthy() - expect(body).toMatchObject({ - type: CrossGroupType_INBOUND, - otherGroup: topic, - transfer: { - sender: { - amount: '100', - }, - }, - }) - }) -}) diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts deleted file mode 100644 index 10bb3f4f6..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreateTransactionRecipe.context.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Account } from '@entity/Account' -import { Community } from '@entity/Community' -import { Transaction } from '@entity/Transaction' - -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { TransactionError } from '@/graphql/model/TransactionError' - -import { AbstractTransactionRole } from './AbstractTransaction.role' -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' -import { BalanceChangingTransactionRecipeRole } from './BalanceChangingTransactionRecipeRole' -import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' -import { CreationTransactionRole } from './CreationTransaction.role' -import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' -import { SendTransactionRole } from './SendTransaction.role' - -/** - * @DCI-Context - * Context for create and add Transaction Recipe to DB - */ - -export interface AdditionalData { - community?: Community - account?: Account -} - -export class CreateTransactionRecipeContext { - private transactionRecipe: AbstractTransactionRecipeRole - // eslint-disable-next-line no-useless-constructor - public constructor( - private draft: CommunityDraft | TransactionDraft | UserAccountDraft, - private data?: AdditionalData, - ) {} - - public getTransactionRecipe(): Transaction { - return this.transactionRecipe.getTransaction() - } - - /** - * @returns true if a transaction recipe was created and false if it wasn't necessary - */ - public async run(): Promise { - if (this.draft instanceof TransactionDraft) { - // contain logic for translation from backend to dlt-connector format - let transactionTypeRole: AbstractTransactionRole - switch (this.draft.type) { - case InputTransactionType.CREATION: - transactionTypeRole = new CreationTransactionRole(this.draft) - break - case InputTransactionType.SEND: - transactionTypeRole = new SendTransactionRole(this.draft) - break - case InputTransactionType.RECEIVE: - return false - } - this.transactionRecipe = await new BalanceChangingTransactionRecipeRole().create( - this.draft, - transactionTypeRole, - ) - return true - } else if (this.draft instanceof CommunityDraft) { - if (!this.data?.community) { - throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'community was not set') - } - this.transactionRecipe = new CommunityRootTransactionRole().create( - this.draft, - this.data.community, - ) - return true - } else if (this.draft instanceof UserAccountDraft) { - if (!this.data?.account) { - throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'account was not set') - } - if (!this.data.community) { - throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'community was not set') - } - this.transactionRecipe = await new RegisterAddressTransactionRole().create( - this.draft, - this.data.account, - this.data.community, - ) - return true - } - return false - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts deleted file mode 100644 index 40648b566..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/CreationTransaction.role.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* eslint-disable camelcase */ -import { Community } from '@entity/Community' -import { MemoryBlock, GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' - -import { CommunityRepository } from '@/data/Community.repository' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { TransactionError } from '@/graphql/model/TransactionError' -import { logger } from '@/logging/logger' -import { UserIdentifierLoggingView } from '@/logging/UserIdentifierLogging.view' - -import { AbstractTransactionRole } from './AbstractTransaction.role' - -export class CreationTransactionRole extends AbstractTransactionRole { - public getSigningUser(): UserIdentifier { - return this.self.linkedUser - } - - public getRecipientUser(): UserIdentifier { - return this.self.user - } - - public async getGradidoTransactionBuilder(): Promise { - const builder = new GradidoTransactionBuilder() - const recipientUser = await this.loadUser(this.self.user) - if (!this.self.targetDate) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing targetDate for contribution', - ) - } - return builder - .setTransactionCreation( - new TransferAmount( - new MemoryBlock(recipientUser.derive2Pubkey), - this.self.amount.toString(), - ), - new Date(this.self.targetDate), - ) - .setMemo('dummy memo for creation') - } - - public async getCommunity(): Promise { - if (this.self.user.communityUuid !== this.self.linkedUser.communityUuid) { - throw new TransactionError( - TransactionErrorType.LOGIC_ERROR, - 'mismatch community uuids on contribution', - ) - } - const community = await CommunityRepository.getCommunityForUserIdentifier(this.self.user) - if (!community) { - logger.error( - 'missing community for user identifier', - new UserIdentifierLoggingView(this.self.user), - ) - throw new TransactionError(TransactionErrorType.NOT_FOUND, "couldn't find community for user") - } - return community - } - - public async getOtherCommunity(): Promise { - return null - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts deleted file mode 100644 index f2a41a72f..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/RegisterAddressTransaction.role.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Account } from '@entity/Account' -import { Community } from '@entity/Community' -import { - // eslint-disable-next-line camelcase - AddressType_COMMUNITY_HUMAN, - MemoryBlock, - GradidoTransactionBuilder, -} from 'gradido-blockchain-js' - -import { AccountLogic } from '@/data/Account.logic' -import { CommunityRepository } from '@/data/Community.repository' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { TransactionError } from '@/graphql/model/TransactionError' - -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipeRole' - -export class RegisterAddressTransactionRole extends AbstractTransactionRecipeRole { - async create( - userAccountDraft: UserAccountDraft, - account: Account, - community: Community, - ): Promise { - const user = account.user - if (!user) { - throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'missing user for account') - } - const gradidoTransactionBuilder = new GradidoTransactionBuilder() - const communityKeyPair = await CommunityRepository.loadHomeCommunityKeyPair() - const signingKeyPair = new AccountLogic(account).calculateKeyPair(communityKeyPair) - if (!signingKeyPair) { - throw new TransactionError(TransactionErrorType.NOT_FOUND, "couldn't found signing key pair") - } - const transaction = gradidoTransactionBuilder - .setRegisterAddress( - new MemoryBlock(user.derive1Pubkey), - AddressType_COMMUNITY_HUMAN, - null, - new MemoryBlock(account.derive2Pubkey), - ) - .setCreatedAt(new Date(userAccountDraft.createdAt)) - .sign(signingKeyPair.keyPair) - .sign(communityKeyPair.keyPair) - .build() - - this.transactionBuilder - .fromGradidoTransaction(transaction) - .setCommunity(community) - .setSigningAccount(account) - return this - } -} diff --git a/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts b/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts deleted file mode 100644 index 874656cda..000000000 --- a/dlt-connector/src/interactions/backendToDb/transaction/SendTransaction.role.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* eslint-disable camelcase */ -import { - CrossGroupType, - CrossGroupType_LOCAL, - CrossGroupType_OUTBOUND, - MemoryBlock, - GradidoTransactionBuilder, - TransferAmount, -} from 'gradido-blockchain-js' - -import { UserIdentifier } from '@/graphql/input/UserIdentifier' - -import { AbstractTransactionRole } from './AbstractTransaction.role' - -export class SendTransactionRole extends AbstractTransactionRole { - public getSigningUser(): UserIdentifier { - return this.self.user - } - - public getRecipientUser(): UserIdentifier { - return this.self.linkedUser - } - - public async getGradidoTransactionBuilder(): Promise { - const builder = new GradidoTransactionBuilder() - const signingUser = await this.loadUser(this.self.user) - const recipientUser = await this.loadUser(this.self.linkedUser) - return builder - .setTransactionTransfer( - new TransferAmount(new MemoryBlock(signingUser.derive2Pubkey), this.self.amount.toString()), - new MemoryBlock(recipientUser.derive2Pubkey), - ) - .setMemo('dummy memo for transfer') - } -} diff --git a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts index 498e71bf7..dc80d7c02 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -1,9 +1,9 @@ /* eslint-disable camelcase */ -import { AddressType_COMMUNITY_HUMAN, GradidoTransactionBuilder } from 'gradido-blockchain-js' +import { GradidoTransactionBuilder } from 'gradido-blockchain-js' import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { LogError } from '@/server/LogError' -import { uuid4ToHash } from '@/utils/typeConverter' +import { accountTypeToAddressType, uuid4ToHash } from '@/utils/typeConverter' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' @@ -30,7 +30,7 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { .setCreatedAt(new Date(this.self.createdAt)) .setRegisterAddress( accountKeyPair.getPublicKey(), - AddressType_COMMUNITY_HUMAN, + accountTypeToAddressType(this.self.accountType), uuid4ToHash(this.self.user.uuid), ) .sign(communityKeyPair) diff --git a/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts b/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts deleted file mode 100644 index e8730f8e3..000000000 --- a/dlt-connector/src/interactions/transmitToIota/AbstractTransactionRecipe.role.ts +++ /dev/null @@ -1,106 +0,0 @@ -/* eslint-disable camelcase */ -import { Transaction } from '@entity/Transaction' -import { - GradidoTransaction, - GradidoTransactionBuilder, - InteractionSerialize, - InteractionValidate, - MemoryBlock, - TransactionType_COMMUNITY_ROOT, - ValidateType_SINGLE, -} from 'gradido-blockchain-js' - -import { sendMessage as iotaSendMessage } from '@/client/IotaClient' -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionError } from '@/graphql/model/TransactionError' -import { logger } from '@/logging/logger' - -export abstract class AbstractTransactionRecipeRole { - // eslint-disable-next-line no-useless-constructor - public constructor(protected self: Transaction) {} - - public abstract transmitToIota(): Promise - public abstract getCrossGroupTypeName(): string - - public validate(transactionBuilder: GradidoTransactionBuilder): GradidoTransaction { - const transaction = transactionBuilder.build() - try { - // throw an exception when something is wrong - const validator = new InteractionValidate(transaction) - validator.run(ValidateType_SINGLE) - } catch (e) { - if (e instanceof Error) { - throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e.message) - } else if (typeof e === 'string') { - throw new TransactionError(TransactionErrorType.VALIDATION_ERROR, e) - } else { - throw e - } - } - return transaction - } - - protected getGradidoTransactionBuilder(): GradidoTransactionBuilder { - if (!this.self.signature) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing signature in transaction recipe', - ) - } - let publicKey: Buffer | undefined - if (this.self.type === TransactionType_COMMUNITY_ROOT) { - publicKey = this.self.community.rootPubkey - if (!publicKey) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing community public key for community root transaction', - ) - } - } else if (this.self.signingAccount) { - publicKey = this.self.signingAccount.derive2Pubkey - if (!publicKey) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'missing signing account public key for transaction', - ) - } - } else { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, - "signingAccount not exist and it isn't a community root transaction", - ) - } - return new GradidoTransactionBuilder() - .setTransactionBody(new MemoryBlock(this.self.bodyBytes)) - .addSignaturePair(new MemoryBlock(publicKey), new MemoryBlock(this.self.signature)) - } - - /** - * - * @param gradidoTransaction - * @param topic - * @return iota message id - */ - protected async sendViaIota( - gradidoTransaction: GradidoTransaction, - topic: string, - ): Promise { - // protobuf serializing function - const serialized = new InteractionSerialize(gradidoTransaction).run() - if (!serialized) { - throw new TransactionError( - TransactionErrorType.PROTO_ENCODE_ERROR, - 'cannot serialize transaction', - ) - } - const resultMessage = await iotaSendMessage( - Uint8Array.from(serialized.data()), - Uint8Array.from(Buffer.from(topic, 'hex')), - ) - logger.info('transmitted Gradido Transaction to Iota', { - id: this.self.id, - messageId: resultMessage.messageId, - }) - return Buffer.from(resultMessage.messageId, 'hex') - } -} diff --git a/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts b/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts deleted file mode 100644 index afa171a37..000000000 --- a/dlt-connector/src/interactions/transmitToIota/InboundTransactionRecipe.role.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Transaction } from '@entity/Transaction' -import { MemoryBlock } from 'gradido-blockchain-js' - -import { logger } from '@/logging/logger' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' -import { LogError } from '@/server/LogError' - -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipe.role' - -/** - * Inbound Transaction on recipient community, mark the gradidos as received from another community - * need to set gradido id from OUTBOUND transaction! - */ -export class InboundTransactionRecipeRole extends AbstractTransactionRecipeRole { - public getCrossGroupTypeName(): string { - return 'INBOUND' - } - - public async transmitToIota(): Promise { - logger.debug('transmit INBOUND transaction to iota', new TransactionLoggingView(this.self)) - const builder = this.getGradidoTransactionBuilder() - const pairingTransaction = await new TransactionLogic(this.self).findPairTransaction() - if (!pairingTransaction.iotaMessageId || pairingTransaction.iotaMessageId.length !== 32) { - throw new LogError( - 'missing iota message id in pairing transaction, was it already send?', - new TransactionLoggingView(pairingTransaction), - ) - } - builder.setParentMessageId(new MemoryBlock(pairingTransaction.iotaMessageId)) - this.self.pairingTransactionId = pairingTransaction.id - this.self.pairingTransaction = pairingTransaction - pairingTransaction.pairingTransactionId = this.self.id - - if (!this.self.otherCommunity) { - throw new LogError('missing other community') - } - - this.self.iotaMessageId = await this.sendViaIota( - this.validate(builder), - this.self.otherCommunity.iotaTopic, - ) - return this.self - } -} diff --git a/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts b/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts deleted file mode 100644 index 10f862d9a..000000000 --- a/dlt-connector/src/interactions/transmitToIota/LocalTransactionRecipe.role.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Transaction } from '@entity/Transaction' - -import { logger } from '@/logging/logger' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' - -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipe.role' - -export class LocalTransactionRecipeRole extends AbstractTransactionRecipeRole { - public getCrossGroupTypeName(): string { - return 'LOCAL' - } - - public async transmitToIota(): Promise { - logger.debug( - `transmit ${this.getCrossGroupTypeName()} transaction to iota`, - new TransactionLoggingView(this.self), - ) - this.self.iotaMessageId = await this.sendViaIota( - this.validate(this.getGradidoTransactionBuilder()), - this.self.community.iotaTopic, - ) - return this.self - } -} diff --git a/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts b/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts deleted file mode 100644 index d3b0b67c4..000000000 --- a/dlt-connector/src/interactions/transmitToIota/OutboundTransactionRecipeRole.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LocalTransactionRecipeRole } from './LocalTransactionRecipe.role' - -/** - * Outbound Transaction on sender community, mark the gradidos as sended out of community - */ -export class OutboundTransactionRecipeRole extends LocalTransactionRecipeRole { - public getCrossGroupTypeName(): string { - return 'OUTBOUND' - } -} diff --git a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts deleted file mode 100644 index f366be2b4..000000000 --- a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -import 'reflect-metadata' -import { Account } from '@entity/Account' -import { Decimal } from 'decimal.js-light' -import { CrossGroupType_INBOUND, CrossGroupType_OUTBOUND, InteractionDeserialize, InteractionToJson, InteractionValidate, MemoryBlock } from 'gradido-blockchain-js' -import { v4 } from 'uuid' - -import { TestDB } from '@test/TestDB' - -import { CONFIG } from '@/config' -import { KeyPair } from '@/data/KeyPair' -import { Mnemonic } from '@/data/Mnemonic' -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { logger } from '@/logging/logger' - -import { CreateTransactionRecipeContext } from '../backendToDb/transaction/CreateTransactionRecipe.context' - -import { TransmitToIotaContext } from './TransmitToIota.context' - -// eslint-disable-next-line import/order -import { communitySeed } from '@test/seeding/Community.seed' -// eslint-disable-next-line import/order -import { createUserSet, UserSet } from '@test/seeding/UserSet.seed' - -jest.mock('@typeorm/DataSource', () => ({ - getDataSource: jest.fn(() => TestDB.instance.dbConnect), -})) - -jest.mock('@/client/IotaClient', () => { - return { - sendMessage: jest.fn().mockReturnValue({ - messageId: '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', - }), - } -}) - -CONFIG.IOTA_HOME_COMMUNITY_SEED = '034b0229a2ba4e98e1cc5e8767dca886279b484303ffa73546bd5f5bf0b71285' -const homeCommunityUuid = v4() -const foreignCommunityUuid = v4() - -const keyPair = new KeyPair(new Mnemonic(CONFIG.IOTA_HOME_COMMUNITY_SEED)) -const foreignKeyPair = new KeyPair( - new Mnemonic('5d4e163c078cc6b51f5c88f8422bc8f21d1d59a284515ab1ea79e1c176ebec50'), -) - -let moderator: UserSet -let firstUser: UserSet -let secondUser: UserSet -let foreignUser: UserSet - -const now = new Date() - -describe('interactions/transmitToIota/TransmitToIotaContext', () => { - beforeAll(async () => { - await TestDB.instance.setupTestDB() - await communitySeed(homeCommunityUuid, false) - await communitySeed(foreignCommunityUuid, true, foreignKeyPair) - - moderator = createUserSet(homeCommunityUuid, keyPair) - firstUser = createUserSet(homeCommunityUuid, keyPair) - secondUser = createUserSet(homeCommunityUuid, keyPair) - foreignUser = createUserSet(foreignCommunityUuid, foreignKeyPair) - - await Account.save([ - moderator.account, - firstUser.account, - secondUser.account, - foreignUser.account, - ]) - }) - - afterAll(async () => { - await TestDB.instance.teardownTestDB() - }) - - it('LOCAL transaction', async () => { - const creationTransactionDraft = new TransactionDraft() - creationTransactionDraft.amount = new Decimal('1000') - creationTransactionDraft.backendTransactionId = 1 - creationTransactionDraft.createdAt = new Date().toISOString() - creationTransactionDraft.linkedUser = moderator.identifier - creationTransactionDraft.user = firstUser.identifier - creationTransactionDraft.type = InputTransactionType.CREATION - creationTransactionDraft.targetDate = new Date().toISOString() - const transactionRecipeContext = new CreateTransactionRecipeContext(creationTransactionDraft) - await transactionRecipeContext.run() - const transaction = transactionRecipeContext.getTransactionRecipe() - - const context = new TransmitToIotaContext(transaction) - const debugSpy = jest.spyOn(logger, 'debug') - await context.run() - expect( - transaction.iotaMessageId?.compare( - Buffer.from('5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', 'hex'), - ), - ).toBe(0) - expect(debugSpy).toHaveBeenNthCalledWith( - 3, - expect.stringContaining('transmit LOCAL transaction to iota'), - expect.objectContaining({}), - ) - }) - - it('OUTBOUND transaction', async () => { - const crossGroupSendTransactionDraft = new TransactionDraft() - crossGroupSendTransactionDraft.amount = new Decimal('100') - crossGroupSendTransactionDraft.backendTransactionId = 4 - crossGroupSendTransactionDraft.createdAt = now.toISOString() - crossGroupSendTransactionDraft.linkedUser = foreignUser.identifier - crossGroupSendTransactionDraft.user = firstUser.identifier - crossGroupSendTransactionDraft.type = InputTransactionType.SEND - const transactionRecipeContext = new CreateTransactionRecipeContext( - crossGroupSendTransactionDraft, - ) - await transactionRecipeContext.run() - const transaction = transactionRecipeContext.getTransactionRecipe() - await transaction.save() - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body).not.toBeNull() - expect(body?.getType()).toEqual(CrossGroupType_OUTBOUND) - const context = new TransmitToIotaContext(transaction) - const debugSpy = jest.spyOn(logger, 'debug') - await context.run() - expect( - transaction.iotaMessageId?.compare( - Buffer.from('5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', 'hex'), - ), - ).toBe(0) - expect(debugSpy).toHaveBeenNthCalledWith( - 5, - expect.stringContaining('transmit OUTBOUND transaction to iota'), - expect.objectContaining({}), - ) - }) - - it('INBOUND transaction', async () => { - const crossGroupRecvTransactionDraft = new TransactionDraft() - crossGroupRecvTransactionDraft.amount = new Decimal('100') - crossGroupRecvTransactionDraft.backendTransactionId = 5 - crossGroupRecvTransactionDraft.createdAt = now.toISOString() - crossGroupRecvTransactionDraft.linkedUser = firstUser.identifier - crossGroupRecvTransactionDraft.user = foreignUser.identifier - crossGroupRecvTransactionDraft.type = InputTransactionType.RECEIVE - const transactionRecipeContext = new CreateTransactionRecipeContext( - crossGroupRecvTransactionDraft, - ) - await transactionRecipeContext.run() - const transaction = transactionRecipeContext.getTransactionRecipe() - await transaction.save() - // console.log(new TransactionLoggingView(transaction)) - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const body = deserializer.getTransactionBody() - expect(body?.getType()).toEqual(CrossGroupType_INBOUND) - - const context = new TransmitToIotaContext(transaction) - const debugSpy = jest.spyOn(logger, 'debug') - await context.run() - expect( - transaction.iotaMessageId?.compare( - Buffer.from('5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', 'hex'), - ), - ).toBe(0) - expect(debugSpy).toHaveBeenNthCalledWith( - 7, - expect.stringContaining('transmit INBOUND transaction to iota'), - expect.objectContaining({}), - ) - }) -}) diff --git a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts b/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts deleted file mode 100644 index 69c9ade3f..000000000 --- a/dlt-connector/src/interactions/transmitToIota/TransmitToIota.context.ts +++ /dev/null @@ -1,73 +0,0 @@ -/* eslint-disable camelcase */ -import { Transaction } from '@entity/Transaction' -import { - CrossGroupType_INBOUND, - CrossGroupType_LOCAL, - CrossGroupType_OUTBOUND, - InteractionDeserialize, - MemoryBlock, -} from 'gradido-blockchain-js' - -import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' -import { TransactionError } from '@/graphql/model/TransactionError' -import { logger } from '@/logging/logger' -import { TransactionLoggingView } from '@/logging/TransactionLogging.view' -import { LogError } from '@/server/LogError' -import { getDataSource } from '@/typeorm/DataSource' - -import { AbstractTransactionRecipeRole } from './AbstractTransactionRecipe.role' -import { InboundTransactionRecipeRole } from './InboundTransactionRecipe.role' -import { LocalTransactionRecipeRole } from './LocalTransactionRecipe.role' -import { OutboundTransactionRecipeRole } from './OutboundTransactionRecipeRole' - -/** - * @DCI-Context - * Context for sending transaction recipe to iota - * send every transaction only once to iota! - */ -export class TransmitToIotaContext { - private transactionRecipeRole: AbstractTransactionRecipeRole - - public constructor(transaction: Transaction) { - const deserializer = new InteractionDeserialize(new MemoryBlock(transaction.bodyBytes)) - deserializer.run() - const transactionBody = deserializer.getTransactionBody() - if (!transactionBody) { - throw new TransactionError( - TransactionErrorType.PROTO_DECODE_ERROR, - 'error decoding body bytes', - ) - } - switch (transactionBody.getType()) { - case CrossGroupType_LOCAL: - this.transactionRecipeRole = new LocalTransactionRecipeRole(transaction) - break - case CrossGroupType_INBOUND: - this.transactionRecipeRole = new InboundTransactionRecipeRole(transaction) - break - case CrossGroupType_OUTBOUND: - this.transactionRecipeRole = new OutboundTransactionRecipeRole(transaction) - break - default: - throw new LogError('unknown cross group type', transactionBody.getType()) - } - } - - public async run(): Promise { - const transaction = await this.transactionRecipeRole.transmitToIota() - logger.debug('transaction sended via iota', new TransactionLoggingView(transaction)) - // store changes in db - // prevent endless loop - const pairingTransaction = transaction.pairingTransaction - if (pairingTransaction) { - transaction.pairingTransaction = undefined - await getDataSource().transaction(async (transactionalEntityManager) => { - await transactionalEntityManager.save(transaction) - await transactionalEntityManager.save(pairingTransaction) - }) - } else { - await transaction.save() - } - logger.info('sended transaction successfully updated in db') - } -} diff --git a/dlt-connector/src/logging/AbstractLogging.view.ts b/dlt-connector/src/logging/AbstractLogging.view.ts index e5f439b5d..ddb1cb6ed 100644 --- a/dlt-connector/src/logging/AbstractLogging.view.ts +++ b/dlt-connector/src/logging/AbstractLogging.view.ts @@ -1,6 +1,5 @@ import util from 'util' -import { Decimal } from 'decimal.js-light' import { Timestamp, TimestampSeconds } from 'gradido-blockchain-js' export abstract class AbstractLoggingView { @@ -25,13 +24,6 @@ export abstract class AbstractLoggingView { return undefined } - protected decimalToString(number: Decimal | undefined | null): string | undefined { - if (number) { - return number.toString() - } - return undefined - } - protected timestampSecondsToDateString(timestamp: TimestampSeconds): string | undefined { if (timestamp && timestamp.getSeconds()) { return timestamp.getDate().toISOString() diff --git a/dlt-connector/src/logging/AccountLogging.view.ts b/dlt-connector/src/logging/AccountLogging.view.ts deleted file mode 100644 index f1a7abe20..000000000 --- a/dlt-connector/src/logging/AccountLogging.view.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Account } from '@entity/Account' -import { addressTypeToString } from 'gradido-blockchain-js' - -import { AccountType } from '@/graphql/enum/AccountType' -import { accountTypeToAddressType } from '@/utils/typeConverter' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { UserLoggingView } from './UserLogging.view' - -export class AccountLoggingView extends AbstractLoggingView { - public constructor(private account: Account) { - super() - } - - public toJSON() { - return { - id: this.account.id, - user: this.account.user ? new UserLoggingView(this.account.user).toJSON() : null, - derivationIndex: this.account.derivationIndex, - derive2Pubkey: this.account.derive2Pubkey.toString(this.bufferStringFormat), - type: addressTypeToString( - accountTypeToAddressType(this.account.type as unknown as AccountType), - ), - createdAt: this.dateToString(this.account.createdAt), - confirmedAt: this.dateToString(this.account.confirmedAt), - balanceOnConfirmation: this.decimalToString(this.account.balanceOnConfirmation), - balanceConfirmedAt: this.dateToString(this.account.balanceConfirmedAt), - balanceOnCreation: this.decimalToString(this.account.balanceOnCreation), - balanceCreatedAt: this.dateToString(this.account.balanceCreatedAt), - } - } -} diff --git a/dlt-connector/src/logging/BackendTransactionLogging.view.ts b/dlt-connector/src/logging/BackendTransactionLogging.view.ts deleted file mode 100644 index d21c765aa..000000000 --- a/dlt-connector/src/logging/BackendTransactionLogging.view.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { BackendTransaction } from '@entity/BackendTransaction' - -import { InputTransactionType } from '@/graphql/enum/InputTransactionType' -import { getEnumValue } from '@/utils/typeConverter' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { TransactionLoggingView } from './TransactionLogging.view' - -export class BackendTransactionLoggingView extends AbstractLoggingView { - public constructor(private self: BackendTransaction) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(showTransaction = true): any { - return { - id: this.self.id, - backendTransactionId: this.self.backendTransactionId, - transaction: - showTransaction && this.self.transaction - ? new TransactionLoggingView(this.self.transaction).toJSON(false) - : undefined, - type: getEnumValue(InputTransactionType, this.self.typeId), - balance: this.decimalToString(this.self.balance), - createdAt: this.dateToString(this.self.createdAt), - confirmedAt: this.dateToString(this.self.confirmedAt), - verifiedOnBackend: this.self.verifiedOnBackend, - } - } -} diff --git a/dlt-connector/src/logging/CommunityLogging.view.ts b/dlt-connector/src/logging/CommunityLogging.view.ts deleted file mode 100644 index 22f0a4597..000000000 --- a/dlt-connector/src/logging/CommunityLogging.view.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Community } from '@entity/Community' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { AccountLoggingView } from './AccountLogging.view' - -export class CommunityLoggingView extends AbstractLoggingView { - public constructor(private self: Community) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - id: this.self.id, - iotaTopic: this.self.iotaTopic, - foreign: this.self.foreign, - publicKey: this.self.rootPubkey?.toString(this.bufferStringFormat), - createdAt: this.dateToString(this.self.createdAt), - confirmedAt: this.dateToString(this.self.confirmedAt), - aufAccount: this.self.aufAccount ? new AccountLoggingView(this.self.aufAccount) : undefined, - gmwAccount: this.self.gmwAccount ? new AccountLoggingView(this.self.gmwAccount) : undefined, - } - } -} diff --git a/dlt-connector/src/logging/TransactionDraftLogging.view.ts b/dlt-connector/src/logging/TransactionDraftLogging.view.ts index 5e86822ec..655a9ab9e 100644 --- a/dlt-connector/src/logging/TransactionDraftLogging.view.ts +++ b/dlt-connector/src/logging/TransactionDraftLogging.view.ts @@ -16,7 +16,7 @@ export class TransactionDraftLoggingView extends AbstractLoggingView { user: new UserIdentifierLoggingView(this.self.user).toJSON(), linkedUser: new UserIdentifierLoggingView(this.self.linkedUser).toJSON(), backendTransactionId: this.self.backendTransactionId, - amount: this.decimalToString(this.self.amount), + amount: Number(this.self.amount), type: getEnumValue(InputTransactionType, this.self.type), createdAt: this.self.createdAt, targetDate: this.self.targetDate, diff --git a/dlt-connector/src/logging/TransactionLogging.view.ts b/dlt-connector/src/logging/TransactionLogging.view.ts deleted file mode 100644 index 1bb59cc55..000000000 --- a/dlt-connector/src/logging/TransactionLogging.view.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Transaction } from '@entity/Transaction' - -import { TransactionType } from '@/data/proto/3_3/enum/TransactionType' -import { LogError } from '@/server/LogError' -import { getEnumValue } from '@/utils/typeConverter' - -import { AbstractLoggingView } from './AbstractLogging.view' -import { AccountLoggingView } from './AccountLogging.view' -import { BackendTransactionLoggingView } from './BackendTransactionLogging.view' -import { CommunityLoggingView } from './CommunityLogging.view' - -export class TransactionLoggingView extends AbstractLoggingView { - public constructor(private self: Transaction) { - super() - if (this.self.community === undefined) { - throw new LogError('sender community is zero') - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(showBackendTransactions = true, deep = 1): any { - return { - id: this.self.id, - nr: this.self.nr, - bodyBytesLength: this.self.bodyBytes.length, - createdAt: this.dateToString(this.self.createdAt), - confirmedAt: this.dateToString(this.self.confirmedAt), - protocolVersion: this.self.protocolVersion, - type: getEnumValue(TransactionType, this.self.type), - signature: this.self.signature.subarray(0, 31).toString(this.bufferStringFormat) + '..', - community: new CommunityLoggingView(this.self.community).toJSON(), - otherCommunity: this.self.otherCommunity - ? new CommunityLoggingView(this.self.otherCommunity) - : { id: this.self.otherCommunityId }, - iotaMessageId: this.self.iotaMessageId - ? this.self.iotaMessageId.toString(this.bufferStringFormat) - : undefined, - signingAccount: this.self.signingAccount - ? new AccountLoggingView(this.self.signingAccount) - : { id: this.self.signingAccountId }, - recipientAccount: this.self.recipientAccount - ? new AccountLoggingView(this.self.recipientAccount) - : { id: this.self.recipientAccountId }, - pairingTransaction: - this.self.pairingTransaction && deep === 1 - ? new TransactionLoggingView(this.self.pairingTransaction).toJSON( - showBackendTransactions, - deep + 1, - ) - : { id: this.self.pairingTransaction }, - amount: this.decimalToString(this.self.amount), - accountBalanceOnCreation: this.decimalToString(this.self.accountBalanceOnCreation), - accountBalanceOnConfirmation: this.decimalToString(this.self.accountBalanceOnConfirmation), - runningHash: this.self.runningHash - ? this.self.runningHash.toString(this.bufferStringFormat) - : undefined, - iotaMilestone: this.self.iotaMilestone, - backendTransactions: - showBackendTransactions && this.self.backendTransactions - ? this.self.backendTransactions.map((backendTransaction) => - new BackendTransactionLoggingView(backendTransaction).toJSON(false), - ) - : undefined, - } - } -} diff --git a/dlt-connector/src/logging/UserLogging.view.ts b/dlt-connector/src/logging/UserLogging.view.ts deleted file mode 100644 index a3cbd66bc..000000000 --- a/dlt-connector/src/logging/UserLogging.view.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { User } from '@entity/User' - -import { AbstractLoggingView } from './AbstractLogging.view' - -export class UserLoggingView extends AbstractLoggingView { - public constructor(private user: User) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - id: this.user.id, - gradidoId: this.user.gradidoID, - derive1Pubkey: this.user.derive1Pubkey.toString(this.bufferStringFormat), - createdAt: this.dateToString(this.user.createdAt), - confirmedAt: this.dateToString(this.user.confirmedAt), - } - } -} diff --git a/dlt-connector/src/manager/InterruptiveSleepManager.ts b/dlt-connector/src/manager/InterruptiveSleepManager.ts deleted file mode 100644 index 7827c8fe9..000000000 --- a/dlt-connector/src/manager/InterruptiveSleepManager.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { LogError } from '@/server/LogError' - -import { InterruptiveSleep } from '../utils/InterruptiveSleep' - -// Source: https://refactoring.guru/design-patterns/singleton/typescript/example -// and ../federation/client/FederationClientFactory.ts -/** - * A Singleton class defines the `getInstance` method that lets clients access - * the unique singleton instance. - */ -// eslint-disable-next-line @typescript-eslint/no-extraneous-class -export class InterruptiveSleepManager { - // eslint-disable-next-line no-use-before-define - private static instance: InterruptiveSleepManager - private interruptiveSleep: Map = new Map() - private stepSizeMilliseconds = 10 - - /** - * The Singleton's constructor should always be private to prevent direct - * construction calls with the `new` operator. - */ - // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function - private constructor() {} - - /** - * The static method that controls the access to the singleton instance. - * - * This implementation let you subclass the Singleton class while keeping - * just one instance of each subclass around. - */ - public static getInstance(): InterruptiveSleepManager { - if (!InterruptiveSleepManager.instance) { - InterruptiveSleepManager.instance = new InterruptiveSleepManager() - } - return InterruptiveSleepManager.instance - } - - /** - * only for new created InterruptiveSleepManager Entries! - * @param step size in ms in which new! InterruptiveSleepManager check if they where triggered - */ - public setStepSize(ms: number) { - this.stepSizeMilliseconds = ms - } - - public interrupt(key: string): void { - const interruptiveSleep = this.interruptiveSleep.get(key) - if (interruptiveSleep) { - interruptiveSleep.interrupt() - } - } - - public sleep(key: string, ms: number): Promise { - if (!this.interruptiveSleep.has(key)) { - this.interruptiveSleep.set(key, new InterruptiveSleep(this.stepSizeMilliseconds)) - } - const interruptiveSleep = this.interruptiveSleep.get(key) - if (!interruptiveSleep) { - throw new LogError('map entry not exist after setting it') - } - return interruptiveSleep.sleep(ms) - } -} diff --git a/dlt-connector/src/tasks/transmitToIota.ts b/dlt-connector/src/tasks/transmitToIota.ts deleted file mode 100644 index 89236586e..000000000 --- a/dlt-connector/src/tasks/transmitToIota.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/data/const' -import { TransactionRepository } from '@/data/Transaction.repository' -import { TransmitToIotaContext } from '@/interactions/transmitToIota/TransmitToIota.context' -import { InterruptiveSleepManager } from '@/manager/InterruptiveSleepManager' - -import { logger } from '../logging/logger' - -function sleep(ms: number) { - return new Promise((resolve) => { - setTimeout(resolve, ms) - }) -} - -let running = true - -export const stopTransmitToIota = (): void => { - running = false -} -/** - * check for pending transactions: - * - if one found call TransmitToIotaContext - * - if not, wait 1000 ms and try again - * if a new transaction was added, the sleep will be interrupted - */ -export const transmitToIota = async (): Promise => { - logger.info('start iota message transmitter') - // eslint-disable-next-line no-unmodified-loop-condition - while (running) { - try { - while (true) { - const recipe = await TransactionRepository.getNextPendingTransaction() - if (!recipe) break - const transmitToIotaContext = new TransmitToIotaContext(recipe) - await transmitToIotaContext.run() - } - - await InterruptiveSleepManager.getInstance().sleep( - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, - 1000, - ) - } catch (error) { - logger.error('error while transmitting to iota, retry in 10 seconds ', error) - await sleep(10000) - } - } - logger.error( - 'end iota message transmitter, no further transaction will be transmitted. !!! Please restart Server !!!', - ) -} diff --git a/dlt-connector/src/utils/InterruptiveSleep.ts b/dlt-connector/src/utils/InterruptiveSleep.ts deleted file mode 100644 index c21e57db9..000000000 --- a/dlt-connector/src/utils/InterruptiveSleep.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Sleep, that can be interrupted - * call sleep only for msSteps and than check if interrupt was called - */ -export class InterruptiveSleep { - private interruptSleep = false - private msSteps = 10 - - constructor(msSteps: number) { - this.msSteps = msSteps - } - - public interrupt(): void { - this.interruptSleep = true - } - - private static _sleep(ms: number) { - return new Promise((resolve) => { - setTimeout(resolve, ms) - }) - } - - public async sleep(ms: number): Promise { - let waited = 0 - this.interruptSleep = false - while (waited < ms && !this.interruptSleep) { - await InterruptiveSleep._sleep(this.msSteps) - waited += this.msSteps - } - } -} From c4697a010a7839e4d0e8170ff4e4c6e999e98bf6 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sun, 22 Sep 2024 17:06:17 +0200 Subject: [PATCH 10/23] remove dlt-database --- .github/workflows/test_dlt_connector.yml | 9 +- dlt-connector/package.json | 5 +- dlt-database/.env.dist | 6 - dlt-database/.env.template | 8 - dlt-database/.eslintignore | 3 - dlt-database/.eslintrc.js | 206 -- dlt-database/.gitignore | 27 - dlt-database/.nvmrc | 1 - dlt-database/.prettierrc.js | 9 - dlt-database/Dockerfile | 130 - dlt-database/README.md | 39 - dlt-database/entity/0001-init_db/Account.ts | 81 - .../entity/0001-init_db/AccountCommunity.ts | 30 - dlt-database/entity/0001-init_db/Community.ts | 69 - .../0001-init_db/ConfirmedTransaction.ts | 59 - .../entity/0001-init_db/InvalidTransaction.ts | 10 - dlt-database/entity/0001-init_db/Migration.ts | 13 - .../entity/0001-init_db/TransactionRecipe.ts | 83 - dlt-database/entity/0001-init_db/User.ts | 40 - .../0002-refactor_add_community/Account.ts | 80 - .../AccountCommunity.ts | 30 - .../0002-refactor_add_community/Community.ts | 69 - .../ConfirmedTransaction.ts | 59 - .../0002-refactor_add_community/User.ts | 39 - .../Account.ts | 89 - .../BackendTransaction.ts | 46 - .../Community.ts | 64 - .../InvalidTransaction.ts | 13 - .../Transaction.ts | 129 - .../0003-refactor_transaction_recipe/User.ts | 35 - .../entity/0004-fix_spelling/Transaction.ts | 129 - .../Community.ts | 64 - .../Transaction.ts | 109 - dlt-database/entity/Account.ts | 1 - dlt-database/entity/AccountCommunity.ts | 1 - dlt-database/entity/Community.ts | 1 - dlt-database/entity/InvalidTransaction.ts | 1 - dlt-database/entity/Migration.ts | 1 - dlt-database/entity/Transaction.ts | 1 - dlt-database/entity/User.ts | 1 - dlt-database/entity/index.ts | 17 - dlt-database/log/.gitignore | 2 - dlt-database/migrations/0001-init_db.ts | 130 - .../migrations/0002-refactor_add_community.ts | 61 - .../0003-refactor_transaction_recipe.ts | 156 - dlt-database/migrations/0004-fix_spelling.ts | 15 - ...05-refactor_with_gradido_blockchain_lib.ts | 28 - dlt-database/package.json | 55 - dlt-database/src/config/index.ts | 39 - dlt-database/src/index.ts | 56 - dlt-database/src/prepare.ts | 22 - dlt-database/src/typeorm.ts | 1 - .../src/typeorm/DecimalTransformer.ts | 19 - dlt-database/tsconfig.json | 73 - dlt-database/yarn.lock | 2594 ----------------- docker-compose.apple-m1.override.yml | 6 - docker-compose.override.yml | 22 - docker-compose.reset.yml | 27 - docker-compose.test.yml | 12 - docker-compose.yml | 26 - 60 files changed, 2 insertions(+), 5149 deletions(-) delete mode 100644 dlt-database/.env.dist delete mode 100644 dlt-database/.env.template delete mode 100644 dlt-database/.eslintignore delete mode 100644 dlt-database/.eslintrc.js delete mode 100644 dlt-database/.gitignore delete mode 100644 dlt-database/.nvmrc delete mode 100644 dlt-database/.prettierrc.js delete mode 100644 dlt-database/Dockerfile delete mode 100644 dlt-database/README.md delete mode 100644 dlt-database/entity/0001-init_db/Account.ts delete mode 100644 dlt-database/entity/0001-init_db/AccountCommunity.ts delete mode 100644 dlt-database/entity/0001-init_db/Community.ts delete mode 100644 dlt-database/entity/0001-init_db/ConfirmedTransaction.ts delete mode 100644 dlt-database/entity/0001-init_db/InvalidTransaction.ts delete mode 100644 dlt-database/entity/0001-init_db/Migration.ts delete mode 100644 dlt-database/entity/0001-init_db/TransactionRecipe.ts delete mode 100644 dlt-database/entity/0001-init_db/User.ts delete mode 100644 dlt-database/entity/0002-refactor_add_community/Account.ts delete mode 100644 dlt-database/entity/0002-refactor_add_community/AccountCommunity.ts delete mode 100644 dlt-database/entity/0002-refactor_add_community/Community.ts delete mode 100644 dlt-database/entity/0002-refactor_add_community/ConfirmedTransaction.ts delete mode 100644 dlt-database/entity/0002-refactor_add_community/User.ts delete mode 100644 dlt-database/entity/0003-refactor_transaction_recipe/Account.ts delete mode 100644 dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts delete mode 100644 dlt-database/entity/0003-refactor_transaction_recipe/Community.ts delete mode 100644 dlt-database/entity/0003-refactor_transaction_recipe/InvalidTransaction.ts delete mode 100644 dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts delete mode 100644 dlt-database/entity/0003-refactor_transaction_recipe/User.ts delete mode 100644 dlt-database/entity/0004-fix_spelling/Transaction.ts delete mode 100644 dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts delete mode 100644 dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts delete mode 100644 dlt-database/entity/Account.ts delete mode 100644 dlt-database/entity/AccountCommunity.ts delete mode 100644 dlt-database/entity/Community.ts delete mode 100644 dlt-database/entity/InvalidTransaction.ts delete mode 100644 dlt-database/entity/Migration.ts delete mode 100644 dlt-database/entity/Transaction.ts delete mode 100644 dlt-database/entity/User.ts delete mode 100644 dlt-database/entity/index.ts delete mode 100644 dlt-database/log/.gitignore delete mode 100644 dlt-database/migrations/0001-init_db.ts delete mode 100644 dlt-database/migrations/0002-refactor_add_community.ts delete mode 100644 dlt-database/migrations/0003-refactor_transaction_recipe.ts delete mode 100644 dlt-database/migrations/0004-fix_spelling.ts delete mode 100644 dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts delete mode 100644 dlt-database/package.json delete mode 100644 dlt-database/src/config/index.ts delete mode 100644 dlt-database/src/index.ts delete mode 100644 dlt-database/src/prepare.ts delete mode 100644 dlt-database/src/typeorm.ts delete mode 100644 dlt-database/src/typeorm/DecimalTransformer.ts delete mode 100644 dlt-database/tsconfig.json delete mode 100644 dlt-database/yarn.lock diff --git a/.github/workflows/test_dlt_connector.yml b/.github/workflows/test_dlt_connector.yml index 099f0dd1a..8716b0c5e 100644 --- a/.github/workflows/test_dlt_connector.yml +++ b/.github/workflows/test_dlt_connector.yml @@ -60,13 +60,6 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v3 - - - name: DLT-Connector | docker-compose mariadb - run: docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mariadb - - - name: Sleep for 30 seconds - run: sleep 30s - shell: bash - name: DLT-Connector | Unit tests - run: cd dlt-database && yarn && yarn build && cd ../dlt-connector && yarn && yarn test + run: cd dlt-connector && yarn && yarn test diff --git a/dlt-connector/package.json b/dlt-connector/package.json index ca889b833..6031dd3b0 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -1,6 +1,6 @@ { "name": "gradido-dlt-connector", - "version": "2.3.1", + "version": "3.0.0", "description": "Gradido DLT-Connector", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/", @@ -23,7 +23,6 @@ "class-validator": "^0.14.0", "cors": "^2.8.5", "cross-env": "^7.0.3", - "dlt-database": "file:../dlt-database", "dotenv": "10.0.0", "express": "4.17.1", "express-slow-down": "^2.0.1", @@ -66,8 +65,6 @@ "prettier": "^2.8.7", "ts-jest": "^27.0.5", "ts-node": "^10.9.1", - "typeorm": "^0.3.17", - "typeorm-extension": "^3.0.1", "typescript": "^4.9.4" }, "engines": { diff --git a/dlt-database/.env.dist b/dlt-database/.env.dist deleted file mode 100644 index ecee20a06..000000000 --- a/dlt-database/.env.dist +++ /dev/null @@ -1,6 +0,0 @@ -DB_HOST=localhost -DB_PORT=3306 -DB_USER=root -DB_PASSWORD= -DB_DATABASE=gradido_dlt -MIGRATIONS_TABLE=migrations diff --git a/dlt-database/.env.template b/dlt-database/.env.template deleted file mode 100644 index 5b875bb6e..000000000 --- a/dlt-database/.env.template +++ /dev/null @@ -1,8 +0,0 @@ -CONFIG_VERSION=$DATABASE_CONFIG_VERSION - -DB_HOST=localhost -DB_PORT=3306 -DB_USER=$DB_USER -DB_PASSWORD=$DB_PASSWORD -DB_DATABASE=gradido_dlt -MIGRATIONS_TABLE=migrations diff --git a/dlt-database/.eslintignore b/dlt-database/.eslintignore deleted file mode 100644 index f6b255e92..000000000 --- a/dlt-database/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -**/*.min.js -build \ No newline at end of file diff --git a/dlt-database/.eslintrc.js b/dlt-database/.eslintrc.js deleted file mode 100644 index 6f1db58ff..000000000 --- a/dlt-database/.eslintrc.js +++ /dev/null @@ -1,206 +0,0 @@ -// eslint-disable-next-line import/no-commonjs, import/unambiguous -module.exports = { - root: true, - env: { - node: true, - }, - parser: '@typescript-eslint/parser', - plugins: ['prettier', '@typescript-eslint', 'import', 'n', 'promise'], - extends: [ - 'standard', - 'eslint:recommended', - 'plugin:prettier/recommended', - 'plugin:import/recommended', - 'plugin:import/typescript', - // 'plugin:security/recommended', - 'plugin:@eslint-community/eslint-comments/recommended', - ], - settings: { - 'import/parsers': { - '@typescript-eslint/parser': ['.ts', '.tsx'], - }, - 'import/resolver': { - typescript: { - project: ['./tsconfig.json'], - }, - node: true, - }, - }, - rules: { - 'no-console': 'error', - camelcase: 'error', - 'no-debugger': 'error', - 'prettier/prettier': [ - 'error', - { - htmlWhitespaceSensitivity: 'ignore', - }, - ], - // import - 'import/export': 'error', - 'import/no-deprecated': 'error', - 'import/no-empty-named-blocks': 'error', - // 'import/no-extraneous-dependencies': 'error', - 'import/no-mutable-exports': 'error', - 'import/no-unused-modules': 'error', - 'import/no-named-as-default': 'error', - 'import/no-named-as-default-member': 'error', - 'import/no-amd': 'error', - 'import/no-commonjs': 'error', - 'import/no-import-module-exports': 'error', - 'import/no-nodejs-modules': 'off', - 'import/unambiguous': 'error', - 'import/default': 'error', - 'import/named': 'error', - 'import/namespace': 'error', - 'import/no-absolute-path': 'error', - // 'import/no-cycle': 'error', - 'import/no-dynamic-require': 'error', - 'import/no-internal-modules': 'off', - 'import/no-relative-packages': 'error', - // 'import/no-relative-parent-imports': ['error', { ignore: ['@/*'] }], - 'import/no-self-import': 'error', - 'import/no-unresolved': 'error', - 'import/no-useless-path-segments': 'error', - 'import/no-webpack-loader-syntax': 'error', - 'import/consistent-type-specifier-style': 'error', - 'import/exports-last': 'off', - 'import/extensions': 'error', - 'import/first': 'error', - 'import/group-exports': 'off', - 'import/newline-after-import': 'error', - 'import/no-anonymous-default-export': 'error', - 'import/no-default-export': 'error', - 'import/no-duplicates': 'error', - 'import/no-named-default': 'error', - 'import/no-namespace': 'error', - 'import/no-unassigned-import': 'error', - // 'import/order': [ - // 'error', - // { - // groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'], - // 'newlines-between': 'always', - // pathGroups: [ - // { - // pattern: '@?*/**', - // group: 'external', - // position: 'after', - // }, - // { - // pattern: '@/**', - // group: 'external', - // position: 'after', - // }, - // ], - // alphabetize: { - // order: 'asc' /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */, - // caseInsensitive: true /* ignore case. Options: [true, false] */, - // }, - // distinctGroup: true, - // }, - // ], - 'import/prefer-default-export': 'off', - // n - 'n/handle-callback-err': 'error', - 'n/no-callback-literal': 'error', - 'n/no-exports-assign': 'error', - // 'n/no-extraneous-import': 'error', - 'n/no-extraneous-require': 'error', - 'n/no-hide-core-modules': 'error', - 'n/no-missing-import': 'off', // not compatible with typescript - 'n/no-missing-require': 'error', - 'n/no-new-require': 'error', - 'n/no-path-concat': 'error', - // 'n/no-process-exit': 'error', - 'n/no-unpublished-bin': 'error', - 'n/no-unpublished-import': 'off', // TODO need to exclude seeds - 'n/no-unpublished-require': 'error', - 'n/no-unsupported-features': ['error', { ignores: ['modules'] }], - 'n/no-unsupported-features/es-builtins': 'error', - 'n/no-unsupported-features/es-syntax': 'error', - 'n/no-unsupported-features/node-builtins': 'error', - 'n/process-exit-as-throw': 'error', - 'n/shebang': 'error', - 'n/callback-return': 'error', - 'n/exports-style': 'error', - 'n/file-extension-in-import': 'off', - 'n/global-require': 'error', - 'n/no-mixed-requires': 'error', - 'n/no-process-env': 'error', - 'n/no-restricted-import': 'error', - 'n/no-restricted-require': 'error', - // 'n/no-sync': 'error', - 'n/prefer-global/buffer': 'error', - 'n/prefer-global/console': 'error', - 'n/prefer-global/process': 'error', - 'n/prefer-global/text-decoder': 'error', - 'n/prefer-global/text-encoder': 'error', - 'n/prefer-global/url': 'error', - 'n/prefer-global/url-search-params': 'error', - 'n/prefer-promises/dns': 'error', - // 'n/prefer-promises/fs': 'error', - // promise - // 'promise/catch-or-return': 'error', - // 'promise/no-return-wrap': 'error', - // 'promise/param-names': 'error', - // 'promise/always-return': 'error', - // 'promise/no-native': 'off', - // 'promise/no-nesting': 'warn', - // 'promise/no-promise-in-callback': 'warn', - // 'promise/no-callback-in-promise': 'warn', - // 'promise/avoid-new': 'warn', - // 'promise/no-new-statics': 'error', - // 'promise/no-return-in-finally': 'warn', - // 'promise/valid-params': 'warn', - // 'promise/prefer-await-to-callbacks': 'error', - // 'promise/no-multiple-resolved': 'error', - // eslint comments - '@eslint-community/eslint-comments/disable-enable-pair': ['error', { allowWholeFile: true }], - '@eslint-community/eslint-comments/no-restricted-disable': 'error', - '@eslint-community/eslint-comments/no-use': 'off', - '@eslint-community/eslint-comments/require-description': 'off', - }, - overrides: [ - // only for ts files - { - files: ['*.ts', '*.tsx'], - extends: [ - // 'plugin:@typescript-eslint/recommended', - // 'plugin:@typescript-eslint/recommended-requiring-type-checking', - // 'plugin:@typescript-eslint/strict', - ], - rules: { - // allow explicitly defined dangling promises - // '@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }], - 'no-void': ['error', { allowAsStatement: true }], - // ignore prefer-regexp-exec rule to allow string.match(regex) - '@typescript-eslint/prefer-regexp-exec': 'off', - // this should not run on ts files: https://github.com/import-js/eslint-plugin-import/issues/2215#issuecomment-911245486 - 'import/unambiguous': 'off', - // this is not compatible with typeorm, due to joined tables can be null, but are not defined as nullable - '@typescript-eslint/no-unnecessary-condition': 'off', - }, - parserOptions: { - tsconfigRootDir: __dirname, - project: ['./tsconfig.json'], - // this is to properly reference the referenced project database without requirement of compiling it - // eslint-disable-next-line camelcase - EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true, - }, - }, - // we do not have testing on the database - // { - // files: ['*.test.ts'], - // plugins: ['jest'], - // rules: { - // 'jest/no-disabled-tests': 'error', - // 'jest/no-focused-tests': 'error', - // 'jest/no-identical-title': 'error', - // 'jest/prefer-to-have-length': 'error', - // 'jest/valid-expect': 'error', - // '@typescript-eslint/unbound-method': 'off', - // 'jest/unbound-method': 'error', - // }, - // }, - ], -} diff --git a/dlt-database/.gitignore b/dlt-database/.gitignore deleted file mode 100644 index 9e9e01ced..000000000 --- a/dlt-database/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -.DS_Store -node_modules/ -build/ -.cache/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -test/unit/coverage - -package-lock.json -/.env -/.env.bak -.env.development.local -.env.production.local - -# Editor directories and files -.idea -*.suo -*.ntvs* -*.njsproj -*.sln - -# coverage folder - -coverage/ - -*~ diff --git a/dlt-database/.nvmrc b/dlt-database/.nvmrc deleted file mode 100644 index 02c4afe7d..000000000 --- a/dlt-database/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.7.0 \ No newline at end of file diff --git a/dlt-database/.prettierrc.js b/dlt-database/.prettierrc.js deleted file mode 100644 index bc1d767d7..000000000 --- a/dlt-database/.prettierrc.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - semi: false, - printWidth: 100, - singleQuote: true, - trailingComma: "all", - tabWidth: 2, - bracketSpacing: true, - endOfLine: "auto", -}; diff --git a/dlt-database/Dockerfile b/dlt-database/Dockerfile deleted file mode 100644 index e34a4dbb6..000000000 --- a/dlt-database/Dockerfile +++ /dev/null @@ -1,130 +0,0 @@ -################################################################################## -# BASE ########################################################################### -################################################################################## -FROM node:18.7.0-alpine3.16 as base - -# ENVs (available in production aswell, can be overwritten by commandline or env file) -## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame -ENV DOCKER_WORKDIR="/app" -## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 -ENV BUILD_DATE="1970-01-01T00:00:00.00Z" -## We cannot do $(npm run version).${BUILD_NUMBER} here so we default to 0.0.0.0 -ENV BUILD_VERSION="0.0.0.0" -## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 -ENV BUILD_COMMIT="0000000" -## SET NODE_ENV -ENV NODE_ENV="production" - -# Labels -LABEL org.label-schema.build-date="${BUILD_DATE}" -LABEL org.label-schema.name="gradido:database" -LABEL org.label-schema.description="Gradido Database Migration Service" -LABEL org.label-schema.usage="https://github.com/gradido/gradido/blob/master/README.md" -LABEL org.label-schema.url="https://gradido.net" -LABEL org.label-schema.vcs-url="https://github.com/gradido/gradido/tree/master/database" -LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}" -LABEL org.label-schema.vendor="Gradido Community" -LABEL org.label-schema.version="${BUILD_VERSION}" -LABEL org.label-schema.schema-version="1.0" -LABEL maintainer="support@gradido.net" - -# Install Additional Software -## install: git -#RUN apk --no-cache add git - -## Workdir -RUN mkdir -p ${DOCKER_WORKDIR} -WORKDIR ${DOCKER_WORKDIR} - -################################################################################## -# DEVELOPMENT (Connected to the local environment, to reload on demand) ########## -################################################################################## -FROM base as development - -# We don't need to copy or build anything since we gonna bind to the -# local filesystem which will need a rebuild anyway - -# Run command -# (for development we need to execute npm install since the -# node_modules are on another volume and need updating) -CMD /bin/sh -c "yarn install" - -################################################################################## -# BUILD (Does contain all files and is therefore bloated) ######################## -################################################################################## -FROM base as build - -# Copy everything -COPY . . -# npm install -RUN yarn install --production=false --frozen-lockfile --non-interactive -# npm build -RUN yarn run build - -################################################################################## -# TEST UP ######################################################################## -################################################################################## -FROM build as test_up - -# Run command -CMD /bin/sh -c "yarn install && yarn run dev_up" - -################################################################################## -# TEST RESET ##################################################################### -################################################################################## -FROM build as test_reset - -# Run command -CMD /bin/sh -c "yarn install && yarn run dev_reset" - -################################################################################## -# TEST DOWN ###################################################################### -################################################################################## -FROM build as test_down - -# Run command -CMD /bin/sh -c "yarn install && yarn run dev_down" - -################################################################################## -# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) # -################################################################################## -FROM base as production - -# Copy "binary"-files from build image -COPY --from=build ${DOCKER_WORKDIR}/build ./build -# We also copy the node_modules express and serve-static for the run script -COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules -# Copy static files -# COPY --from=build ${DOCKER_WORKDIR}/public ./public -# Copy package.json for script definitions (lock file should not be needed) -COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json -# Copy Mnemonic files -COPY --from=build ${DOCKER_WORKDIR}/src/config/*.txt ./src/config/ -# Copy log folder -COPY --from=build ${DOCKER_WORKDIR}/log ./log -# Copy run scripts run/ -# COPY --from=build ${DOCKER_WORKDIR}/run ./run - -################################################################################## -# PRODUCTION UP ################################################################## -################################################################################## -FROM production as production_up - -# Run command -CMD /bin/sh -c "yarn run up" - -################################################################################## -# PRODUCTION RESET ############################################################### -################################################################################## -FROM production as production_reset - -# Run command -CMD /bin/sh -c "yarn run reset" - -################################################################################## -# PRODUCTION DOWN ################################################################ -################################################################################## -FROM production as production_down - -# Run command -CMD /bin/sh -c "yarn run down" \ No newline at end of file diff --git a/dlt-database/README.md b/dlt-database/README.md deleted file mode 100644 index e951f4530..000000000 --- a/dlt-database/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# database - -## Project setup - -```bash -yarn install -``` - -## Upgrade migrations production - -```bash -yarn up -``` - -## Upgrade migrations development - -```bash -yarn dev_up -``` - -## Downgrade migrations production - -```bash -yarn down -``` - -## Downgrade migrations development - -```bash -yarn dev_down -``` - -## Reset database - -```bash -yarn dev_reset -``` - -Runs all down migrations and after this all up migrations. diff --git a/dlt-database/entity/0001-init_db/Account.ts b/dlt-database/entity/0001-init_db/Account.ts deleted file mode 100644 index 7ceaf09cc..000000000 --- a/dlt-database/entity/0001-init_db/Account.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - JoinColumn, - OneToMany, - BaseEntity, -} from 'typeorm' -import { User } from '../User' -// TransactionRecipe was removed in newer migrations, so only the version from this folder can be linked -import { TransactionRecipe } from './TransactionRecipe' -// ConfirmedTransaction was removed in newer migrations, so only the version from this folder can be linked -import { ConfirmedTransaction } from './ConfirmedTransaction' -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Decimal } from 'decimal.js-light' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('accounts') -export class Account extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @ManyToOne(() => User, (user) => user.accounts) // Assuming you have a User entity with 'accounts' relation - @JoinColumn({ name: 'user_id' }) - user?: User - - // if user id is null, account belongs to community gmw or auf - @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: true }) - userId?: number - - @Column({ name: 'derivation_index', type: 'int', unsigned: true }) - derivationIndex: number - - @Column({ name: 'derive2_pubkey', type: 'binary', length: 32, unique: true }) - derive2Pubkey: Buffer - - @Column({ type: 'tinyint', unsigned: true }) - type: number - - @Column({ - name: 'created_at', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - createdAt: Date - - @Column({ name: 'confirmed_at', type: 'datetime', precision: 3, nullable: true }) - confirmedAt?: Date - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - default: 0, - transformer: DecimalTransformer, - }) - balance: Decimal - - @Column({ - name: 'balance_date', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - balanceDate: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.account) - @JoinColumn({ name: 'account_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.signingAccount) - transactionRecipesSigning?: TransactionRecipe[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.recipientAccount) - transactionRecipesRecipient?: TransactionRecipe[] - - @OneToMany(() => ConfirmedTransaction, (transaction) => transaction.account) - confirmedTransactions?: ConfirmedTransaction[] -} diff --git a/dlt-database/entity/0001-init_db/AccountCommunity.ts b/dlt-database/entity/0001-init_db/AccountCommunity.ts deleted file mode 100644 index 4c56b7954..000000000 --- a/dlt-database/entity/0001-init_db/AccountCommunity.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, BaseEntity } from 'typeorm' - -import { Account } from '../Account' -import { Community } from '../Community' - -@Entity('accounts_communities') -export class AccountCommunity extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @ManyToOne(() => Account, (account) => account.accountCommunities) - @JoinColumn({ name: 'account_id' }) - account: Account - - @Column({ name: 'account_id', type: 'int', unsigned: true }) - accountId: number - - @ManyToOne(() => Community, (community) => community.accountCommunities) - @JoinColumn({ name: 'community_id' }) - community: Community - - @Column({ name: 'community_id', type: 'int', unsigned: true }) - communityId: number - - @Column({ name: 'valid_from', type: 'datetime', precision: 3 }) - validFrom: Date - - @Column({ name: 'valid_to', type: 'datetime', precision: 3, nullable: true }) - validTo?: Date -} diff --git a/dlt-database/entity/0001-init_db/Community.ts b/dlt-database/entity/0001-init_db/Community.ts deleted file mode 100644 index 943914878..000000000 --- a/dlt-database/entity/0001-init_db/Community.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - JoinColumn, - OneToOne, - OneToMany, - BaseEntity, -} from 'typeorm' -import { Account } from '../Account' -// TransactionRecipe was removed in newer migrations, so only the version from this folder can be linked -import { TransactionRecipe } from './TransactionRecipe' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('communities') -export class Community extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ name: 'iota_topic', collation: 'utf8mb4_unicode_ci' }) - iotaTopic: string - - @Column({ name: 'root_pubkey', type: 'binary', length: 32, unique: true }) - rootPubkey: Buffer - - @Column({ name: 'root_privkey', type: 'binary', length: 32, nullable: true }) - rootPrivkey?: Buffer - - @Column({ name: 'root_chaincode', type: 'binary', length: 32, nullable: true }) - rootChaincode?: Buffer - - @Column({ type: 'tinyint', default: true }) - foreign: boolean - - @Column({ name: 'gmw_account_id', type: 'int', unsigned: true, nullable: true }) - gmwAccountId?: number - - @OneToOne(() => Account) - @JoinColumn({ name: 'gmw_account_id' }) - gmwAccount?: Account - - @Column({ name: 'auf_account_id', type: 'int', unsigned: true, nullable: true }) - aufAccountId?: number - - @OneToOne(() => Account) - @JoinColumn({ name: 'auf_account_id' }) - aufAccount?: Account - - @Column({ - name: 'created_at', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - createdAt: Date - - @Column({ name: 'confirmed_at', type: 'datetime', precision: 3, nullable: true }) - confirmedAt?: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.community) - @JoinColumn({ name: 'community_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.senderCommunity) - transactionRecipesSender?: TransactionRecipe[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.recipientCommunity) - transactionRecipesRecipient?: TransactionRecipe[] -} diff --git a/dlt-database/entity/0001-init_db/ConfirmedTransaction.ts b/dlt-database/entity/0001-init_db/ConfirmedTransaction.ts deleted file mode 100644 index 408a58a69..000000000 --- a/dlt-database/entity/0001-init_db/ConfirmedTransaction.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - JoinColumn, - OneToOne, - BaseEntity, -} from 'typeorm' -import { Decimal } from 'decimal.js-light' - -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -// the relation in future account don't match which this any longer, so we can only link with the local account here -import { Account } from './Account' -// TransactionRecipe was removed in newer migrations, so only the version from this folder can be linked -import { TransactionRecipe } from './TransactionRecipe' - -@Entity('confirmed_transactions') -export class ConfirmedTransaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @OneToOne(() => TransactionRecipe, (recipe) => recipe.confirmedTransaction) - @JoinColumn({ name: 'transaction_recipe_id' }) - transactionRecipe: TransactionRecipe - - @Column({ name: 'transaction_recipe_id', type: 'int', unsigned: true }) - transactionRecipeId: number - - @Column({ type: 'bigint' }) - nr: number - - @Column({ type: 'binary', length: 48 }) - runningHash: Buffer - - @ManyToOne(() => Account, (account) => account.confirmedTransactions) - @JoinColumn({ name: 'account_id' }) - account: Account - - @Column({ name: 'account_id', type: 'int', unsigned: true }) - accountId: number - - @Column({ - name: 'account_balance', - type: 'decimal', - precision: 40, - scale: 20, - nullable: false, - default: 0, - transformer: DecimalTransformer, - }) - accountBalance: Decimal - - @Column({ name: 'iota_milestone', type: 'bigint' }) - iotaMilestone: number - - @Column({ name: 'confirmed_at', type: 'datetime', precision: 3 }) - confirmedAt: Date -} diff --git a/dlt-database/entity/0001-init_db/InvalidTransaction.ts b/dlt-database/entity/0001-init_db/InvalidTransaction.ts deleted file mode 100644 index 1e9be4ff4..000000000 --- a/dlt-database/entity/0001-init_db/InvalidTransaction.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from 'typeorm' - -@Entity('invalid_transactions') -export class InvalidTransaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'iota_message_id', type: 'binary', length: 32 }) - iotaMessageId: Buffer -} diff --git a/dlt-database/entity/0001-init_db/Migration.ts b/dlt-database/entity/0001-init_db/Migration.ts deleted file mode 100644 index f1163cfbc..000000000 --- a/dlt-database/entity/0001-init_db/Migration.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' - -@Entity('migrations') -export class Migration extends BaseEntity { - @PrimaryGeneratedColumn() // This is actually not a primary column - version: number - - @Column({ length: 256, nullable: true, default: null }) - fileName: string - - @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' }) - date: Date -} diff --git a/dlt-database/entity/0001-init_db/TransactionRecipe.ts b/dlt-database/entity/0001-init_db/TransactionRecipe.ts deleted file mode 100644 index b2acbba75..000000000 --- a/dlt-database/entity/0001-init_db/TransactionRecipe.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - OneToOne, - JoinColumn, - BaseEntity, -} from 'typeorm' -import { Decimal } from 'decimal.js-light' - -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -// the relation in future account don't match which this any longer, so we can only link with the local account here -import { Account } from './Account' -// the relation in future community don't match which this any longer, so we can only link with the local account here -import { Community } from './Community' -// ConfirmedTransaction was removed in newer migrations, so only the version from this folder can be linked -import { ConfirmedTransaction } from './ConfirmedTransaction' - -@Entity('transaction_recipes') -export class TransactionRecipe extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'iota_message_id', type: 'binary', length: 32, nullable: true }) - iotaMessageId?: Buffer - - // if transaction has a sender than it is also the sender account - @ManyToOne(() => Account, (account) => account.transactionRecipesSigning) - @JoinColumn({ name: 'signing_account_id' }) - signingAccount: Account - - @Column({ name: 'signing_account_id', type: 'int', unsigned: true }) - signingAccountId: number - - @ManyToOne(() => Account, (account) => account.transactionRecipesRecipient) - @JoinColumn({ name: 'recipient_account_id' }) - recipientAccount?: Account - - @Column({ name: 'recipient_account_id', type: 'int', unsigned: true, nullable: true }) - recipientAccountId?: number - - @ManyToOne(() => Community, (community) => community.transactionRecipesSender) - @JoinColumn({ name: 'sender_community_id' }) - senderCommunity: Community - - @Column({ name: 'sender_community_id', type: 'int', unsigned: true }) - senderCommunityId: number - - @ManyToOne(() => Community, (community) => community.transactionRecipesRecipient) - @JoinColumn({ name: 'recipient_community_id' }) - recipientCommunity?: Community - - @Column({ name: 'recipient_community_id', type: 'int', unsigned: true, nullable: true }) - recipientCommunityId?: number - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - amount?: Decimal - - @Column({ type: 'tinyint' }) - type: number - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - @Column({ name: 'body_bytes', type: 'blob' }) - bodyBytes: Buffer - - @Column({ type: 'binary', length: 64 }) - signature: Buffer - - @Column({ name: 'protocol_version', type: 'int', default: 1 }) - protocolVersion: number - - @OneToOne(() => ConfirmedTransaction, (transaction) => transaction.transactionRecipe) - confirmedTransaction?: ConfirmedTransaction -} diff --git a/dlt-database/entity/0001-init_db/User.ts b/dlt-database/entity/0001-init_db/User.ts deleted file mode 100644 index 681a668e2..000000000 --- a/dlt-database/entity/0001-init_db/User.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany, JoinColumn } from 'typeorm' - -import { Account } from '../Account' - -@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) -export class User extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ - name: 'gradido_id', - length: 36, - nullable: true, - collation: 'utf8mb4_unicode_ci', - }) - gradidoID?: string - - @Column({ name: 'derive1_pubkey', type: 'binary', length: 32, unique: true }) - derive1Pubkey: Buffer - - @Column({ - name: 'created_at', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - createdAt: Date - - @Column({ - name: 'confirmed_at', - type: 'datetime', - precision: 3, - nullable: true, - }) - confirmedAt?: Date - - @OneToMany(() => Account, (account) => account.user) - @JoinColumn({ name: 'user_id' }) - accounts?: Account[] -} diff --git a/dlt-database/entity/0002-refactor_add_community/Account.ts b/dlt-database/entity/0002-refactor_add_community/Account.ts deleted file mode 100644 index 821b75e73..000000000 --- a/dlt-database/entity/0002-refactor_add_community/Account.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - JoinColumn, - OneToMany, - BaseEntity, -} from 'typeorm' -import { User } from '../User' -// TransactionRecipe was removed in newer migrations, so only the version from this folder can be linked -import { TransactionRecipe } from '../0001-init_db/TransactionRecipe' -// ConfirmedTransaction was removed in newer migrations, so only the version from this folder can be linked -import { ConfirmedTransaction } from './ConfirmedTransaction' -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Decimal } from 'decimal.js-light' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('accounts') -export class Account extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @ManyToOne(() => User, (user) => user.accounts) // Assuming you have a User entity with 'accounts' relation - @JoinColumn({ name: 'user_id' }) - user?: User - - // if user id is null, account belongs to community gmw or auf - @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: true }) - userId?: number - - @Column({ name: 'derivation_index', type: 'int', unsigned: true }) - derivationIndex: number - - @Column({ name: 'derive2_pubkey', type: 'binary', length: 32, unique: true }) - derive2Pubkey: Buffer - - @Column({ type: 'tinyint', unsigned: true }) - type: number - - @Column({ - name: 'created_at', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - createdAt: Date - - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - default: 0, - transformer: DecimalTransformer, - }) - balance: Decimal - - @Column({ - name: 'balance_date', - type: 'datetime', - default: () => 'CURRENT_TIMESTAMP()', - }) - balanceDate: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.account) - @JoinColumn({ name: 'account_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.signingAccount) - transactionRecipesSigning?: TransactionRecipe[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.recipientAccount) - transactionRecipesRecipient?: TransactionRecipe[] - - @OneToMany(() => ConfirmedTransaction, (transaction) => transaction.account) - confirmedTransactions?: ConfirmedTransaction[] -} diff --git a/dlt-database/entity/0002-refactor_add_community/AccountCommunity.ts b/dlt-database/entity/0002-refactor_add_community/AccountCommunity.ts deleted file mode 100644 index 80d6c15bf..000000000 --- a/dlt-database/entity/0002-refactor_add_community/AccountCommunity.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, BaseEntity } from 'typeorm' - -import { Account } from '../Account' -import { Community } from '../Community' - -@Entity('accounts_communities') -export class AccountCommunity extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @ManyToOne(() => Account, (account) => account.accountCommunities) - @JoinColumn({ name: 'account_id' }) - account: Account - - @Column({ name: 'account_id', type: 'int', unsigned: true }) - accountId: number - - @ManyToOne(() => Community, (community) => community.accountCommunities) - @JoinColumn({ name: 'community_id' }) - community: Community - - @Column({ name: 'community_id', type: 'int', unsigned: true }) - communityId: number - - @Column({ name: 'valid_from', type: 'datetime' }) - validFrom: Date - - @Column({ name: 'valid_to', type: 'datetime', nullable: true }) - validTo?: Date -} diff --git a/dlt-database/entity/0002-refactor_add_community/Community.ts b/dlt-database/entity/0002-refactor_add_community/Community.ts deleted file mode 100644 index 7136efa2e..000000000 --- a/dlt-database/entity/0002-refactor_add_community/Community.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - JoinColumn, - OneToOne, - OneToMany, - BaseEntity, -} from 'typeorm' -import { Account } from '../Account' -// TransactionRecipe was removed in newer migrations, so only the version from this folder can be linked -import { TransactionRecipe } from '../0001-init_db/TransactionRecipe' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('communities') -export class Community extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ name: 'iota_topic', collation: 'utf8mb4_unicode_ci' }) - iotaTopic: string - - @Column({ name: 'root_pubkey', type: 'binary', length: 32, unique: true, nullable: true }) - rootPubkey?: Buffer - - @Column({ name: 'root_privkey', type: 'binary', length: 64, nullable: true }) - rootPrivkey?: Buffer - - @Column({ name: 'root_chaincode', type: 'binary', length: 32, nullable: true }) - rootChaincode?: Buffer - - @Column({ type: 'tinyint', default: true }) - foreign: boolean - - @Column({ name: 'gmw_account_id', type: 'int', unsigned: true, nullable: true }) - gmwAccountId?: number - - @OneToOne(() => Account) - @JoinColumn({ name: 'gmw_account_id' }) - gmwAccount?: Account - - @Column({ name: 'auf_account_id', type: 'int', unsigned: true, nullable: true }) - aufAccountId?: number - - @OneToOne(() => Account) - @JoinColumn({ name: 'auf_account_id' }) - aufAccount?: Account - - @Column({ - name: 'created_at', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - createdAt: Date - - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.community) - @JoinColumn({ name: 'community_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.senderCommunity) - transactionRecipesSender?: TransactionRecipe[] - - @OneToMany(() => TransactionRecipe, (recipe) => recipe.recipientCommunity) - transactionRecipesRecipient?: TransactionRecipe[] -} diff --git a/dlt-database/entity/0002-refactor_add_community/ConfirmedTransaction.ts b/dlt-database/entity/0002-refactor_add_community/ConfirmedTransaction.ts deleted file mode 100644 index 1cdc591bf..000000000 --- a/dlt-database/entity/0002-refactor_add_community/ConfirmedTransaction.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - JoinColumn, - OneToOne, - BaseEntity, -} from 'typeorm' -import { Decimal } from 'decimal.js-light' - -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -// the relation in future account don't match which this any longer, so we can only link with the local account here -import { Account } from './Account' -// TransactionRecipe was removed in newer migrations, so only the version from this folder can be linked -import { TransactionRecipe } from '../0001-init_db/TransactionRecipe' - -@Entity('confirmed_transactions') -export class ConfirmedTransaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @OneToOne(() => TransactionRecipe, (recipe) => recipe.confirmedTransaction) - @JoinColumn({ name: 'transaction_recipe_id' }) - transactionRecipe: TransactionRecipe - - @Column({ name: 'transaction_recipe_id', type: 'int', unsigned: true }) - transactionRecipeId: number - - @Column({ type: 'bigint' }) - nr: number - - @Column({ type: 'binary', length: 48 }) - runningHash: Buffer - - @ManyToOne(() => Account, (account) => account.confirmedTransactions) - @JoinColumn({ name: 'account_id' }) - account: Account - - @Column({ name: 'account_id', type: 'int', unsigned: true }) - accountId: number - - @Column({ - name: 'account_balance', - type: 'decimal', - precision: 40, - scale: 20, - nullable: false, - default: 0, - transformer: DecimalTransformer, - }) - accountBalance: Decimal - - @Column({ name: 'iota_milestone', type: 'bigint' }) - iotaMilestone: number - - @Column({ name: 'confirmed_at', type: 'datetime' }) - confirmedAt: Date -} diff --git a/dlt-database/entity/0002-refactor_add_community/User.ts b/dlt-database/entity/0002-refactor_add_community/User.ts deleted file mode 100644 index 5387be058..000000000 --- a/dlt-database/entity/0002-refactor_add_community/User.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany, JoinColumn } from 'typeorm' - -import { Account } from '../Account' - -@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) -export class User extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ - name: 'gradido_id', - length: 36, - nullable: true, - collation: 'utf8mb4_unicode_ci', - }) - gradidoID?: string - - @Column({ name: 'derive1_pubkey', type: 'binary', length: 32, unique: true }) - derive1Pubkey: Buffer - - @Column({ - name: 'created_at', - type: 'datetime', - precision: 3, - default: () => 'CURRENT_TIMESTAMP(3)', - }) - createdAt: Date - - @Column({ - name: 'confirmed_at', - type: 'datetime', - nullable: true, - }) - confirmedAt?: Date - - @OneToMany(() => Account, (account) => account.user) - @JoinColumn({ name: 'user_id' }) - accounts?: Account[] -} diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/Account.ts b/dlt-database/entity/0003-refactor_transaction_recipe/Account.ts deleted file mode 100644 index 1c01094f1..000000000 --- a/dlt-database/entity/0003-refactor_transaction_recipe/Account.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - JoinColumn, - OneToMany, - BaseEntity, -} from 'typeorm' -import { User } from '../User' -import { Transaction } from '../Transaction' -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Decimal } from 'decimal.js-light' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('accounts') -export class Account extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @ManyToOne(() => User, (user) => user.accounts, { cascade: ['insert', 'update'], eager: true }) // Assuming you have a User entity with 'accounts' relation - @JoinColumn({ name: 'user_id' }) - user?: User - - // if user id is null, account belongs to community gmw or auf - @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: true }) - userId?: number - - @Column({ name: 'derivation_index', type: 'int', unsigned: true }) - derivationIndex: number - - @Column({ name: 'derive2_pubkey', type: 'binary', length: 32, unique: true }) - derive2Pubkey: Buffer - - @Column({ type: 'tinyint', unsigned: true }) - type: number - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @Column({ - name: 'balance_on_confirmation', - type: 'decimal', - precision: 40, - scale: 20, - default: 0, - transformer: DecimalTransformer, - }) - balanceOnConfirmation: Decimal - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ - name: 'balance_confirmed_at', - type: 'datetime', - nullable: true, - }) - balanceConfirmedAt: Date - - @Column({ - name: 'balance_on_creation', - type: 'decimal', - precision: 40, - scale: 20, - default: 0, - transformer: DecimalTransformer, - }) - balanceOnCreation: Decimal - - @Column({ - name: 'balance_created_at', - type: 'datetime', - precision: 3, - }) - balanceCreatedAt: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.account) - @JoinColumn({ name: 'account_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => Transaction, (transaction) => transaction.signingAccount) - transactionSigning?: Transaction[] - - @OneToMany(() => Transaction, (transaction) => transaction.recipientAccount) - transactionRecipient?: Transaction[] -} diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts b/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts deleted file mode 100644 index 77744a6d4..000000000 --- a/dlt-database/entity/0003-refactor_transaction_recipe/BackendTransaction.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, ManyToOne, JoinColumn } from 'typeorm' -import { Decimal } from 'decimal.js-light' - -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -// BackendTransaction was removed in newer migrations, so only the version from this folder can be linked -import { Transaction } from './Transaction' - -@Entity('backend_transactions') -export class BackendTransaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'backend_transaction_id', type: 'bigint', unsigned: true, unique: true }) - backendTransactionId: number - - @ManyToOne(() => Transaction, (transaction) => transaction.backendTransactions) - @JoinColumn({ name: 'transaction_id' }) - transaction: Transaction - - @Column({ name: 'transaction_id', type: 'bigint', unsigned: true }) - transactionId: number - - @Column({ name: 'type_id', unsigned: true, nullable: false }) - typeId: number - - // account balance based on creation date - @Column({ - name: 'balance', - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - balance?: Decimal - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @Column({ name: 'verifiedOnBackend', type: 'tinyint', default: false }) - verifiedOnBackend: boolean -} diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/Community.ts b/dlt-database/entity/0003-refactor_transaction_recipe/Community.ts deleted file mode 100644 index 1233d0832..000000000 --- a/dlt-database/entity/0003-refactor_transaction_recipe/Community.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - JoinColumn, - OneToOne, - OneToMany, - BaseEntity, -} from 'typeorm' -import { Account } from '../Account' -import { Transaction } from '../Transaction' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('communities') -export class Community extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ name: 'iota_topic', collation: 'utf8mb4_unicode_ci', unique: true }) - iotaTopic: string - - @Column({ name: 'root_pubkey', type: 'binary', length: 32, unique: true, nullable: true }) - rootPubkey?: Buffer - - @Column({ name: 'root_privkey', type: 'binary', length: 64, nullable: true }) - rootPrivkey?: Buffer - - @Column({ name: 'root_chaincode', type: 'binary', length: 32, nullable: true }) - rootChaincode?: Buffer - - @Column({ type: 'tinyint', default: true }) - foreign: boolean - - @Column({ name: 'gmw_account_id', type: 'int', unsigned: true, nullable: true }) - gmwAccountId?: number - - @OneToOne(() => Account, { cascade: true }) - @JoinColumn({ name: 'gmw_account_id' }) - gmwAccount?: Account - - @Column({ name: 'auf_account_id', type: 'int', unsigned: true, nullable: true }) - aufAccountId?: number - - @OneToOne(() => Account, { cascade: true }) - @JoinColumn({ name: 'auf_account_id' }) - aufAccount?: Account - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.community) - @JoinColumn({ name: 'community_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => Transaction, (transaction) => transaction.community) - transactions?: Transaction[] - - @OneToMany(() => Transaction, (transaction) => transaction.otherCommunity) - friendCommunitiesTransactions?: Transaction[] -} diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/InvalidTransaction.ts b/dlt-database/entity/0003-refactor_transaction_recipe/InvalidTransaction.ts deleted file mode 100644 index a34823dbd..000000000 --- a/dlt-database/entity/0003-refactor_transaction_recipe/InvalidTransaction.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from 'typeorm' - -@Entity('invalid_transactions') -export class InvalidTransaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'iota_message_id', type: 'binary', length: 32, unique: true }) - iotaMessageId: Buffer - - @Column({ name: 'error_message', type: 'varchar', length: 255 }) - errorMessage: string -} diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts b/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts deleted file mode 100644 index b520b27f8..000000000 --- a/dlt-database/entity/0003-refactor_transaction_recipe/Transaction.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - OneToOne, - JoinColumn, - BaseEntity, - OneToMany, -} from 'typeorm' -import { Decimal } from 'decimal.js-light' - -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Account } from '../Account' -import { Community } from '../Community' -// BackendTransaction was removed in newer migrations, so only the version from this folder can be linked -import { BackendTransaction } from './BackendTransaction' - -@Entity('transactions') -export class Transaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'iota_message_id', type: 'binary', length: 32, nullable: true }) - iotaMessageId?: Buffer - - @OneToOne(() => Transaction, { cascade: ['update'] }) - // eslint-disable-next-line no-use-before-define - paringTransaction?: Transaction - - @Column({ name: 'paring_transaction_id', type: 'bigint', unsigned: true, nullable: true }) - paringTransactionId?: number - - // if transaction has a sender than it is also the sender account - @ManyToOne(() => Account, (account) => account.transactionSigning) - @JoinColumn({ name: 'signing_account_id' }) - signingAccount?: Account - - @Column({ name: 'signing_account_id', type: 'int', unsigned: true, nullable: true }) - signingAccountId?: number - - @ManyToOne(() => Account, (account) => account.transactionRecipient) - @JoinColumn({ name: 'recipient_account_id' }) - recipientAccount?: Account - - @Column({ name: 'recipient_account_id', type: 'int', unsigned: true, nullable: true }) - recipientAccountId?: number - - @ManyToOne(() => Community, (community) => community.transactions, { - eager: true, - }) - @JoinColumn({ name: 'community_id' }) - community: Community - - @Column({ name: 'community_id', type: 'int', unsigned: true }) - communityId: number - - @ManyToOne(() => Community, (community) => community.friendCommunitiesTransactions) - @JoinColumn({ name: 'other_community_id' }) - otherCommunity?: Community - - @Column({ name: 'other_community_id', type: 'int', unsigned: true, nullable: true }) - otherCommunityId?: number - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - amount?: Decimal - - // account balance for sender based on creation date - @Column({ - name: 'account_balance_on_creation', - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - accountBalanceOnCreation?: Decimal - - @Column({ type: 'tinyint' }) - type: number - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - @Column({ name: 'body_bytes', type: 'blob' }) - bodyBytes: Buffer - - @Column({ type: 'binary', length: 64, unique: true }) - signature: Buffer - - @Column({ name: 'protocol_version', type: 'varchar', length: 255, default: '1' }) - protocolVersion: string - - @Column({ type: 'bigint', nullable: true }) - nr?: number - - @Column({ name: 'running_hash', type: 'binary', length: 48, nullable: true }) - runningHash?: Buffer - - // account balance for sender based on confirmation date (iota milestone) - @Column({ - name: 'account_balance_on_confirmation', - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - accountBalanceOnConfirmation?: Decimal - - @Column({ name: 'iota_milestone', type: 'bigint', nullable: true }) - iotaMilestone?: number - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @OneToMany(() => BackendTransaction, (backendTransaction) => backendTransaction.transaction, { - cascade: ['insert', 'update'], - }) - @JoinColumn({ name: 'transaction_id' }) - backendTransactions: BackendTransaction[] -} diff --git a/dlt-database/entity/0003-refactor_transaction_recipe/User.ts b/dlt-database/entity/0003-refactor_transaction_recipe/User.ts deleted file mode 100644 index fdfeb9830..000000000 --- a/dlt-database/entity/0003-refactor_transaction_recipe/User.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany, JoinColumn } from 'typeorm' - -import { Account } from '../Account' - -@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) -export class User extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ - name: 'gradido_id', - length: 36, - nullable: true, - collation: 'utf8mb4_unicode_ci', - }) - gradidoID?: string - - @Column({ name: 'derive1_pubkey', type: 'binary', length: 32, unique: true }) - derive1Pubkey: Buffer - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ - name: 'confirmed_at', - type: 'datetime', - nullable: true, - }) - confirmedAt?: Date - - @OneToMany(() => Account, (account) => account.user) - @JoinColumn({ name: 'user_id' }) - accounts?: Account[] -} diff --git a/dlt-database/entity/0004-fix_spelling/Transaction.ts b/dlt-database/entity/0004-fix_spelling/Transaction.ts deleted file mode 100644 index f3f4427f7..000000000 --- a/dlt-database/entity/0004-fix_spelling/Transaction.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - OneToOne, - JoinColumn, - BaseEntity, - OneToMany, -} from 'typeorm' -import { Decimal } from 'decimal.js-light' - -import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' -import { Account } from '../Account' -import { Community } from '../Community' -// BackendTransaction was removed in newer migrations, so only the version from this folder can be linked -import { BackendTransaction } from '../0003-refactor_transaction_recipe/BackendTransaction' - -@Entity('transactions') -export class Transaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'iota_message_id', type: 'binary', length: 32, nullable: true }) - iotaMessageId?: Buffer - - @OneToOne(() => Transaction, { cascade: ['update'] }) - // eslint-disable-next-line no-use-before-define - pairingTransaction?: Transaction - - @Column({ name: 'pairing_transaction_id', type: 'bigint', unsigned: true, nullable: true }) - pairingTransactionId?: number - - // if transaction has a sender than it is also the sender account - @ManyToOne(() => Account, (account) => account.transactionSigning) - @JoinColumn({ name: 'signing_account_id' }) - signingAccount?: Account - - @Column({ name: 'signing_account_id', type: 'int', unsigned: true, nullable: true }) - signingAccountId?: number - - @ManyToOne(() => Account, (account) => account.transactionRecipient) - @JoinColumn({ name: 'recipient_account_id' }) - recipientAccount?: Account - - @Column({ name: 'recipient_account_id', type: 'int', unsigned: true, nullable: true }) - recipientAccountId?: number - - @ManyToOne(() => Community, (community) => community.transactions, { - eager: true, - }) - @JoinColumn({ name: 'community_id' }) - community: Community - - @Column({ name: 'community_id', type: 'int', unsigned: true }) - communityId: number - - @ManyToOne(() => Community, (community) => community.friendCommunitiesTransactions) - @JoinColumn({ name: 'other_community_id' }) - otherCommunity?: Community - - @Column({ name: 'other_community_id', type: 'int', unsigned: true, nullable: true }) - otherCommunityId?: number - - @Column({ - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - amount?: Decimal - - // account balance for sender based on creation date - @Column({ - name: 'account_balance_on_creation', - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - accountBalanceOnCreation?: Decimal - - @Column({ type: 'tinyint' }) - type: number - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - @Column({ name: 'body_bytes', type: 'blob' }) - bodyBytes: Buffer - - @Column({ type: 'binary', length: 64, unique: true }) - signature: Buffer - - @Column({ name: 'protocol_version', type: 'varchar', length: 255, default: '1' }) - protocolVersion: string - - @Column({ type: 'bigint', nullable: true }) - nr?: number - - @Column({ name: 'running_hash', type: 'binary', length: 48, nullable: true }) - runningHash?: Buffer - - // account balance for sender based on confirmation date (iota milestone) - @Column({ - name: 'account_balance_on_confirmation', - type: 'decimal', - precision: 40, - scale: 20, - nullable: true, - transformer: DecimalTransformer, - }) - accountBalanceOnConfirmation?: Decimal - - @Column({ name: 'iota_milestone', type: 'bigint', nullable: true }) - iotaMilestone?: number - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @OneToMany(() => BackendTransaction, (backendTransaction) => backendTransaction.transaction, { - cascade: ['insert', 'update'], - }) - @JoinColumn({ name: 'transaction_id' }) - backendTransactions: BackendTransaction[] -} diff --git a/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts b/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts deleted file mode 100644 index f19790ff1..000000000 --- a/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Community.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - JoinColumn, - OneToOne, - OneToMany, - BaseEntity, -} from 'typeorm' -import { Account } from '../Account' -import { Transaction } from '../Transaction' -import { AccountCommunity } from '../AccountCommunity' - -@Entity('communities') -export class Community extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true }) - id: number - - @Column({ name: 'iota_topic', collation: 'utf8mb4_unicode_ci', unique: true }) - iotaTopic: string - - @Column({ name: 'root_pubkey', type: 'binary', length: 32, unique: true, nullable: true }) - rootPubkey?: Buffer - - @Column({ name: 'root_privkey', type: 'binary', length: 80, nullable: true }) - rootEncryptedPrivkey?: Buffer - - @Column({ name: 'root_chaincode', type: 'binary', length: 32, nullable: true }) - rootChaincode?: Buffer - - @Column({ type: 'tinyint', default: true }) - foreign: boolean - - @Column({ name: 'gmw_account_id', type: 'int', unsigned: true, nullable: true }) - gmwAccountId?: number - - @OneToOne(() => Account, { cascade: true }) - @JoinColumn({ name: 'gmw_account_id' }) - gmwAccount?: Account - - @Column({ name: 'auf_account_id', type: 'int', unsigned: true, nullable: true }) - aufAccountId?: number - - @OneToOne(() => Account, { cascade: true }) - @JoinColumn({ name: 'auf_account_id' }) - aufAccount?: Account - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date - - @OneToMany(() => AccountCommunity, (accountCommunity) => accountCommunity.community) - @JoinColumn({ name: 'community_id' }) - accountCommunities: AccountCommunity[] - - @OneToMany(() => Transaction, (transaction) => transaction.community) - transactions?: Transaction[] - - @OneToMany(() => Transaction, (transaction) => transaction.otherCommunity) - friendCommunitiesTransactions?: Transaction[] -} diff --git a/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts b/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts deleted file mode 100644 index eae5a6405..000000000 --- a/dlt-database/entity/0005-refactor_with_gradido_blockchain_lib/Transaction.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { - Entity, - PrimaryGeneratedColumn, - Column, - ManyToOne, - OneToOne, - JoinColumn, - BaseEntity, -} from 'typeorm' - -import { Account } from '../Account' -import { Community } from '../Community' - -@Entity('transactions') -export class Transaction extends BaseEntity { - @PrimaryGeneratedColumn('increment', { unsigned: true, type: 'bigint' }) - id: number - - @Column({ name: 'iota_message_id', type: 'binary', length: 32, nullable: true }) - iotaMessageId?: Buffer - - @OneToOne(() => Transaction, { cascade: ['update'] }) - // eslint-disable-next-line no-use-before-define - pairingTransaction?: Transaction - - @Column({ name: 'pairing_transaction_id', type: 'bigint', unsigned: true, nullable: true }) - pairingTransactionId?: number - - // if transaction has a sender than it is also the sender account - @ManyToOne(() => Account, (account) => account.transactionSigning) - @JoinColumn({ name: 'signing_account_id' }) - signingAccount?: Account - - @Column({ name: 'signing_account_id', type: 'int', unsigned: true, nullable: true }) - signingAccountId?: number - - @ManyToOne(() => Account, (account) => account.transactionRecipient) - @JoinColumn({ name: 'recipient_account_id' }) - recipientAccount?: Account - - @Column({ name: 'recipient_account_id', type: 'int', unsigned: true, nullable: true }) - recipientAccountId?: number - - @ManyToOne(() => Community, (community) => community.transactions, { - eager: true, - }) - @JoinColumn({ name: 'community_id' }) - community: Community - - @Column({ name: 'community_id', type: 'int', unsigned: true }) - communityId: number - - @ManyToOne(() => Community, (community) => community.friendCommunitiesTransactions) - @JoinColumn({ name: 'other_community_id' }) - otherCommunity?: Community - - @Column({ name: 'other_community_id', type: 'int', unsigned: true, nullable: true }) - otherCommunityId?: number - - @Column({ - type: 'bigint', - nullable: true, - }) - amount?: number - - // account balance for sender based on creation date - @Column({ - name: 'account_balance_on_creation', - type: 'bigint', - nullable: true, - }) - accountBalanceOnCreation?: number - - @Column({ type: 'tinyint' }) - type: number - - @Column({ name: 'created_at', type: 'datetime', precision: 3 }) - createdAt: Date - - @Column({ name: 'body_bytes', type: 'blob' }) - bodyBytes: Buffer - - @Column({ type: 'binary', length: 64, unique: true }) - signature: Buffer - - @Column({ name: 'protocol_version', type: 'varchar', length: 255, default: '1' }) - protocolVersion: string - - @Column({ type: 'bigint', nullable: true }) - nr?: number - - @Column({ name: 'running_hash', type: 'binary', length: 48, nullable: true }) - runningHash?: Buffer - - // account balance for sender based on confirmation date (iota milestone) - @Column({ - name: 'account_balance_on_confirmation', - type: 'bigint', - nullable: true, - }) - accountBalanceOnConfirmation?: number - - @Column({ name: 'iota_milestone', type: 'bigint', nullable: true }) - iotaMilestone?: number - - // use timestamp from iota milestone which is only in seconds precision, so no need to use 3 Bytes extra here - @Column({ name: 'confirmed_at', type: 'datetime', nullable: true }) - confirmedAt?: Date -} diff --git a/dlt-database/entity/Account.ts b/dlt-database/entity/Account.ts deleted file mode 100644 index 3d7713ba9..000000000 --- a/dlt-database/entity/Account.ts +++ /dev/null @@ -1 +0,0 @@ -export { Account } from './0003-refactor_transaction_recipe/Account' diff --git a/dlt-database/entity/AccountCommunity.ts b/dlt-database/entity/AccountCommunity.ts deleted file mode 100644 index 985e7bfb9..000000000 --- a/dlt-database/entity/AccountCommunity.ts +++ /dev/null @@ -1 +0,0 @@ -export { AccountCommunity } from './0002-refactor_add_community/AccountCommunity' diff --git a/dlt-database/entity/Community.ts b/dlt-database/entity/Community.ts deleted file mode 100644 index e31bb1e5a..000000000 --- a/dlt-database/entity/Community.ts +++ /dev/null @@ -1 +0,0 @@ -export { Community } from './0005-refactor_with_gradido_blockchain_lib/Community' diff --git a/dlt-database/entity/InvalidTransaction.ts b/dlt-database/entity/InvalidTransaction.ts deleted file mode 100644 index 166b13adf..000000000 --- a/dlt-database/entity/InvalidTransaction.ts +++ /dev/null @@ -1 +0,0 @@ -export { InvalidTransaction } from './0003-refactor_transaction_recipe/InvalidTransaction' diff --git a/dlt-database/entity/Migration.ts b/dlt-database/entity/Migration.ts deleted file mode 100644 index 9f1e743d0..000000000 --- a/dlt-database/entity/Migration.ts +++ /dev/null @@ -1 +0,0 @@ -export { Migration } from './0001-init_db/Migration' diff --git a/dlt-database/entity/Transaction.ts b/dlt-database/entity/Transaction.ts deleted file mode 100644 index 4c22b275f..000000000 --- a/dlt-database/entity/Transaction.ts +++ /dev/null @@ -1 +0,0 @@ -export { Transaction } from './0005-refactor_with_gradido_blockchain_lib/Transaction' diff --git a/dlt-database/entity/User.ts b/dlt-database/entity/User.ts deleted file mode 100644 index 4f1b039ff..000000000 --- a/dlt-database/entity/User.ts +++ /dev/null @@ -1 +0,0 @@ -export { User } from './0003-refactor_transaction_recipe/User' diff --git a/dlt-database/entity/index.ts b/dlt-database/entity/index.ts deleted file mode 100644 index ba7ea2663..000000000 --- a/dlt-database/entity/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Account } from './Account' -import { AccountCommunity } from './AccountCommunity' -import { Community } from './Community' -import { InvalidTransaction } from './InvalidTransaction' -import { Migration } from './Migration' -import { Transaction } from './Transaction' -import { User } from './User' - -export const entities = [ - AccountCommunity, - Account, - Community, - InvalidTransaction, - Migration, - Transaction, - User, -] diff --git a/dlt-database/log/.gitignore b/dlt-database/log/.gitignore deleted file mode 100644 index c96a04f00..000000000 --- a/dlt-database/log/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore \ No newline at end of file diff --git a/dlt-database/migrations/0001-init_db.ts b/dlt-database/migrations/0001-init_db.ts deleted file mode 100644 index 8188a889d..000000000 --- a/dlt-database/migrations/0001-init_db.ts +++ /dev/null @@ -1,130 +0,0 @@ -/* FIRST MIGRATION - * - * This migration is special since it takes into account that - * the database can be setup already but also may not be. - * Therefore you will find all `CREATE TABLE` statements with - * a `IF NOT EXISTS`, all `INSERT` with an `IGNORE` and in the - * downgrade function all `DROP TABLE` with a `IF EXISTS`. - * This ensures compatibility for existing or non-existing - * databases. - */ - -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write upgrade logic as parameter of queryFn - await queryFn(` - CREATE TABLE IF NOT EXISTS \`users\` ( - \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, - \`gradido_id\` char(36) DEFAULT NULL, - \`derive1_pubkey\` binary(32) NOT NULL, - \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - \`confirmed_at\` datetime(3) DEFAULT NULL, - PRIMARY KEY (\`id\`), - INDEX \`gradido_id\` (\`gradido_id\`), - UNIQUE KEY \`derive1_pubkey\` (\`derive1_pubkey\`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`accounts\` ( - \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, - \`user_id\` int(10) unsigned DEFAULT NULL, - \`derivation_index\` int(10) unsigned NOT NULL, - \`derive2_pubkey\` binary(32) NOT NULL, - \`type\` tinyint unsigned NOT NULL, - \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - \`confirmed_at\` datetime(3) DEFAULT NULL, - \`balance\` decimal(40,20) NOT NULL DEFAULT 0, - \`balance_date\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (\`id\`), - UNIQUE KEY \`derive2_pubkey\` (\`derive2_pubkey\`), - FOREIGN KEY (\`user_id\`) REFERENCES users(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - `) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`communities\` ( - \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, - \`iota_topic\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - \`root_pubkey\` binary(32) NOT NULL, - \`root_privkey\` binary(32) DEFAULT NULL, - \`root_chaincode\` binary(32) DEFAULT NULL, - \`foreign\` tinyint(4) NOT NULL DEFAULT true, - \`gmw_account_id\` int(10) unsigned DEFAULT NULL, - \`auf_account_id\` int(10) unsigned DEFAULT NULL, - \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - \`confirmed_at\` datetime(3) DEFAULT NULL, - PRIMARY KEY (\`id\`), - UNIQUE KEY \`root_pubkey\` (\`root_pubkey\`), - FOREIGN KEY (\`gmw_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`auf_account_id\`) REFERENCES accounts(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`accounts_communities\` ( - \`id\` int(10) unsigned NOT NULL AUTO_INCREMENT, - \`account_id\` int(10) unsigned NOT NULL, - \`community_id\` int(10) unsigned NOT NULL, - \`valid_from\` datetime(3) NOT NULL, - \`valid_to\` datetime(3) DEFAULT NULL, - PRIMARY KEY (\`id\`), - FOREIGN KEY (\`account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`community_id\`) REFERENCES communities(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`transaction_recipes\` ( - \`id\` bigint unsigned NOT NULL AUTO_INCREMENT, - \`iota_message_id\` binary(32) DEFAULT NULL, - \`signing_account_id\` int(10) unsigned NOT NULL, - \`recipient_account_id\` int(10) unsigned DEFAULT NULL, - \`sender_community_id\` int(10) unsigned NOT NULL, - \`recipient_community_id\` int(10) unsigned DEFAULT NULL, - \`amount\` decimal(40,20) DEFAULT NULL, - \`type\` tinyint unsigned NOT NULL, - \`created_at\` datetime(3) NOT NULL, - \`body_bytes\` BLOB NOT NULL, - \`signature\` binary(64) NOT NULL, - \`protocol_version\` int(10) NOT NULL DEFAULT 1, - PRIMARY KEY (\`id\`), - FOREIGN KEY (\`signing_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`recipient_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`sender_community_id\`) REFERENCES communities(id), - FOREIGN KEY (\`recipient_community_id\`) REFERENCES communities(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`confirmed_transactions\` ( - \`id\` bigint unsigned NOT NULL AUTO_INCREMENT, - \`transaction_recipe_id\` bigint unsigned NOT NULL, - \`nr\` bigint unsigned NOT NULL, - \`running_hash\` binary(48) NOT NULL, - \`account_id\` int(10) unsigned NOT NULL, - \`account_balance\` decimal(40,20) NOT NULL DEFAULT 0, - \`iota_milestone\` bigint NOT NULL, - \`confirmed_at\` datetime(3) NOT NULL, - PRIMARY KEY (\`id\`), - FOREIGN KEY (\`transaction_recipe_id\`) REFERENCES transaction_recipes(id), - FOREIGN KEY (\`account_id\`) REFERENCES accounts(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`invalid_transactions\` ( - \`id\` bigint unsigned NOT NULL AUTO_INCREMENT, - \`iota_message_id\` binary(32) NOT NULL, - PRIMARY KEY (\`id\`), - INDEX (\`iota_message_id\`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) -} - -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write downgrade logic as parameter of queryFn - await queryFn(`DROP TABLE IF EXISTS \`users\`;`) - await queryFn(`DROP TABLE IF EXISTS \`accounts\`;`) - await queryFn(`DROP TABLE IF EXISTS \`accounts_communities\`;`) - await queryFn(`DROP TABLE IF EXISTS \`transaction_recipes\`;`) - await queryFn(`DROP TABLE IF EXISTS \`confirmed_transactions\`;`) - await queryFn(`DROP TABLE IF EXISTS \`communities\`;`) - await queryFn(`DROP TABLE IF EXISTS \`invalid_transactions\`;`) -} diff --git a/dlt-database/migrations/0002-refactor_add_community.ts b/dlt-database/migrations/0002-refactor_add_community.ts deleted file mode 100644 index 725954ea0..000000000 --- a/dlt-database/migrations/0002-refactor_add_community.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write upgrade logic as parameter of queryFn - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`root_privkey\` binary(64) NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`root_pubkey\` binary(32) NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`root_chaincode\` binary(32) NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`confirmed_at\` datetime NULL DEFAULT NULL;`, - ) - await queryFn(`ALTER TABLE \`users\` MODIFY COLUMN \`confirmed_at\` datetime NULL DEFAULT NULL;`) - await queryFn( - `ALTER TABLE \`accounts\` MODIFY COLUMN \`confirmed_at\` datetime NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`accounts\` MODIFY COLUMN \`balance_date\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;`, - ) - await queryFn( - `ALTER TABLE \`accounts_communities\` MODIFY COLUMN \`valid_from\` datetime NOT NULL;`, - ) - await queryFn( - `ALTER TABLE \`accounts_communities\` MODIFY COLUMN \`valid_to\` datetime NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`confirmed_transactions\` MODIFY COLUMN \`confirmed_at\` datetime NOT NULL;`, - ) -} - -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`root_privkey\` binary(32) DEFAULT NULL;`, - ) - await queryFn(`ALTER TABLE \`communities\` MODIFY COLUMN \`root_pubkey\` binary(32) NOT NULL;`) - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`root_chaincode\` binary(32) DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`communities\` MODIFY COLUMN \`confirmed_at\` datetime(3) DEFAULT NULL;`, - ) - await queryFn(`ALTER TABLE \`users\` MODIFY COLUMN \`confirmed_at\` datetime(3) DEFAULT NULL;`) - await queryFn(`ALTER TABLE \`accounts\` MODIFY COLUMN \`confirmed_at\` datetime(3) DEFAULT NULL;`) - await queryFn( - `ALTER TABLE \`accounts\` MODIFY COLUMN \`balance_date\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3);`, - ) - await queryFn( - `ALTER TABLE \`accounts_communities\` MODIFY COLUMN \`valid_from\` datetime(3) NOT NULL;`, - ) - await queryFn( - `ALTER TABLE \`accounts_communities\` MODIFY COLUMN \`valid_to\` datetime(3) DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`confirmed_transactions\` MODIFY COLUMN \`confirmed_at\` datetime(3) NOT NULL;`, - ) -} diff --git a/dlt-database/migrations/0003-refactor_transaction_recipe.ts b/dlt-database/migrations/0003-refactor_transaction_recipe.ts deleted file mode 100644 index 0c022cc42..000000000 --- a/dlt-database/migrations/0003-refactor_transaction_recipe.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write upgrade logic as parameter of queryFn - await queryFn(`DROP TABLE \`confirmed_transactions\`;`) - await queryFn(`DROP TABLE \`transaction_recipes\`;`) - - await queryFn(` - ALTER TABLE \`accounts\` - RENAME COLUMN \`balance\` TO \`balance_on_confirmation\`, - RENAME COLUMN \`balance_date\` TO \`balance_confirmed_at\` - ; - `) - - await queryFn( - `ALTER TABLE \`accounts\` ADD COLUMN \`balance_on_creation\` decimal(40,20) NOT NULL DEFAULT 0 AFTER \`balance_confirmed_at\`;`, - ) - await queryFn( - `ALTER TABLE \`accounts\` ADD COLUMN \`balance_created_at\` datetime(3) NOT NULL AFTER \`balance_on_creation\`;`, - ) - await queryFn( - `ALTER TABLE \`accounts\` MODIFY COLUMN \`balance_confirmed_at\` datetime NULL DEFAULT NULL;`, - ) - - await queryFn( - `ALTER TABLE \`invalid_transactions\` ADD COLUMN \`error_message\` varchar(255) NOT NULL;`, - ) - - await queryFn(`ALTER TABLE \`invalid_transactions\` DROP INDEX \`iota_message_id\`;`) - await queryFn(`ALTER TABLE \`invalid_transactions\` ADD UNIQUE(\`iota_message_id\`);`) - - await queryFn( - `CREATE TABLE \`transactions\` ( - \`id\` bigint unsigned NOT NULL AUTO_INCREMENT, - \`iota_message_id\` varbinary(32) NULL DEFAULT NULL, - \`paring_transaction_id\` bigint unsigned NULL DEFAULT NULL, - \`signing_account_id\` int unsigned NULL DEFAULT NULL, - \`recipient_account_id\` int unsigned NULL DEFAULT NULL, - \`community_id\` int unsigned NOT NULL, - \`other_community_id\` int unsigned NULL DEFAULT NULL, - \`amount\` decimal(40, 20) NULL DEFAULT NULL, - \`account_balance_on_creation\` decimal(40, 20) NULL DEFAULT 0.00000000000000000000, - \`type\` tinyint NOT NULL, - \`created_at\` datetime(3) NOT NULL, - \`body_bytes\` blob NOT NULL, - \`signature\` varbinary(64) NOT NULL, - \`protocol_version\` varchar(255) NOT NULL DEFAULT '1', - \`nr\` bigint NULL DEFAULT NULL, - \`running_hash\` varbinary(48) NULL DEFAULT NULL, - \`account_balance_on_confirmation\` decimal(40, 20) NULL DEFAULT 0.00000000000000000000, - \`iota_milestone\` bigint NULL DEFAULT NULL, - \`confirmed_at\` datetime NULL DEFAULT NULL, - PRIMARY KEY (\`id\`), - UNIQUE KEY \`signature\` (\`signature\`), - FOREIGN KEY (\`signing_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`recipient_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`community_id\`) REFERENCES communities(id), - FOREIGN KEY (\`other_community_id\`) REFERENCES communities(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - `, - ) - - await queryFn( - `CREATE TABLE \`backend_transactions\` ( - \`id\` BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, - \`backend_transaction_id\` BIGINT UNSIGNED NOT NULL, - \`transaction_id\` BIGINT UNSIGNED NOT NULL, - \`type_id\` INT UNSIGNED NOT NULL, - \`balance\` DECIMAL(40, 20) NULL DEFAULT NULL, - \`created_at\` DATETIME(3) NOT NULL, - \`confirmed_at\` DATETIME NULL DEFAULT NULL, - \`verifiedOnBackend\` TINYINT NOT NULL DEFAULT 0, - PRIMARY KEY (\`id\`), - UNIQUE (\`backend_transaction_id\`), - FOREIGN KEY (\`transaction_id\`) REFERENCES transactions(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - `, - ) - - await queryFn(`ALTER TABLE \`communities\` ADD UNIQUE(\`iota_topic\`);`) - - await queryFn(`ALTER TABLE \`users\` CHANGE \`created_at\` \`created_at\` DATETIME(3) NOT NULL;`) - await queryFn( - `ALTER TABLE \`communities\` CHANGE \`created_at\` \`created_at\` DATETIME(3) NOT NULL;`, - ) - await queryFn( - `ALTER TABLE \`accounts\` CHANGE \`created_at\` \`created_at\` DATETIME(3) NOT NULL;`, - ) -} - -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn(` - CREATE TABLE IF NOT EXISTS \`transaction_recipes\` ( - \`id\` bigint unsigned NOT NULL AUTO_INCREMENT, - \`iota_message_id\` binary(32) DEFAULT NULL, - \`signing_account_id\` int(10) unsigned NOT NULL, - \`recipient_account_id\` int(10) unsigned DEFAULT NULL, - \`sender_community_id\` int(10) unsigned NOT NULL, - \`recipient_community_id\` int(10) unsigned DEFAULT NULL, - \`amount\` decimal(40,20) DEFAULT NULL, - \`type\` tinyint unsigned NOT NULL, - \`created_at\` datetime(3) NOT NULL, - \`body_bytes\` BLOB NOT NULL, - \`signature\` binary(64) NOT NULL, - \`protocol_version\` int(10) NOT NULL DEFAULT 1, - PRIMARY KEY (\`id\`), - FOREIGN KEY (\`signing_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`recipient_account_id\`) REFERENCES accounts(id), - FOREIGN KEY (\`sender_community_id\`) REFERENCES communities(id), - FOREIGN KEY (\`recipient_community_id\`) REFERENCES communities(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) - - await queryFn(` - CREATE TABLE IF NOT EXISTS \`confirmed_transactions\` ( - \`id\` bigint unsigned NOT NULL AUTO_INCREMENT, - \`transaction_recipe_id\` bigint unsigned NOT NULL, - \`nr\` bigint unsigned NOT NULL, - \`running_hash\` binary(48) NOT NULL, - \`account_id\` int(10) unsigned NOT NULL, - \`account_balance\` decimal(40,20) NOT NULL DEFAULT 0, - \`iota_milestone\` bigint NOT NULL, - \`confirmed_at\` datetime NOT NULL, - PRIMARY KEY (\`id\`), - FOREIGN KEY (\`transaction_recipe_id\`) REFERENCES transaction_recipes(id), - FOREIGN KEY (\`account_id\`) REFERENCES accounts(id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;`) - - await queryFn( - `ALTER TABLE \`accounts\` MODIFY COLUMN \`balance_confirmed_at_date\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3);`, - ) - await queryFn(` - ALTER TABLE \`accounts\` - RENAME COLUMN \`balance_on_confirmation\` TO \`balance\`, - RENAME COLUMN \`balance_confirmed_at\` TO \`balance_date\` - ; - `) - - await queryFn(`ALTER TABLE \`accounts\` DROP COLUMN \`balance_on_creation\`;`) - await queryFn(`ALTER TABLE \`accounts\` DROP COLUMN \`balance_created_at\`;`) - await queryFn(`ALTER TABLE \`invalid_transactions\` DROP COLUMN \`error_message\`;`) - await queryFn(`ALTER TABLE \`invalid_transactions\` DROP INDEX \`iota_message_id\`;`) - await queryFn(`ALTER TABLE \`invalid_transactions\` ADD INDEX(\`iota_message_id\`); `) - await queryFn(`DROP TABLE \`transactions\`;`) - await queryFn(`DROP TABLE \`backend_transactions\`;`) - - await queryFn( - `ALTER TABLE \`users\` CHANGE \`created_at\` \`created_at\` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3);`, - ) - await queryFn( - `ALTER TABLE \`communities\` CHANGE \`created_at\` \`created_at\` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3);`, - ) - await queryFn( - `ALTER TABLE \`accounts\` CHANGE \`created_at\` \`created_at\` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3);`, - ) -} diff --git a/dlt-database/migrations/0004-fix_spelling.ts b/dlt-database/migrations/0004-fix_spelling.ts deleted file mode 100644 index 1507ab590..000000000 --- a/dlt-database/migrations/0004-fix_spelling.ts +++ /dev/null @@ -1,15 +0,0 @@ -export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn(` - ALTER TABLE \`transactions\` - RENAME COLUMN \`paring_transaction_id\` TO \`pairing_transaction_id\` - ; - `) -} - -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn(` - ALTER TABLE \`transactions\` - RENAME COLUMN \`pairing_transaction_id\` TO \`paring_transaction_id\` - ; - `) -} diff --git a/dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts b/dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts deleted file mode 100644 index 453c131ba..000000000 --- a/dlt-database/migrations/0005-refactor_with_gradido_blockchain_lib.ts +++ /dev/null @@ -1,28 +0,0 @@ -export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn( - `ALTER TABLE \`communities\` CHANGE COLUMN \`root_privkey\` \`root_encrypted_privkey\` binary(80) NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_confirmation\` int NULL DEFAULT 0;`, - ) - await queryFn( - `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_creation\` int NULL DEFAULT 0;`, - ) - await queryFn(`ALTER TABLE \`transactions\` MODIFY COLUMN \`amount\` int NULL DEFAULT 0;`) - await queryFn(`DROP TABLE \`backend_transactions\`;`) -} - -export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn( - `ALTER TABLE \`communities\` CHANGE COLUMN \`root_encrypted_privkey\` \`root_privkey\` binary(64) NULL DEFAULT NULL;`, - ) - await queryFn( - `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_confirmation\` decimal(40, 20) NULL DEFAULT 0.00000000000000000000;`, - ) - await queryFn( - `ALTER TABLE \`transactions\` MODIFY COLUMN \`account_balance_on_creation\` decimal(40, 20) NULL DEFAULT 0.00000000000000000000;`, - ) - await queryFn( - `ALTER TABLE \`transactions\` MODIFY COLUMN \`amount\` decimal(40, 20) NULL DEFAULT NULL;`, - ) -} diff --git a/dlt-database/package.json b/dlt-database/package.json deleted file mode 100644 index f60587dad..000000000 --- a/dlt-database/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "gradido-database", - "version": "1.23.2", - "description": "Gradido Database Tool to execute database migrations", - "main": "src/index.ts", - "repository": "https://github.com/gradido/gradido/database", - "author": "Ulf Gebhardt", - "license": "Apache-2.0", - "private": false, - "scripts": { - "build": "tsc --build", - "clean": "tsc --build --clean", - "up": "cross-env TZ=UTC node build/src/index.js up", - "down": "cross-env TZ=UTC node build/src/index.js down", - "reset": "cross-env TZ=UTC node build/src/index.js reset", - "dev_up": "cross-env TZ=UTC ts-node src/index.ts up", - "dev_down": "cross-env TZ=UTC ts-node src/index.ts down", - "dev_reset": "cross-env TZ=UTC ts-node src/index.ts reset", - "lint": "eslint --max-warnings=0 --ext .js,.ts ." - }, - "devDependencies": { - "@eslint-community/eslint-plugin-eslint-comments": "^3.2.1", - "@types/faker": "^5.5.9", - "@types/node": "^16.10.3", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", - "eslint": "^8.37.0", - "eslint-config-prettier": "^8.8.0", - "eslint-config-standard": "^17.0.0", - "eslint-import-resolver-typescript": "^3.5.4", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-security": "^1.7.1", - "prettier": "^2.8.7", - "ts-node": "^10.2.1", - "typescript": "^4.3.5" - }, - "dependencies": { - "@types/uuid": "^8.3.4", - "cross-env": "^7.0.3", - "crypto": "^1.0.1", - "decimal.js-light": "^2.5.1", - "dotenv": "^10.0.0", - "mysql2": "^2.3.0", - "reflect-metadata": "^0.1.13", - "ts-mysql-migrate": "^1.0.2", - "typeorm": "^0.3.16", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=14" - } -} diff --git a/dlt-database/src/config/index.ts b/dlt-database/src/config/index.ts deleted file mode 100644 index 46a1e580c..000000000 --- a/dlt-database/src/config/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable n/no-process-env */ - -import dotenv from 'dotenv' - -dotenv.config() - -const constants = { - CONFIG_VERSION: { - DEFAULT: 'DEFAULT', - EXPECTED: 'v1.2022-08-22', - CURRENT: '', - }, -} - -const database = { - DB_HOST: process.env.DB_HOST ?? 'localhost', - DB_PORT: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 3306, - DB_USER: process.env.DB_USER ?? 'root', - DB_PASSWORD: process.env.DB_PASSWORD ?? '', - DB_DATABASE: process.env.DB_DATABASE ?? 'gradido_dlt', -} - -const migrations = { - MIGRATIONS_TABLE: process.env.MIGRATIONS_TABLE ?? 'migrations', -} - -// Check config version -constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION ?? constants.CONFIG_VERSION.DEFAULT -if ( - ![constants.CONFIG_VERSION.EXPECTED, constants.CONFIG_VERSION.DEFAULT].includes( - constants.CONFIG_VERSION.CURRENT, - ) -) { - throw new Error( - `Fatal: Config Version incorrect - expected "${constants.CONFIG_VERSION.EXPECTED}" or "${constants.CONFIG_VERSION.DEFAULT}", but found "${constants.CONFIG_VERSION.CURRENT}"`, - ) -} - -export const CONFIG = { ...constants, ...database, ...migrations } diff --git a/dlt-database/src/index.ts b/dlt-database/src/index.ts deleted file mode 100644 index 96785a721..000000000 --- a/dlt-database/src/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { createDatabase } from './prepare' -import { CONFIG } from './config' - -import { createPool } from 'mysql' -import { Migration } from 'ts-mysql-migrate' -import path from 'path' - -const run = async (command: string) => { - // Database actions not supported by our migration library - await createDatabase() - - // Initialize Migrations - const pool = createPool({ - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - user: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - database: CONFIG.DB_DATABASE, - }) - const migration = new Migration({ - conn: pool, - tableName: CONFIG.MIGRATIONS_TABLE, - silent: true, - dir: path.join(__dirname, '..', 'migrations'), - }) - await migration.initialize() - - // Execute command - switch (command) { - case 'up': - await migration.up() // use for upgrade script - break - case 'down': - await migration.down() // use for downgrade script - break - case 'reset': - // TODO protect from production - await migration.reset() - break - default: - throw new Error(`Unsupported command ${command}`) - } - - // Terminate connections gracefully - pool.end() -} - -run(process.argv[2]) - .catch((err) => { - // eslint-disable-next-line no-console - console.log(err) - process.exit(1) - }) - .then(() => { - process.exit() - }) diff --git a/dlt-database/src/prepare.ts b/dlt-database/src/prepare.ts deleted file mode 100644 index aa7e6d862..000000000 --- a/dlt-database/src/prepare.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { createConnection } from 'mysql2/promise' - -import { CONFIG } from './config' - -export const createDatabase = async (): Promise => { - const con = await createConnection({ - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - user: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - }) - - await con.connect() - - // Create Database `gradido_dlt` - await con.query(` - CREATE DATABASE IF NOT EXISTS ${CONFIG.DB_DATABASE} - DEFAULT CHARACTER SET utf8mb4 - DEFAULT COLLATE utf8mb4_unicode_ci;`) - - await con.end() -} diff --git a/dlt-database/src/typeorm.ts b/dlt-database/src/typeorm.ts deleted file mode 100644 index 4b4f494f1..000000000 --- a/dlt-database/src/typeorm.ts +++ /dev/null @@ -1 +0,0 @@ -export * from 'typeorm' diff --git a/dlt-database/src/typeorm/DecimalTransformer.ts b/dlt-database/src/typeorm/DecimalTransformer.ts deleted file mode 100644 index b1bcb8ca3..000000000 --- a/dlt-database/src/typeorm/DecimalTransformer.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Decimal } from 'decimal.js-light' -import { ValueTransformer } from 'typeorm' - -Decimal.set({ - precision: 25, - rounding: Decimal.ROUND_HALF_UP, -}) - -export const DecimalTransformer: ValueTransformer = { - /** - * Used to marshal Decimal when writing to the database. - */ - to: (decimal: Decimal | null): string | null => (decimal ? decimal.toString() : null), - - /** - * Used to unmarshal Decimal when reading from the database. - */ - from: (decimal: string | null): Decimal | null => (decimal ? new Decimal(decimal) : null), -} diff --git a/dlt-database/tsconfig.json b/dlt-database/tsconfig.json deleted file mode 100644 index 445b9d11f..000000000 --- a/dlt-database/tsconfig.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./build/outfile.js", /* Concatenate and emit output to single file. */ - "outDir": "./build", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - "strictPropertyInitialization": false, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [".", "../database"], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - }, - "references": [] /* Any project that is referenced must itself have a `references` array (which may be empty). */ -} diff --git a/dlt-database/yarn.lock b/dlt-database/yarn.lock deleted file mode 100644 index f4e8c4086..000000000 --- a/dlt-database/yarn.lock +++ /dev/null @@ -1,2594 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@eslint-community/eslint-plugin-eslint-comments@^3.2.1": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.1.tgz#3c65061e27f155eae3744c3b30c5a8253a959040" - integrity sha512-/HZbjIGaVO2zLlWX3gRgiHmKRVvvqrC0zVu3eXnIj1ORxoyfGSj50l0PfDfqihyZAqrDYzSMdJesXzFjvAoiLQ== - dependencies: - escape-string-regexp "^1.0.5" - ignore "^5.2.4" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nolyfill/is-core-module@1.0.39": - version "1.0.39" - resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" - integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@sqltools/formatter@^1.2.5": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" - integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/faker@^5.5.9": - version "5.5.9" - resolved "https://registry.yarnpkg.com/@types/faker/-/faker-5.5.9.tgz#588ede92186dc557bff8341d294335d50d255f0c" - integrity sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA== - -"@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mysql@^2.15.8": - version "2.15.26" - resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.26.tgz#f0de1484b9e2354d587e7d2bd17a873cc8300836" - integrity sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "22.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" - integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== - dependencies: - undici-types "~6.19.2" - -"@types/node@^16.10.3": - version "16.18.106" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.106.tgz#62228200da6d98365d2de5601f7230cdf041f0e2" - integrity sha512-YTgQUcpdXRc7iiEMutkkXl9WUx5lGUCVYvnfRg9CV+IA4l9epctEhCTbaw4KgzXaKYv8emvFJkEM65+MkNUhsQ== - -"@types/semver@^7.3.12": - version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" - integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== - -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - -"@typescript-eslint/eslint-plugin@^5.57.1": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" - integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== - dependencies: - "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/type-utils" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - graphemer "^1.4.0" - ignore "^5.2.0" - natural-compare-lite "^1.4.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.57.1": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/type-utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" - integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== - dependencies: - "@typescript-eslint/typescript-estree" "5.62.0" - "@typescript-eslint/utils" "5.62.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" - integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@types/json-schema" "^7.0.9" - "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - eslint-scope "^5.1.1" - semver "^7.3.7" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1, acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== - -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== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -app-root-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" - integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: - 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.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bignumber.js@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -builtins@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" - integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== - dependencies: - semver "^7.0.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^4.0.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -cli-highlight@^2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -dayjs@^1.11.9: - version "1.11.13" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" - integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: - version "4.3.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - -decimal.js-light@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -denque@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" - integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -dotenv@^16.0.3: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.15.0: - version "5.17.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.8.0: - 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" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" - integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== - -eslint-import-resolver-node@^0.3.9: - 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.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.4: - version "3.6.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e" - integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== - dependencies: - "@nolyfill/is-core-module" "1.0.39" - debug "^4.3.5" - enhanced-resolve "^5.15.0" - eslint-module-utils "^2.8.1" - fast-glob "^3.3.2" - get-tsconfig "^4.7.5" - is-bun-module "^1.0.2" - is-glob "^4.0.3" - -eslint-module-utils@^2.8.0, eslint-module-utils@^2.8.1: - version "2.8.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz#2ecad69d71e1fa81f17f7f24d5d3e46b168de663" - integrity sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" - integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.27.5: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-n@^15.7.0: - version "15.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" - integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== - dependencies: - builtins "^5.0.1" - eslint-plugin-es "^4.1.0" - eslint-utils "^3.0.0" - ignore "^5.1.1" - is-core-module "^2.11.0" - minimatch "^3.1.2" - resolve "^1.22.1" - semver "^7.3.8" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-promise@^6.1.1: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" - integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== - -eslint-plugin-security@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz#0e9c4a471f6e4d3ca16413c7a4a51f3966ba16e4" - integrity sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ== - dependencies: - safe-regex "^2.1.1" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -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" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.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, 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.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.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.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" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -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" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.3.0" - 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.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6: - 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.2.0" - es-abstract "^1.22.1" - 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== - -generate-function@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== - dependencies: - is-property "^1.0.2" - -get-caller-file@^2.0.5: - version "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.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.7.5: - version "4.8.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.8.0.tgz#125dc13a316f61650a12b20c97c11b8fd996fedd" - integrity sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -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== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-bun-module@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bun-module/-/is-bun-module-1.1.0.tgz#a66b9830869437f6cdad440ba49ab6e4dc837269" - integrity sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA== - dependencies: - semver "^7.6.3" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "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, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-property@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -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" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -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" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -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-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "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@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@^2.1.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" - integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mysql2@^2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0" - integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA== - dependencies: - denque "^2.0.1" - generate-function "^2.3.1" - iconv-lite "^0.6.3" - long "^4.0.0" - lru-cache "^6.0.0" - named-placeholders "^1.1.2" - seq-queue "^0.0.5" - sqlstring "^2.3.2" - -mysql@^2.18.1: - version "2.18.1" - resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" - integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== - dependencies: - bignumber.js "9.0.0" - readable-stream "2.3.7" - safe-buffer "5.1.2" - sqlstring "2.3.1" - -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -named-placeholders@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" - integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== - dependencies: - lru-cache "^7.14.1" - -natural-compare-lite@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" - integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.8.7: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -readable-stream@2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -reflect-metadata@^0.1.13: - version "0.1.14" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" - integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== - -reflect-metadata@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" - integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== - -regexp-tree@~0.1.1: - version "0.1.27" - 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.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.22.1, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - 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" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -safe-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" - integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== - dependencies: - regexp-tree "~0.1.1" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -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== - -semver@^7.0.0, semver@^7.3.7, semver@^7.3.8, semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -seq-queue@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" - integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -sha.js@^2.4.11: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sqlstring@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" - integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== - -sqlstring@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" - integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-mysql-migrate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ts-mysql-migrate/-/ts-mysql-migrate-1.0.2.tgz#736d37c3aa3fef92f226b869098e939950d0e18c" - integrity sha512-zDW6iQsfPCJfQ3JMhfUGjhy8aK+VNTvPrXmJH66PB2EGEvyn4m7x2nBdhDNhKuwYU9LMxW1p+l39Ei+btXNpxA== - dependencies: - "@types/mysql" "^2.15.8" - mysql "^2.18.1" - -ts-node@^10.2.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typeorm@^0.3.16: - version "0.3.20" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" - integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== - dependencies: - "@sqltools/formatter" "^1.2.5" - app-root-path "^3.1.0" - buffer "^6.0.3" - chalk "^4.1.2" - cli-highlight "^2.1.11" - dayjs "^1.11.9" - debug "^4.3.4" - dotenv "^16.0.3" - glob "^10.3.10" - mkdirp "^2.1.3" - reflect-metadata "^0.2.1" - sha.js "^2.4.11" - tslib "^2.5.0" - uuid "^9.0.0" - yargs "^17.6.2" - -typescript@^4.3.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.6.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/docker-compose.apple-m1.override.yml b/docker-compose.apple-m1.override.yml index 888bb551e..e69c736fe 100644 --- a/docker-compose.apple-m1.override.yml +++ b/docker-compose.apple-m1.override.yml @@ -33,12 +33,6 @@ services: ######################################################## database: platform: linux/amd64 - - ######################################################## - # DLT-DATABASE ############################################# - ######################################################## - dlt-database: - platform: linux/amd64 ######################################################### ## NGINX ################################################ diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 4807a6bbf..eb7b54269 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -148,28 +148,6 @@ services: # bind the local folder to the docker to allow live reload - ./database:/app - ######################################################## - # DLT-DATABASE ############################################## - ######################################################## - dlt-database: - # we always run on production here since else the service lingers - # feel free to change this behaviour if it seems useful - # Due to problems with the volume caching the built files - # we changed this to test build. This keeps the service running. - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/dlt-database:local-test_up - build: - target: test_up - environment: - - NODE_ENV="development" - volumes: - # This makes sure the docker container has its own node modules. - # Therefore it is possible to have a different node version on the host machine - - dlt-database_node_modules:/app/node_modules - - dlt-database_build:/app/build - # bind the local folder to the docker to allow live reload - - ./dlt-database:/app - ######################################################### ## MARIADB ############################################## ######################################################### diff --git a/docker-compose.reset.yml b/docker-compose.reset.yml index 13708bdef..afc9b5a80 100644 --- a/docker-compose.reset.yml +++ b/docker-compose.reset.yml @@ -32,33 +32,6 @@ services: # Application only envs #env_file: # - ./frontend/.env - - ######################################################## - # DLT-DATABASE ############################################# - ######################################################## - dlt-database: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/dlt-database:local-production_reset - build: - context: ./dlt-database - target: production_reset - depends_on: - - mariadb - networks: - - internal-net - - external-net # this is required to fetch the packages - environment: - # Envs used in Dockerfile - # - DOCKER_WORKDIR="/app" - - BUILD_DATE - - BUILD_VERSION - - BUILD_COMMIT - - NODE_ENV="production" - - DB_HOST=mariadb - # Application only envs - #env_file: - # - ./frontend/.env - networks: external-net: diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 6b6b2c04f..8e45055a4 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -76,18 +76,6 @@ services: - NODE_ENV="test" # restart: always # this is very dangerous, but worth a test for the delayed mariadb startup at first run - ######################################################## - # DLT-DATABASE ############################################# - ######################################################## - dlt-database: - image: gradido/dlt-database:test_up - build: - context: ./dlt-database - target: test_up - environment: - - NODE_ENV="test" - # restart: always # this is very dangerous, but worth a test for the delayed mariadb startup at first run - ######################################################### ## MARIADB ############################################## ######################################################### diff --git a/docker-compose.yml b/docker-compose.yml index 76243a98a..9d84aea34 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -239,32 +239,6 @@ services: #env_file: # - ./frontend/.env - ######################################################## - # DLT-DATABASE ############################################# - ######################################################## - dlt-database: - # name the image so that it cannot be found in a DockerHub repository, otherwise it will not be built locally from the 'dockerfile' but pulled from there - image: gradido/dlt-database:local-production_up - build: - context: ./dlt-database - target: production_up - depends_on: - - mariadb - networks: - - internal-net - - external-net # this is required to fetch the packages - environment: - # Envs used in Dockerfile - # - DOCKER_WORKDIR="/app" - - BUILD_DATE - - BUILD_VERSION - - BUILD_COMMIT - - NODE_ENV="production" - - DB_HOST=mariadb - # Application only envs - #env_file: - # - ./frontend/.env - ######################################################### ## NGINX ################################################ ######################################################### From e1cc58381eeee4cc4f5b492471605ce1387d5434 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sun, 22 Sep 2024 17:29:12 +0200 Subject: [PATCH 11/23] fix db version, remove olddated tests --- backend/src/config/index.ts | 2 +- dht-node/src/config/index.ts | 2 +- dlt-connector/.env.dist | 9 - dlt-connector/.env.template | 9 - dlt-connector/jest.config.js | 11 - dlt-connector/package.json | 2 +- dlt-connector/src/config/index.ts | 14 +- dlt-connector/src/graphql/model/Community.ts | 36 -- .../resolver/CommunityResolver.test.ts | 87 --- .../resolver/TransactionsResolver.test.ts | 218 ------- dlt-connector/src/index.ts | 7 +- dlt-connector/src/server/createServer.ts | 3 - dlt-connector/src/typeorm/DataSource.ts | 89 --- dlt-connector/test/TestDB.ts | 77 --- dlt-connector/test/seeding/Community.seed.ts | 28 - dlt-connector/test/seeding/UserSet.seed.ts | 55 -- dlt-connector/tsconfig.json | 6 - dlt-connector/yarn.lock | 550 +----------------- federation/src/config/index.ts | 2 +- 19 files changed, 19 insertions(+), 1188 deletions(-) delete mode 100644 dlt-connector/src/graphql/model/Community.ts delete mode 100644 dlt-connector/src/graphql/resolver/CommunityResolver.test.ts delete mode 100644 dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts delete mode 100644 dlt-connector/src/typeorm/DataSource.ts delete mode 100644 dlt-connector/test/TestDB.ts delete mode 100644 dlt-connector/test/seeding/Community.seed.ts delete mode 100644 dlt-connector/test/seeding/UserSet.seed.ts diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index d66f729db..7ded1b8f4 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -12,7 +12,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0086-add_community_location', + DB_VERSION: '0087-add_dlt_users_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info diff --git a/dht-node/src/config/index.ts b/dht-node/src/config/index.ts index 8bf59c465..f2dc456b4 100644 --- a/dht-node/src/config/index.ts +++ b/dht-node/src/config/index.ts @@ -4,7 +4,7 @@ import dotenv from 'dotenv' dotenv.config() const constants = { - DB_VERSION: '0086-add_community_location', + DB_VERSION: '0087-add_dlt_users_table', LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index 8ad78348d..ba8fe5557 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -9,15 +9,6 @@ IOTA_API_URL=https://chrysalis-nodes.iota.org IOTA_COMMUNITY_ALIAS=GRADIDO: TestHelloWelt2 IOTA_HOME_COMMUNITY_SEED=aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899 -# Database -DB_HOST=localhost -DB_PORT=3306 -DB_USER=root -DB_PASSWORD= -DB_DATABASE=gradido_dlt -DB_DATABASE_TEST=gradido_dlt_test -TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log - # DLT-Connector DLT_CONNECTOR_PORT=6010 diff --git a/dlt-connector/.env.template b/dlt-connector/.env.template index 15c2ae5a9..ac27481bb 100644 --- a/dlt-connector/.env.template +++ b/dlt-connector/.env.template @@ -7,15 +7,6 @@ IOTA_API_URL=$IOTA_API_URL IOTA_COMMUNITY_ALIAS=$IOTA_COMMUNITY_ALIAS IOTA_HOME_COMMUNITY_SEED=$IOTA_HOME_COMMUNITY_SEED -# Database -DB_HOST=localhost -DB_PORT=3306 -DB_USER=root -DB_PASSWORD= -DB_DATABASE=gradido_dlt -DB_DATABASE_TEST=$DB_DATABASE_TEST -TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log - # DLT-Connector DLT_CONNECTOR_PORT=$DLT_CONNECTOR_PORT diff --git a/dlt-connector/jest.config.js b/dlt-connector/jest.config.js index 9b5a01350..652408b23 100644 --- a/dlt-connector/jest.config.js +++ b/dlt-connector/jest.config.js @@ -22,18 +22,7 @@ module.exports = { '@input/(.*)': '/src/graphql/input/$1', '@proto/(.*)': '/src/proto/$1', '@test/(.*)': '/test/$1', - '@typeorm/(.*)': '/src/typeorm/$1', '@client/(.*)': '/src/client/$1', - '@entity/(.*)': - // eslint-disable-next-line n/no-process-env - process.env.NODE_ENV === 'development' - ? '/../dlt-database/entity/$1' - : '/../dlt-database/build/entity/$1', - '@dbTools/(.*)': - // eslint-disable-next-line n/no-process-env - process.env.NODE_ENV === 'development' - ? '/../dlt-database/src/$1' - : '/../dlt-database/build/src/$1', '@validator/(.*)': '/src/graphql/validator/$1', }, } diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 6031dd3b0..db7192cc1 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -13,7 +13,7 @@ "start": "cross-env TZ=UTC TS_NODE_BASEURL=./build node -r tsconfig-paths/register build/src/index.js", "dev": "cross-env TZ=UTC nodemon -w src --ext ts --exec ts-node -r dotenv/config -r tsconfig-paths/register src/index.ts", "lint": "eslint --max-warnings=0 --ext .js,.ts .", - "test": "cross-env TZ=UTC NODE_ENV=development jest --runInBand --forceExit --detectOpenHandles" + "test": "cross-env TZ=UTC NODE_ENV=development jest --forceExit --detectOpenHandles" }, "dependencies": { "@apollo/server": "^4.7.5", diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index ff50eb3fe..806d3fd50 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -4,7 +4,6 @@ dotenv.config() const constants = { LOG4JS_CONFIG: 'log4js-config.json', - DB_VERSION: '0005-refactor_with_gradido_blockchain_lib', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', CONFIG_VERSION: { @@ -19,20 +18,10 @@ const server = { JWT_SECRET: process.env.JWT_SECRET ?? 'secret123', } -const database = { - DB_HOST: process.env.DB_HOST ?? 'localhost', - DB_PORT: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 3306, - DB_USER: process.env.DB_USER ?? 'root', - DB_PASSWORD: process.env.DB_PASSWORD ?? '', - DB_DATABASE: process.env.DB_DATABASE ?? 'gradido_dlt', - DB_DATABASE_TEST: process.env.DB_DATABASE_TEST ?? 'gradido_dlt_test', - TYPEORM_LOGGING_RELATIVE_PATH: process.env.TYPEORM_LOGGING_RELATIVE_PATH ?? 'typeorm.backend.log', -} - const iota = { IOTA_API_URL: process.env.IOTA_API_URL ?? 'https://chrysalis-nodes.iota.org', IOTA_COMMUNITY_ALIAS: process.env.IOTA_COMMUNITY_ALIAS ?? 'GRADIDO: TestHelloWelt2', - IOTA_HOME_COMMUNITY_SEED: process.env.IOTA_HOME_COMMUNITY_SEED?.substring(0, 32) ?? null, + IOTA_HOME_COMMUNITY_SEED: process.env.IOTA_HOME_COMMUNITY_SEED ?? null, } const dltConnector = { @@ -69,7 +58,6 @@ if ( export const CONFIG = { ...constants, ...server, - ...database, ...iota, ...dltConnector, ...nodeServer, diff --git a/dlt-connector/src/graphql/model/Community.ts b/dlt-connector/src/graphql/model/Community.ts deleted file mode 100644 index 7a69288dc..000000000 --- a/dlt-connector/src/graphql/model/Community.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Community as CommunityEntity } from '@entity/Community' -import { ObjectType, Field, Int } from 'type-graphql' - -@ObjectType() -export class Community { - constructor(entity: CommunityEntity) { - this.id = entity.id - this.iotaTopic = entity.iotaTopic - if (entity.rootPubkey) { - this.rootPublicKeyHex = entity.rootPubkey?.toString('hex') - } - this.foreign = entity.foreign - this.createdAt = entity.createdAt.toString() - if (entity.confirmedAt) { - this.confirmedAt = entity.confirmedAt.toString() - } - } - - @Field(() => Int) - id: number - - @Field(() => String) - iotaTopic: string - - @Field(() => String) - rootPublicKeyHex?: string - - @Field(() => Boolean) - foreign: boolean - - @Field(() => String) - createdAt: string - - @Field(() => String) - confirmedAt?: string -} diff --git a/dlt-connector/src/graphql/resolver/CommunityResolver.test.ts b/dlt-connector/src/graphql/resolver/CommunityResolver.test.ts deleted file mode 100644 index 0fa61cc48..000000000 --- a/dlt-connector/src/graphql/resolver/CommunityResolver.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import 'reflect-metadata' -import assert from 'assert' - -import { ApolloServer } from '@apollo/server' - -// must be imported before createApolloTestServer so that TestDB was created before createApolloTestServer imports repositories -// eslint-disable-next-line import/order -import { TestDB } from '@test/TestDB' -import { TransactionResult } from '@model/TransactionResult' -import { createApolloTestServer } from '@test/ApolloServerMock' - -import { CONFIG } from '@/config' - -CONFIG.IOTA_HOME_COMMUNITY_SEED = 'aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899' - -const con = TestDB.instance - -jest.mock('@typeorm/DataSource', () => ({ - getDataSource: jest.fn(() => TestDB.instance.dbConnect), -})) - -let apolloTestServer: ApolloServer - -describe('graphql/resolver/CommunityResolver', () => { - beforeAll(async () => { - await con.setupTestDB() - apolloTestServer = await createApolloTestServer() - }) - afterAll(async () => { - await con.teardownTestDB() - }) - - describe('tests with db', () => { - it('test add foreign community', async () => { - const response = await apolloTestServer.executeOperation({ - query: - 'mutation ($input: CommunityDraft!) { addCommunity(data: $input) {succeed, error {message}} }', - variables: { - input: { - uuid: '3d813cbb-37fb-42ba-91df-831e1593ac29', - foreign: true, - createdAt: '2012-04-17T17:12:00.0012Z', - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult.errors).toBeUndefined() - const transactionResult = response.body.singleResult.data?.addCommunity as TransactionResult - expect(transactionResult.succeed).toEqual(true) - }) - - it('test add home community', async () => { - const response = await apolloTestServer.executeOperation({ - query: - 'mutation ($input: CommunityDraft!) { addCommunity(data: $input) {succeed, error {message}} }', - variables: { - input: { - uuid: '3d823cad-37fb-41cd-91df-152e1593ac29', - foreign: false, - createdAt: '2012-05-12T13:12:00.2917Z', - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult.errors).toBeUndefined() - const transactionResult = response.body.singleResult.data?.addCommunity as TransactionResult - expect(transactionResult.succeed).toEqual(true) - }) - - it('test add existing community', async () => { - const response = await apolloTestServer.executeOperation({ - query: 'mutation ($input: CommunityDraft!) { addCommunity(data: $input) {succeed} }', - variables: { - input: { - uuid: '3d823cad-37fb-41cd-91df-152e1593ac29', - foreign: false, - createdAt: '2012-05-12T13:12:00.1271Z', - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult.errors).toBeUndefined() - const transactionResult = response.body.singleResult.data?.addCommunity as TransactionResult - expect(transactionResult.succeed).toEqual(false) - }) - }) -}) diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts deleted file mode 100644 index 6eb443e21..000000000 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.test.ts +++ /dev/null @@ -1,218 +0,0 @@ -import 'reflect-metadata' -import assert from 'assert' - -import { ApolloServer } from '@apollo/server' - -// must be imported before createApolloTestServer so that TestDB was created before createApolloTestServer imports repositories -// eslint-disable-next-line import/order -import { TestDB } from '@test/TestDB' -import { AccountType } from '@enum/AccountType' -import { TransactionResult } from '@model/TransactionResult' -import { createApolloTestServer } from '@test/ApolloServerMock' - -import { CONFIG } from '@/config' -import { AccountFactory } from '@/data/Account.factory' -import { KeyPair } from '@/data/KeyPair' -import { Mnemonic } from '@/data/Mnemonic' -import { UserFactory } from '@/data/User.factory' -import { UserLogic } from '@/data/User.logic' -import { AddCommunityContext } from '@/interactions/backendToDb/community/AddCommunity.context' -import { getEnumValue } from '@/utils/typeConverter' - -import { InputTransactionType } from '../enum/InputTransactionType' -import { CommunityDraft } from '../input/CommunityDraft' -import { UserAccountDraft } from '../input/UserAccountDraft' -import { UserIdentifier } from '../input/UserIdentifier' - -let apolloTestServer: ApolloServer - -jest.mock('@/client/IotaClient', () => { - return { - sendMessage: jest.fn().mockReturnValue({ - messageId: '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', - }), - } -}) - -jest.mock('@typeorm/DataSource', () => ({ - getDataSource: jest.fn(() => TestDB.instance.dbConnect), -})) - -CONFIG.IOTA_HOME_COMMUNITY_SEED = 'aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899' -const communityUUID = '3d813cbb-37fb-42ba-91df-831e1593ac29' -const communityKeyPair = new KeyPair(new Mnemonic(CONFIG.IOTA_HOME_COMMUNITY_SEED)) - -const createUserStoreAccount = async (uuid: string): Promise => { - const userAccountDraft = new UserAccountDraft() - userAccountDraft.accountType = AccountType.COMMUNITY_HUMAN - userAccountDraft.createdAt = new Date().toString() - userAccountDraft.user = new UserIdentifier() - userAccountDraft.user.uuid = uuid - userAccountDraft.user.communityUuid = communityUUID - const user = UserFactory.create(userAccountDraft, communityKeyPair) - const userLogic = new UserLogic(user) - const account = AccountFactory.createAccountFromUserAccountDraft( - userAccountDraft, - userLogic.calculateKeyPair(communityKeyPair), - ) - account.user = user - // user is set to cascade: ['insert'] will be saved together with account - await account.save() - return userAccountDraft.user -} - -describe('Transaction Resolver Test', () => { - let user: UserIdentifier - let linkedUser: UserIdentifier - beforeAll(async () => { - await TestDB.instance.setupTestDB() - apolloTestServer = await createApolloTestServer() - - const communityDraft = new CommunityDraft() - communityDraft.uuid = communityUUID - communityDraft.foreign = false - communityDraft.createdAt = new Date().toString() - const addCommunityContext = new AddCommunityContext(communityDraft) - await addCommunityContext.run() - user = await createUserStoreAccount('0ec72b74-48c2-446f-91ce-31ad7d9f4d65') - linkedUser = await createUserStoreAccount('ddc8258e-fcb5-4e48-8d1d-3a07ec371dbe') - }) - - afterAll(async () => { - await TestDB.instance.teardownTestDB() - }) - - it('test mocked sendTransaction', async () => { - const response = await apolloTestServer.executeOperation({ - query: - 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {succeed, recipe { id, topic }} }', - variables: { - input: { - user, - linkedUser, - type: getEnumValue(InputTransactionType, InputTransactionType.SEND), - amount: '10', - createdAt: '2012-04-17T17:12:00Z', - backendTransactionId: 1, - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult.errors).toBeUndefined() - const transactionResult = response.body.singleResult.data?.sendTransaction as TransactionResult - expect(transactionResult.recipe).toBeDefined() - expect(transactionResult.succeed).toBe(true) - }) - - it('test mocked sendTransaction invalid transactionType ', async () => { - const response = await apolloTestServer.executeOperation({ - query: - 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, succeed} }', - variables: { - input: { - user, - linkedUser, - type: 'INVALID', - amount: '10', - createdAt: '2012-04-17T17:12:00Z', - backendTransactionId: 1, - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult).toMatchObject({ - errors: [ - { - message: - 'Variable "$input" got invalid value "INVALID" at "input.type"; Value "INVALID" does not exist in "InputTransactionType" enum.', - }, - ], - }) - }) - - it('test mocked sendTransaction invalid amount ', async () => { - const response = await apolloTestServer.executeOperation({ - query: - 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, succeed} }', - variables: { - input: { - user, - linkedUser, - type: getEnumValue(InputTransactionType, InputTransactionType.SEND), - amount: 'no number', - createdAt: '2012-04-17T17:12:00Z', - backendTransactionId: 1, - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult).toMatchObject({ - errors: [ - { - message: - 'Variable "$input" got invalid value "no number" at "input.amount"; Expected type "Decimal". [DecimalError] Invalid argument: no number', - }, - ], - }) - }) - - it('test mocked sendTransaction invalid created date ', async () => { - const response = await apolloTestServer.executeOperation({ - query: - 'mutation ($input: TransactionDraft!) { sendTransaction(data: $input) {error {type, message}, succeed} }', - variables: { - input: { - user, - linkedUser, - type: getEnumValue(InputTransactionType, InputTransactionType.SEND), - amount: '10', - createdAt: 'not valid', - backendTransactionId: 1, - }, - }, - }) - assert(response.body.kind === 'single') - expect(response.body.singleResult).toMatchObject({ - errors: [ - { - 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}, succeed} }', - variables: { - input: { - user, - linkedUser, - type: getEnumValue(InputTransactionType, InputTransactionType.CREATION), - amount: '10', - createdAt: '2012-04-17T17:12:00Z', - backendTransactionId: 1, - }, - }, - }) - 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/index.ts b/dlt-connector/src/index.ts index 2dd21b66b..c025296fd 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -6,14 +6,14 @@ import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' import { CONFIG } from '@/config' import { BackendClient } from './client/BackendClient' +import { getTransaction } from './client/GradidoNode' import { CommunityDraft } from './graphql/input/CommunityDraft' +import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' import { logger } from './logging/logger' import { KeyPairCacheManager } from './manager/KeyPairCacheManager' import createServer from './server/createServer' import { LogError } from './server/LogError' -import { getTransaction } from './client/GradidoNode' import { uuid4ToHash } from './utils/typeConverter' -import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' async function waitForServer( backend: BackendClient, @@ -46,9 +46,10 @@ async function main() { if (seed.size() < 32) { throw new Error('seed need to be greater than 32 Bytes') } - } catch (_) { + } catch (error) { throw new LogError( 'IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long', + error, ) } } diff --git a/dlt-connector/src/server/createServer.ts b/dlt-connector/src/server/createServer.ts index 25e0a12e2..9cc29124c 100755 --- a/dlt-connector/src/server/createServer.ts +++ b/dlt-connector/src/server/createServer.ts @@ -12,7 +12,6 @@ import { Logger } from 'log4js' import { schema } from '@/graphql/schema' import { logger as dltLogger } from '@/logging/logger' -import { Connection } from '@/typeorm/DataSource' type ServerDef = { apollo: ApolloServer; app: Express } @@ -29,8 +28,6 @@ const createServer = async ( logger.addContext('user', 'unknown') logger.debug('createServer...') - // connect to db and test db version - await Connection.getInstance().init() // Express Server const app = express() diff --git a/dlt-connector/src/typeorm/DataSource.ts b/dlt-connector/src/typeorm/DataSource.ts deleted file mode 100644 index a86a061f3..000000000 --- a/dlt-connector/src/typeorm/DataSource.ts +++ /dev/null @@ -1,89 +0,0 @@ -// TODO This is super weird - since the entities are defined in another project they have their own globals. -// We cannot use our connection here, but must use the external typeorm installation -import { DataSource as DBDataSource, FileLogger } from '@dbTools/typeorm' -import { entities } from '@entity/index' -import { Migration } from '@entity/Migration' - -import { CONFIG } from '@/config' -import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' - -// eslint-disable-next-line @typescript-eslint/no-extraneous-class -export class Connection { - // eslint-disable-next-line no-use-before-define - private static instance: Connection - private connection: DBDataSource - - /** - * The Singleton's constructor should always be private to prevent direct - * construction calls with the `new` operator. - */ - // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function - private constructor() { - this.connection = new DBDataSource({ - type: 'mysql', - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - username: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - database: CONFIG.DB_DATABASE, - entities, - synchronize: false, - logging: true, - logger: new FileLogger('all', { - logPath: CONFIG.TYPEORM_LOGGING_RELATIVE_PATH, - }), - extra: { - charset: 'utf8mb4_unicode_ci', - }, - }) - } - - /** - * The static method that controls the access to the singleton instance. - * - * This implementation let you subclass the Singleton class while keeping - * just one instance of each subclass around. - */ - public static getInstance(): Connection { - if (!Connection.instance) { - Connection.instance = new Connection() - } - return Connection.instance - } - - public getDataSource(): DBDataSource { - return this.connection - } - - public async init(): Promise { - await this.connection.initialize() - try { - Connection.getInstance() - } catch (error) { - // try and catch for logging - logger.fatal(`Couldn't open connection to database!`) - throw error - } - - // check for correct database version - await this.checkDBVersion(CONFIG.DB_VERSION) - } - - async checkDBVersion(DB_VERSION: string): Promise { - const dbVersion = await Migration.find({ order: { version: 'DESC' }, take: 1 }) - if (!dbVersion || dbVersion.length < 1) { - throw new LogError('found no db version in migrations, could dlt-database run successfully?') - } - // return dbVersion ? dbVersion.fileName : null - if (!dbVersion[0].fileName.includes(DB_VERSION)) { - throw new LogError( - `Wrong database version detected - the backend requires '${DB_VERSION}' but found '${ - dbVersion[0].fileName ?? 'None' - }`, - ) - } - } -} - -export const getDataSource = () => Connection.getInstance().getDataSource() diff --git a/dlt-connector/test/TestDB.ts b/dlt-connector/test/TestDB.ts deleted file mode 100644 index 63ce78500..000000000 --- a/dlt-connector/test/TestDB.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { DataSource, FileLogger } from '@dbTools/typeorm' -import { entities } from '@entity/index' -import { createDatabase } from 'typeorm-extension' - -import { CONFIG } from '@/config' -import { LogError } from '@/server/LogError' - -// TODO: maybe use in memory db like here: https://dkzeb.medium.com/unit-testing-in-ts-jest-with-typeorm-entities-ad5de5f95438 -export class TestDB { - // eslint-disable-next-line no-use-before-define - private static _instance: TestDB - - private constructor() { - if (!CONFIG.DB_DATABASE_TEST) { - throw new LogError('no test db in config') - } - if (CONFIG.DB_DATABASE === CONFIG.DB_DATABASE_TEST) { - throw new LogError( - 'main db is the same as test db, not good because test db will be cleared after each test run', - ) - } - this.dbConnect = new DataSource({ - type: 'mysql', - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - username: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - database: CONFIG.DB_DATABASE_TEST, - entities, - synchronize: true, - dropSchema: true, - logging: true, - logger: new FileLogger('all', { - logPath: CONFIG.TYPEORM_LOGGING_RELATIVE_PATH, - }), - extra: { - charset: 'utf8mb4_unicode_ci', - }, - }) - } - - public static get instance(): TestDB { - if (!this._instance) this._instance = new TestDB() - return this._instance - } - - public dbConnect!: DataSource - - async setupTestDB() { - // eslint-disable-next-line no-console - try { - if (!CONFIG.DB_DATABASE_TEST) { - throw new LogError('no test db in config') - } - await createDatabase({ - ifNotExist: true, - options: { - type: 'mysql', - charset: 'utf8mb4_unicode_ci', - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - username: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - database: CONFIG.DB_DATABASE_TEST, - }, - }) - await this.dbConnect.initialize() - } catch (error) { - // eslint-disable-next-line no-console - console.log(error) - } - } - - async teardownTestDB() { - await this.dbConnect.destroy() - } -} diff --git a/dlt-connector/test/seeding/Community.seed.ts b/dlt-connector/test/seeding/Community.seed.ts deleted file mode 100644 index 8dee407f3..000000000 --- a/dlt-connector/test/seeding/Community.seed.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Community } from '@entity/Community' - -import { KeyPair } from '@/data/KeyPair' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { AddCommunityContext } from '@/interactions/backendToDb/community/AddCommunity.context' -import { uuid4ToHash } from '@/utils/typeConverter' - -export const communitySeed = async ( - uuid: string, - foreign: boolean, - keyPair: KeyPair | undefined = undefined, -): Promise => { - const homeCommunityDraft = new CommunityDraft() - homeCommunityDraft.uuid = uuid - homeCommunityDraft.foreign = foreign - homeCommunityDraft.createdAt = new Date().toISOString() - const iotaTopic = uuid4ToHash(uuid) - const addCommunityContext = new AddCommunityContext(homeCommunityDraft, iotaTopic) - await addCommunityContext.run() - - const community = await Community.findOneOrFail({ where: { iotaTopic } }) - if (foreign && keyPair) { - // that isn't entirely correct, normally only the public key from foreign community is known, and will be come form blockchain - keyPair.fillInCommunityKeys(community) - await community.save() - } - return community -} diff --git a/dlt-connector/test/seeding/UserSet.seed.ts b/dlt-connector/test/seeding/UserSet.seed.ts deleted file mode 100644 index 933b386ca..000000000 --- a/dlt-connector/test/seeding/UserSet.seed.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Account } from '@entity/Account' -import { User } from '@entity/User' -import { v4 } from 'uuid' - -import { AccountFactory } from '@/data/Account.factory' -import { KeyPair } from '@/data/KeyPair' -import { UserFactory } from '@/data/User.factory' -import { UserLogic } from '@/data/User.logic' -import { AccountType } from '@/graphql/enum/AccountType' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' - -export type UserSet = { - identifier: UserIdentifier - user: User - account: Account -} - -export const createUserIdentifier = (userUuid: string, communityUuid: string): UserIdentifier => { - const user = new UserIdentifier() - user.uuid = userUuid - user.communityUuid = communityUuid - return user -} - -export const createUserAndAccount = ( - userIdentifier: UserIdentifier, - communityKeyPair: KeyPair, -): Account => { - const accountDraft = new UserAccountDraft() - accountDraft.user = userIdentifier - accountDraft.createdAt = new Date().toISOString() - accountDraft.accountType = AccountType.COMMUNITY_HUMAN - const user = UserFactory.create(accountDraft, communityKeyPair) - const userLogic = new UserLogic(user) - const account = AccountFactory.createAccountFromUserAccountDraft( - accountDraft, - userLogic.calculateKeyPair(communityKeyPair), - ) - account.user = user - return account -} - -export const createUserSet = (communityUuid: string, communityKeyPair: KeyPair): UserSet => { - const identifier = createUserIdentifier(v4(), communityUuid) - const account = createUserAndAccount(identifier, communityKeyPair) - if (!account.user) { - throw Error('user missing') - } - return { - identifier, - account, - user: account.user, - } -} diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index 32525c013..2ce9731e3 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -53,14 +53,9 @@ "@input/*": ["src/graphql/input/*"], "@model/*": ["src/graphql/model/*"], "@resolver/*": ["src/graphql/resolver/*"], - "@scalar/*": ["src/graphql/scalar/*"], "@test/*": ["test/*"], "@proto/*" : ["src/proto/*"], "@validator/*" : ["src/graphql/validator/*"], - "@typeorm/*" : ["src/typeorm/*"], - /* external */ - "@dbTools/*": ["../dlt-database/src/*", "../../dlt-database/build/src/*"], - "@entity/*": ["../dlt-database/entity/*", "../../dlt-database/build/entity/*"] }, // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ "typeRoots": ["node_modules/@types", "@types"], /* List of folders to include type definitions from. */ @@ -86,7 +81,6 @@ }, "references": [ { - "path": "../dlt-database/tsconfig.json", // add 'prepend' if you want to include the referenced project in your output file // "prepend": true } diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 64ebb063a..c4f244816 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -481,11 +481,6 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@faker-js/faker@^8.4.1": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-8.4.1.tgz#5d5e8aee8fce48f5e189bf730ebd1f758f491451" - integrity sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg== - "@graphql-tools/merge@^8.4.1": version "8.4.2" resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.4.2.tgz#95778bbe26b635e8d2f60ce9856b388f11fe8288" @@ -600,18 +595,6 @@ neon-cli "^0.8" prebuild-install "^6.1.2" -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -863,11 +846,6 @@ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - "@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" @@ -945,11 +923,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sqltools/formatter@^1.2.5": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" - integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== - "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -1109,13 +1082,6 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== -"@types/mysql@^2.15.8": - version "2.15.26" - resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.26.tgz#f0de1484b9e2354d587e7d2bd17a873cc8300836" - integrity sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ== - dependencies: - "@types/node" "*" - "@types/node-fetch@^2.6.1": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -1394,11 +1360,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1418,16 +1379,6 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -1436,11 +1387,6 @@ anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-root-path@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" - integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== - aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1679,11 +1625,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== -bignumber.js@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" - integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== - binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -1747,13 +1688,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -1803,14 +1737,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -1873,7 +1799,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1942,18 +1868,6 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-highlight@^2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -2084,11 +1998,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -consola@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" - integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== - console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -2177,7 +2086,7 @@ cross-inspect@1.0.1: dependencies: tslib "^2.4.0" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2186,11 +2095,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -crypto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/crypto/-/crypto-1.0.1.tgz#2af1b7cad8175d24c8a1b0778255794a21803037" - integrity sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig== - cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" @@ -2249,11 +2153,6 @@ date-format@^4.0.14: resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== -dayjs@^1.11.9: - version "1.11.13" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" - integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== - debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2275,11 +2174,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -decimal.js-light@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - decimal.js@^10.2.1: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -2340,11 +2234,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -denque@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" - integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -2355,11 +2244,6 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -destr@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.3.tgz#7f9e97cb3d16dbdca7be52aca1644ce402cfe449" - integrity sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ== - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -2397,20 +2281,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -"dlt-database@file:../dlt-database": - version "1.23.2" - dependencies: - "@types/uuid" "^8.3.4" - cross-env "^7.0.3" - crypto "^1.0.1" - decimal.js-light "^2.5.1" - dotenv "^10.0.0" - mysql2 "^2.3.0" - reflect-metadata "^0.1.13" - ts-mysql-migrate "^1.0.2" - typeorm "^0.3.16" - uuid "^8.3.2" - doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -2432,38 +2302,16 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -dotenv@10.0.0, dotenv@^10.0.0: +dotenv@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -dotenv@^16.0.3: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - dset@^3.1.2: version "3.1.4" resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.4.tgz#f8eaf5f023f068a036d08cd07dc9ffb7d0065248" integrity sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA== -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ebec@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ebec/-/ebec-1.1.1.tgz#683a0dc82a77e86349e05b24c43d7233a6d0f840" - integrity sha512-JZ1vcvPQtR+8LGbZmbjG21IxLQq/v47iheJqn2F6yB2CgnGfn8ZVg3myHrf3buIZS8UCwQK0jOSIb3oHX7aH8g== - dependencies: - smob "^1.4.0" - -ebec@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/ebec/-/ebec-2.3.0.tgz#9b5b423f1196a0cd414e041111f2b1d146308bd5" - integrity sha512-bt+0tSL7223VU3PSVi0vtNLZ8pO1AfWolcPPMk2a/a5H+o/ZU9ky0n3A0zhrR4qzJTN61uPsGIO4ShhOukdzxA== - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2484,11 +2332,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2514,13 +2357,6 @@ enhanced-resolve@^5.15.0: graceful-fs "^4.2.4" tapable "^2.2.0" -envix@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/envix/-/envix-1.5.0.tgz#bbb7ceba6f098a272ef2044e606789844d08c1db" - integrity sha512-IOxTKT+tffjxgvX2O5nq6enbkv6kBQ/QdMy18bZWo0P0rKPvsRp2/EypIPwTvJfnmk3VdOlq/KcRSZCswefM/w== - dependencies: - std-env "^3.7.0" - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3179,11 +3015,6 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.2.7, flatted@^3.2.9: version "3.3.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" @@ -3201,14 +3032,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -3325,13 +3148,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== - dependencies: - is-property "^1.0.2" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -3405,18 +3221,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^10.3.10: - version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -3583,11 +3387,6 @@ helmet@^7.1.0: resolved "https://registry.yarnpkg.com/helmet/-/helmet-7.1.0.tgz#287279e00f8a3763d5dccbaf1e5ee39b8c3784ca" integrity sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg== -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -3662,14 +3461,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3890,11 +3682,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-property@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4005,15 +3792,6 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - jest-changed-files@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" @@ -4419,11 +4197,6 @@ jest@^27.2.4: import-local "^3.0.2" jest-cli "^27.5.1" -jiti@^1.21.6: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - jose@^5.2.2: version "5.9.2" resolved "https://registry.yarnpkg.com/jose/-/jose-5.9.2.tgz#22a22da06edb8fb9e583aa24bafc1e8457b4db92" @@ -4592,18 +4365,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -locter@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/locter/-/locter-2.1.1.tgz#31be1c81db8268162c4c3e4d2700df3f7ed235cc" - integrity sha512-trTg69NVZkfo/70BW7cXAZkFEFDWlQwPcNUO1aDZs/HhOzt7jBPSWldGqK/RXQDmb2tWCpPdRmrHMSXPRm3B2w== - dependencies: - destr "^2.0.3" - ebec "^2.3.0" - fast-glob "^3.3.2" - flat "^5.0.2" - jiti "^1.21.6" - yaml "^2.5.0" - lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" @@ -4660,18 +4421,6 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4679,13 +4428,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - lru-cache@^7.10.1, lru-cache@^7.14.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" @@ -4794,13 +4536,6 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -4818,11 +4553,6 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -4841,11 +4571,6 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^2.1.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" - integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4866,46 +4591,6 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mysql2@^2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-2.3.3.tgz#944f3deca4b16629052ff8614fbf89d5552545a0" - integrity sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA== - dependencies: - denque "^2.0.1" - generate-function "^2.3.1" - iconv-lite "^0.6.3" - long "^4.0.0" - lru-cache "^6.0.0" - named-placeholders "^1.1.2" - seq-queue "^0.0.5" - sqlstring "^2.3.2" - -mysql@^2.18.1: - version "2.18.1" - resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717" - integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig== - dependencies: - bignumber.js "9.0.0" - readable-stream "2.3.7" - safe-buffer "5.1.2" - sqlstring "2.3.1" - -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -named-placeholders@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" - integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== - dependencies: - lru-cache "^7.14.1" - nan@^2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" @@ -4956,14 +4641,6 @@ neon-cli@^0.8: validate-npm-package-license "^3.0.4" validate-npm-package-name "^3.0.0" -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - node-abi@^2.21.0: version "2.30.1" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" @@ -5096,7 +4773,7 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -5227,11 +4904,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -5249,36 +4921,16 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@6.0.1, parse5@^6.0.1: +parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -5299,14 +4951,6 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-to-regexp@0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" @@ -5484,14 +5128,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -rapiq@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/rapiq/-/rapiq-0.9.0.tgz#0f427b1a459064a488ae86d2fb91f14524369240" - integrity sha512-k4oT4RarFBrlLMJ49xUTeQpa/us0uU4I70D/UEnK3FWQ4GENzei01rEQAmvPKAIzACo4NMW+YcYJ7EVfSa7EFg== - dependencies: - ebec "^1.1.0" - smob "^1.4.0" - raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -5527,19 +5163,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -readable-stream@2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - readable-stream@^2.0.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -5579,11 +5202,6 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== -reflect-metadata@^0.2.1, reflect-metadata@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" - integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== - regexp-tree@~0.1.1: version "0.1.27" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" @@ -5735,7 +5353,7 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5805,11 +5423,6 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" -seq-queue@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" - integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== - serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -5902,11 +5515,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -5938,11 +5546,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -smob@^1.4.0, smob@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/smob/-/smob-1.5.0.tgz#85d79a1403abf128d24d3ebc1cdc5e1a9548d3ab" - integrity sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig== - 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" @@ -5992,16 +5595,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sqlstring@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" - integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== - -sqlstring@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" - integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== - stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -6019,11 +5612,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== - streamroller@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" @@ -6041,15 +5629,6 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -6068,15 +5647,6 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -6119,13 +5689,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -6140,13 +5703,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -6281,20 +5837,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - throat@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" @@ -6385,14 +5927,6 @@ ts-jest@^27.0.5: semver "7.x" yargs-parser "20.x" -ts-mysql-migrate@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ts-mysql-migrate/-/ts-mysql-migrate-1.1.2.tgz#6f280f4684cb95440ffa7254b926b494badb8cf3" - integrity sha512-jwhVaMrYBNNhAoZ5XISxzqbnXTHqwazqu/r1UQ6kUaGNPGL43ZFnBiXVj4Gm3pfe3xtCGIaNInehDfdDuigPgw== - dependencies: - "@types/mysql" "^2.15.8" - mysql "^2.18.1" - ts-node@^10.9.1: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -6441,7 +5975,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.2, tslib@^2.6.3: +tslib@^2.4.0, tslib@^2.5.0, tslib@^2.5.2, tslib@^2.6.2, tslib@^2.6.3: version "2.7.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== @@ -6553,42 +6087,6 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typeorm-extension@^3.0.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/typeorm-extension/-/typeorm-extension-3.6.1.tgz#e40711951db48ed59e22ccdebcc43d5527acf5e8" - integrity sha512-OyjYrjtu2VgtjU1vJiUcQ5A+auNWgUtSBfZ4rWgMdsBBkzGpOjFKkPrA6B2RdngJfk9KOGNaw34XI0EATw+LqQ== - dependencies: - "@faker-js/faker" "^8.4.1" - consola "^3.2.3" - envix "^1.5.0" - locter "^2.1.0" - pascal-case "^3.1.2" - rapiq "^0.9.0" - reflect-metadata "^0.2.2" - smob "^1.5.0" - yargs "^17.7.2" - -typeorm@^0.3.16, typeorm@^0.3.17: - version "0.3.20" - resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" - integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== - dependencies: - "@sqltools/formatter" "^1.2.5" - app-root-path "^3.1.0" - buffer "^6.0.3" - chalk "^4.1.2" - cli-highlight "^2.1.11" - dayjs "^1.11.9" - debug "^4.3.4" - dotenv "^16.0.3" - glob "^10.3.10" - mkdirp "^2.1.3" - reflect-metadata "^0.2.1" - sha.js "^2.4.11" - tslib "^2.5.0" - uuid "^9.0.0" - yargs "^17.6.2" - typescript@^4.9.4: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" @@ -6697,11 +6195,6 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^9.0.0, uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" @@ -6882,15 +6375,6 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -6900,15 +6384,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6954,11 +6429,6 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" - integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== - yargs-parser@20.x, yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -6969,7 +6439,7 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^16.0.0, yargs@^16.2.0: +yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -6982,7 +6452,7 @@ yargs@^16.0.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.6.2, yargs@^17.7.2: +yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index 0cbebc733..4ada82244 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0086-add_community_location', + DB_VERSION: '0087-add_dlt_users_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From 4dc4451b2f48546fc774229eb20e8c95263ec5f3 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 23 Sep 2024 19:11:00 +0200 Subject: [PATCH 12/23] adjustments --- .../apis/dltConnector/DltConnectorClient.ts | 28 +++++-- backend/src/graphql/resolver/UserResolver.ts | 5 +- .../tasks/sendTransactionsToDltConnector.ts | 84 ++++++++++++------- .../DltTransaction.ts | 36 ++++++++ .../0087-add_dlt_users_table/DltUser.ts | 3 + database/entity/DltTransaction.ts | 2 +- .../migrations/0087-add_dlt_users_table.ts | 27 ++++-- dlt-connector/src/client/GradidoNode.ts | 2 +- .../src/graphql/input/TransactionDraft.ts | 8 +- dlt-connector/src/index.ts | 16 +++- .../sendToIota/CreationTransaction.role.ts | 1 + .../sendToIota/TransferTransaction.role.ts | 1 + .../logging/TransactionDraftLogging.view.ts | 1 - 13 files changed, 161 insertions(+), 53 deletions(-) create mode 100644 database/entity/0087-add_dlt_users_table/DltTransaction.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 4737d95bc..75e9b2544 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -13,13 +13,18 @@ import { UserAccountDraft } from './model/UserAccountDraft' import { UserIdentifier } from './model/UserIdentifier' const sendTransaction = gql` - mutation ($input: TransactionInput!) { + mutation ($input: TransactionDraft!) { sendTransaction(data: $input) { error { message name } succeed + recipe { + createdAt + type + messageIdHex + } } } ` @@ -32,6 +37,11 @@ const registerAddress = gql` name } succeed + recipe { + createdAt + type + messageIdHex + } } } ` @@ -126,7 +136,6 @@ export class DltConnectorClient { amount: amountString, type: typeString, createdAt: transaction.balanceDate.toISOString(), - backendTransactionId: transaction.id, targetDate: transaction.creationDate?.toISOString(), }, } @@ -142,9 +151,14 @@ export class DltConnectorClient { if (result.error) { throw new Error(result.error.message) } + console.log(result) return result } catch (e) { - throw new LogError('Error send sending transaction to dlt-connector: ', e) + if (e instanceof Error) { + throw new LogError(`from dlt-connector: ${e.message}`) + } else { + throw new LogError('Exception sending transfer transaction to dlt-connector', e) + } } } @@ -172,11 +186,15 @@ export class DltConnectorClient { result, }) if (result.error) { - logger.error('Error sending register address transaction to dlt-connector', result.error) + throw new Error(result.error.message) } return result } catch (e) { - logger.error('Exception sending register address transaction to dlt-connector', e) + if (e instanceof Error) { + throw new LogError(`from dlt-connector: ${e.message}`) + } else { + throw new LogError('Exception sending register address transaction to dlt-connector', e) + } } } } diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 6ddd15705..9dbbba1f1 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -66,7 +66,10 @@ import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { communityDbUser } from '@/util/communityUser' import { hasElopageBuys } from '@/util/hasElopageBuys' -import { InterruptiveSleepManager, TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/util/InterruptiveSleepManager' +import { + InterruptiveSleepManager, + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, +} from '@/util/InterruptiveSleepManager' import { getTimeDurationObject, printTimeDuration } from '@/util/time' import random from 'random-bigint' diff --git a/backend/src/tasks/sendTransactionsToDltConnector.ts b/backend/src/tasks/sendTransactionsToDltConnector.ts index 26535e082..62c7c5ad7 100644 --- a/backend/src/tasks/sendTransactionsToDltConnector.ts +++ b/backend/src/tasks/sendTransactionsToDltConnector.ts @@ -33,31 +33,60 @@ export async function sendTransactionsToDltConnector(): Promise { while (true) { const pendingTransaction = await findNextPendingTransaction() if (pendingTransaction instanceof User) { - const result = await dltConnector.registerAddress(pendingTransaction) - if (result?.succeed && result.recipe) { - const dltUser = DltUser.create() - dltUser.userId = pendingTransaction.id - dltUser.messageId = result.recipe.messageIdHex - // wait until saved, necessary before next call to findNextPendingTransaction - await DltUser.save(dltUser) - logger.info('store dltUser: messageId=%s in dltTx=%d', dltUser.messageId, dltUser.id) + const dltUser = DltUser.create() + dltUser.userId = pendingTransaction.id + try { + const result = await dltConnector.registerAddress(pendingTransaction) + if (result?.succeed && result.recipe) { + dltUser.messageId = result.recipe.messageIdHex + } + } catch (e) { + if (e instanceof Error) { + dltUser.error = e.message + } else if (typeof e === 'string') { + dltUser.error = e + } + } + // wait until saved, necessary before next call to findNextPendingTransaction + await DltUser.save(dltUser) + if (dltUser.messageId) { + logger.info('store dltUser: messageId=%s, id=%d', dltUser.messageId, dltUser.id) + } else { + logger.error('store dltUser with error: id=%d, error=%s', dltUser.id, dltUser.error) } } else if (pendingTransaction instanceof Transaction) { - const result = await dltConnector.transmitTransaction(pendingTransaction) - if (result?.succeed && result.recipe) { - const dltTransaction = DltTransaction.create() - dltTransaction.transactionId = pendingTransaction.id - dltTransaction.messageId = result.recipe.messageIdHex - // wait until saved, necessary before next call to findNextPendingTransaction - await DltTransaction.save(dltTransaction) + const dltTransaction = DltTransaction.create() + dltTransaction.transactionId = pendingTransaction.id + try { + const result = await dltConnector.transmitTransaction(pendingTransaction) + if (result?.succeed && result.recipe) { + dltTransaction.messageId = result.recipe.messageIdHex + } else { + dltTransaction.error = 'skipped' + } + } catch (e) { + if (e instanceof Error) { + dltTransaction.error = e.message + } else if (typeof e === 'string') { + dltTransaction.error = e + } + } + // wait until saved, necessary before next call to findNextPendingTransaction + await DltTransaction.save(dltTransaction) + if (dltTransaction.messageId) { logger.info( - 'store dltTransaction: messageId=%s in dltTx=%d', + 'store dltTransaction: messageId=%s, id=%d', dltTransaction.messageId, dltTransaction.id, ) + } else { + logger.error( + 'store dltTransaction with error: id=%d, error=%s', + dltTransaction.id, + dltTransaction.error, + ) } } else { - // nothing to do, break inner loop and sleep until new work has arrived break } } @@ -72,22 +101,21 @@ export async function sendTransactionsToDltConnector(): Promise { } async function findNextPendingTransaction(): Promise { - const lastTransactionPromise: Promise = Transaction.createQueryBuilder() - .select() - .leftJoin(DltTransaction, 'dltTransaction', 'transaction.id = dltTransaction.transactionId') - .where('dltTransaction.transactionId IS NULL') + const lastTransactionPromise: Promise = Transaction.createQueryBuilder() + .leftJoin(DltTransaction, 'dltTransaction', 'Transaction.id = dltTransaction.transactionId') + .where('dltTransaction.transaction_id IS NULL') // eslint-disable-next-line camelcase - .orderBy({ balance_date: 'ASC', id: 'ASC' }) + .orderBy({ balance_date: 'ASC', Transaction_id: 'ASC' }) .limit(1) - .getRawOne() + .getOne() - const lastUserPromise: Promise = User.createQueryBuilder() - .leftJoin(DltUser, 'dltUser', 'user.id = dltUser.userId') - .where('dltUser.userId IS NULL') + const lastUserPromise: Promise = User.createQueryBuilder() + .leftJoin(DltUser, 'dltUser', 'User.id = dltUser.userId') + .where('dltUser.user_id IS NULL') // eslint-disable-next-line camelcase - .orderBy({ created_at: 'ASC', id: 'ASC' }) + .orderBy({ User_created_at: 'ASC', User_id: 'ASC' }) .limit(1) - .getRawOne() + .getOne() const results = await Promise.all([lastTransactionPromise, lastUserPromise]) if (results[0] && results[1]) { diff --git a/database/entity/0087-add_dlt_users_table/DltTransaction.ts b/database/entity/0087-add_dlt_users_table/DltTransaction.ts new file mode 100644 index 000000000..653077bac --- /dev/null +++ b/database/entity/0087-add_dlt_users_table/DltTransaction.ts @@ -0,0 +1,36 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { Transaction } from '../Transaction' + +@Entity('dlt_transactions', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class DltTransaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'transaction_id', type: 'int', unsigned: true, nullable: false }) + transactionId: number + + @Column({ + name: 'message_id', + length: 64, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + messageId: string + + @Column({ name: 'verified', type: 'bool', nullable: false, default: false }) + verified: boolean + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @Column({ name: 'verified_at', nullable: true, default: null, type: 'datetime' }) + verifiedAt: Date | null + + @Column({ name: 'error', type: 'text', nullable: true }) + error: string | null + + @OneToOne(() => Transaction, (transaction) => transaction.dltTransaction) + @JoinColumn({ name: 'transaction_id' }) + transaction?: Transaction | null +} diff --git a/database/entity/0087-add_dlt_users_table/DltUser.ts b/database/entity/0087-add_dlt_users_table/DltUser.ts index ca916e128..483437d58 100644 --- a/database/entity/0087-add_dlt_users_table/DltUser.ts +++ b/database/entity/0087-add_dlt_users_table/DltUser.ts @@ -27,6 +27,9 @@ export class DltUser extends BaseEntity { @Column({ name: 'verified_at', nullable: true, default: null, type: 'datetime' }) verifiedAt: Date | null + @Column({ name: 'error', type: 'text', nullable: true }) + error: string | null + @OneToOne(() => User, (user) => user.dltUser) @JoinColumn({ name: 'user_id' }) user?: User | null diff --git a/database/entity/DltTransaction.ts b/database/entity/DltTransaction.ts index d9c03306c..31c21d583 100644 --- a/database/entity/DltTransaction.ts +++ b/database/entity/DltTransaction.ts @@ -1 +1 @@ -export { DltTransaction } from './0070-add_dlt_transactions_table/DltTransaction' +export { DltTransaction } from './0087-add_dlt_users_table/DltTransaction' diff --git a/database/migrations/0087-add_dlt_users_table.ts b/database/migrations/0087-add_dlt_users_table.ts index fdb310c67..95f5c2ca2 100644 --- a/database/migrations/0087-add_dlt_users_table.ts +++ b/database/migrations/0087-add_dlt_users_table.ts @@ -3,17 +3,28 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { await queryFn(` - CREATE TABLE dlt_users ( - id int unsigned NOT NULL AUTO_INCREMENT, - user_id int(10) unsigned NOT NULL, - message_id varchar(64) NULL DEFAULT NULL, - verified tinyint(4) NOT NULL DEFAULT 0, - created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - verified_at datetime(3), + CREATE TABLE \`dlt_users\` ( + \`id\` int unsigned NOT NULL AUTO_INCREMENT, + \`user_id\` int(10) unsigned NOT NULL, + \`message_id\` varchar(64) NULL DEFAULT NULL, + \`verified\` tinyint(4) NOT NULL DEFAULT 0, + \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + \`verified_at\` datetime(3), + \`error\` text NULL DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) + + await queryFn( + 'ALTER TABLE `dlt_transactions` RENAME COLUMN `transactions_id` TO `transaction_id`;', + ) + await queryFn('ALTER TABLE `dlt_transactions` ADD COLUMN `error` text NULL DEFAULT NULL;') } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn(`DROP TABLE dlt_users;`) + await queryFn(`DROP TABLE \`dlt_users\`;`) + + await queryFn( + 'ALTER TABLE `dlt_transactions` RENAME COLUMN `transaction_id` TO `transactions_id`;', + ) + await queryFn('ALTER TABLE `dlt_transactions` DROP COLUMN `error`;') } diff --git a/dlt-connector/src/client/GradidoNode.ts b/dlt-connector/src/client/GradidoNode.ts index 92a211768..a33e5adc2 100644 --- a/dlt-connector/src/client/GradidoNode.ts +++ b/dlt-connector/src/client/GradidoNode.ts @@ -6,7 +6,7 @@ import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrp import { CONFIG } from '@/config' import { logger } from '@/logging/logger' import { LogError } from '@/server/LogError' -import { confirmedTransactionFromBase64, getEnumValue } from '@/utils/typeConverter' +import { confirmedTransactionFromBase64 } from '@/utils/typeConverter' const client = new JsonRpcClient({ url: CONFIG.NODE_SERVER_URL, diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 59e1ecafd..d1fa48c3c 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -1,8 +1,8 @@ // https://www.npmjs.com/package/@apollo/protobufjs import { InputTransactionType } from '@enum/InputTransactionType' import { isValidDateString, isValidNumberString } from '@validator/DateString' -import { IsEnum, IsObject, IsPositive, ValidateNested } from 'class-validator' -import { InputType, Field, Int } from 'type-graphql' +import { IsEnum, IsObject, ValidateNested } from 'class-validator' +import { InputType, Field } from 'type-graphql' import { UserIdentifier } from './UserIdentifier' @@ -18,10 +18,6 @@ export class TransactionDraft { @ValidateNested() linkedUser: UserIdentifier - @Field(() => Int) - @IsPositive() - backendTransactionId: number - @Field(() => String) @isValidNumberString() amount: string diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index c025296fd..ac5366127 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -72,9 +72,21 @@ async function main() { const communityDraft = await backend.getHomeCommunityDraft() KeyPairCacheManager.getInstance().setHomeCommunityUUID(communityDraft.uuid) + logger.info('home community topic: %s', uuid4ToHash(communityDraft.uuid).convertToHex()) + logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) // ask gradido node if community blockchain was created - const firstTransaction = await getTransaction(1, uuid4ToHash(communityDraft.uuid).convertToHex()) - if (!firstTransaction) { + try { + const firstTransaction = await getTransaction( + 1, + uuid4ToHash(communityDraft.uuid).convertToHex(), + ) + if (!firstTransaction) { + // if not exist, create community root transaction + await SendToIotaContext(communityDraft) + } + } catch (e) { + // eslint-disable-next-line no-console + // console.log('error requesting gradido node: ', e) // if not exist, create community root transaction await SendToIotaContext(communityDraft) } diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index 0e80e19a4..b7a074a7a 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -29,6 +29,7 @@ export class CreationTransactionRole extends AbstractTransactionRole { } builder .setCreatedAt(new Date(this.self.createdAt)) + .setMemo('dummy memo for creation') .setTransactionCreation( new TransferAmount(recipientKeyPair.getPublicKey(), this.self.amount.toString()), new Date(this.self.targetDate), diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index c26f8c61f..e0749f002 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -26,6 +26,7 @@ export class TransferTransactionRole extends AbstractTransactionRole { const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) builder .setCreatedAt(new Date(this.self.createdAt)) + .setMemo('dummy memo for transfer') .setTransactionTransfer( new TransferAmount(senderKeyPair.getPublicKey(), this.self.amount.toString()), recipientKeyPair.getPublicKey(), diff --git a/dlt-connector/src/logging/TransactionDraftLogging.view.ts b/dlt-connector/src/logging/TransactionDraftLogging.view.ts index 655a9ab9e..b68f6d746 100644 --- a/dlt-connector/src/logging/TransactionDraftLogging.view.ts +++ b/dlt-connector/src/logging/TransactionDraftLogging.view.ts @@ -15,7 +15,6 @@ export class TransactionDraftLoggingView extends AbstractLoggingView { return { user: new UserIdentifierLoggingView(this.self.user).toJSON(), linkedUser: new UserIdentifierLoggingView(this.self.linkedUser).toJSON(), - backendTransactionId: this.self.backendTransactionId, amount: Number(this.self.amount), type: getEnumValue(InputTransactionType, this.self.type), createdAt: this.self.createdAt, From 93883ae9f26bcf6a4c20ef564291238cda247542 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 7 Nov 2024 17:35:37 +0100 Subject: [PATCH 13/23] fix and refactor dlt --- backend/package.json | 1 + .../apis/dltConnector/DltConnectorClient.ts | 138 +++++++---------- .../dltConnector/model/TransactionDraft.ts | 38 +++++ .../dltConnector/model/UserAccountDraft.ts | 10 +- .../apis/dltConnector/model/UserIdentifier.ts | 8 +- .../sendTransactionsToDltConnector.test.ts | 0 .../sendTransactionsToDltConnector.ts | 142 ++++++++++++++++++ .../resolver/TransactionLinkResolver.ts | 2 +- backend/src/index.ts | 2 +- .../tasks/sendTransactionsToDltConnector.ts | 129 ---------------- backend/yarn.lock | 17 +++ .../src/graphql/input/TransactionDraft.ts | 5 +- .../src/graphql/input/UserAccountDraft.ts | 3 +- .../src/graphql/model/TransactionResult.ts | 2 +- .../graphql/resolver/TransactionsResolver.ts | 3 +- .../src/graphql/validator/DateString.ts | 2 +- .../KeyPairCalculation.context.ts | 2 +- dlt-connector/yarn.lock | 41 ++++- 18 files changed, 321 insertions(+), 224 deletions(-) create mode 100755 backend/src/apis/dltConnector/model/TransactionDraft.ts rename backend/src/{tasks => apis/dltConnector}/sendTransactionsToDltConnector.test.ts (100%) create mode 100644 backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts delete mode 100644 backend/src/tasks/sendTransactionsToDltConnector.ts diff --git a/backend/package.json b/backend/package.json index ba45225a2..beb460fee 100644 --- a/backend/package.json +++ b/backend/package.json @@ -61,6 +61,7 @@ "@types/jest": "^27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^16.10.3", + "@types/node-fetch": "^2.6.11", "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "@types/uuid": "^8.3.4", diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 75e9b2544..3402e0844 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -1,16 +1,17 @@ import { Transaction as DbTransaction } from '@entity/Transaction' import { User } from '@entity/User' import { gql, GraphQLClient } from 'graphql-request' +// eslint-disable-next-line import/named, n/no-extraneous-import +import { FetchError } from 'node-fetch' import { CONFIG } from '@/config' import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' -import { AccountType } from './enum/AccountType' +import { TransactionDraft } from './model/TransactionDraft' import { TransactionResult } from './model/TransactionResult' import { UserAccountDraft } from './model/UserAccountDraft' -import { UserIdentifier } from './model/UserIdentifier' const sendTransaction = gql` mutation ($input: TransactionDraft!) { @@ -46,17 +47,6 @@ const registerAddress = gql` } ` -// from ChatGPT -function getTransactionTypeString(id: TransactionTypeId): string { - const key = Object.keys(TransactionTypeId).find( - (key) => TransactionTypeId[key as keyof typeof TransactionTypeId] === id, - ) - if (key === undefined) { - throw new LogError('invalid transaction type id: ' + id.toString()) - } - return key -} - // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts /** @@ -109,92 +99,74 @@ export class DltConnectorClient { return DltConnectorClient.instance } + private getTransactionParams(input: DbTransaction | User): TransactionDraft | UserAccountDraft { + if (input instanceof DbTransaction) { + return new TransactionDraft(input) + } else if (input instanceof User) { + return new UserAccountDraft(input) + } + throw new LogError('transaction should be either Transaction or User Entity') + } + + private handleTransactionResult(result: TransactionResult) { + if (result.error) { + throw new Error(result.error.message) + } + return result + } + + private async sendTransaction(input: TransactionDraft) { + const { + data: { sendTransaction: result }, + } = await this.client.rawRequest<{ sendTransaction: TransactionResult }>(sendTransaction, { + input, + }) + return this.handleTransactionResult(result) + } + + private async registerAddress(input: UserAccountDraft) { + const { + data: { registerAddress: result }, + } = await this.client.rawRequest<{ registerAddress: TransactionResult }>(registerAddress, { + input, + }) + return this.handleTransactionResult(result) + } + /** * transmit transaction via dlt-connector to iota * and update dltTransactionId of transaction in db with iota message id */ public async transmitTransaction( - transaction: DbTransaction, + transaction: DbTransaction | User, ): Promise { // we don't need the receive transactions, there contain basically the same data as the send transactions - if ((transaction.typeId as TransactionTypeId) === TransactionTypeId.RECEIVE) { + if ( + transaction instanceof DbTransaction && + (transaction.typeId as TransactionTypeId) === TransactionTypeId.RECEIVE + ) { return } - const typeString = getTransactionTypeString(transaction.typeId) - // no negative values in dlt connector, gradido concept don't use negative values so the code don't use it too - const amountString = transaction.amount.abs().toString() - const params = { - input: { - user: { - uuid: transaction.userGradidoID, - communityUuid: transaction.userCommunityUuid, - } as UserIdentifier, - linkedUser: { - uuid: transaction.linkedUserGradidoID, - communityUuid: transaction.linkedUserCommunityUuid, - } as UserIdentifier, - amount: amountString, - type: typeString, - createdAt: transaction.balanceDate.toISOString(), - targetDate: transaction.creationDate?.toISOString(), - }, - } + + const input = this.getTransactionParams(transaction) try { - // TODO: add account nr for user after they have also more than one account in backend - logger.debug('transmit transaction to dlt connector', params) - const { - data: { sendTransaction: result }, - } = await this.client.rawRequest<{ sendTransaction: TransactionResult }>( - sendTransaction, - params, - ) - if (result.error) { - throw new Error(result.error.message) + logger.debug('transmit transaction or user to dlt connector', input) + if (input instanceof TransactionDraft) { + return await this.sendTransaction(input) + } else if (input instanceof UserAccountDraft) { + return await this.registerAddress(input) + } else { + throw new LogError('unhandled branch reached') } - console.log(result) - return result } catch (e) { - if (e instanceof Error) { + logger.error(e) + if (e instanceof FetchError) { + throw e + } else if (e instanceof Error) { throw new LogError(`from dlt-connector: ${e.message}`) } else { throw new LogError('Exception sending transfer transaction to dlt-connector', e) } } } - - public async registerAddress(dbUser: User): Promise { - const params = { - input: { - user: { - uuid: dbUser.gradidoID, - communityUuid: dbUser.communityUuid, - accountNr: 1, - } as UserIdentifier, - createdAt: dbUser.createdAt.toISOString(), - accountType: AccountType.COMMUNITY_HUMAN, - } as UserAccountDraft, - } - try { - const { - data: { registerAddress: result }, - } = await this.client.rawRequest<{ registerAddress: TransactionResult }>( - registerAddress, - params, - ) - logger.info('send register address transaction to dlt-connector', { - params, - result, - }) - if (result.error) { - throw new Error(result.error.message) - } - return result - } catch (e) { - if (e instanceof Error) { - throw new LogError(`from dlt-connector: ${e.message}`) - } else { - throw new LogError('Exception sending register address transaction to dlt-connector', e) - } - } - } } diff --git a/backend/src/apis/dltConnector/model/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts new file mode 100755 index 000000000..e6b8f8d6d --- /dev/null +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -0,0 +1,38 @@ +// https://www.npmjs.com/package/@apollo/protobufjs +import { Transaction } from '@entity/Transaction' + +import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' +import { LogError } from '@/server/LogError' + +import { UserIdentifier } from './UserIdentifier' + +export class TransactionDraft { + user: UserIdentifier + linkedUser: UserIdentifier + amount: string + type: string + createdAt: string + // only for creation transactions + targetDate?: string + + constructor(transaction: Transaction) { + if ( + !transaction.linkedUserGradidoID || + !transaction.linkedUserCommunityUuid || + !transaction.userCommunityUuid + ) { + throw new LogError( + `missing necessary field in transaction: ${transaction.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, + ) + } + this.user = new UserIdentifier(transaction.userGradidoID, transaction.userCommunityUuid) + this.linkedUser = new UserIdentifier( + transaction.linkedUserGradidoID, + transaction.linkedUserCommunityUuid, + ) + this.amount = transaction.amount.abs().toString() + this.type = TransactionTypeId[transaction.typeId] + this.createdAt = transaction.balanceDate.toISOString() + this.targetDate = transaction.creationDate?.toISOString() + } +} diff --git a/backend/src/apis/dltConnector/model/UserAccountDraft.ts b/backend/src/apis/dltConnector/model/UserAccountDraft.ts index f4aff4cb4..dc52065d1 100644 --- a/backend/src/apis/dltConnector/model/UserAccountDraft.ts +++ b/backend/src/apis/dltConnector/model/UserAccountDraft.ts @@ -1,9 +1,17 @@ +import { User } from '@entity/User' + import { AccountType } from '@/apis/dltConnector/enum/AccountType' import { UserIdentifier } from './UserIdentifier' -export interface UserAccountDraft { +export class UserAccountDraft { user: UserIdentifier createdAt: string accountType: AccountType + + constructor(user: User) { + this.user = new UserIdentifier(user.gradidoID, user.communityUuid) + this.createdAt = user.createdAt.toISOString() + this.accountType = AccountType.COMMUNITY_HUMAN + } } diff --git a/backend/src/apis/dltConnector/model/UserIdentifier.ts b/backend/src/apis/dltConnector/model/UserIdentifier.ts index e265593be..1824d17f3 100644 --- a/backend/src/apis/dltConnector/model/UserIdentifier.ts +++ b/backend/src/apis/dltConnector/model/UserIdentifier.ts @@ -1,5 +1,11 @@ -export interface UserIdentifier { +export class UserIdentifier { uuid: string communityUuid: string accountNr?: number + + constructor(uuid: string, communityUuid: string, accountNr?: number) { + this.uuid = uuid + this.communityUuid = communityUuid + this.accountNr = accountNr + } } diff --git a/backend/src/tasks/sendTransactionsToDltConnector.test.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts similarity index 100% rename from backend/src/tasks/sendTransactionsToDltConnector.test.ts rename to backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts new file mode 100644 index 000000000..36974b5cf --- /dev/null +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts @@ -0,0 +1,142 @@ +import { DltTransaction } from '@entity/DltTransaction' +import { DltUser } from '@entity/DltUser' +import { Transaction } from '@entity/Transaction' +import { User } from '@entity/User' +// eslint-disable-next-line import/named, n/no-extraneous-import +import { FetchError } from 'node-fetch' + +import { DltConnectorClient } from '@dltConnector/DltConnectorClient' + +import { TransactionResult } from '@/apis/dltConnector/model/TransactionResult' +import { backendLogger as logger } from '@/server/logger' +import { + InterruptiveSleepManager, + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, +} from '@/util/InterruptiveSleepManager' + +let isLoopRunning = true + +export const stopSendTransactionsToDltConnector = (): void => { + isLoopRunning = false +} + +function logTransactionResult( + type: 'dltUser' | 'dltTransaction', + data: { id: number; messageId: string; error: string | null }, +): void { + if (data.error) { + logger.error(`Store ${type} with error: id=${data.id}, error=${data.error}`) + } else { + logger.info(`Store ${type}: messageId=${data.messageId}, id=${data.id}`) + } +} + +async function saveTransactionResult( + pendingTransaction: User | Transaction, + messageId: string, + error: string | null, +): Promise { + if (pendingTransaction instanceof User) { + const dltUser = DltUser.create() + dltUser.userId = pendingTransaction.id + dltUser.messageId = messageId + dltUser.error = error + await DltUser.save(dltUser) + logTransactionResult('dltUser', dltUser) + } else if (pendingTransaction instanceof Transaction) { + const dltTransaction = DltTransaction.create() + dltTransaction.transactionId = pendingTransaction.id + dltTransaction.messageId = messageId + dltTransaction.error = error + await DltTransaction.save(dltTransaction) + logTransactionResult('dltTransaction', dltTransaction) + } +} + +async function findNextPendingTransaction(): Promise { + const lastTransactionPromise: Promise = Transaction.createQueryBuilder() + .leftJoin(DltTransaction, 'dltTransaction', 'Transaction.id = dltTransaction.transactionId') + .where('dltTransaction.transaction_id IS NULL') + // eslint-disable-next-line camelcase + .orderBy({ balance_date: 'ASC', Transaction_id: 'ASC' }) + .limit(1) + .getOne() + + const lastUserPromise: Promise = User.createQueryBuilder() + .leftJoin(DltUser, 'dltUser', 'User.id = dltUser.userId') + .where('dltUser.user_id IS NULL') + // eslint-disable-next-line camelcase + .orderBy({ User_created_at: 'ASC', User_id: 'ASC' }) + .limit(1) + .getOne() + + const results = await Promise.all([lastTransactionPromise, lastUserPromise]) + if (results[0] && results[1]) { + return results[0].balanceDate < results[1].createdAt ? results[0] : results[1] + } else if (results[0]) { + return results[0] + } else if (results[1]) { + return results[1] + } + return null +} + +async function processPendingTransactions(dltConnector: DltConnectorClient): Promise { + let pendingTransaction: Transaction | User | null = null + while ((pendingTransaction = await findNextPendingTransaction())) { + let result: TransactionResult | undefined + let messageId = '' + let error: string | null = null + + try { + result = await dltConnector.transmitTransaction(pendingTransaction) + if (result?.succeed && result.recipe) { + messageId = result.recipe.messageIdHex + } else { + error = 'skipped' + } + } catch (e) { + if (e instanceof FetchError) { + throw e + } + error = e instanceof Error ? e.message : String(e) + } + + await saveTransactionResult(pendingTransaction, messageId, error) + } +} + +export async function sendTransactionsToDltConnector(): Promise { + const dltConnector = DltConnectorClient.getInstance() + + if (!dltConnector) { + logger.info('Sending to DltConnector currently not configured...') + isLoopRunning = false + return + } + + logger.info('Starting sendTransactionsToDltConnector task') + + // eslint-disable-next-line no-unmodified-loop-condition + while (isLoopRunning) { + try { + // return after no pending transactions are left + await processPendingTransactions(dltConnector) + await InterruptiveSleepManager.getInstance().sleep( + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, + 1000, + ) + } catch (e) { + // couldn't connect to dlt-connector? We wait + if (e instanceof FetchError) { + logger.error(`error connecting dlt-connector, wait 5 seconds before retry: ${String(e)}`) + await InterruptiveSleepManager.getInstance().sleep( + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, + 5000, + ) + } else { + logger.error(`Error while sending to DLT-connector or writing messageId`, e) + } + } + } +} diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 0ef7f0586..8a5c92cf4 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -38,7 +38,7 @@ import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' import { fullName } from '@/util/utilities' import { calculateBalance } from '@/util/validate' -import { sendTransactionsToDltConnector } from '../../tasks/sendTransactionsToDltConnector' +import { sendTransactionsToDltConnector } from '../../apis/dltConnector/sendTransactionsToDltConnector' import { executeTransaction } from './TransactionResolver' import { getUserCreation, validateContribution } from './util/creations' diff --git a/backend/src/index.ts b/backend/src/index.ts index 5cb3574e4..dd166d3d5 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,7 +1,7 @@ import { CONFIG } from './config' import { startValidateCommunities } from './federation/validateCommunities' import { createServer } from './server/createServer' -import { sendTransactionsToDltConnector } from './tasks/sendTransactionsToDltConnector' +import { sendTransactionsToDltConnector } from './apis/dltConnector/sendTransactionsToDltConnector' async function main() { const { app } = await createServer() diff --git a/backend/src/tasks/sendTransactionsToDltConnector.ts b/backend/src/tasks/sendTransactionsToDltConnector.ts deleted file mode 100644 index 62c7c5ad7..000000000 --- a/backend/src/tasks/sendTransactionsToDltConnector.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { DltTransaction } from '@entity/DltTransaction' -import { DltUser } from '@entity/DltUser' -import { Transaction } from '@entity/Transaction' -import { User } from '@entity/User' - -import { DltConnectorClient } from '@dltConnector/DltConnectorClient' - -import { backendLogger as logger } from '@/server/logger' -import { - InterruptiveSleepManager, - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, -} from '@/util/InterruptiveSleepManager' - -let running = true - -export const stopSendTransactionsToDltConnector = (): void => { - running = false -} - -export async function sendTransactionsToDltConnector(): Promise { - const dltConnector = DltConnectorClient.getInstance() - if (!dltConnector) { - logger.info('sending to DltConnector currently not configured...') - running = false - return - } - logger.info('start sendTransactionsToDltConnector task') - - // eslint-disable-next-line no-unmodified-loop-condition - while (running) { - try { - // loop while work could be found - while (true) { - const pendingTransaction = await findNextPendingTransaction() - if (pendingTransaction instanceof User) { - const dltUser = DltUser.create() - dltUser.userId = pendingTransaction.id - try { - const result = await dltConnector.registerAddress(pendingTransaction) - if (result?.succeed && result.recipe) { - dltUser.messageId = result.recipe.messageIdHex - } - } catch (e) { - if (e instanceof Error) { - dltUser.error = e.message - } else if (typeof e === 'string') { - dltUser.error = e - } - } - // wait until saved, necessary before next call to findNextPendingTransaction - await DltUser.save(dltUser) - if (dltUser.messageId) { - logger.info('store dltUser: messageId=%s, id=%d', dltUser.messageId, dltUser.id) - } else { - logger.error('store dltUser with error: id=%d, error=%s', dltUser.id, dltUser.error) - } - } else if (pendingTransaction instanceof Transaction) { - const dltTransaction = DltTransaction.create() - dltTransaction.transactionId = pendingTransaction.id - try { - const result = await dltConnector.transmitTransaction(pendingTransaction) - if (result?.succeed && result.recipe) { - dltTransaction.messageId = result.recipe.messageIdHex - } else { - dltTransaction.error = 'skipped' - } - } catch (e) { - if (e instanceof Error) { - dltTransaction.error = e.message - } else if (typeof e === 'string') { - dltTransaction.error = e - } - } - // wait until saved, necessary before next call to findNextPendingTransaction - await DltTransaction.save(dltTransaction) - if (dltTransaction.messageId) { - logger.info( - 'store dltTransaction: messageId=%s, id=%d', - dltTransaction.messageId, - dltTransaction.id, - ) - } else { - logger.error( - 'store dltTransaction with error: id=%d, error=%s', - dltTransaction.id, - dltTransaction.error, - ) - } - } else { - break - } - } - await InterruptiveSleepManager.getInstance().sleep( - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, - 1000, - ) - } catch (e) { - logger.error(`error while sending to dlt-connector or writing messageId`, e) - } - } -} - -async function findNextPendingTransaction(): Promise { - const lastTransactionPromise: Promise = Transaction.createQueryBuilder() - .leftJoin(DltTransaction, 'dltTransaction', 'Transaction.id = dltTransaction.transactionId') - .where('dltTransaction.transaction_id IS NULL') - // eslint-disable-next-line camelcase - .orderBy({ balance_date: 'ASC', Transaction_id: 'ASC' }) - .limit(1) - .getOne() - - const lastUserPromise: Promise = User.createQueryBuilder() - .leftJoin(DltUser, 'dltUser', 'User.id = dltUser.userId') - .where('dltUser.user_id IS NULL') - // eslint-disable-next-line camelcase - .orderBy({ User_created_at: 'ASC', User_id: 'ASC' }) - .limit(1) - .getOne() - - const results = await Promise.all([lastTransactionPromise, lastUserPromise]) - if (results[0] && results[1]) { - return results[0].balanceDate < results[1].createdAt ? results[0] : results[1] - } else if (results[0]) { - return results[0] - } else if (results[1]) { - return results[1] - } - return null -} diff --git a/backend/yarn.lock b/backend/yarn.lock index 5c33b1ce8..9e32b7d8c 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1126,6 +1126,14 @@ dependencies: "@types/node" "*" +"@types/node-fetch@^2.6.11": + version "2.6.11" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + "@types/node@*", "@types/node@^16.10.3": version "16.10.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" @@ -3417,6 +3425,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index d1fa48c3c..3f1f57a85 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -1,9 +1,10 @@ // https://www.npmjs.com/package/@apollo/protobufjs -import { InputTransactionType } from '@enum/InputTransactionType' -import { isValidDateString, isValidNumberString } from '@validator/DateString' import { IsEnum, IsObject, ValidateNested } from 'class-validator' import { InputType, Field } from 'type-graphql' +import { InputTransactionType } from '@enum/InputTransactionType' +import { isValidDateString, isValidNumberString } from '@validator/DateString' + import { UserIdentifier } from './UserIdentifier' @InputType() diff --git a/dlt-connector/src/graphql/input/UserAccountDraft.ts b/dlt-connector/src/graphql/input/UserAccountDraft.ts index e10be9574..9ae544e32 100644 --- a/dlt-connector/src/graphql/input/UserAccountDraft.ts +++ b/dlt-connector/src/graphql/input/UserAccountDraft.ts @@ -1,9 +1,10 @@ // https://www.npmjs.com/package/@apollo/protobufjs -import { isValidDateString } from '@validator/DateString' import { IsEnum, IsObject, ValidateNested } from 'class-validator' import { InputType, Field } from 'type-graphql' +import { isValidDateString } from '@validator/DateString' + import { AccountType } from '@/graphql/enum/AccountType' import { UserIdentifier } from './UserIdentifier' diff --git a/dlt-connector/src/graphql/model/TransactionResult.ts b/dlt-connector/src/graphql/model/TransactionResult.ts index 370c9827d..346920310 100644 --- a/dlt-connector/src/graphql/model/TransactionResult.ts +++ b/dlt-connector/src/graphql/model/TransactionResult.ts @@ -19,7 +19,7 @@ export class TransactionResult { @Field(() => TransactionError, { nullable: true }) error?: TransactionError - // if no error happend, the message id of the iota transaction + // if no error happened, the message id of the iota transaction @Field(() => TransactionRecipe, { nullable: true }) recipe?: TransactionRecipe diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index 50636dee3..e5e537ad9 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,6 +1,7 @@ -import { TransactionDraft } from '@input/TransactionDraft' import { Resolver, Arg, Mutation } from 'type-graphql' +import { TransactionDraft } from '@input/TransactionDraft' + import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' import { TransactionError } from '../model/TransactionError' diff --git a/dlt-connector/src/graphql/validator/DateString.ts b/dlt-connector/src/graphql/validator/DateString.ts index 2be057194..0445c1bbe 100644 --- a/dlt-connector/src/graphql/validator/DateString.ts +++ b/dlt-connector/src/graphql/validator/DateString.ts @@ -38,4 +38,4 @@ export function isValidNumberString(validationOptions?: ValidationOptions) { }, }) } -} \ No newline at end of file +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts index 8e6466df5..012168bb0 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -12,7 +12,7 @@ import { UserKeyPairRole } from './UserKeyPair.role' /** * @DCI-Context - * Context for calculating key pair for signing transactions + * Context for calculating key pair for signing transactions */ export async function KeyPairCalculation(input: UserIdentifier | string): Promise { const cache = KeyPairCacheManager.getInstance() diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index c4f244816..1f60d65f2 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -1082,7 +1082,7 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== -"@types/node-fetch@^2.6.1": +"@types/node-fetch@^2.6.1", "@types/node-fetch@^2.6.11": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== @@ -2112,6 +2112,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -2931,6 +2936,14 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3050,6 +3063,13 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -4670,6 +4690,11 @@ node-api-headers@^1.1.0: resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.3.0.tgz#bb32c6b3e33fb0004bd93c66787bf00998c834ea" integrity sha512-8Bviwtw4jNhv0B2qDjj4M5e6GyAuGtxsmZTrFJu3S3Z0+oHwIgSUdIKkKJmZd+EbMo7g3v4PLBbrjxwmZOqMBg== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -4677,6 +4702,15 @@ node-fetch@^2.6.12, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-gyp-build@^4.8.1: version "4.8.2" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" @@ -6265,6 +6299,11 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From 4ab8d6b83a73d45b5331a4f033d7c190c317984f Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 7 Nov 2024 18:25:45 +0100 Subject: [PATCH 14/23] expand dltTransaction to integrate also user and transactionLink --- backend/src/config/index.ts | 2 +- .../0087-add_dlt_users_table/DltUser.ts | 3 +- .../0088-merge_dlt_tables/DltTransaction.ts | 52 +++++ .../0088-merge_dlt_tables/TransactionLink.ts | 74 +++++++ database/entity/0088-merge_dlt_tables/User.ts | 181 ++++++++++++++++++ database/entity/DltTransaction.ts | 2 +- database/entity/TransactionLink.ts | 2 +- database/entity/User.ts | 2 +- database/entity/index.ts | 2 - database/migrations/0088-merge_dlt_tables.ts | 33 ++++ dht-node/src/config/index.ts | 2 +- federation/src/config/index.ts | 2 +- 12 files changed, 348 insertions(+), 9 deletions(-) create mode 100644 database/entity/0088-merge_dlt_tables/DltTransaction.ts create mode 100644 database/entity/0088-merge_dlt_tables/TransactionLink.ts create mode 100644 database/entity/0088-merge_dlt_tables/User.ts create mode 100644 database/migrations/0088-merge_dlt_tables.ts diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 7ded1b8f4..37a654f8e 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -12,7 +12,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0087-add_dlt_users_table', + DB_VERSION: '0088-merge_dlt_tables', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info diff --git a/database/entity/0087-add_dlt_users_table/DltUser.ts b/database/entity/0087-add_dlt_users_table/DltUser.ts index 483437d58..2b9dccb3f 100644 --- a/database/entity/0087-add_dlt_users_table/DltUser.ts +++ b/database/entity/0087-add_dlt_users_table/DltUser.ts @@ -1,5 +1,6 @@ import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' -import { User } from '../User' +// this Entity was removed in current code and isn't any longer compatible with user +import { User } from './User' @Entity('dlt_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class DltUser extends BaseEntity { diff --git a/database/entity/0088-merge_dlt_tables/DltTransaction.ts b/database/entity/0088-merge_dlt_tables/DltTransaction.ts new file mode 100644 index 000000000..6525c229d --- /dev/null +++ b/database/entity/0088-merge_dlt_tables/DltTransaction.ts @@ -0,0 +1,52 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { Transaction } from '../Transaction' +import { User } from '../User' +import { TransactionLink } from '../TransactionLink' + +@Entity('dlt_transactions', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class DltTransaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'transaction_id', type: 'int', unsigned: true, nullable: true }) + transactionId?: number | null + + @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: true }) + userId?: number | null + + @Column({ name: 'transaction_link_id', type: 'int', unsigned: true, nullable: true }) + transactionLinkId?: number | null + + @Column({ + name: 'message_id', + length: 64, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + messageId: string + + @Column({ name: 'verified', type: 'bool', nullable: false, default: false }) + verified: boolean + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @Column({ name: 'verified_at', nullable: true, default: null, type: 'datetime' }) + verifiedAt: Date | null + + @Column({ name: 'error', type: 'text', nullable: true }) + error: string | null + + @OneToOne(() => Transaction, (transaction) => transaction.dltTransaction) + @JoinColumn({ name: 'transaction_id' }) + transaction?: Transaction | null + + @OneToOne(() => User, (user) => user.dltTransaction) + @JoinColumn({ name: 'user_id' }) + user?: User | null + + @OneToOne(() => TransactionLink, (transactionLink) => transactionLink.dltTransaction) + @JoinColumn({ name: 'transaction_link_id' }) + transactionLink?: TransactionLink | null +} diff --git a/database/entity/0088-merge_dlt_tables/TransactionLink.ts b/database/entity/0088-merge_dlt_tables/TransactionLink.ts new file mode 100644 index 000000000..3258e346f --- /dev/null +++ b/database/entity/0088-merge_dlt_tables/TransactionLink.ts @@ -0,0 +1,74 @@ +import { Decimal } from 'decimal.js-light' +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToOne, + JoinColumn, +} from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' +import { DltTransaction } from '../DltTransaction' + +@Entity('transaction_links') +export class TransactionLink extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ unsigned: true, nullable: false }) + userId: number + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + name: 'hold_available_amount', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + holdAvailableAmount: Decimal + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ length: 24, nullable: false, collation: 'utf8mb4_unicode_ci' }) + code: string + + @Column({ + type: 'datetime', + nullable: false, + }) + createdAt: Date + + @DeleteDateColumn() + deletedAt: Date | null + + @Column({ + type: 'datetime', + nullable: false, + }) + validUntil: Date + + @Column({ + type: 'datetime', + nullable: true, + }) + redeemedAt: Date | null + + @Column({ type: 'int', unsigned: true, nullable: true }) + redeemedBy: number | null + + @OneToOne(() => DltTransaction, (dlt) => dlt.transactionLinkId) + @JoinColumn({ name: 'id', referencedColumnName: 'transactionLinkId' }) + dltTransaction?: DltTransaction | null +} diff --git a/database/entity/0088-merge_dlt_tables/User.ts b/database/entity/0088-merge_dlt_tables/User.ts new file mode 100644 index 000000000..d133cdad8 --- /dev/null +++ b/database/entity/0088-merge_dlt_tables/User.ts @@ -0,0 +1,181 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToMany, + JoinColumn, + OneToOne, + Geometry, + ManyToOne, +} from 'typeorm' +import { Contribution } from '../Contribution' +import { ContributionMessage } from '../ContributionMessage' +import { UserContact } from '../UserContact' +import { UserRole } from '../UserRole' +import { GeometryTransformer } from '../../src/typeorm/GeometryTransformer' +import { Community } from '../Community' +import { DltTransaction } from '../DltTransaction' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ type: 'bool', default: false }) + foreign: boolean + + @Column({ + name: 'gradido_id', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + gradidoID: string + + @Column({ + name: 'community_uuid', + type: 'char', + length: 36, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + communityUuid: string + + @ManyToOne(() => Community, (community) => community.users) + @JoinColumn({ name: 'community_uuid', referencedColumnName: 'communityUuid' }) + community: Community | null + + @Column({ + name: 'alias', + length: 20, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + alias: string + + @OneToOne(() => UserContact, (emailContact: UserContact) => emailContact.user) + @JoinColumn({ name: 'email_id' }) + emailContact: UserContact + + @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) + emailId: number | null + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ name: 'gms_publish_name', type: 'int', unsigned: true, nullable: false, default: 0 }) + gmsPublishName: number + + @Column({ name: 'humhub_publish_name', type: 'int', unsigned: true, nullable: false, default: 0 }) + humhubPublishName: number + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @DeleteDateColumn({ name: 'deleted_at', nullable: true }) + deletedAt: Date | null + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ + name: 'password_encryption_type', + type: 'int', + unsigned: true, + nullable: false, + default: 0, + }) + passwordEncryptionType: number + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ type: 'bool', default: false }) + hideAmountGDD: boolean + + @Column({ type: 'bool', default: false }) + hideAmountGDT: boolean + + @OneToMany(() => UserRole, (userRole) => userRole.user) + @JoinColumn({ name: 'user_id' }) + userRoles: UserRole[] + + @Column({ name: 'referrer_id', type: 'int', unsigned: true, nullable: true, default: null }) + referrerId?: number | null + + @Column({ + name: 'contribution_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + contributionLinkId?: number | null + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ name: 'gms_allowed', type: 'bool', default: true }) + gmsAllowed: boolean + + @Column({ + name: 'location', + type: 'geometry', + default: null, + nullable: true, + transformer: GeometryTransformer, + }) + location: Geometry | null + + @Column({ + name: 'gms_publish_location', + type: 'int', + unsigned: true, + nullable: false, + default: 2, + }) + gmsPublishLocation: number + + @Column({ name: 'gms_registered', type: 'bool', default: false }) + gmsRegistered: boolean + + @Column({ name: 'gms_registered_at', type: 'datetime', default: null, nullable: true }) + gmsRegisteredAt: Date | null + + @Column({ name: 'humhub_allowed', type: 'bool', default: false }) + humhubAllowed: boolean + + @OneToMany(() => Contribution, (contribution) => contribution.user) + @JoinColumn({ name: 'user_id' }) + contributions?: Contribution[] + + @OneToMany(() => ContributionMessage, (message) => message.user) + @JoinColumn({ name: 'user_id' }) + messages?: ContributionMessage[] + + @OneToMany(() => UserContact, (userContact: UserContact) => userContact.user) + @JoinColumn({ name: 'user_id' }) + userContacts?: UserContact[] + + @OneToOne(() => DltTransaction, (dlt) => dlt.userId) + @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) + dltTransaction?: DltTransaction | null +} diff --git a/database/entity/DltTransaction.ts b/database/entity/DltTransaction.ts index 31c21d583..373e5f593 100644 --- a/database/entity/DltTransaction.ts +++ b/database/entity/DltTransaction.ts @@ -1 +1 @@ -export { DltTransaction } from './0087-add_dlt_users_table/DltTransaction' +export { DltTransaction } from './0088-merge_dlt_tables/DltTransaction' diff --git a/database/entity/TransactionLink.ts b/database/entity/TransactionLink.ts index a483f0171..ff69e101f 100644 --- a/database/entity/TransactionLink.ts +++ b/database/entity/TransactionLink.ts @@ -1 +1 @@ -export { TransactionLink } from './0031-remove_sendEmail_from_transaction_link/TransactionLink' +export { TransactionLink } from './0088-merge_dlt_tables/TransactionLink' diff --git a/database/entity/User.ts b/database/entity/User.ts index 5267c24cc..3836c683e 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0087-add_dlt_users_table/User' +export { User } from './0088-merge_dlt_tables/User' diff --git a/database/entity/index.ts b/database/entity/index.ts index a5a988490..3352abdb4 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -13,7 +13,6 @@ import { Community } from './Community' import { FederatedCommunity } from './FederatedCommunity' import { UserRole } from './UserRole' import { DltTransaction } from './DltTransaction' -import { DltUser } from './DltUser' import { PendingTransaction } from './0071-add-pending_transactions-table/PendingTransaction' export const entities = [ @@ -22,7 +21,6 @@ export const entities = [ ContributionLink, ContributionMessage, DltTransaction, - DltUser, Event, FederatedCommunity, LoginElopageBuys, diff --git a/database/migrations/0088-merge_dlt_tables.ts b/database/migrations/0088-merge_dlt_tables.ts new file mode 100644 index 000000000..7964ffd94 --- /dev/null +++ b/database/migrations/0088-merge_dlt_tables.ts @@ -0,0 +1,33 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE \`dlt_users\`;`) + await queryFn(` + ALTER TABLE \`dlt_transactions\` + CHANGE \`transaction_id\` \`transaction_id\` INT(10) UNSIGNED NULL DEFAULT NULL, + ADD \`user_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`transaction_id\`, + ADD \`transaction_link_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`user_id\`; + `) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE \`dlt_users\` ( + \`id\` int unsigned NOT NULL AUTO_INCREMENT, + \`user_id\` int(10) unsigned NOT NULL, + \`message_id\` varchar(64) NULL DEFAULT NULL, + \`verified\` tinyint(4) NOT NULL DEFAULT 0, + \`created_at\` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + \`verified_at\` datetime(3), + \`error\` text NULL DEFAULT NULL, + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) + + await queryFn(` + ALTER TABLE \`dlt_transactions\` + CHANGE \`transaction_id\` \`transaction_id\` INT(10) UNSIGNED NOT NULL, + DROP COLUMN \`user_id\`, + DROP COLUMN \`transaction_link_id\`; + `) +} diff --git a/dht-node/src/config/index.ts b/dht-node/src/config/index.ts index f2dc456b4..e0e7f094c 100644 --- a/dht-node/src/config/index.ts +++ b/dht-node/src/config/index.ts @@ -4,7 +4,7 @@ import dotenv from 'dotenv' dotenv.config() const constants = { - DB_VERSION: '0087-add_dlt_users_table', + DB_VERSION: '0088-merge_dlt_tables', LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index 4ada82244..61ac3471d 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0087-add_dlt_users_table', + DB_VERSION: '0088-merge_dlt_tables', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From 4875621699cbd5de0a52a949e1f289e35bd2cc9f Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 12 Nov 2024 21:15:36 +0100 Subject: [PATCH 15/23] fix error with loop, implement dlt support for linked transactions --- .../apis/dltConnector/DltConnectorClient.ts | 9 +- .../apis/dltConnector/model/IdentifierSeed.ts | 7 + .../dltConnector/model/TransactionDraft.ts | 52 ++++--- .../sendTransactionsToDltConnector.ts | 141 ++++++++++++------ .../resolver/TransactionLinkResolver.ts | 4 - backend/src/index.ts | 2 +- .../0088-merge_dlt_tables/TransactionLink.ts | 5 + database/entity/0088-merge_dlt_tables/User.ts | 5 + .../src/graphql/input/TransactionDraft.ts | 5 + .../DeferredTransferTransaction.role.ts | 39 +++++ .../sendToIota/TransferTransaction.role.ts | 2 +- 11 files changed, 194 insertions(+), 77 deletions(-) create mode 100644 backend/src/apis/dltConnector/model/IdentifierSeed.ts create mode 100644 dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 3402e0844..b8f2dbbe3 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -1,4 +1,5 @@ import { Transaction as DbTransaction } from '@entity/Transaction' +import { TransactionLink } from '@entity/TransactionLink' import { User } from '@entity/User' import { gql, GraphQLClient } from 'graphql-request' // eslint-disable-next-line import/named, n/no-extraneous-import @@ -99,8 +100,10 @@ export class DltConnectorClient { return DltConnectorClient.instance } - private getTransactionParams(input: DbTransaction | User): TransactionDraft | UserAccountDraft { - if (input instanceof DbTransaction) { + private getTransactionParams( + input: DbTransaction | User | TransactionLink, + ): TransactionDraft | UserAccountDraft { + if (input instanceof DbTransaction || input instanceof TransactionLink) { return new TransactionDraft(input) } else if (input instanceof User) { return new UserAccountDraft(input) @@ -138,7 +141,7 @@ export class DltConnectorClient { * and update dltTransactionId of transaction in db with iota message id */ public async transmitTransaction( - transaction: DbTransaction | User, + transaction: DbTransaction | User | TransactionLink, ): Promise { // we don't need the receive transactions, there contain basically the same data as the send transactions if ( diff --git a/backend/src/apis/dltConnector/model/IdentifierSeed.ts b/backend/src/apis/dltConnector/model/IdentifierSeed.ts new file mode 100644 index 000000000..c597d2797 --- /dev/null +++ b/backend/src/apis/dltConnector/model/IdentifierSeed.ts @@ -0,0 +1,7 @@ +export class IdentifierSeed { + seed: string + + constructor(seed: string) { + this.seed = seed + } +} diff --git a/backend/src/apis/dltConnector/model/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts index e6b8f8d6d..7413969eb 100755 --- a/backend/src/apis/dltConnector/model/TransactionDraft.ts +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -1,38 +1,52 @@ // https://www.npmjs.com/package/@apollo/protobufjs import { Transaction } from '@entity/Transaction' +import { TransactionLink } from '@entity/TransactionLink' import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { LogError } from '@/server/LogError' +import { IdentifierSeed } from './IdentifierSeed' import { UserIdentifier } from './UserIdentifier' export class TransactionDraft { user: UserIdentifier - linkedUser: UserIdentifier + linkedUser: UserIdentifier | IdentifierSeed amount: string type: string createdAt: string // only for creation transactions targetDate?: string + // only for transaction links + timeoutDate?: string - constructor(transaction: Transaction) { - if ( - !transaction.linkedUserGradidoID || - !transaction.linkedUserCommunityUuid || - !transaction.userCommunityUuid - ) { - throw new LogError( - `missing necessary field in transaction: ${transaction.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, - ) - } - this.user = new UserIdentifier(transaction.userGradidoID, transaction.userCommunityUuid) - this.linkedUser = new UserIdentifier( - transaction.linkedUserGradidoID, - transaction.linkedUserCommunityUuid, - ) + constructor(transaction: Transaction | TransactionLink) { this.amount = transaction.amount.abs().toString() - this.type = TransactionTypeId[transaction.typeId] - this.createdAt = transaction.balanceDate.toISOString() - this.targetDate = transaction.creationDate?.toISOString() + + if (transaction instanceof Transaction) { + if ( + !transaction.linkedUserGradidoID || + !transaction.linkedUserCommunityUuid || + !transaction.userCommunityUuid + ) { + throw new LogError( + `missing necessary field in transaction: ${transaction.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, + ) + } + this.user = new UserIdentifier(transaction.userGradidoID, transaction.userCommunityUuid) + this.linkedUser = new UserIdentifier( + transaction.linkedUserGradidoID, + transaction.linkedUserCommunityUuid, + ) + this.createdAt = transaction.balanceDate.toISOString() + this.targetDate = transaction.creationDate?.toISOString() + this.type = TransactionTypeId[transaction.typeId] + } else if (transaction instanceof TransactionLink) { + const user = transaction.user + this.user = new UserIdentifier(user.gradidoID, user.communityUuid) + this.linkedUser = new IdentifierSeed(transaction.code) + this.createdAt = transaction.createdAt.toISOString() + this.type = TransactionTypeId[TransactionTypeId.LINK_SUMMARY] + this.timeoutDate = transaction.validUntil.toISOString() + } } } diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts index 36974b5cf..c9a192189 100644 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts @@ -1,6 +1,9 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { backendLogger as logger } from '@/server/logger' +import { BaseEntity, EntityPropertyNotFoundError, EntityTarget, OrderByCondition, SelectQueryBuilder } from '@dbTools/typeorm' import { DltTransaction } from '@entity/DltTransaction' -import { DltUser } from '@entity/DltUser' import { Transaction } from '@entity/Transaction' +import { TransactionLink } from '@entity/TransactionLink' import { User } from '@entity/User' // eslint-disable-next-line import/named, n/no-extraneous-import import { FetchError } from 'node-fetch' @@ -8,11 +11,11 @@ import { FetchError } from 'node-fetch' import { DltConnectorClient } from '@dltConnector/DltConnectorClient' import { TransactionResult } from '@/apis/dltConnector/model/TransactionResult' -import { backendLogger as logger } from '@/server/logger' import { InterruptiveSleepManager, TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, } from '@/util/InterruptiveSleepManager' +import { LogError } from '@/server/LogError' let isLoopRunning = true @@ -20,70 +23,105 @@ export const stopSendTransactionsToDltConnector = (): void => { isLoopRunning = false } -function logTransactionResult( - type: 'dltUser' | 'dltTransaction', - data: { id: number; messageId: string; error: string | null }, -): void { +interface NextPendingTransactionQueries { + lastTransactionQuery: SelectQueryBuilder + lastUserQuery: SelectQueryBuilder + lastTransactionLinkQuery: SelectQueryBuilder +} + +function logTransactionResult(data: { id: number; messageId: string; error: string | null }): void { if (data.error) { - logger.error(`Store ${type} with error: id=${data.id}, error=${data.error}`) + logger.error(`Store dltTransaction with error: id=${data.id}, error=${data.error}`) } else { - logger.info(`Store ${type}: messageId=${data.messageId}, id=${data.id}`) + logger.info(`Store dltTransaction: messageId=${data.messageId}, id=${data.id}`) } } async function saveTransactionResult( - pendingTransaction: User | Transaction, + pendingTransaction: User | Transaction | TransactionLink, messageId: string, error: string | null, ): Promise { + const dltTransaction = DltTransaction.create() + dltTransaction.messageId = messageId + dltTransaction.error = error if (pendingTransaction instanceof User) { - const dltUser = DltUser.create() - dltUser.userId = pendingTransaction.id - dltUser.messageId = messageId - dltUser.error = error - await DltUser.save(dltUser) - logTransactionResult('dltUser', dltUser) + dltTransaction.userId = pendingTransaction.id } else if (pendingTransaction instanceof Transaction) { - const dltTransaction = DltTransaction.create() dltTransaction.transactionId = pendingTransaction.id - dltTransaction.messageId = messageId - dltTransaction.error = error - await DltTransaction.save(dltTransaction) - logTransactionResult('dltTransaction', dltTransaction) + } else if (pendingTransaction instanceof TransactionLink) { + dltTransaction.transactionLinkId = pendingTransaction.id } + await DltTransaction.save(dltTransaction) + logTransactionResult(dltTransaction) } -async function findNextPendingTransaction(): Promise { - const lastTransactionPromise: Promise = Transaction.createQueryBuilder() - .leftJoin(DltTransaction, 'dltTransaction', 'Transaction.id = dltTransaction.transactionId') - .where('dltTransaction.transaction_id IS NULL') - // eslint-disable-next-line camelcase - .orderBy({ balance_date: 'ASC', Transaction_id: 'ASC' }) - .limit(1) - .getOne() - - const lastUserPromise: Promise = User.createQueryBuilder() - .leftJoin(DltUser, 'dltUser', 'User.id = dltUser.userId') - .where('dltUser.user_id IS NULL') - // eslint-disable-next-line camelcase - .orderBy({ User_created_at: 'ASC', User_id: 'ASC' }) - .limit(1) - .getOne() - - const results = await Promise.all([lastTransactionPromise, lastUserPromise]) - if (results[0] && results[1]) { - return results[0].balanceDate < results[1].createdAt ? results[0] : results[1] - } else if (results[0]) { - return results[0] - } else if (results[1]) { - return results[1] +async function findNextPendingTransaction(): Promise { + // Helper function to avoid code repetition + const createQueryForPendingItems = ( + qb: SelectQueryBuilder, + joinCondition: string, + orderBy: OrderByCondition, + ): Promise => { + return qb + .leftJoin(DltTransaction, 'dltTransaction', joinCondition) + .where('dltTransaction.user_id IS NULL') + .andWhere('dltTransaction.transaction_id IS NULL') + .andWhere('dltTransaction.transaction_link_Id IS NULL') + .orderBy(orderBy) + .limit(1) + .getOne() } - return null + + const lastTransactionPromise = createQueryForPendingItems( + Transaction.createQueryBuilder(), + 'Transaction.id = dltTransaction.transactionId', + // eslint-disable-next-line camelcase + { balance_date: 'ASC', Transaction_id: 'ASC' }, + ) + + const lastUserPromise = createQueryForPendingItems( + User.createQueryBuilder(), + 'User.id = dltTransaction.userId', + // eslint-disable-next-line camelcase + { User_created_at: 'ASC', User_id: 'ASC' }, + ) + + const lastTransactionLinkPromise = createQueryForPendingItems( + TransactionLink.createQueryBuilder().leftJoinAndSelect('transactionLink.user', 'user'), + 'TransactionLink.id = dltTransaction.transactionLinkId', + // eslint-disable-next-line camelcase + { TransactionLinkId_created_at: 'ASC', User_id: 'ASC' }, + ) + + const results = await Promise.all([ + lastTransactionPromise, + lastUserPromise, + lastTransactionLinkPromise, + ]) + + results.sort((a, b) => { + const getTime = (input: Transaction | User | TransactionLink | null) => { + if (!input) return Infinity + if (input instanceof Transaction) { + return input.balanceDate.getTime() + } else if (input instanceof User || input instanceof TransactionLink) { + return input.createdAt.getTime() + } + return Infinity + } + return getTime(a) - getTime(b) + }) + return results[0] ?? null } async function processPendingTransactions(dltConnector: DltConnectorClient): Promise { - let pendingTransaction: Transaction | User | null = null - while ((pendingTransaction = await findNextPendingTransaction())) { + let pendingTransaction: Transaction | User | TransactionLink | null = null + do { + pendingTransaction = await findNextPendingTransaction() + if (!pendingTransaction) { + return + } let result: TransactionResult | undefined let messageId = '' let error: string | null = null @@ -103,7 +141,7 @@ async function processPendingTransactions(dltConnector: DltConnectorClient): Pro } await saveTransactionResult(pendingTransaction, messageId, error) - } + } while (pendingTransaction) } export async function sendTransactionsToDltConnector(): Promise { @@ -114,9 +152,11 @@ export async function sendTransactionsToDltConnector(): Promise { isLoopRunning = false return } - logger.info('Starting sendTransactionsToDltConnector task') + // define outside of loop for reuse and reducing gb collection + // const queries = getFindNextPendingTransactionQueries() + // eslint-disable-next-line no-unmodified-loop-condition while (isLoopRunning) { try { @@ -127,6 +167,9 @@ export async function sendTransactionsToDltConnector(): Promise { 1000, ) } catch (e) { + if (e instanceof EntityPropertyNotFoundError) { + throw new LogError(e.message, e.stack) + } // couldn't connect to dlt-connector? We wait if (e instanceof FetchError) { logger.error(`error connecting dlt-connector, wait 5 seconds before retry: ${String(e)}`) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 8a5c92cf4..88f84b6e2 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -38,8 +38,6 @@ import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' import { fullName } from '@/util/utilities' import { calculateBalance } from '@/util/validate' -import { sendTransactionsToDltConnector } from '../../apis/dltConnector/sendTransactionsToDltConnector' - import { executeTransaction } from './TransactionResolver' import { getUserCreation, validateContribution } from './util/creations' import { getLastTransaction } from './util/getLastTransaction' @@ -311,8 +309,6 @@ export class TransactionLinkResolver { } finally { releaseLock() } - // trigger to send transaction via dlt-connector - void sendTransactionsToDltConnector() return true } else { const now = new Date() diff --git a/backend/src/index.ts b/backend/src/index.ts index dd166d3d5..f2026a0f9 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,7 +1,7 @@ +import { sendTransactionsToDltConnector } from './apis/dltConnector/sendTransactionsToDltConnector' import { CONFIG } from './config' import { startValidateCommunities } from './federation/validateCommunities' import { createServer } from './server/createServer' -import { sendTransactionsToDltConnector } from './apis/dltConnector/sendTransactionsToDltConnector' async function main() { const { app } = await createServer() diff --git a/database/entity/0088-merge_dlt_tables/TransactionLink.ts b/database/entity/0088-merge_dlt_tables/TransactionLink.ts index 3258e346f..72c80195b 100644 --- a/database/entity/0088-merge_dlt_tables/TransactionLink.ts +++ b/database/entity/0088-merge_dlt_tables/TransactionLink.ts @@ -10,6 +10,7 @@ import { } from 'typeorm' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' import { DltTransaction } from '../DltTransaction' +import { User } from '../User' @Entity('transaction_links') export class TransactionLink extends BaseEntity { @@ -71,4 +72,8 @@ export class TransactionLink extends BaseEntity { @OneToOne(() => DltTransaction, (dlt) => dlt.transactionLinkId) @JoinColumn({ name: 'id', referencedColumnName: 'transactionLinkId' }) dltTransaction?: DltTransaction | null + + @OneToOne(() => User, (user) => user.transactionLink) + @JoinColumn({ name: 'userId' }) + user: User } diff --git a/database/entity/0088-merge_dlt_tables/User.ts b/database/entity/0088-merge_dlt_tables/User.ts index d133cdad8..64a6261ab 100644 --- a/database/entity/0088-merge_dlt_tables/User.ts +++ b/database/entity/0088-merge_dlt_tables/User.ts @@ -17,6 +17,7 @@ import { UserRole } from '../UserRole' import { GeometryTransformer } from '../../src/typeorm/GeometryTransformer' import { Community } from '../Community' import { DltTransaction } from '../DltTransaction' +import { TransactionLink } from './TransactionLink' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { @@ -178,4 +179,8 @@ export class User extends BaseEntity { @OneToOne(() => DltTransaction, (dlt) => dlt.userId) @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) dltTransaction?: DltTransaction | null + + @OneToOne(() => TransactionLink, (transactionLink) => transactionLink.userId) + @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) + transactionLink?: TransactionLink | null } diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 3f1f57a85..9a702aee3 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -35,4 +35,9 @@ export class TransactionDraft { @Field(() => String, { nullable: true }) @isValidDateString() targetDate?: string + + // only for transaction links + @Field(() => String, { nullable: true }) + @isValidDateString() + timeoutDate?: string } diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts new file mode 100644 index 000000000..48c025b09 --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -0,0 +1,39 @@ +import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' + +import { LogError } from '@/server/LogError' +import { uuid4ToHash } from '@/utils/typeConverter' + +import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' + +import { TransferTransactionRole } from './TransferTransaction.role' + +export class DeferredTransferTransactionRole extends TransferTransactionRole { + public async getGradidoTransactionBuilder(): Promise { + const builder = new GradidoTransactionBuilder() + const senderKeyPair = await KeyPairCalculation(this.self.user) + const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + if (!this.self.timeoutDate) { + throw new LogError('timeoutDate date missing for deferred transfer transaction') + } + builder + .setCreatedAt(new Date(this.self.createdAt)) + .setMemo('dummy memo for transfer') + .setDeferredTransfer( + new GradidoTransfer( + new TransferAmount(senderKeyPair.getPublicKey(), this.self.amount.toString()), + recipientKeyPair.getPublicKey(), + ), + new Date(this.self.timeoutDate), + ) + const senderCommunity = this.self.user.communityUuid + const recipientCommunity = this.self.linkedUser.communityUuid + if (senderCommunity !== recipientCommunity) { + // we have a cross group transaction + builder + .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) + .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) + } + builder.sign(senderKeyPair) + return builder + } +} diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index e0749f002..1e5dde5dd 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -8,7 +8,7 @@ import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.con import { AbstractTransactionRole } from './AbstractTransaction.role' export class TransferTransactionRole extends AbstractTransactionRole { - constructor(private self: TransactionDraft) { + constructor(protected self: TransactionDraft) { super() } From e691db05b74b79145e58d4a589460a53a26e19b6 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 13 Nov 2024 14:22:04 +0100 Subject: [PATCH 16/23] move code into interaction in backend, implement transaction link in dlt-connector --- .../dltConnector/DltConnectorClient.test.ts | 5 +- .../apis/dltConnector/DltConnectorClient.ts | 22 +-- .../AbstractTransactionToDlt.role.ts | 63 ++++++++ .../TransactionLinkToDlt.role.ts | 45 ++++++ .../transactionToDlt/TransactionToDlt.role.ts | 45 ++++++ .../transactionToDlt/UserToDlt.role.ts | 45 ++++++ .../transactionToDlt.context.ts | 65 +++++++++ .../sendTransactionsToDltConnector.ts | 136 +----------------- backend/src/util/InterruptiveSleep.ts | 10 +- backend/src/util/utilities.ts | 4 + .../src/graphql/input/IdentifierSeed.ts | 9 ++ .../src/graphql/input/TransactionDraft.ts | 3 +- .../KeyPairCalculation.context.ts | 71 ++++----- .../LinkedTransactionKeyPair.role.ts | 22 +++ .../sendToIota/CreationTransaction.role.ts | 11 +- .../DeferredTransferTransaction.role.ts | 24 ++-- .../sendToIota/TransferTransaction.role.ts | 9 ++ .../logging/TransactionDraftLogging.view.ts | 6 +- .../src/manager/KeyPairCacheManager.ts | 12 +- dlt-connector/yarn.lock | 41 +----- 20 files changed, 400 insertions(+), 248 deletions(-) create mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts create mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts create mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts create mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts create mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts create mode 100644 dlt-connector/src/graphql/input/IdentifierSeed.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.test.ts b/backend/src/apis/dltConnector/DltConnectorClient.test.ts index d99093a1b..8169be112 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.test.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.test.ts @@ -14,6 +14,7 @@ import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { DltConnectorClient } from './DltConnectorClient' +import { TransactionDraft } from './model/TransactionDraft' let con: Connection @@ -113,7 +114,9 @@ describe('transmitTransaction', () => { const localTransaction = new DbTransaction() localTransaction.typeId = 12 try { - await DltConnectorClient.getInstance()?.transmitTransaction(localTransaction) + await DltConnectorClient.getInstance()?.transmitTransaction( + new TransactionDraft(localTransaction), + ) } catch (e) { expect(e).toMatchObject( new LogError('invalid transaction type id: ' + localTransaction.typeId.toString()), diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index b8f2dbbe3..f864bb652 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -1,6 +1,3 @@ -import { Transaction as DbTransaction } from '@entity/Transaction' -import { TransactionLink } from '@entity/TransactionLink' -import { User } from '@entity/User' import { gql, GraphQLClient } from 'graphql-request' // eslint-disable-next-line import/named, n/no-extraneous-import import { FetchError } from 'node-fetch' @@ -9,6 +6,7 @@ import { CONFIG } from '@/config' import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' +// eslint-disable-next-line import/named, n/no-extraneous-import import { TransactionDraft } from './model/TransactionDraft' import { TransactionResult } from './model/TransactionResult' @@ -100,17 +98,6 @@ export class DltConnectorClient { return DltConnectorClient.instance } - private getTransactionParams( - input: DbTransaction | User | TransactionLink, - ): TransactionDraft | UserAccountDraft { - if (input instanceof DbTransaction || input instanceof TransactionLink) { - return new TransactionDraft(input) - } else if (input instanceof User) { - return new UserAccountDraft(input) - } - throw new LogError('transaction should be either Transaction or User Entity') - } - private handleTransactionResult(result: TransactionResult) { if (result.error) { throw new Error(result.error.message) @@ -141,17 +128,16 @@ export class DltConnectorClient { * and update dltTransactionId of transaction in db with iota message id */ public async transmitTransaction( - transaction: DbTransaction | User | TransactionLink, + input: TransactionDraft | UserAccountDraft, ): Promise { // we don't need the receive transactions, there contain basically the same data as the send transactions if ( - transaction instanceof DbTransaction && - (transaction.typeId as TransactionTypeId) === TransactionTypeId.RECEIVE + input instanceof TransactionDraft && + TransactionTypeId[input.type as keyof typeof TransactionTypeId] === TransactionTypeId.RECEIVE ) { return } - const input = this.getTransactionParams(transaction) try { logger.debug('transmit transaction or user to dlt connector', input) if (input instanceof TransactionDraft) { diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts new file mode 100644 index 000000000..50296244e --- /dev/null +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts @@ -0,0 +1,63 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from '@dbTools/typeorm' +import { DltTransaction } from '@entity/DltTransaction' + +import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' + +import { backendLogger as logger } from '@/server/logger' + +export abstract class AbstractTransactionToDltRole { + protected self: T | null + + // public interface + public abstract initWithLast(): Promise + public abstract getTimestamp(): number + public abstract convertToGraphqlInput(): TransactionDraft | UserAccountDraft + public getEntity(): T | null { + return this.self + } + + public async saveTransactionResult(messageId: string, error: string | null): Promise { + const dltTransaction = DltTransaction.create() + dltTransaction.messageId = messageId + dltTransaction.error = error + this.setJoinId(dltTransaction) + await DltTransaction.save(dltTransaction) + if (dltTransaction.error) { + logger.error( + `Store dltTransaction with error: id=${dltTransaction.id}, error=${dltTransaction.error}`, + ) + } else { + logger.info( + `Store dltTransaction: messageId=${dltTransaction.messageId}, id=${dltTransaction.id}`, + ) + } + } + + // intern + protected abstract setJoinId(dltTransaction: DltTransaction): void + + // helper + protected createQueryForPendingItems( + qb: SelectQueryBuilder, + joinCondition: string, + orderBy: OrderByCondition, + ): Promise { + return qb + .leftJoin(DltTransaction, 'dltTransaction', joinCondition) + .where('dltTransaction.user_id IS NULL') + .andWhere('dltTransaction.transaction_id IS NULL') + .andWhere('dltTransaction.transaction_link_Id IS NULL') + .orderBy(orderBy) + .limit(1) + .getOne() + } + + protected createDltTransactionEntry(messageId: string, error: string | null): DltTransaction { + const dltTransaction = DltTransaction.create() + dltTransaction.messageId = messageId + dltTransaction.error = error + return dltTransaction + } +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts new file mode 100644 index 000000000..a30d86f65 --- /dev/null +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -0,0 +1,45 @@ +import { DltTransaction } from '@entity/DltTransaction' +import { TransactionLink } from '@entity/TransactionLink' + +import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' + +import { LogError } from '@/server/LogError' + +import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' + +/** + * send transactionLink as Deferred Transfers + */ +export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { + async initWithLast(): Promise { + this.self = await this.createQueryForPendingItems( + TransactionLink.createQueryBuilder().leftJoinAndSelect('transactionLink.user', 'user'), + 'TransactionLink.id = dltTransaction.transactionLinkId', + // eslint-disable-next-line camelcase + { TransactionLinkId_created_at: 'ASC', User_id: 'ASC' }, + ) + return this + } + + public getTimestamp(): number { + if (!this.self) { + return Infinity + } + return this.self.createdAt.getTime() + } + + public convertToGraphqlInput(): TransactionDraft | UserAccountDraft { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction link') + } + return new TransactionDraft(this.self) + } + + protected setJoinId(dltTransaction: DltTransaction): void { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction link') + } + dltTransaction.transactionLinkId = this.self.id + } +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts new file mode 100644 index 000000000..f777f2683 --- /dev/null +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts @@ -0,0 +1,45 @@ +import { DltTransaction } from '@entity/DltTransaction' +import { Transaction } from '@entity/Transaction' + +import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' + +import { LogError } from '@/server/LogError' + +import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' + +/** + * send transfer and creations transactions to dlt connector as GradidoTransfer and GradidoCreation + */ +export class TransactionToDltRole extends AbstractTransactionToDltRole { + async initWithLast(): Promise { + this.self = await this.createQueryForPendingItems( + Transaction.createQueryBuilder(), + 'Transaction.id = dltTransaction.transactionId', + // eslint-disable-next-line camelcase + { balance_date: 'ASC', Transaction_id: 'ASC' }, + ) + return this + } + + public getTimestamp(): number { + if (!this.self) { + return Infinity + } + return this.self.balanceDate.getTime() + } + + public convertToGraphqlInput(): TransactionDraft | UserAccountDraft { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction') + } + return new TransactionDraft(this.self) + } + + protected setJoinId(dltTransaction: DltTransaction): void { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction') + } + dltTransaction.transactionId = this.self.id + } +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts new file mode 100644 index 000000000..fc3b0b2c3 --- /dev/null +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts @@ -0,0 +1,45 @@ +import { DltTransaction } from '@entity/DltTransaction' +import { User } from '@entity/User' + +import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' + +import { LogError } from '@/server/LogError' + +import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' + +/** + * send new user to dlt connector, will be made to RegisterAddress Transaction + */ +export class UserToDltRole extends AbstractTransactionToDltRole { + async initWithLast(): Promise { + this.self = await this.createQueryForPendingItems( + User.createQueryBuilder(), + 'User.id = dltTransaction.userId', + // eslint-disable-next-line camelcase + { User_created_at: 'ASC', User_id: 'ASC' }, + ) + return this + } + + public getTimestamp(): number { + if (!this.self) { + return Infinity + } + return this.self.createdAt.getTime() + } + + public convertToGraphqlInput(): TransactionDraft | UserAccountDraft { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction') + } + return new UserAccountDraft(this.self) + } + + protected setJoinId(dltTransaction: DltTransaction): void { + if (!this.self) { + throw new LogError('try to create dlt entry for empty user') + } + dltTransaction.userId = this.self.id + } +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts new file mode 100644 index 000000000..57281f96b --- /dev/null +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts @@ -0,0 +1,65 @@ +import { Transaction } from '@entity/Transaction' +import { TransactionLink } from '@entity/TransactionLink' +import { User } from '@entity/User' +// eslint-disable-next-line import/named, n/no-extraneous-import +import { FetchError } from 'node-fetch' + +import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' +import { TransactionResult } from '@/apis/dltConnector/model/TransactionResult' + +import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' +import { TransactionLinkToDltRole } from './TransactionLinkToDlt.role' +import { TransactionToDltRole } from './TransactionToDlt.role' +import { UserToDltRole } from './UserToDlt.role' + +/** + * @DCI-Context + * Context for sending transactions to dlt connector, always the oldest not sended transaction first + */ +export async function transactionToDlt(dltConnector: DltConnectorClient): Promise { + async function findNextPendingTransaction(): Promise< + AbstractTransactionToDltRole + > { + // collect each oldest not sended entity from db and choose oldest + const results = await Promise.all([ + new TransactionToDltRole().initWithLast(), + new UserToDltRole().initWithLast(), + new TransactionLinkToDltRole().initWithLast(), + ]) + + // sort array to get oldest at first place + results.sort((a, b) => { + return a.getTimestamp() - b.getTimestamp() + }) + return results[0] + } + + while (true) { + const pendingTransactionRole = await findNextPendingTransaction() + const pendingTransaction = pendingTransactionRole.getEntity() + if (!pendingTransaction) { + break + } + let result: TransactionResult | undefined + let messageId = '' + let error: string | null = null + + try { + result = await dltConnector.transmitTransaction( + pendingTransactionRole.convertToGraphqlInput(), + ) + if (result?.succeed && result.recipe) { + messageId = result.recipe.messageIdHex + } else { + error = 'skipped' + } + } catch (e) { + if (e instanceof FetchError) { + throw e + } + error = e instanceof Error ? e.message : String(e) + } + + await pendingTransactionRole.saveTransactionResult(messageId, error) + } +} diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts index c9a192189..7e0abf0fa 100644 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts @@ -1,21 +1,18 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { backendLogger as logger } from '@/server/logger' -import { BaseEntity, EntityPropertyNotFoundError, EntityTarget, OrderByCondition, SelectQueryBuilder } from '@dbTools/typeorm' -import { DltTransaction } from '@entity/DltTransaction' -import { Transaction } from '@entity/Transaction' -import { TransactionLink } from '@entity/TransactionLink' -import { User } from '@entity/User' +import { EntityPropertyNotFoundError } from '@dbTools/typeorm' // eslint-disable-next-line import/named, n/no-extraneous-import import { FetchError } from 'node-fetch' import { DltConnectorClient } from '@dltConnector/DltConnectorClient' -import { TransactionResult } from '@/apis/dltConnector/model/TransactionResult' +import { LogError } from '@/server/LogError' +import { backendLogger as logger } from '@/server/logger' import { InterruptiveSleepManager, TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, } from '@/util/InterruptiveSleepManager' -import { LogError } from '@/server/LogError' + +import { transactionToDlt } from './interaction/transactionToDlt/transactionToDlt.context' let isLoopRunning = true @@ -23,127 +20,6 @@ export const stopSendTransactionsToDltConnector = (): void => { isLoopRunning = false } -interface NextPendingTransactionQueries { - lastTransactionQuery: SelectQueryBuilder - lastUserQuery: SelectQueryBuilder - lastTransactionLinkQuery: SelectQueryBuilder -} - -function logTransactionResult(data: { id: number; messageId: string; error: string | null }): void { - if (data.error) { - logger.error(`Store dltTransaction with error: id=${data.id}, error=${data.error}`) - } else { - logger.info(`Store dltTransaction: messageId=${data.messageId}, id=${data.id}`) - } -} - -async function saveTransactionResult( - pendingTransaction: User | Transaction | TransactionLink, - messageId: string, - error: string | null, -): Promise { - const dltTransaction = DltTransaction.create() - dltTransaction.messageId = messageId - dltTransaction.error = error - if (pendingTransaction instanceof User) { - dltTransaction.userId = pendingTransaction.id - } else if (pendingTransaction instanceof Transaction) { - dltTransaction.transactionId = pendingTransaction.id - } else if (pendingTransaction instanceof TransactionLink) { - dltTransaction.transactionLinkId = pendingTransaction.id - } - await DltTransaction.save(dltTransaction) - logTransactionResult(dltTransaction) -} - -async function findNextPendingTransaction(): Promise { - // Helper function to avoid code repetition - const createQueryForPendingItems = ( - qb: SelectQueryBuilder, - joinCondition: string, - orderBy: OrderByCondition, - ): Promise => { - return qb - .leftJoin(DltTransaction, 'dltTransaction', joinCondition) - .where('dltTransaction.user_id IS NULL') - .andWhere('dltTransaction.transaction_id IS NULL') - .andWhere('dltTransaction.transaction_link_Id IS NULL') - .orderBy(orderBy) - .limit(1) - .getOne() - } - - const lastTransactionPromise = createQueryForPendingItems( - Transaction.createQueryBuilder(), - 'Transaction.id = dltTransaction.transactionId', - // eslint-disable-next-line camelcase - { balance_date: 'ASC', Transaction_id: 'ASC' }, - ) - - const lastUserPromise = createQueryForPendingItems( - User.createQueryBuilder(), - 'User.id = dltTransaction.userId', - // eslint-disable-next-line camelcase - { User_created_at: 'ASC', User_id: 'ASC' }, - ) - - const lastTransactionLinkPromise = createQueryForPendingItems( - TransactionLink.createQueryBuilder().leftJoinAndSelect('transactionLink.user', 'user'), - 'TransactionLink.id = dltTransaction.transactionLinkId', - // eslint-disable-next-line camelcase - { TransactionLinkId_created_at: 'ASC', User_id: 'ASC' }, - ) - - const results = await Promise.all([ - lastTransactionPromise, - lastUserPromise, - lastTransactionLinkPromise, - ]) - - results.sort((a, b) => { - const getTime = (input: Transaction | User | TransactionLink | null) => { - if (!input) return Infinity - if (input instanceof Transaction) { - return input.balanceDate.getTime() - } else if (input instanceof User || input instanceof TransactionLink) { - return input.createdAt.getTime() - } - return Infinity - } - return getTime(a) - getTime(b) - }) - return results[0] ?? null -} - -async function processPendingTransactions(dltConnector: DltConnectorClient): Promise { - let pendingTransaction: Transaction | User | TransactionLink | null = null - do { - pendingTransaction = await findNextPendingTransaction() - if (!pendingTransaction) { - return - } - let result: TransactionResult | undefined - let messageId = '' - let error: string | null = null - - try { - result = await dltConnector.transmitTransaction(pendingTransaction) - if (result?.succeed && result.recipe) { - messageId = result.recipe.messageIdHex - } else { - error = 'skipped' - } - } catch (e) { - if (e instanceof FetchError) { - throw e - } - error = e instanceof Error ? e.message : String(e) - } - - await saveTransactionResult(pendingTransaction, messageId, error) - } while (pendingTransaction) -} - export async function sendTransactionsToDltConnector(): Promise { const dltConnector = DltConnectorClient.getInstance() @@ -161,7 +37,7 @@ export async function sendTransactionsToDltConnector(): Promise { while (isLoopRunning) { try { // return after no pending transactions are left - await processPendingTransactions(dltConnector) + await transactionToDlt(dltConnector) await InterruptiveSleepManager.getInstance().sleep( TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, 1000, diff --git a/backend/src/util/InterruptiveSleep.ts b/backend/src/util/InterruptiveSleep.ts index c21e57db9..dc8ed5ae0 100644 --- a/backend/src/util/InterruptiveSleep.ts +++ b/backend/src/util/InterruptiveSleep.ts @@ -1,3 +1,5 @@ +import { delay } from './utilities' + /** * Sleep, that can be interrupted * call sleep only for msSteps and than check if interrupt was called @@ -14,17 +16,11 @@ export class InterruptiveSleep { this.interruptSleep = true } - private static _sleep(ms: number) { - return new Promise((resolve) => { - setTimeout(resolve, ms) - }) - } - public async sleep(ms: number): Promise { let waited = 0 this.interruptSleep = false while (waited < ms && !this.interruptSleep) { - await InterruptiveSleep._sleep(this.msSteps) + await delay(this.msSteps) waited += this.msSteps } } diff --git a/backend/src/util/utilities.ts b/backend/src/util/utilities.ts index 905cce686..4f45af023 100644 --- a/backend/src/util/utilities.ts +++ b/backend/src/util/utilities.ts @@ -1,3 +1,5 @@ +import { promisify } from 'util' + import { Decimal } from 'decimal.js-light' import i18n from 'i18n' @@ -30,6 +32,8 @@ export function resetInterface>(obj: T): T { return obj } +export const delay = promisify(setTimeout) + export const ensureUrlEndsWithSlash = (url: string): string => { return url.endsWith('/') ? url : url.concat('/') } diff --git a/dlt-connector/src/graphql/input/IdentifierSeed.ts b/dlt-connector/src/graphql/input/IdentifierSeed.ts new file mode 100644 index 000000000..41e7a31cd --- /dev/null +++ b/dlt-connector/src/graphql/input/IdentifierSeed.ts @@ -0,0 +1,9 @@ +import { IsString } from 'class-validator' +import { InputType, Field } from 'type-graphql' + +@InputType() +export class IdentifierSeed { + @Field(() => String) + @IsString() + seed: string +} diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 9a702aee3..393d5da93 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -5,6 +5,7 @@ import { InputType, Field } from 'type-graphql' import { InputTransactionType } from '@enum/InputTransactionType' import { isValidDateString, isValidNumberString } from '@validator/DateString' +import { IdentifierSeed } from './IdentifierSeed' import { UserIdentifier } from './UserIdentifier' @InputType() @@ -17,7 +18,7 @@ export class TransactionDraft { @Field(() => UserIdentifier) @IsObject() @ValidateNested() - linkedUser: UserIdentifier + linkedUser: UserIdentifier | IdentifierSeed @Field(() => String) @isValidNumberString() diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts index 012168bb0..ca54d8d16 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -1,12 +1,13 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' +import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' -import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' import { AccountKeyPairRole } from './AccountKeyPair.role' import { ForeignCommunityKeyPairRole } from './ForeignCommunityKeyPair.role' import { HomeCommunityKeyPairRole } from './HomeCommunityKeyPair.role' +import { LinkedTransactionKeyPairRole } from './LinkedTransactionKeyPair.role' import { RemoteAccountKeyPairRole } from './RemoteAccountKeyPair.role' import { UserKeyPairRole } from './UserKeyPair.role' @@ -14,43 +15,49 @@ import { UserKeyPairRole } from './UserKeyPair.role' * @DCI-Context * Context for calculating key pair for signing transactions */ -export async function KeyPairCalculation(input: UserIdentifier | string): Promise { +export async function KeyPairCalculation( + input: UserIdentifier | string | IdentifierSeed, +): Promise { const cache = KeyPairCacheManager.getInstance() - const keyPair = cache.findKeyPair(input) + + // Try cache lookup first + let keyPair = cache.findKeyPair(input) if (keyPair) { return keyPair } - let communityUUID: string - if (input instanceof UserIdentifier) { - communityUUID = input.communityUuid - } else { - communityUUID = input - } - if (cache.getHomeCommunityUUID() !== communityUUID) { - // it isn't home community so we can only retrieve public keys - let role: AbstractRemoteKeyPairRole - if (input instanceof UserIdentifier) { - role = new RemoteAccountKeyPairRole(input) - } else { - role = new ForeignCommunityKeyPairRole(input) + const retrieveKeyPair = async ( + input: UserIdentifier | string | IdentifierSeed, + ): Promise => { + if (input instanceof IdentifierSeed) { + return new LinkedTransactionKeyPairRole(input.seed).generateKeyPair() } - const keyPair = await role.retrieveKeyPair() - cache.addKeyPair(input, keyPair) - return keyPair + + const communityUUID = input instanceof UserIdentifier ? input.communityUuid : input + + // If input does not belong to the home community, handle as remote key pair + if (cache.getHomeCommunityUUID() !== communityUUID) { + const role = + input instanceof UserIdentifier + ? new RemoteAccountKeyPairRole(input) + : new ForeignCommunityKeyPairRole(input) + return await role.retrieveKeyPair() + } + + let communityKeyPair = cache.findKeyPair(communityUUID) + if (!communityKeyPair) { + communityKeyPair = new HomeCommunityKeyPairRole().generateKeyPair() + cache.addKeyPair(communityUUID, communityKeyPair) + } + if (input instanceof UserIdentifier) { + const userKeyPair = new UserKeyPairRole(input, communityKeyPair).generateKeyPair() + const accountNr = input.accountNr ?? 1 + return new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() + } + return communityKeyPair } - let communityKeyPair = cache.findKeyPair(communityUUID) - if (!communityKeyPair) { - communityKeyPair = new HomeCommunityKeyPairRole().generateKeyPair() - cache.addKeyPair(communityUUID, communityKeyPair) - } - if (input instanceof UserIdentifier) { - const userKeyPair = new UserKeyPairRole(input, communityKeyPair).generateKeyPair() - const accountNr = input.accountNr ?? 1 - const accountKeyPair = new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() - cache.addKeyPair(input, accountKeyPair) - return accountKeyPair - } - return communityKeyPair + keyPair = await retrieveKeyPair(input) + cache.addKeyPair(input, keyPair) + return keyPair } diff --git a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts new file mode 100644 index 000000000..39a20dd7a --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts @@ -0,0 +1,22 @@ +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' + +import { LogError } from '@/server/LogError' + +import { AbstractKeyPairRole } from './AbstractKeyPair.role' + +export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { + public constructor(private seed: string) { + super() + } + + public generateKeyPair(): KeyPairEd25519 { + // seed is expected to be 24 bytes long, but we need 32 + // so hash the seed with blake2 and we have 32 Bytes + const hash = new MemoryBlock(this.seed).calculateHash() + const keyPair = KeyPairEd25519.create(hash) + if (!keyPair) { + throw new LogError('error creating Ed25519 KeyPair from seed', this.seed) + } + return keyPair + } +} diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index b7a074a7a..775c60cb7 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -1,5 +1,6 @@ import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' +import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { LogError } from '@/server/LogError' @@ -21,12 +22,16 @@ export class CreationTransactionRole extends AbstractTransactionRole { } public async getGradidoTransactionBuilder(): Promise { - const builder = new GradidoTransactionBuilder() - const recipientKeyPair = await KeyPairCalculation(this.self.user) - const signerKeyPair = await KeyPairCalculation(this.self.linkedUser) + if (this.self.linkedUser instanceof IdentifierSeed) { + throw new LogError('invalid recipient, it is a IdentifierSeed instead of a UserIdentifier') + } if (!this.self.targetDate) { throw new LogError('target date missing for creation transaction') } + const builder = new GradidoTransactionBuilder() + const recipientKeyPair = await KeyPairCalculation(this.self.user) + const signerKeyPair = await KeyPairCalculation(this.self.linkedUser) + builder .setCreatedAt(new Date(this.self.createdAt)) .setMemo('dummy memo for creation') diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 48c025b09..ff252f59d 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -1,20 +1,28 @@ import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { LogError } from '@/server/LogError' -import { uuid4ToHash } from '@/utils/typeConverter' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { TransferTransactionRole } from './TransferTransaction.role' export class DeferredTransferTransactionRole extends TransferTransactionRole { + getRecipientCommunityUuid(): string { + throw new LogError('cannot be used as cross group transaction') + } + public async getGradidoTransactionBuilder(): Promise { - const builder = new GradidoTransactionBuilder() - const senderKeyPair = await KeyPairCalculation(this.self.user) - const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + if (this.self.linkedUser instanceof UserIdentifier) { + throw new LogError('invalid recipient, it is a UserIdentifier instead of a IdentifierSeed') + } if (!this.self.timeoutDate) { throw new LogError('timeoutDate date missing for deferred transfer transaction') } + const builder = new GradidoTransactionBuilder() + const senderKeyPair = await KeyPairCalculation(this.self.user) + const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + builder .setCreatedAt(new Date(this.self.createdAt)) .setMemo('dummy memo for transfer') @@ -25,14 +33,6 @@ export class DeferredTransferTransactionRole extends TransferTransactionRole { ), new Date(this.self.timeoutDate), ) - const senderCommunity = this.self.user.communityUuid - const recipientCommunity = this.self.linkedUser.communityUuid - if (senderCommunity !== recipientCommunity) { - // we have a cross group transaction - builder - .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) - .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) - } builder.sign(senderKeyPair) return builder } diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index 1e5dde5dd..16a2ec7ee 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -1,6 +1,8 @@ import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' +import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { LogError } from '@/server/LogError' import { uuid4ToHash } from '@/utils/typeConverter' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' @@ -17,10 +19,17 @@ export class TransferTransactionRole extends AbstractTransactionRole { } getRecipientCommunityUuid(): string { + if (this.self.linkedUser instanceof IdentifierSeed) { + throw new LogError('invalid recipient, it is a IdentifierSeed instead of a UserIdentifier') + } return this.self.linkedUser.communityUuid } public async getGradidoTransactionBuilder(): Promise { + if (this.self.linkedUser instanceof IdentifierSeed) { + throw new LogError('invalid recipient, it is a IdentifierSeed instead of a UserIdentifier') + } + const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation(this.self.user) const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) diff --git a/dlt-connector/src/logging/TransactionDraftLogging.view.ts b/dlt-connector/src/logging/TransactionDraftLogging.view.ts index b68f6d746..8f9e11331 100644 --- a/dlt-connector/src/logging/TransactionDraftLogging.view.ts +++ b/dlt-connector/src/logging/TransactionDraftLogging.view.ts @@ -1,5 +1,6 @@ import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { getEnumValue } from '@/utils/typeConverter' import { AbstractLoggingView } from './AbstractLogging.view' @@ -14,7 +15,10 @@ export class TransactionDraftLoggingView extends AbstractLoggingView { public toJSON(): any { return { user: new UserIdentifierLoggingView(this.self.user).toJSON(), - linkedUser: new UserIdentifierLoggingView(this.self.linkedUser).toJSON(), + linkedUser: + this.self.linkedUser instanceof UserIdentifier + ? new UserIdentifierLoggingView(this.self.linkedUser).toJSON() + : 'seed', amount: Number(this.self.amount), type: getEnumValue(InputTransactionType, this.self.type), createdAt: this.self.createdAt, diff --git a/dlt-connector/src/manager/KeyPairCacheManager.ts b/dlt-connector/src/manager/KeyPairCacheManager.ts index f5c11e388..844f5ad58 100644 --- a/dlt-connector/src/manager/KeyPairCacheManager.ts +++ b/dlt-connector/src/manager/KeyPairCacheManager.ts @@ -1,5 +1,6 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' +import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { LogError } from '@/server/LogError' @@ -44,11 +45,14 @@ export class KeyPairCacheManager { return this.homeCommunityUUID } - public findKeyPair(input: UserIdentifier | string): KeyPairEd25519 | undefined { + public findKeyPair(input: UserIdentifier | string | IdentifierSeed): KeyPairEd25519 | undefined { return this.cache.get(this.getKey(input)) } - public addKeyPair(input: UserIdentifier | string, keyPair: KeyPairEd25519): void { + public addKeyPair( + input: UserIdentifier | string | IdentifierSeed, + keyPair: KeyPairEd25519, + ): void { const key = this.getKey(input) if (this.cache.has(key)) { throw new LogError('key already exist, cannot add', key) @@ -56,9 +60,11 @@ export class KeyPairCacheManager { this.cache.set(key, keyPair) } - protected getKey(input: UserIdentifier | string): string { + protected getKey(input: UserIdentifier | string | IdentifierSeed): string { if (input instanceof UserIdentifier) { return input.uuid + } else if (input instanceof IdentifierSeed) { + return input.seed } else { return input } diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index 1f60d65f2..c4f244816 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -1082,7 +1082,7 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== -"@types/node-fetch@^2.6.1", "@types/node-fetch@^2.6.11": +"@types/node-fetch@^2.6.1": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== @@ -2112,11 +2112,6 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -data-uri-to-buffer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" - integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -2936,14 +2931,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" - integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -3063,13 +3050,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -4690,11 +4670,6 @@ node-api-headers@^1.1.0: resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.3.0.tgz#bb32c6b3e33fb0004bd93c66787bf00998c834ea" integrity sha512-8Bviwtw4jNhv0B2qDjj4M5e6GyAuGtxsmZTrFJu3S3Z0+oHwIgSUdIKkKJmZd+EbMo7g3v4PLBbrjxwmZOqMBg== -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -4702,15 +4677,6 @@ node-fetch@^2.6.12, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" - integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - node-gyp-build@^4.8.1: version "4.8.2" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" @@ -6299,11 +6265,6 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" -web-streams-polyfill@^3.0.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" From de162647e53489412288d55cd8e2fd44e9de5193 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 13 Nov 2024 14:55:34 +0100 Subject: [PATCH 17/23] fix error and error handling --- .../transactionToDlt/TransactionLinkToDlt.role.ts | 4 ++-- .../transactionToDlt/transactionToDlt.context.ts | 5 +---- .../dltConnector/sendTransactionsToDltConnector.ts | 12 +++++++----- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts index a30d86f65..1b0ac97e6 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -14,10 +14,10 @@ import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { async initWithLast(): Promise { this.self = await this.createQueryForPendingItems( - TransactionLink.createQueryBuilder().leftJoinAndSelect('transactionLink.user', 'user'), + TransactionLink.createQueryBuilder().leftJoinAndSelect('TransactionLink.user', 'user'), 'TransactionLink.id = dltTransaction.transactionLinkId', // eslint-disable-next-line camelcase - { TransactionLinkId_created_at: 'ASC', User_id: 'ASC' }, + { TransactionLink_createdAt: 'ASC', User_id: 'ASC' }, ) return this } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts index 57281f96b..9e56eee81 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts @@ -1,3 +1,4 @@ +import { EntityPropertyNotFoundError, QueryFailedError, TypeORMError } from '@dbTools/typeorm' import { Transaction } from '@entity/Transaction' import { TransactionLink } from '@entity/TransactionLink' import { User } from '@entity/User' @@ -33,7 +34,6 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis }) return results[0] } - while (true) { const pendingTransactionRole = await findNextPendingTransaction() const pendingTransaction = pendingTransactionRole.getEntity() @@ -54,9 +54,6 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis error = 'skipped' } } catch (e) { - if (e instanceof FetchError) { - throw e - } error = e instanceof Error ? e.message : String(e) } diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts index 7e0abf0fa..98bbde864 100644 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts @@ -1,5 +1,5 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { EntityPropertyNotFoundError } from '@dbTools/typeorm' +import { TypeORMError } from '@dbTools/typeorm' // eslint-disable-next-line import/named, n/no-extraneous-import import { FetchError } from 'node-fetch' @@ -43,9 +43,6 @@ export async function sendTransactionsToDltConnector(): Promise { 1000, ) } catch (e) { - if (e instanceof EntityPropertyNotFoundError) { - throw new LogError(e.message, e.stack) - } // couldn't connect to dlt-connector? We wait if (e instanceof FetchError) { logger.error(`error connecting dlt-connector, wait 5 seconds before retry: ${String(e)}`) @@ -54,7 +51,12 @@ export async function sendTransactionsToDltConnector(): Promise { 5000, ) } else { - logger.error(`Error while sending to DLT-connector or writing messageId`, e) + if (e instanceof TypeORMError) { + // seems to be a error in code, so let better stop here + throw new LogError(e.message, e.stack) + } else { + logger.error(`Error while sending to DLT-connector or writing messageId`, e) + } } } } From 7ddd1cf922d45dddde41521c725417a79e659e01 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 14 Nov 2024 08:50:39 +0100 Subject: [PATCH 18/23] refactored process --- .../apis/dltConnector/DltConnectorClient.ts | 31 +++++++++++- .../AbstractTransactionToDlt.role.ts | 7 ++- .../TransactionLinkToDlt.role.ts | 5 +- .../transactionToDlt/TransactionToDlt.role.ts | 3 +- .../transactionToDlt/UserToDlt.role.ts | 3 +- .../apis/dltConnector/model/IdentifierSeed.ts | 7 --- .../dltConnector/model/TransactionDraft.ts | 47 +++++++------------ .../model/TransactionLinkDraft.ts | 21 +++++++++ .../src/graphql/enum/InputTransactionType.ts | 3 ++ .../src/graphql/input/IdentifierSeed.ts | 8 +++- .../src/graphql/input/TransactionDraft.ts | 13 ++--- .../src/graphql/input/TransactionLinkDraft.ts | 30 ++++++++++++ .../graphql/resolver/TransactionsResolver.ts | 21 ++++++++- .../sendToIota/CreationTransaction.role.ts | 4 -- .../DeferredTransferTransaction.role.ts | 23 +++++---- .../sendToIota/SendToIota.context.ts | 6 ++- .../sendToIota/TransferTransaction.role.ts | 9 ---- 17 files changed, 161 insertions(+), 80 deletions(-) delete mode 100644 backend/src/apis/dltConnector/model/IdentifierSeed.ts create mode 100644 backend/src/apis/dltConnector/model/TransactionLinkDraft.ts create mode 100644 dlt-connector/src/graphql/input/TransactionLinkDraft.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index f864bb652..5bdf60c35 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -9,6 +9,7 @@ import { backendLogger as logger } from '@/server/logger' // eslint-disable-next-line import/named, n/no-extraneous-import import { TransactionDraft } from './model/TransactionDraft' +import { TransactionLinkDraft } from './model/TransactionLinkDraft' import { TransactionResult } from './model/TransactionResult' import { UserAccountDraft } from './model/UserAccountDraft' @@ -29,6 +30,23 @@ const sendTransaction = gql` } ` +const deferredTransfer = gql` + mutation ($input: TransactionLinkDraft!) { + deferredTransfer(data: $input) { + error { + message + name + } + succeed + recipe { + createdAt + type + messageIdHex + } + } + } +` + const registerAddress = gql` mutation ($input: UserAccountDraft!) { registerAddress(data: $input) { @@ -114,6 +132,15 @@ export class DltConnectorClient { return this.handleTransactionResult(result) } + private async deferredTransfer(input: TransactionLinkDraft) { + const { + data: { deferredTransfer: result }, + } = await this.client.rawRequest<{ deferredTransfer: TransactionResult }>(deferredTransfer, { + input, + }) + return this.handleTransactionResult(result) + } + private async registerAddress(input: UserAccountDraft) { const { data: { registerAddress: result }, @@ -128,7 +155,7 @@ export class DltConnectorClient { * and update dltTransactionId of transaction in db with iota message id */ public async transmitTransaction( - input: TransactionDraft | UserAccountDraft, + input: TransactionDraft | UserAccountDraft | TransactionLinkDraft, ): Promise { // we don't need the receive transactions, there contain basically the same data as the send transactions if ( @@ -144,6 +171,8 @@ export class DltConnectorClient { return await this.sendTransaction(input) } else if (input instanceof UserAccountDraft) { return await this.registerAddress(input) + } else if (input instanceof TransactionLinkDraft) { + return await this.deferredTransfer(input) } else { throw new LogError('unhandled branch reached') } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts index 50296244e..c1a73edd0 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts @@ -3,6 +3,7 @@ import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from '@dbTools/ty import { DltTransaction } from '@entity/DltTransaction' import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { TransactionLinkDraft } from '@dltConnector/model/TransactionLinkDraft' import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' import { backendLogger as logger } from '@/server/logger' @@ -13,7 +14,11 @@ export abstract class AbstractTransactionToDltRole { // public interface public abstract initWithLast(): Promise public abstract getTimestamp(): number - public abstract convertToGraphqlInput(): TransactionDraft | UserAccountDraft + public abstract convertToGraphqlInput(): + | TransactionDraft + | UserAccountDraft + | TransactionLinkDraft + public getEntity(): T | null { return this.self } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts index 1b0ac97e6..5b1efdad6 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -2,6 +2,7 @@ import { DltTransaction } from '@entity/DltTransaction' import { TransactionLink } from '@entity/TransactionLink' import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { TransactionLinkDraft } from '@dltConnector/model/TransactionLinkDraft' import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' import { LogError } from '@/server/LogError' @@ -29,11 +30,11 @@ export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { return this.self.createdAt.getTime() } - public convertToGraphqlInput(): TransactionDraft | UserAccountDraft { + public convertToGraphqlInput(): TransactionDraft | UserAccountDraft | TransactionLinkDraft { if (!this.self) { throw new LogError('try to create dlt entry for empty transaction') } diff --git a/backend/src/apis/dltConnector/model/IdentifierSeed.ts b/backend/src/apis/dltConnector/model/IdentifierSeed.ts deleted file mode 100644 index c597d2797..000000000 --- a/backend/src/apis/dltConnector/model/IdentifierSeed.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class IdentifierSeed { - seed: string - - constructor(seed: string) { - this.seed = seed - } -} diff --git a/backend/src/apis/dltConnector/model/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts index 7413969eb..e31003986 100755 --- a/backend/src/apis/dltConnector/model/TransactionDraft.ts +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -1,52 +1,39 @@ // https://www.npmjs.com/package/@apollo/protobufjs import { Transaction } from '@entity/Transaction' -import { TransactionLink } from '@entity/TransactionLink' import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { LogError } from '@/server/LogError' -import { IdentifierSeed } from './IdentifierSeed' import { UserIdentifier } from './UserIdentifier' export class TransactionDraft { user: UserIdentifier - linkedUser: UserIdentifier | IdentifierSeed + linkedUser: UserIdentifier amount: string type: string createdAt: string // only for creation transactions targetDate?: string - // only for transaction links - timeoutDate?: string - constructor(transaction: Transaction | TransactionLink) { + constructor(transaction: Transaction) { this.amount = transaction.amount.abs().toString() - if (transaction instanceof Transaction) { - if ( - !transaction.linkedUserGradidoID || - !transaction.linkedUserCommunityUuid || - !transaction.userCommunityUuid - ) { - throw new LogError( - `missing necessary field in transaction: ${transaction.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, - ) - } - this.user = new UserIdentifier(transaction.userGradidoID, transaction.userCommunityUuid) - this.linkedUser = new UserIdentifier( - transaction.linkedUserGradidoID, - transaction.linkedUserCommunityUuid, + if ( + !transaction.linkedUserGradidoID || + !transaction.linkedUserCommunityUuid || + !transaction.userCommunityUuid + ) { + throw new LogError( + `missing necessary field in transaction: ${transaction.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, ) - this.createdAt = transaction.balanceDate.toISOString() - this.targetDate = transaction.creationDate?.toISOString() - this.type = TransactionTypeId[transaction.typeId] - } else if (transaction instanceof TransactionLink) { - const user = transaction.user - this.user = new UserIdentifier(user.gradidoID, user.communityUuid) - this.linkedUser = new IdentifierSeed(transaction.code) - this.createdAt = transaction.createdAt.toISOString() - this.type = TransactionTypeId[TransactionTypeId.LINK_SUMMARY] - this.timeoutDate = transaction.validUntil.toISOString() } + this.user = new UserIdentifier(transaction.userGradidoID, transaction.userCommunityUuid) + this.linkedUser = new UserIdentifier( + transaction.linkedUserGradidoID, + transaction.linkedUserCommunityUuid, + ) + this.createdAt = transaction.balanceDate.toISOString() + this.targetDate = transaction.creationDate?.toISOString() + this.type = TransactionTypeId[transaction.typeId] } } diff --git a/backend/src/apis/dltConnector/model/TransactionLinkDraft.ts b/backend/src/apis/dltConnector/model/TransactionLinkDraft.ts new file mode 100644 index 000000000..1a12f552b --- /dev/null +++ b/backend/src/apis/dltConnector/model/TransactionLinkDraft.ts @@ -0,0 +1,21 @@ +// https://www.npmjs.com/package/@apollo/protobufjs +import { TransactionLink } from '@entity/TransactionLink' + +import { UserIdentifier } from './UserIdentifier' + +export class TransactionLinkDraft { + user: UserIdentifier + seed: string + amount: string + createdAt: string + timeoutDate: string + + constructor(transaction: TransactionLink) { + this.amount = transaction.amount.abs().toString() + const user = transaction.user + this.user = new UserIdentifier(user.gradidoID, user.communityUuid) + this.seed = transaction.code + this.createdAt = transaction.createdAt.toISOString() + this.timeoutDate = transaction.validUntil.toISOString() + } +} diff --git a/dlt-connector/src/graphql/enum/InputTransactionType.ts b/dlt-connector/src/graphql/enum/InputTransactionType.ts index 41eeac6cb..94cd39ff3 100755 --- a/dlt-connector/src/graphql/enum/InputTransactionType.ts +++ b/dlt-connector/src/graphql/enum/InputTransactionType.ts @@ -6,6 +6,9 @@ export enum InputTransactionType { CREATION = 1, SEND = 2, RECEIVE = 3, + // This is a virtual property, never occurring on the database + DECAY = 4, + LINK_SUMMARY = 5, } registerEnumType(InputTransactionType, { diff --git a/dlt-connector/src/graphql/input/IdentifierSeed.ts b/dlt-connector/src/graphql/input/IdentifierSeed.ts index 41e7a31cd..f09ad2f8b 100644 --- a/dlt-connector/src/graphql/input/IdentifierSeed.ts +++ b/dlt-connector/src/graphql/input/IdentifierSeed.ts @@ -1,9 +1,15 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + import { IsString } from 'class-validator' -import { InputType, Field } from 'type-graphql' +import { Field, InputType } from 'type-graphql' @InputType() export class IdentifierSeed { @Field(() => String) @IsString() seed: string + + constructor(seed: string) { + this.seed = seed + } } diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 393d5da93..d1fa48c3c 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -1,11 +1,9 @@ // https://www.npmjs.com/package/@apollo/protobufjs +import { InputTransactionType } from '@enum/InputTransactionType' +import { isValidDateString, isValidNumberString } from '@validator/DateString' import { IsEnum, IsObject, ValidateNested } from 'class-validator' import { InputType, Field } from 'type-graphql' -import { InputTransactionType } from '@enum/InputTransactionType' -import { isValidDateString, isValidNumberString } from '@validator/DateString' - -import { IdentifierSeed } from './IdentifierSeed' import { UserIdentifier } from './UserIdentifier' @InputType() @@ -18,7 +16,7 @@ export class TransactionDraft { @Field(() => UserIdentifier) @IsObject() @ValidateNested() - linkedUser: UserIdentifier | IdentifierSeed + linkedUser: UserIdentifier @Field(() => String) @isValidNumberString() @@ -36,9 +34,4 @@ export class TransactionDraft { @Field(() => String, { nullable: true }) @isValidDateString() targetDate?: string - - // only for transaction links - @Field(() => String, { nullable: true }) - @isValidDateString() - timeoutDate?: string } diff --git a/dlt-connector/src/graphql/input/TransactionLinkDraft.ts b/dlt-connector/src/graphql/input/TransactionLinkDraft.ts new file mode 100644 index 000000000..7ac621e35 --- /dev/null +++ b/dlt-connector/src/graphql/input/TransactionLinkDraft.ts @@ -0,0 +1,30 @@ +// https://www.npmjs.com/package/@apollo/protobufjs +import { isValidDateString, isValidNumberString } from '@validator/DateString' +import { IsObject, IsString, ValidateNested } from 'class-validator' +import { InputType, Field } from 'type-graphql' + +import { UserIdentifier } from './UserIdentifier' + +@InputType() +export class TransactionLinkDraft { + @Field(() => UserIdentifier) + @IsObject() + @ValidateNested() + user: UserIdentifier + + @Field(() => String) + @IsString() + seed: string + + @Field(() => String) + @isValidNumberString() + amount: string + + @Field(() => String) + @isValidDateString() + createdAt: string + + @Field(() => String) + @isValidDateString() + timeoutDate: string +} diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index e5e537ad9..8d3d5970b 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,9 +1,9 @@ +import { TransactionLinkDraft } from '@input/TransactionLinkDraft' import { Resolver, Arg, Mutation } from 'type-graphql' -import { TransactionDraft } from '@input/TransactionDraft' - import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' +import { TransactionDraft } from '../input/TransactionDraft' import { TransactionError } from '../model/TransactionError' import { TransactionResult } from '../model/TransactionResult' @@ -25,4 +25,21 @@ export class TransactionResolver { } } } + + @Mutation(() => TransactionResult) + async deferredTransfer( + @Arg('data') + transactionLinkDraft: TransactionLinkDraft, + ): Promise { + try { + return await SendToIotaContext(transactionLinkDraft) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + if (error instanceof TransactionError) { + return new TransactionResult(error) + } else { + throw error + } + } + } } diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index 775c60cb7..c448a1704 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -1,6 +1,5 @@ import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' -import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { LogError } from '@/server/LogError' @@ -22,9 +21,6 @@ export class CreationTransactionRole extends AbstractTransactionRole { } public async getGradidoTransactionBuilder(): Promise { - if (this.self.linkedUser instanceof IdentifierSeed) { - throw new LogError('invalid recipient, it is a IdentifierSeed instead of a UserIdentifier') - } if (!this.self.targetDate) { throw new LogError('target date missing for creation transaction') } diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index ff252f59d..7a4c627a1 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -1,27 +1,30 @@ import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' +import { TransactionLinkDraft } from '@/graphql/input/TransactionLinkDraft' import { LogError } from '@/server/LogError' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' -import { TransferTransactionRole } from './TransferTransaction.role' +import { AbstractTransactionRole } from './AbstractTransaction.role' + +export class DeferredTransferTransactionRole extends AbstractTransactionRole { + constructor(protected self: TransactionLinkDraft) { + super() + } + + getSenderCommunityUuid(): string { + return this.self.user.communityUuid + } -export class DeferredTransferTransactionRole extends TransferTransactionRole { getRecipientCommunityUuid(): string { throw new LogError('cannot be used as cross group transaction') } public async getGradidoTransactionBuilder(): Promise { - if (this.self.linkedUser instanceof UserIdentifier) { - throw new LogError('invalid recipient, it is a UserIdentifier instead of a IdentifierSeed') - } - if (!this.self.timeoutDate) { - throw new LogError('timeoutDate date missing for deferred transfer transaction') - } const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation(this.self.user) - const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + const recipientKeyPair = await KeyPairCalculation(new IdentifierSeed(this.self.seed)) builder .setCreatedAt(new Date(this.self.createdAt)) diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index a10a95c35..caf4df11f 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -12,6 +12,7 @@ import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionLinkDraft } from '@/graphql/input/TransactionLinkDraft' import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { TransactionError } from '@/graphql/model/TransactionError' import { TransactionRecipe } from '@/graphql/model/TransactionRecipe' @@ -23,6 +24,7 @@ import { uuid4ToHash } from '@/utils/typeConverter' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' +import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' @@ -32,7 +34,7 @@ import { TransferTransactionRole } from './TransferTransaction.role' * send every transaction only once to iota! */ export async function SendToIotaContext( - input: TransactionDraft | UserAccountDraft | CommunityDraft, + input: TransactionDraft | UserAccountDraft | CommunityDraft | TransactionLinkDraft, ): Promise { const validate = (transaction: GradidoTransaction): void => { try { @@ -81,6 +83,8 @@ export async function SendToIotaContext( } else { throw new LogError('not supported transaction type') } + } else if (input instanceof TransactionLinkDraft) { + role = new DeferredTransferTransactionRole(input) } else if (input instanceof UserAccountDraft) { role = new RegisterAddressTransactionRole(input) } else if (input instanceof CommunityDraft) { diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index 16a2ec7ee..1e5dde5dd 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -1,8 +1,6 @@ import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' -import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { LogError } from '@/server/LogError' import { uuid4ToHash } from '@/utils/typeConverter' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' @@ -19,17 +17,10 @@ export class TransferTransactionRole extends AbstractTransactionRole { } getRecipientCommunityUuid(): string { - if (this.self.linkedUser instanceof IdentifierSeed) { - throw new LogError('invalid recipient, it is a IdentifierSeed instead of a UserIdentifier') - } return this.self.linkedUser.communityUuid } public async getGradidoTransactionBuilder(): Promise { - if (this.self.linkedUser instanceof IdentifierSeed) { - throw new LogError('invalid recipient, it is a IdentifierSeed instead of a UserIdentifier') - } - const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation(this.self.user) const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) From a24ed8ef986e43ab71fe8bac151807a07d0d4d39 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 14 Nov 2024 11:20:43 +0100 Subject: [PATCH 19/23] refactor, pack in one graphql in put model, add redeeming transaction link in dlt --- .../dltConnector/DltConnectorClient.test.ts | 15 -- .../apis/dltConnector/DltConnectorClient.ts | 112 +---------- .../apis/dltConnector/enum/TransactionType.ts | 19 +- .../AbstractTransactionToDlt.role.ts | 10 +- .../TransactionLinkToDlt.role.ts | 20 +- .../transactionToDlt/TransactionToDlt.role.ts | 61 +++++- .../transactionToDlt/UserToDlt.role.ts | 17 +- .../transactionToDlt.context.ts | 25 +-- .../apis/dltConnector/model/CommunityUser.ts | 10 + .../apis/dltConnector/model/IdentifierSeed.ts | 9 + .../dltConnector/model/TransactionDraft.ts | 42 ++--- .../model/TransactionLinkDraft.ts | 21 --- .../dltConnector/model/UserAccountDraft.ts | 17 -- .../apis/dltConnector/model/UserIdentifier.ts | 20 +- .../0088-merge_dlt_tables/Transaction.ts | 176 ++++++++++++++++++ .../0088-merge_dlt_tables/TransactionLink.ts | 6 + database/entity/Transaction.ts | 2 +- .../logging/TransactionLinkLogging.view.ts | 35 ++++ database/logging/TransactionLogging.view.ts | 7 +- .../src/graphql/enum/InputTransactionType.ts | 12 +- .../src/graphql/input/CommunityDraft.ts | 3 +- .../src/graphql/input/CommunityUser.ts | 15 ++ .../src/graphql/input/TransactionDraft.ts | 22 ++- .../src/graphql/input/TransactionLinkDraft.ts | 30 --- .../src/graphql/input/UserAccountDraft.ts | 26 --- .../src/graphql/input/UserIdentifier.ts | 23 ++- .../src/graphql/resolver/AccountsResolver.ts | 23 +-- .../graphql/resolver/TransactionsResolver.ts | 18 -- .../KeyPairCalculation.context.ts | 14 +- .../RemoteAccountKeyPair.role.ts | 6 +- .../keyPairCalculation/UserKeyPair.role.ts | 6 +- .../sendToIota/CreationTransaction.role.ts | 22 ++- .../DeferredTransferTransaction.role.ts | 33 +++- .../RegisterAddressTransaction.role.ts | 22 ++- .../sendToIota/SendToIota.context.ts | 32 ++-- .../sendToIota/TransferTransaction.role.ts | 22 ++- .../src/logging/CommunityUserLogging.view.ts | 17 ++ .../src/logging/IdentifierSeedLogging.view.ts | 16 ++ .../src/logging/UserIdentifierLogging.view.ts | 8 +- .../src/manager/KeyPairCacheManager.ts | 21 ++- 40 files changed, 606 insertions(+), 409 deletions(-) create mode 100644 backend/src/apis/dltConnector/model/CommunityUser.ts create mode 100644 backend/src/apis/dltConnector/model/IdentifierSeed.ts delete mode 100644 backend/src/apis/dltConnector/model/TransactionLinkDraft.ts delete mode 100644 backend/src/apis/dltConnector/model/UserAccountDraft.ts create mode 100644 database/entity/0088-merge_dlt_tables/Transaction.ts create mode 100644 database/logging/TransactionLinkLogging.view.ts create mode 100644 dlt-connector/src/graphql/input/CommunityUser.ts delete mode 100644 dlt-connector/src/graphql/input/TransactionLinkDraft.ts delete mode 100644 dlt-connector/src/graphql/input/UserAccountDraft.ts create mode 100644 dlt-connector/src/logging/CommunityUserLogging.view.ts create mode 100644 dlt-connector/src/logging/IdentifierSeedLogging.view.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.test.ts b/backend/src/apis/dltConnector/DltConnectorClient.test.ts index 8169be112..5cd7c3269 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.test.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.test.ts @@ -109,21 +109,6 @@ describe('transmitTransaction', () => { expect(result).toBe(false) }) */ - - it('invalid transaction type', async () => { - const localTransaction = new DbTransaction() - localTransaction.typeId = 12 - try { - await DltConnectorClient.getInstance()?.transmitTransaction( - new TransactionDraft(localTransaction), - ) - } catch (e) { - expect(e).toMatchObject( - new LogError('invalid transaction type id: ' + localTransaction.typeId.toString()), - ) - } - }) - /* it.skip('should transmit the transaction and update the dltTransactionId in the database', async () => { await transaction.save() diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 5bdf60c35..a9a6557d5 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -1,17 +1,11 @@ import { gql, GraphQLClient } from 'graphql-request' -// eslint-disable-next-line import/named, n/no-extraneous-import -import { FetchError } from 'node-fetch' import { CONFIG } from '@/config' -import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' -import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' // eslint-disable-next-line import/named, n/no-extraneous-import import { TransactionDraft } from './model/TransactionDraft' -import { TransactionLinkDraft } from './model/TransactionLinkDraft' import { TransactionResult } from './model/TransactionResult' -import { UserAccountDraft } from './model/UserAccountDraft' const sendTransaction = gql` mutation ($input: TransactionDraft!) { @@ -30,40 +24,6 @@ const sendTransaction = gql` } ` -const deferredTransfer = gql` - mutation ($input: TransactionLinkDraft!) { - deferredTransfer(data: $input) { - error { - message - name - } - succeed - recipe { - createdAt - type - messageIdHex - } - } - } -` - -const registerAddress = gql` - mutation ($input: UserAccountDraft!) { - registerAddress(data: $input) { - error { - message - name - } - succeed - recipe { - createdAt - type - messageIdHex - } - } - } -` - // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts /** @@ -116,75 +76,17 @@ export class DltConnectorClient { return DltConnectorClient.instance } - private handleTransactionResult(result: TransactionResult) { - if (result.error) { - throw new Error(result.error.message) - } - return result - } - - private async sendTransaction(input: TransactionDraft) { + /** + * transmit transaction via dlt-connector to iota + * and update dltTransactionId of transaction in db with iota message id + */ + public async sendTransaction(input: TransactionDraft): Promise { + logger.debug('transmit transaction or user to dlt connector', input) const { data: { sendTransaction: result }, } = await this.client.rawRequest<{ sendTransaction: TransactionResult }>(sendTransaction, { input, }) - return this.handleTransactionResult(result) - } - - private async deferredTransfer(input: TransactionLinkDraft) { - const { - data: { deferredTransfer: result }, - } = await this.client.rawRequest<{ deferredTransfer: TransactionResult }>(deferredTransfer, { - input, - }) - return this.handleTransactionResult(result) - } - - private async registerAddress(input: UserAccountDraft) { - const { - data: { registerAddress: result }, - } = await this.client.rawRequest<{ registerAddress: TransactionResult }>(registerAddress, { - input, - }) - return this.handleTransactionResult(result) - } - - /** - * transmit transaction via dlt-connector to iota - * and update dltTransactionId of transaction in db with iota message id - */ - public async transmitTransaction( - input: TransactionDraft | UserAccountDraft | TransactionLinkDraft, - ): Promise { - // we don't need the receive transactions, there contain basically the same data as the send transactions - if ( - input instanceof TransactionDraft && - TransactionTypeId[input.type as keyof typeof TransactionTypeId] === TransactionTypeId.RECEIVE - ) { - return - } - - try { - logger.debug('transmit transaction or user to dlt connector', input) - if (input instanceof TransactionDraft) { - return await this.sendTransaction(input) - } else if (input instanceof UserAccountDraft) { - return await this.registerAddress(input) - } else if (input instanceof TransactionLinkDraft) { - return await this.deferredTransfer(input) - } else { - throw new LogError('unhandled branch reached') - } - } catch (e) { - logger.error(e) - if (e instanceof FetchError) { - throw e - } else if (e instanceof Error) { - throw new LogError(`from dlt-connector: ${e.message}`) - } else { - throw new LogError('Exception sending transfer transaction to dlt-connector', e) - } - } + return result } } diff --git a/backend/src/apis/dltConnector/enum/TransactionType.ts b/backend/src/apis/dltConnector/enum/TransactionType.ts index 51b87c134..095f56c47 100644 --- a/backend/src/apis/dltConnector/enum/TransactionType.ts +++ b/backend/src/apis/dltConnector/enum/TransactionType.ts @@ -1,11 +1,18 @@ +import { registerEnumType } from 'type-graphql' + /** * Transaction Types on Blockchain */ export enum TransactionType { - GRADIDO_TRANSFER = 1, - GRADIDO_CREATION = 2, - GROUP_FRIENDS_UPDATE = 3, - REGISTER_ADDRESS = 4, - GRADIDO_DEFERRED_TRANSFER = 5, - COMMUNITY_ROOT = 6, + GRADIDO_TRANSFER = 'GRADIDO_TRANSFER', + GRADIDO_CREATION = 'GRADIDO_CREATION', + GROUP_FRIENDS_UPDATE = 'GROUP_FRIENDS_UPDATE', + REGISTER_ADDRESS = 'REGISTER_ADDRESS', + GRADIDO_DEFERRED_TRANSFER = 'GRADIDO_DEFERRED_TRANSFER', + COMMUNITY_ROOT = 'COMMUNITY_ROOT', } + +registerEnumType(TransactionType, { + name: 'TransactionType', // this one is mandatory + description: 'Type of the transaction', // this one is optional +}) diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts index c1a73edd0..e21b853e6 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts @@ -3,8 +3,6 @@ import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from '@dbTools/ty import { DltTransaction } from '@entity/DltTransaction' import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { TransactionLinkDraft } from '@dltConnector/model/TransactionLinkDraft' -import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' import { backendLogger as logger } from '@/server/logger' @@ -14,10 +12,7 @@ export abstract class AbstractTransactionToDltRole { // public interface public abstract initWithLast(): Promise public abstract getTimestamp(): number - public abstract convertToGraphqlInput(): - | TransactionDraft - | UserAccountDraft - | TransactionLinkDraft + public abstract convertToGraphqlInput(): TransactionDraft public getEntity(): T | null { return this.self @@ -48,7 +43,7 @@ export abstract class AbstractTransactionToDltRole { qb: SelectQueryBuilder, joinCondition: string, orderBy: OrderByCondition, - ): Promise { + ): SelectQueryBuilder { return qb .leftJoin(DltTransaction, 'dltTransaction', joinCondition) .where('dltTransaction.user_id IS NULL') @@ -56,7 +51,6 @@ export abstract class AbstractTransactionToDltRole { .andWhere('dltTransaction.transaction_link_Id IS NULL') .orderBy(orderBy) .limit(1) - .getOne() } protected createDltTransactionEntry(messageId: string, error: string | null): DltTransaction { diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts index 5b1efdad6..8aeccfa91 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -1,9 +1,11 @@ import { DltTransaction } from '@entity/DltTransaction' import { TransactionLink } from '@entity/TransactionLink' +import { TransactionType } from '@dltConnector/enum/TransactionType' +import { CommunityUser } from '@dltConnector/model/CommunityUser' +import { IdentifierSeed } from '@dltConnector/model/IdentifierSeed' import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { TransactionLinkDraft } from '@dltConnector/model/TransactionLinkDraft' -import { UserAccountDraft } from '@dltConnector/model/UserAccountDraft' +import { UserIdentifier } from '@dltConnector/model/UserIdentifier' import { LogError } from '@/server/LogError' @@ -19,7 +21,7 @@ export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { async initWithLast(): Promise { this.self = await this.createQueryForPendingItems( - Transaction.createQueryBuilder(), + Transaction.createQueryBuilder().leftJoinAndSelect( + 'Transaction.transactionLink', + 'transactionLink', + ), 'Transaction.id = dltTransaction.transactionId', // eslint-disable-next-line camelcase { balance_date: 'ASC', Transaction_id: 'ASC' }, ) + // we don't need the receive transactions, there contain basically the same data as the send transactions + .andWhere('transaction.typeId NOT :typeId', { typeId: TransactionTypeId.RECEIVE }) + .getOne() return this } @@ -30,11 +39,53 @@ export class TransactionToDltRole extends AbstractTransactionToDltRole { 'User.id = dltTransaction.userId', // eslint-disable-next-line camelcase { User_created_at: 'ASC', User_id: 'ASC' }, - ) + ).getOne() return this } @@ -30,11 +32,16 @@ export class UserToDltRole extends AbstractTransactionToDltRole { return this.self.createdAt.getTime() } - public convertToGraphqlInput(): TransactionDraft | UserAccountDraft | TransactionLinkDraft { + public convertToGraphqlInput(): TransactionDraft { if (!this.self) { throw new LogError('try to create dlt entry for empty transaction') } - return new UserAccountDraft(this.self) + const draft = new TransactionDraft() + draft.user = new UserIdentifier(this.self.communityUuid, new CommunityUser(this.self.gradidoID)) + draft.createdAt = this.self.createdAt.toISOString() + draft.accountType = AccountType.COMMUNITY_HUMAN + draft.type = TransactionType.REGISTER_ADDRESS + return draft } protected setJoinId(dltTransaction: DltTransaction): void { diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts index 9e56eee81..7bf271cd0 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts @@ -1,12 +1,9 @@ -import { EntityPropertyNotFoundError, QueryFailedError, TypeORMError } from '@dbTools/typeorm' import { Transaction } from '@entity/Transaction' import { TransactionLink } from '@entity/TransactionLink' import { User } from '@entity/User' -// eslint-disable-next-line import/named, n/no-extraneous-import -import { FetchError } from 'node-fetch' import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' -import { TransactionResult } from '@/apis/dltConnector/model/TransactionResult' +import { backendLogger as logger } from '@/server/logger' import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' import { TransactionLinkToDltRole } from './TransactionLinkToDlt.role' @@ -40,21 +37,17 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis if (!pendingTransaction) { break } - let result: TransactionResult | undefined let messageId = '' let error: string | null = null - try { - result = await dltConnector.transmitTransaction( - pendingTransactionRole.convertToGraphqlInput(), - ) - if (result?.succeed && result.recipe) { - messageId = result.recipe.messageIdHex - } else { - error = 'skipped' - } - } catch (e) { - error = e instanceof Error ? e.message : String(e) + const result = await dltConnector.sendTransaction( + pendingTransactionRole.convertToGraphqlInput(), + ) + if (result?.succeed && result.recipe) { + messageId = result.recipe.messageIdHex + } else if (result?.error) { + error = result.error.message + logger.error('error from dlt-connector', result.error) } await pendingTransactionRole.saveTransactionResult(messageId, error) diff --git a/backend/src/apis/dltConnector/model/CommunityUser.ts b/backend/src/apis/dltConnector/model/CommunityUser.ts new file mode 100644 index 000000000..0a4eadebf --- /dev/null +++ b/backend/src/apis/dltConnector/model/CommunityUser.ts @@ -0,0 +1,10 @@ +export class CommunityUser { + // for community user, uuid and communityUuid used + uuid: string + accountNr?: number + + constructor(uuid: string, accountNr?: number) { + this.uuid = uuid + this.accountNr = accountNr + } +} diff --git a/backend/src/apis/dltConnector/model/IdentifierSeed.ts b/backend/src/apis/dltConnector/model/IdentifierSeed.ts new file mode 100644 index 000000000..7f7e2fe34 --- /dev/null +++ b/backend/src/apis/dltConnector/model/IdentifierSeed.ts @@ -0,0 +1,9 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +export class IdentifierSeed { + seed: string + + constructor(seed: string) { + this.seed = seed + } +} diff --git a/backend/src/apis/dltConnector/model/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts index e31003986..8a2d7bdd5 100755 --- a/backend/src/apis/dltConnector/model/TransactionDraft.ts +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -1,39 +1,21 @@ // https://www.npmjs.com/package/@apollo/protobufjs -import { Transaction } from '@entity/Transaction' - -import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' -import { LogError } from '@/server/LogError' +import { AccountType } from '@dltConnector/enum/AccountType' +import { TransactionType } from '@dltConnector/enum/TransactionType' import { UserIdentifier } from './UserIdentifier' export class TransactionDraft { user: UserIdentifier - linkedUser: UserIdentifier - amount: string - type: string + // not used for simply register address + linkedUser?: UserIdentifier + // not used for register address + amount?: string + type: TransactionType createdAt: string - // only for creation transactions + // only for creation transaction targetDate?: string - - constructor(transaction: Transaction) { - this.amount = transaction.amount.abs().toString() - - if ( - !transaction.linkedUserGradidoID || - !transaction.linkedUserCommunityUuid || - !transaction.userCommunityUuid - ) { - throw new LogError( - `missing necessary field in transaction: ${transaction.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, - ) - } - this.user = new UserIdentifier(transaction.userGradidoID, transaction.userCommunityUuid) - this.linkedUser = new UserIdentifier( - transaction.linkedUserGradidoID, - transaction.linkedUserCommunityUuid, - ) - this.createdAt = transaction.balanceDate.toISOString() - this.targetDate = transaction.creationDate?.toISOString() - this.type = TransactionTypeId[transaction.typeId] - } + // only for deferred transaction + timeoutDate?: string + // only for register address + accountType?: AccountType } diff --git a/backend/src/apis/dltConnector/model/TransactionLinkDraft.ts b/backend/src/apis/dltConnector/model/TransactionLinkDraft.ts deleted file mode 100644 index 1a12f552b..000000000 --- a/backend/src/apis/dltConnector/model/TransactionLinkDraft.ts +++ /dev/null @@ -1,21 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs -import { TransactionLink } from '@entity/TransactionLink' - -import { UserIdentifier } from './UserIdentifier' - -export class TransactionLinkDraft { - user: UserIdentifier - seed: string - amount: string - createdAt: string - timeoutDate: string - - constructor(transaction: TransactionLink) { - this.amount = transaction.amount.abs().toString() - const user = transaction.user - this.user = new UserIdentifier(user.gradidoID, user.communityUuid) - this.seed = transaction.code - this.createdAt = transaction.createdAt.toISOString() - this.timeoutDate = transaction.validUntil.toISOString() - } -} diff --git a/backend/src/apis/dltConnector/model/UserAccountDraft.ts b/backend/src/apis/dltConnector/model/UserAccountDraft.ts deleted file mode 100644 index dc52065d1..000000000 --- a/backend/src/apis/dltConnector/model/UserAccountDraft.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { User } from '@entity/User' - -import { AccountType } from '@/apis/dltConnector/enum/AccountType' - -import { UserIdentifier } from './UserIdentifier' - -export class UserAccountDraft { - user: UserIdentifier - createdAt: string - accountType: AccountType - - constructor(user: User) { - this.user = new UserIdentifier(user.gradidoID, user.communityUuid) - this.createdAt = user.createdAt.toISOString() - this.accountType = AccountType.COMMUNITY_HUMAN - } -} diff --git a/backend/src/apis/dltConnector/model/UserIdentifier.ts b/backend/src/apis/dltConnector/model/UserIdentifier.ts index 1824d17f3..059405bd0 100644 --- a/backend/src/apis/dltConnector/model/UserIdentifier.ts +++ b/backend/src/apis/dltConnector/model/UserIdentifier.ts @@ -1,11 +1,17 @@ -export class UserIdentifier { - uuid: string - communityUuid: string - accountNr?: number +import { CommunityUser } from './CommunityUser' +import { IdentifierSeed } from './IdentifierSeed' - constructor(uuid: string, communityUuid: string, accountNr?: number) { - this.uuid = uuid +export class UserIdentifier { + communityUuid: string + communityUser?: CommunityUser + seed?: IdentifierSeed // used for deferred transfers + + constructor(communityUuid: string, input: CommunityUser | IdentifierSeed) { + if (input instanceof CommunityUser) { + this.communityUser = input + } else if (input instanceof IdentifierSeed) { + this.seed = input + } this.communityUuid = communityUuid - this.accountNr = accountNr } } diff --git a/database/entity/0088-merge_dlt_tables/Transaction.ts b/database/entity/0088-merge_dlt_tables/Transaction.ts new file mode 100644 index 000000000..d5abed738 --- /dev/null +++ b/database/entity/0088-merge_dlt_tables/Transaction.ts @@ -0,0 +1,176 @@ +/* eslint-disable no-use-before-define */ +import { Decimal } from 'decimal.js-light' +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + OneToOne, + JoinColumn, + ManyToOne, +} from 'typeorm' +import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' +import { Contribution } from '../Contribution' +import { DltTransaction } from '../DltTransaction' +import { TransactionLink } from '../TransactionLink' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ type: 'int', unsigned: true, unique: true, nullable: true, default: null }) + previous: number | null + + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + + @Column({ + name: 'transaction_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + transactionLinkId?: number | null + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + amount: Decimal + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + balance: Decimal + + @Column({ + name: 'balance_date', + type: 'datetime', + default: () => 'CURRENT_TIMESTAMP', + nullable: false, + }) + balanceDate: Date + + @Column({ + type: 'decimal', + precision: 40, + scale: 20, + nullable: false, + transformer: DecimalTransformer, + }) + decay: Decimal + + @Column({ + name: 'decay_start', + type: 'datetime', + nullable: true, + default: null, + }) + decayStart: Date | null + + @Column({ length: 255, nullable: false, collation: 'utf8mb4_unicode_ci' }) + memo: string + + @Column({ name: 'creation_date', type: 'datetime', nullable: true, default: null }) + creationDate: Date | null + + @Column({ name: 'user_id', unsigned: true, nullable: false }) + userId: number + + @Column({ + name: 'user_community_uuid', + type: 'varchar', + length: 36, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + userCommunityUuid: string | null + + @Column({ + name: 'user_gradido_id', + type: 'varchar', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + userGradidoID: string + + @Column({ + name: 'user_name', + type: 'varchar', + length: 512, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + userName: string | null + + @Column({ + name: 'linked_user_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedUserId?: number | null + + @Column({ + name: 'linked_user_community_uuid', + type: 'varchar', + length: 36, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + linkedUserCommunityUuid: string | null + + @Column({ + name: 'linked_user_gradido_id', + type: 'varchar', + length: 36, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + linkedUserGradidoID: string | null + + @Column({ + name: 'linked_user_name', + type: 'varchar', + length: 512, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + linkedUserName: string | null + + @Column({ + name: 'linked_transaction_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + linkedTransactionId?: number | null + + @OneToOne(() => Contribution, (contribution) => contribution.transaction) + @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) + contribution?: Contribution | null + + @OneToOne(() => DltTransaction, (dlt) => dlt.transactionId) + @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) + dltTransaction?: DltTransaction | null + + @OneToOne(() => Transaction) + @JoinColumn({ name: 'previous' }) + previousTransaction?: Transaction | null + + @ManyToOne(() => TransactionLink, (transactionLink) => transactionLink.transactions) + @JoinColumn({ name: 'transactionLinkId' }) + transactionLink?: TransactionLink | null +} diff --git a/database/entity/0088-merge_dlt_tables/TransactionLink.ts b/database/entity/0088-merge_dlt_tables/TransactionLink.ts index 72c80195b..937544bd9 100644 --- a/database/entity/0088-merge_dlt_tables/TransactionLink.ts +++ b/database/entity/0088-merge_dlt_tables/TransactionLink.ts @@ -7,10 +7,12 @@ import { DeleteDateColumn, OneToOne, JoinColumn, + OneToMany, } from 'typeorm' import { DecimalTransformer } from '../../src/typeorm/DecimalTransformer' import { DltTransaction } from '../DltTransaction' import { User } from '../User' +import { Transaction } from '../Transaction' @Entity('transaction_links') export class TransactionLink extends BaseEntity { @@ -76,4 +78,8 @@ export class TransactionLink extends BaseEntity { @OneToOne(() => User, (user) => user.transactionLink) @JoinColumn({ name: 'userId' }) user: User + + @OneToMany(() => Transaction, (transaction) => transaction.transactionLink) + @JoinColumn({ referencedColumnName: 'transactionLinkId' }) + transactions: Transaction[] } diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts index d1d7075a9..7b014e17a 100644 --- a/database/entity/Transaction.ts +++ b/database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0072-add_communityuuid_to_transactions_table/Transaction' +export { Transaction } from './0088-merge_dlt_tables/Transaction' diff --git a/database/logging/TransactionLinkLogging.view.ts b/database/logging/TransactionLinkLogging.view.ts new file mode 100644 index 000000000..781916131 --- /dev/null +++ b/database/logging/TransactionLinkLogging.view.ts @@ -0,0 +1,35 @@ +/* eslint-disable no-unused-vars */ +import { TransactionLink } from '../entity/TransactionLink' +import { AbstractLoggingView } from './AbstractLogging.view' +import { DltTransactionLoggingView } from './DltTransactionLogging.view' +import { TransactionLoggingView } from './TransactionLogging.view' +import { UserLoggingView } from './UserLogging.view' + +export class TransactionLinkLoggingView extends AbstractLoggingView { + public constructor(private self: TransactionLink) { + super() + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public toJSON(): any { + return { + id: this.self.id, + userId: this.self.userId, + amount: this.decimalToString(this.self.amount), + holdAvailableAmount: this.decimalToString(this.self.holdAvailableAmount), + memoLength: this.self.memo.length, + createdAt: this.dateToString(this.self.createdAt), + deletedAt: this.dateToString(this.self.deletedAt), + validUntil: this.dateToString(this.self.validUntil), + redeemedAt: this.dateToString(this.self.redeemedAt), + redeemedBy: this.self.redeemedBy, + dltTransaction: this.self.dltTransaction + ? new DltTransactionLoggingView(this.self.dltTransaction).toJSON() + : undefined, + user: this.self.user ? new UserLoggingView(this.self.user).toJSON() : undefined, + transactions: this.self.transactions.forEach( + (transaction) => new TransactionLoggingView(transaction), + ), + } + } +} diff --git a/database/logging/TransactionLogging.view.ts b/database/logging/TransactionLogging.view.ts index 7912c7e5d..fff2b46cb 100644 --- a/database/logging/TransactionLogging.view.ts +++ b/database/logging/TransactionLogging.view.ts @@ -1,8 +1,10 @@ /* eslint-disable no-unused-vars */ +import { LargeNumberLike } from 'crypto' import { Transaction } from '../entity/Transaction' import { AbstractLoggingView } from './AbstractLogging.view' import { ContributionLoggingView } from './ContributionLogging.view' import { DltTransactionLoggingView } from './DltTransactionLogging.view' +import { TransactionLinkLoggingView } from './TransactionLinkLogging.view' // TODO: move enum into database, maybe rename database enum TransactionTypeId { @@ -43,7 +45,7 @@ export class TransactionLoggingView extends AbstractLoggingView { linkedUserName: this.self.linkedUserName?.substring(0, 3) + '...', linkedTransactionId: this.self.linkedTransactionId, contribution: this.self.contribution - ? new ContributionLoggingView(this.self.contribution) + ? new ContributionLoggingView(this.self.contribution).toJSON() : undefined, dltTransaction: this.self.dltTransaction ? new DltTransactionLoggingView(this.self.dltTransaction).toJSON() @@ -51,6 +53,9 @@ export class TransactionLoggingView extends AbstractLoggingView { previousTransaction: this.self.previousTransaction ? new TransactionLoggingView(this.self.previousTransaction).toJSON() : undefined, + transactionLink: this.self.transactionLink + ? new TransactionLinkLoggingView(this.self.transactionLink).toJSON() + : undefined, } } } diff --git a/dlt-connector/src/graphql/enum/InputTransactionType.ts b/dlt-connector/src/graphql/enum/InputTransactionType.ts index 94cd39ff3..20e5e40f9 100755 --- a/dlt-connector/src/graphql/enum/InputTransactionType.ts +++ b/dlt-connector/src/graphql/enum/InputTransactionType.ts @@ -3,12 +3,12 @@ import { registerEnumType } from 'type-graphql' // enum for graphql but with int because it is the same in backend // for transaction type from backend export enum InputTransactionType { - CREATION = 1, - SEND = 2, - RECEIVE = 3, - // This is a virtual property, never occurring on the database - DECAY = 4, - LINK_SUMMARY = 5, + GRADIDO_TRANSFER = 'GRADIDO_TRANSFER', + GRADIDO_CREATION = 'GRADIDO_CREATION', + GROUP_FRIENDS_UPDATE = 'GROUP_FRIENDS_UPDATE', + REGISTER_ADDRESS = 'REGISTER_ADDRESS', + GRADIDO_DEFERRED_TRANSFER = 'GRADIDO_DEFERRED_TRANSFER', + COMMUNITY_ROOT = 'COMMUNITY_ROOT', } registerEnumType(InputTransactionType, { diff --git a/dlt-connector/src/graphql/input/CommunityDraft.ts b/dlt-connector/src/graphql/input/CommunityDraft.ts index 665e10b75..0b26e68d0 100644 --- a/dlt-connector/src/graphql/input/CommunityDraft.ts +++ b/dlt-connector/src/graphql/input/CommunityDraft.ts @@ -1,10 +1,9 @@ // https://www.npmjs.com/package/@apollo/protobufjs +import { isValidDateString } from '@validator/DateString' import { IsBoolean, IsUUID } from 'class-validator' import { Field, InputType } from 'type-graphql' -import { isValidDateString } from '@validator/DateString' - @InputType() export class CommunityDraft { @Field(() => String) diff --git a/dlt-connector/src/graphql/input/CommunityUser.ts b/dlt-connector/src/graphql/input/CommunityUser.ts new file mode 100644 index 000000000..97eff7a76 --- /dev/null +++ b/dlt-connector/src/graphql/input/CommunityUser.ts @@ -0,0 +1,15 @@ +// https://www.npmjs.com/package/@apollo/protobufjs + +import { IsPositive, IsUUID } from 'class-validator' +import { Field, Int, InputType } from 'type-graphql' + +@InputType() +export class CommunityUser { + @Field(() => String) + @IsUUID('4') + uuid: string + + @Field(() => Int, { defaultValue: 1, nullable: true }) + @IsPositive() + accountNr?: number +} diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index d1fa48c3c..3b2099ab6 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -4,6 +4,8 @@ import { isValidDateString, isValidNumberString } from '@validator/DateString' import { IsEnum, IsObject, ValidateNested } from 'class-validator' import { InputType, Field } from 'type-graphql' +import { AccountType } from '@/graphql/enum/AccountType' + import { UserIdentifier } from './UserIdentifier' @InputType() @@ -13,14 +15,16 @@ export class TransactionDraft { @ValidateNested() user: UserIdentifier - @Field(() => UserIdentifier) + // not used for simply register address + @Field(() => UserIdentifier, { nullable: true }) @IsObject() @ValidateNested() - linkedUser: UserIdentifier + linkedUser?: UserIdentifier - @Field(() => String) + // not used for register address + @Field(() => String, { nullable: true }) @isValidNumberString() - amount: string + amount?: string @Field(() => InputTransactionType) @IsEnum(InputTransactionType) @@ -34,4 +38,14 @@ export class TransactionDraft { @Field(() => String, { nullable: true }) @isValidDateString() targetDate?: string + + // only for deferred transaction + @Field(() => String, { nullable: true }) + @isValidDateString() + timeoutDate?: string + + // only for register address + @Field(() => AccountType, { nullable: true }) + @IsEnum(AccountType) + accountType?: AccountType } diff --git a/dlt-connector/src/graphql/input/TransactionLinkDraft.ts b/dlt-connector/src/graphql/input/TransactionLinkDraft.ts deleted file mode 100644 index 7ac621e35..000000000 --- a/dlt-connector/src/graphql/input/TransactionLinkDraft.ts +++ /dev/null @@ -1,30 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs -import { isValidDateString, isValidNumberString } from '@validator/DateString' -import { IsObject, IsString, ValidateNested } from 'class-validator' -import { InputType, Field } from 'type-graphql' - -import { UserIdentifier } from './UserIdentifier' - -@InputType() -export class TransactionLinkDraft { - @Field(() => UserIdentifier) - @IsObject() - @ValidateNested() - user: UserIdentifier - - @Field(() => String) - @IsString() - seed: string - - @Field(() => String) - @isValidNumberString() - amount: string - - @Field(() => String) - @isValidDateString() - createdAt: string - - @Field(() => String) - @isValidDateString() - timeoutDate: string -} diff --git a/dlt-connector/src/graphql/input/UserAccountDraft.ts b/dlt-connector/src/graphql/input/UserAccountDraft.ts deleted file mode 100644 index 9ae544e32..000000000 --- a/dlt-connector/src/graphql/input/UserAccountDraft.ts +++ /dev/null @@ -1,26 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { IsEnum, IsObject, ValidateNested } from 'class-validator' -import { InputType, Field } from 'type-graphql' - -import { isValidDateString } from '@validator/DateString' - -import { AccountType } from '@/graphql/enum/AccountType' - -import { UserIdentifier } from './UserIdentifier' - -@InputType() -export class UserAccountDraft { - @Field(() => UserIdentifier) - @IsObject() - @ValidateNested() - user: UserIdentifier - - @Field(() => String) - @isValidDateString() - createdAt: string - - @Field(() => AccountType) - @IsEnum(AccountType) - accountType: AccountType -} diff --git a/dlt-connector/src/graphql/input/UserIdentifier.ts b/dlt-connector/src/graphql/input/UserIdentifier.ts index 7d9035b93..f622c24e4 100644 --- a/dlt-connector/src/graphql/input/UserIdentifier.ts +++ b/dlt-connector/src/graphql/input/UserIdentifier.ts @@ -1,19 +1,24 @@ // https://www.npmjs.com/package/@apollo/protobufjs -import { IsPositive, IsUUID } from 'class-validator' -import { Field, Int, InputType } from 'type-graphql' +import { IsObject, IsUUID, ValidateNested } from 'class-validator' +import { Field, InputType } from 'type-graphql' + +import { CommunityUser } from './CommunityUser' +import { IdentifierSeed } from './IdentifierSeed' @InputType() export class UserIdentifier { - @Field(() => String) - @IsUUID('4') - uuid: string - @Field(() => String) @IsUUID('4') communityUuid: string - @Field(() => Int, { defaultValue: 1, nullable: true }) - @IsPositive() - accountNr?: number + @Field(() => CommunityUser, { nullable: true }) + @IsObject() + @ValidateNested() + communityUser?: CommunityUser + + @Field(() => IdentifierSeed, { nullable: true }) + @IsObject() + @ValidateNested() + seed?: IdentifierSeed } diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts index a7f264764..ab7203285 100644 --- a/dlt-connector/src/graphql/resolver/AccountsResolver.ts +++ b/dlt-connector/src/graphql/resolver/AccountsResolver.ts @@ -1,15 +1,14 @@ /* eslint-disable camelcase */ import { AddressType_NONE } from 'gradido-blockchain-js' -import { Arg, Mutation, Query, Resolver } from 'type-graphql' +import { Arg, Query, Resolver } from 'type-graphql' import { getAddressType } from '@/client/GradidoNode' import { KeyPairCalculation } from '@/interactions/keyPairCalculation/KeyPairCalculation.context' -import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' import { logger } from '@/logging/logger' +import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' import { uuid4ToHash } from '@/utils/typeConverter' import { TransactionErrorType } from '../enum/TransactionErrorType' -import { UserAccountDraft } from '../input/UserAccountDraft' import { UserIdentifier } from '../input/UserIdentifier' import { TransactionError } from '../model/TransactionError' import { TransactionResult } from '../model/TransactionResult' @@ -25,6 +24,7 @@ export class AccountResolver { new TransactionError(TransactionErrorType.NOT_FOUND, 'cannot get user public key'), ) } + // ask gradido node server for account type, if type !== NONE account exist const addressType = await getAddressType( publicKey.data(), @@ -33,21 +33,4 @@ export class AccountResolver { logger.info('isAccountExist', userIdentifier) return addressType !== AddressType_NONE } - - @Mutation(() => TransactionResult) - async registerAddress( - @Arg('data') - userAccountDraft: UserAccountDraft, - ): Promise { - try { - return await SendToIotaContext(userAccountDraft) - } catch (err) { - if (err instanceof TransactionError) { - return new TransactionResult(err) - } else { - logger.error('error in register address: ', err) - throw err - } - } - } } diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts index 8d3d5970b..e7d1c105e 100755 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts @@ -1,4 +1,3 @@ -import { TransactionLinkDraft } from '@input/TransactionLinkDraft' import { Resolver, Arg, Mutation } from 'type-graphql' import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' @@ -25,21 +24,4 @@ export class TransactionResolver { } } } - - @Mutation(() => TransactionResult) - async deferredTransfer( - @Arg('data') - transactionLinkDraft: TransactionLinkDraft, - ): Promise { - try { - return await SendToIotaContext(transactionLinkDraft) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - if (error instanceof TransactionError) { - return new TransactionResult(error) - } else { - throw error - } - } - } } diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts index ca54d8d16..3cb1f43cf 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -15,9 +15,7 @@ import { UserKeyPairRole } from './UserKeyPair.role' * @DCI-Context * Context for calculating key pair for signing transactions */ -export async function KeyPairCalculation( - input: UserIdentifier | string | IdentifierSeed, -): Promise { +export async function KeyPairCalculation(input: UserIdentifier | string): Promise { const cache = KeyPairCacheManager.getInstance() // Try cache lookup first @@ -26,11 +24,9 @@ export async function KeyPairCalculation( return keyPair } - const retrieveKeyPair = async ( - input: UserIdentifier | string | IdentifierSeed, - ): Promise => { - if (input instanceof IdentifierSeed) { - return new LinkedTransactionKeyPairRole(input.seed).generateKeyPair() + const retrieveKeyPair = async (input: UserIdentifier | string): Promise => { + if (input instanceof UserIdentifier && input.seed) { + return new LinkedTransactionKeyPairRole(input.seed.seed).generateKeyPair() } const communityUUID = input instanceof UserIdentifier ? input.communityUuid : input @@ -51,7 +47,7 @@ export async function KeyPairCalculation( } if (input instanceof UserIdentifier) { const userKeyPair = new UserKeyPairRole(input, communityKeyPair).generateKeyPair() - const accountNr = input.accountNr ?? 1 + const accountNr = input.communityUser?.accountNr ?? 1 return new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() } return communityKeyPair diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts index 1cc9c9891..132e86499 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -13,7 +13,11 @@ export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { } public async retrieveKeyPair(): Promise { - const nameHash = uuid4ToHash(this.user.uuid) + if (!this.user.communityUser) { + throw new LogError('missing community user') + } + + const nameHash = uuid4ToHash(this.user.communityUser.uuid) const confirmedTransactions = await getTransactions( 0, 30, diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts index 473b203cd..6f433a7df 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -1,6 +1,7 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { LogError } from '@/server/LogError' import { hardenDerivationIndex } from '@/utils/derivationHelper' import { uuid4ToBuffer } from '@/utils/typeConverter' @@ -14,7 +15,10 @@ export class UserKeyPairRole extends AbstractKeyPairRole { public generateKeyPair(): KeyPairEd25519 { // example gradido id: 03857ac1-9cc2-483e-8a91-e5b10f5b8d16 => // wholeHex: '03857ac19cc2483e8a91e5b10f5b8d16'] - const wholeHex = uuid4ToBuffer(this.user.uuid) + if (!this.user.communityUser) { + throw new LogError('missing community user') + } + const wholeHex = uuid4ToBuffer(this.user.communityUser.uuid) const parts = [] for (let i = 0; i < 4; i++) { parts[i] = hardenDerivationIndex(wholeHex.subarray(i * 4, (i + 1) * 4).readUInt32BE()) diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index c448a1704..2865193a9 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -1,7 +1,8 @@ import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { LogError } from '@/server/LogError' +import { TransactionError } from '@/graphql/model/TransactionError' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' @@ -17,12 +18,27 @@ export class CreationTransactionRole extends AbstractTransactionRole { } getRecipientCommunityUuid(): string { - throw new LogError('cannot be used as cross group transaction') + throw new TransactionError( + TransactionErrorType.LOGIC_ERROR, + 'creation: cannot be used as cross group transaction', + ) } public async getGradidoTransactionBuilder(): Promise { if (!this.self.targetDate) { - throw new LogError('target date missing for creation transaction') + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'creation: target date missing', + ) + } + if (!this.self.linkedUser) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'creation: linked user missing', + ) + } + if (!this.self.amount) { + throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'creation: amount missing') } const builder = new GradidoTransactionBuilder() const recipientKeyPair = await KeyPairCalculation(this.self.user) diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 7a4c627a1..511efa869 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -1,15 +1,15 @@ import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' -import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' -import { TransactionLinkDraft } from '@/graphql/input/TransactionLinkDraft' -import { LogError } from '@/server/LogError' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class DeferredTransferTransactionRole extends AbstractTransactionRole { - constructor(protected self: TransactionLinkDraft) { + constructor(protected self: TransactionDraft) { super() } @@ -18,13 +18,34 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { } getRecipientCommunityUuid(): string { - throw new LogError('cannot be used as cross group transaction') + throw new TransactionError( + TransactionErrorType.LOGIC_ERROR, + 'deferred transfer: cannot be used as cross group transaction', + ) } public async getGradidoTransactionBuilder(): Promise { + if (!this.self.linkedUser || !this.self.linkedUser.seed) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'deferred transfer: missing linked user or not a seed', + ) + } + if (!this.self.amount) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'deferred transfer: amount missing', + ) + } + if (!this.self.timeoutDate) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'deferred transfer: timeout date missing', + ) + } const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation(this.self.user) - const recipientKeyPair = await KeyPairCalculation(new IdentifierSeed(this.self.seed)) + const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) builder .setCreatedAt(new Date(this.self.createdAt)) diff --git a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts index dc80d7c02..f8c82586d 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -1,7 +1,9 @@ /* eslint-disable camelcase */ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { TransactionError } from '@/graphql/model/TransactionError' import { LogError } from '@/server/LogError' import { accountTypeToAddressType, uuid4ToHash } from '@/utils/typeConverter' @@ -10,7 +12,7 @@ import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.con import { AbstractTransactionRole } from './AbstractTransaction.role' export class RegisterAddressTransactionRole extends AbstractTransactionRole { - constructor(private self: UserAccountDraft) { + constructor(private self: TransactionDraft) { super() } @@ -23,6 +25,20 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { } public async getGradidoTransactionBuilder(): Promise { + if (!this.self.accountType) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'register address: account type missing', + ) + } + + if (!this.self.user.communityUser) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + "register address: user isn't a community user", + ) + } + const builder = new GradidoTransactionBuilder() const communityKeyPair = await KeyPairCalculation(this.self.user.communityUuid) const accountKeyPair = await KeyPairCalculation(this.self.user) @@ -31,7 +47,7 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { .setRegisterAddress( accountKeyPair.getPublicKey(), accountTypeToAddressType(this.self.accountType), - uuid4ToHash(this.self.user.uuid), + uuid4ToHash(this.self.user.communityUser.uuid), ) .sign(communityKeyPair) .sign(accountKeyPair) diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index caf4df11f..be02eef55 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -12,8 +12,6 @@ import { InputTransactionType } from '@/graphql/enum/InputTransactionType' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { TransactionDraft } from '@/graphql/input/TransactionDraft' -import { TransactionLinkDraft } from '@/graphql/input/TransactionLinkDraft' -import { UserAccountDraft } from '@/graphql/input/UserAccountDraft' import { TransactionError } from '@/graphql/model/TransactionError' import { TransactionRecipe } from '@/graphql/model/TransactionRecipe' import { TransactionResult } from '@/graphql/model/TransactionResult' @@ -34,7 +32,7 @@ import { TransferTransactionRole } from './TransferTransaction.role' * send every transaction only once to iota! */ export async function SendToIotaContext( - input: TransactionDraft | UserAccountDraft | CommunityDraft | TransactionLinkDraft, + input: TransactionDraft | CommunityDraft, ): Promise { const validate = (transaction: GradidoTransaction): void => { try { @@ -76,17 +74,25 @@ export async function SendToIotaContext( let role: AbstractTransactionRole if (input instanceof TransactionDraft) { - if (input.type === InputTransactionType.CREATION) { - role = new CreationTransactionRole(input) - } else if (input.type === InputTransactionType.SEND) { - role = new TransferTransactionRole(input) - } else { - throw new LogError('not supported transaction type') + switch (input.type) { + case InputTransactionType.GRADIDO_CREATION: + role = new CreationTransactionRole(input) + break + case InputTransactionType.GRADIDO_TRANSFER: + role = new TransferTransactionRole(input) + break + case InputTransactionType.REGISTER_ADDRESS: + role = new RegisterAddressTransactionRole(input) + break + case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: + role = new DeferredTransferTransactionRole(input) + break + default: + throw new TransactionError( + TransactionErrorType.NOT_IMPLEMENTED_YET, + 'not supported transaction type: ' + input.type, + ) } - } else if (input instanceof TransactionLinkDraft) { - role = new DeferredTransferTransactionRole(input) - } else if (input instanceof UserAccountDraft) { - role = new RegisterAddressTransactionRole(input) } else if (input instanceof CommunityDraft) { role = new CommunityRootTransactionRole(input) } else { diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index 1e5dde5dd..7a4cd7bb0 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -1,6 +1,9 @@ import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { TransactionError } from '@/graphql/model/TransactionError' import { uuid4ToHash } from '@/utils/typeConverter' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' @@ -8,8 +11,16 @@ import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.con import { AbstractTransactionRole } from './AbstractTransaction.role' export class TransferTransactionRole extends AbstractTransactionRole { - constructor(protected self: TransactionDraft) { + private linkedUser: UserIdentifier + constructor(private self: TransactionDraft) { super() + if (!this.self.linkedUser) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'transfer: linked user missing', + ) + } + this.linkedUser = this.self.linkedUser } getSenderCommunityUuid(): string { @@ -17,13 +28,16 @@ export class TransferTransactionRole extends AbstractTransactionRole { } getRecipientCommunityUuid(): string { - return this.self.linkedUser.communityUuid + return this.linkedUser.communityUuid } public async getGradidoTransactionBuilder(): Promise { + if (!this.self.amount) { + throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'transfer: amount missing') + } const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation(this.self.user) - const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + const recipientKeyPair = await KeyPairCalculation(this.linkedUser) builder .setCreatedAt(new Date(this.self.createdAt)) .setMemo('dummy memo for transfer') @@ -32,7 +46,7 @@ export class TransferTransactionRole extends AbstractTransactionRole { recipientKeyPair.getPublicKey(), ) const senderCommunity = this.self.user.communityUuid - const recipientCommunity = this.self.linkedUser.communityUuid + const recipientCommunity = this.linkedUser.communityUuid if (senderCommunity !== recipientCommunity) { // we have a cross group transaction builder diff --git a/dlt-connector/src/logging/CommunityUserLogging.view.ts b/dlt-connector/src/logging/CommunityUserLogging.view.ts new file mode 100644 index 000000000..f1b421cd6 --- /dev/null +++ b/dlt-connector/src/logging/CommunityUserLogging.view.ts @@ -0,0 +1,17 @@ +import { CommunityUser } from '@/graphql/input/CommunityUser' + +import { AbstractLoggingView } from './AbstractLogging.view' + +export class CommunityUserLoggingView extends AbstractLoggingView { + public constructor(private self: CommunityUser) { + super() + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public toJSON(): any { + return { + uuid: this.self.uuid, + accountNr: this.self.accountNr, + } + } +} diff --git a/dlt-connector/src/logging/IdentifierSeedLogging.view.ts b/dlt-connector/src/logging/IdentifierSeedLogging.view.ts new file mode 100644 index 000000000..d34012e17 --- /dev/null +++ b/dlt-connector/src/logging/IdentifierSeedLogging.view.ts @@ -0,0 +1,16 @@ +import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' + +import { AbstractLoggingView } from './AbstractLogging.view' + +export class IdentifierSeedLoggingView extends AbstractLoggingView { + public constructor(private self: IdentifierSeed) { + super() + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public toJSON(): any { + return { + seed: this.self.seed, + } + } +} diff --git a/dlt-connector/src/logging/UserIdentifierLogging.view.ts b/dlt-connector/src/logging/UserIdentifierLogging.view.ts index 54ac4b07d..16343551f 100644 --- a/dlt-connector/src/logging/UserIdentifierLogging.view.ts +++ b/dlt-connector/src/logging/UserIdentifierLogging.view.ts @@ -1,6 +1,8 @@ import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { AbstractLoggingView } from './AbstractLogging.view' +import { CommunityUserLoggingView } from './CommunityUserLogging.view' +import { IdentifierSeedLoggingView } from './IdentifierSeedLogging.view' export class UserIdentifierLoggingView extends AbstractLoggingView { public constructor(private self: UserIdentifier) { @@ -10,9 +12,11 @@ export class UserIdentifierLoggingView extends AbstractLoggingView { // eslint-disable-next-line @typescript-eslint/no-explicit-any public toJSON(): any { return { - uuid: this.self.uuid, communityUuid: this.self.communityUuid, - accountNr: this.self.accountNr, + communityUser: this.self.communityUser + ? new CommunityUserLoggingView(this.self.communityUser).toJSON() + : undefined, + seed: this.self.seed ? new IdentifierSeedLoggingView(this.self.seed).toJSON() : undefined, } } } diff --git a/dlt-connector/src/manager/KeyPairCacheManager.ts b/dlt-connector/src/manager/KeyPairCacheManager.ts index 844f5ad58..5f5d94f41 100644 --- a/dlt-connector/src/manager/KeyPairCacheManager.ts +++ b/dlt-connector/src/manager/KeyPairCacheManager.ts @@ -45,14 +45,11 @@ export class KeyPairCacheManager { return this.homeCommunityUUID } - public findKeyPair(input: UserIdentifier | string | IdentifierSeed): KeyPairEd25519 | undefined { + public findKeyPair(input: UserIdentifier | string): KeyPairEd25519 | undefined { return this.cache.get(this.getKey(input)) } - public addKeyPair( - input: UserIdentifier | string | IdentifierSeed, - keyPair: KeyPairEd25519, - ): void { + public addKeyPair(input: UserIdentifier | string, keyPair: KeyPairEd25519): void { const key = this.getKey(input) if (this.cache.has(key)) { throw new LogError('key already exist, cannot add', key) @@ -60,13 +57,17 @@ export class KeyPairCacheManager { this.cache.set(key, keyPair) } - protected getKey(input: UserIdentifier | string | IdentifierSeed): string { + protected getKey(input: UserIdentifier | string): string { if (input instanceof UserIdentifier) { - return input.uuid - } else if (input instanceof IdentifierSeed) { - return input.seed - } else { + if (input.communityUser) { + return input.communityUser.uuid + } else if (input.seed) { + return input.seed.seed + } + throw new LogError('unhandled branch') + } else if (typeof input === 'string') { return input } + throw new LogError('unhandled input type') } } From ec2d5cb98dcd95764a8c1afdad9b1e604a9b4f94 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 15 Nov 2024 19:58:50 +0100 Subject: [PATCH 20/23] handle deletiono of transaction link with dlt --- .../dltConnector/enum/DltTransactionType.ts | 8 ++ .../AbstractTransactionToDlt.role.ts | 5 +- .../TransactionLinkDeleteToDlt.role.ts | 83 +++++++++++++++++++ .../TransactionLinkToDlt.role.ts | 4 +- .../transactionToDlt/TransactionToDlt.role.ts | 32 ++++--- .../transactionToDlt/UserToDlt.role.ts | 4 +- .../transactionToDlt.context.ts | 2 + .../resolver/TransactionLinkResolver.ts | 8 ++ .../0088-merge_dlt_tables/DltTransaction.ts | 3 + .../0088-merge_dlt_tables/Transaction.ts | 2 +- .../0088-merge_dlt_tables/TransactionLink.ts | 2 +- database/migrations/0088-merge_dlt_tables.ts | 8 +- .../src/manager/KeyPairCacheManager.ts | 5 +- 13 files changed, 142 insertions(+), 24 deletions(-) create mode 100644 backend/src/apis/dltConnector/enum/DltTransactionType.ts create mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts diff --git a/backend/src/apis/dltConnector/enum/DltTransactionType.ts b/backend/src/apis/dltConnector/enum/DltTransactionType.ts new file mode 100644 index 000000000..80e12daa5 --- /dev/null +++ b/backend/src/apis/dltConnector/enum/DltTransactionType.ts @@ -0,0 +1,8 @@ +export enum DltTransactionType { + REGISTER_ADDRESS = 1, + CREATION = 2, + TRANSFER = 3, + DEFERRED_TRANSFER = 4, + REDEEM_DEFERRED_TRANSFER = 5, + DELETE_DEFERRED_TRANSFER = 6, +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts index e21b853e6..ac77f4195 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts @@ -22,7 +22,7 @@ export abstract class AbstractTransactionToDltRole { const dltTransaction = DltTransaction.create() dltTransaction.messageId = messageId dltTransaction.error = error - this.setJoinId(dltTransaction) + this.setJoinIdAndType(dltTransaction) await DltTransaction.save(dltTransaction) if (dltTransaction.error) { logger.error( @@ -36,7 +36,7 @@ export abstract class AbstractTransactionToDltRole { } // intern - protected abstract setJoinId(dltTransaction: DltTransaction): void + protected abstract setJoinIdAndType(dltTransaction: DltTransaction): void // helper protected createQueryForPendingItems( @@ -50,7 +50,6 @@ export abstract class AbstractTransactionToDltRole { .andWhere('dltTransaction.transaction_id IS NULL') .andWhere('dltTransaction.transaction_link_Id IS NULL') .orderBy(orderBy) - .limit(1) } protected createDltTransactionEntry(messageId: string, error: string | null): DltTransaction { diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts new file mode 100644 index 000000000..742a0b96d --- /dev/null +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts @@ -0,0 +1,83 @@ +import { DltTransaction } from '@entity/DltTransaction' +import { TransactionLink } from '@entity/TransactionLink' + +import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' +import { TransactionType } from '@dltConnector/enum/TransactionType' +import { CommunityUser } from '@dltConnector/model/CommunityUser' +import { IdentifierSeed } from '@dltConnector/model/IdentifierSeed' +import { TransactionDraft } from '@dltConnector/model/TransactionDraft' +import { UserIdentifier } from '@dltConnector/model/UserIdentifier' + +import { LogError } from '@/server/LogError' + +import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' + +/** + * redeem deferred transfer transaction by creator, so "deleting" it + */ +export class TransactionLinkDeleteToDltRole extends AbstractTransactionToDltRole { + async initWithLast(): Promise { + const queryBuilder = this.createQueryForPendingItems( + TransactionLink.createQueryBuilder().leftJoinAndSelect('TransactionLink.user', 'user'), + 'TransactionLink.id = dltTransaction.transactionLinkId and dltTransaction.type_id <> 4', + // eslint-disable-next-line camelcase + { TransactionLink_deletedAt: 'ASC', User_id: 'ASC' }, + ) + .andWhere('TransactionLink.deletedAt IS NOT NULL') + .withDeleted() + const queryBuilder2 = TransactionLink.createQueryBuilder() + .leftJoinAndSelect('TransactionLink.user', 'user') + .where('TransactionLink.deletedAt IS NOT NULL') + .andWhere(() => { + const subQuery = DltTransaction.createQueryBuilder() + .select('1') + .where('DltTransaction.transaction_link_id = TransactionLink.id') + .andWhere('DltTransaction.type_id = :typeId', { + typeId: DltTransactionType.DELETE_DEFERRED_TRANSFER, + }) + .getQuery() + return `NOT EXIST (${subQuery})` + }) + .withDeleted() + // eslint-disable-next-line camelcase + .orderBy({ TransactionLink_deletedAt: 'ASC', User_id: 'ASC' }) + // console.log('query: ', queryBuilder.getSql()) + this.self = await queryBuilder.getOne() + return this + } + + public getTimestamp(): number { + if (!this.self) { + return Infinity + } + if (!this.self.deletedAt) { + throw new LogError('not deleted transaction link selected') + } + return this.self.deletedAt.getTime() + } + + public convertToGraphqlInput(): TransactionDraft { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction link') + } + if (!this.self.deletedAt) { + throw new LogError('not deleted transaction link selected') + } + const draft = new TransactionDraft() + draft.amount = this.self.amount.abs().toString() + const user = this.self.user + draft.user = new UserIdentifier(user.communityUuid, new IdentifierSeed(this.self.code)) + draft.linkedUser = new UserIdentifier(user.communityUuid, new CommunityUser(user.gradidoID)) + draft.createdAt = this.self.deletedAt.toISOString() + draft.type = TransactionType.GRADIDO_TRANSFER + return draft + } + + protected setJoinIdAndType(dltTransaction: DltTransaction): void { + if (!this.self) { + throw new LogError('try to create dlt entry for empty transaction link') + } + dltTransaction.transactionLinkId = this.self.id + dltTransaction.typeId = DltTransactionType.DELETE_DEFERRED_TRANSFER + } +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts index 8aeccfa91..916aacbfc 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -1,6 +1,7 @@ import { DltTransaction } from '@entity/DltTransaction' import { TransactionLink } from '@entity/TransactionLink' +import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' import { TransactionType } from '@dltConnector/enum/TransactionType' import { CommunityUser } from '@dltConnector/model/CommunityUser' import { IdentifierSeed } from '@dltConnector/model/IdentifierSeed' @@ -47,10 +48,11 @@ export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { + private type: DltTransactionType async initWithLast(): Promise { this.self = await this.createQueryForPendingItems( Transaction.createQueryBuilder().leftJoinAndSelect( @@ -27,7 +29,7 @@ export class TransactionToDltRole extends AbstractTransactionToDltRole :typeId', { typeId: TransactionTypeId.RECEIVE }) .getOne() return this } @@ -55,6 +57,19 @@ export class TransactionToDltRole extends AbstractTransactionToDltRole { return draft } - protected setJoinId(dltTransaction: DltTransaction): void { + protected setJoinIdAndType(dltTransaction: DltTransaction): void { if (!this.self) { throw new LogError('try to create dlt entry for empty user') } dltTransaction.userId = this.self.id + dltTransaction.typeId = DltTransactionType.REGISTER_ADDRESS } } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts index 7bf271cd0..bd49c8400 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts @@ -6,6 +6,7 @@ import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' import { backendLogger as logger } from '@/server/logger' import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' +import { TransactionLinkDeleteToDltRole } from './TransactionLinkDeleteToDlt.role' import { TransactionLinkToDltRole } from './TransactionLinkToDlt.role' import { TransactionToDltRole } from './TransactionToDlt.role' import { UserToDltRole } from './UserToDlt.role' @@ -23,6 +24,7 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis new TransactionToDltRole().initWithLast(), new UserToDltRole().initWithLast(), new TransactionLinkToDltRole().initWithLast(), + new TransactionLinkDeleteToDltRole().initWithLast(), ]) // sort array to get oldest at first place diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 88f84b6e2..68bcd5f09 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -33,6 +33,10 @@ import { Context, getUser, getClientTimezoneOffset } from '@/server/context' import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { calculateDecay } from '@/util/decay' +import { + InterruptiveSleepManager, + TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, +} from '@/util/InterruptiveSleepManager' import { TRANSACTION_LINK_LOCK } from '@/util/TRANSACTION_LINK_LOCK' import { TRANSACTIONS_LOCK } from '@/util/TRANSACTIONS_LOCK' import { fullName } from '@/util/utilities' @@ -300,6 +304,8 @@ export class TransactionLinkResolver { contributionLink, contributionLink.amount, ) + // notify dlt-connector loop for new work + InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Creation from contribution link was not successful', e) @@ -354,6 +360,8 @@ export class TransactionLinkResolver { transactionLink, transactionLink.amount, ) + // notify dlt-connector loop for new work + InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) } finally { releaseLinkLock() } diff --git a/database/entity/0088-merge_dlt_tables/DltTransaction.ts b/database/entity/0088-merge_dlt_tables/DltTransaction.ts index 6525c229d..012bddf0b 100644 --- a/database/entity/0088-merge_dlt_tables/DltTransaction.ts +++ b/database/entity/0088-merge_dlt_tables/DltTransaction.ts @@ -17,6 +17,9 @@ export class DltTransaction extends BaseEntity { @Column({ name: 'transaction_link_id', type: 'int', unsigned: true, nullable: true }) transactionLinkId?: number | null + @Column({ name: 'type_id', unsigned: true, nullable: false }) + typeId: number + @Column({ name: 'message_id', length: 64, diff --git a/database/entity/0088-merge_dlt_tables/Transaction.ts b/database/entity/0088-merge_dlt_tables/Transaction.ts index d5abed738..8eec4e1a9 100644 --- a/database/entity/0088-merge_dlt_tables/Transaction.ts +++ b/database/entity/0088-merge_dlt_tables/Transaction.ts @@ -171,6 +171,6 @@ export class Transaction extends BaseEntity { previousTransaction?: Transaction | null @ManyToOne(() => TransactionLink, (transactionLink) => transactionLink.transactions) - @JoinColumn({ name: 'transactionLinkId' }) + @JoinColumn({ name: 'transaction_link_id' }) transactionLink?: TransactionLink | null } diff --git a/database/entity/0088-merge_dlt_tables/TransactionLink.ts b/database/entity/0088-merge_dlt_tables/TransactionLink.ts index 937544bd9..18bcf9892 100644 --- a/database/entity/0088-merge_dlt_tables/TransactionLink.ts +++ b/database/entity/0088-merge_dlt_tables/TransactionLink.ts @@ -80,6 +80,6 @@ export class TransactionLink extends BaseEntity { user: User @OneToMany(() => Transaction, (transaction) => transaction.transactionLink) - @JoinColumn({ referencedColumnName: 'transactionLinkId' }) + @JoinColumn({ referencedColumnName: 'transaction_link_id' }) transactions: Transaction[] } diff --git a/database/migrations/0088-merge_dlt_tables.ts b/database/migrations/0088-merge_dlt_tables.ts index 7964ffd94..ab3db11eb 100644 --- a/database/migrations/0088-merge_dlt_tables.ts +++ b/database/migrations/0088-merge_dlt_tables.ts @@ -7,7 +7,9 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis ALTER TABLE \`dlt_transactions\` CHANGE \`transaction_id\` \`transaction_id\` INT(10) UNSIGNED NULL DEFAULT NULL, ADD \`user_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`transaction_id\`, - ADD \`transaction_link_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`user_id\`; + ADD \`transaction_link_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`user_id\` + ADD \`type_id\` INT UNSIGNED NOT NULL AFTER \`transaction_link_id\` + ; `) } @@ -28,6 +30,8 @@ export async function downgrade(queryFn: (query: string, values?: any[]) => Prom ALTER TABLE \`dlt_transactions\` CHANGE \`transaction_id\` \`transaction_id\` INT(10) UNSIGNED NOT NULL, DROP COLUMN \`user_id\`, - DROP COLUMN \`transaction_link_id\`; + DROP COLUMN \`transaction_link_id\` + DROP COLUMN \`type_id\` + ; `) } diff --git a/dlt-connector/src/manager/KeyPairCacheManager.ts b/dlt-connector/src/manager/KeyPairCacheManager.ts index 5f5d94f41..f492d127b 100644 --- a/dlt-connector/src/manager/KeyPairCacheManager.ts +++ b/dlt-connector/src/manager/KeyPairCacheManager.ts @@ -1,7 +1,7 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { logger } from '@/logging/logger' import { LogError } from '@/server/LogError' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example @@ -52,7 +52,8 @@ export class KeyPairCacheManager { public addKeyPair(input: UserIdentifier | string, keyPair: KeyPairEd25519): void { const key = this.getKey(input) if (this.cache.has(key)) { - throw new LogError('key already exist, cannot add', key) + logger.warn('key already exist, cannot add', key) + return } this.cache.set(key, keyPair) } From eb424fc6c5e56ede3f6f1bfc2a056ecff9e51372 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 10 Jan 2025 20:27:59 +0100 Subject: [PATCH 21/23] refactor for deferred transfer --- .../dltConnector/DltConnectorClient.test.ts | 2 - .../apis/dltConnector/enum/TransactionType.ts | 1 + .../TransactionLinkDeleteToDlt.role.ts | 6 +- .../TransactionLinkToDlt.role.ts | 5 +- .../transactionToDlt/TransactionToDlt.role.ts | 5 +- .../dltConnector/model/TransactionDraft.ts | 3 +- dlt-connector/package.json | 2 +- dlt-connector/src/client/GradidoNode.ts | 36 +++++- dlt-connector/src/data/KeyPairIdentifier.ts | 72 ++++++++++++ dlt-connector/src/graphql/const.ts | 2 + .../src/graphql/enum/InputTransactionType.ts | 1 + .../src/graphql/enum/TransactionErrorType.ts | 1 + .../src/graphql/input/TransactionDraft.ts | 15 ++- .../src/graphql/resolver/AccountsResolver.ts | 4 +- .../ForeignCommunityKeyPair.role.ts | 2 +- .../KeyPairCalculation.context.ts | 51 ++++++--- .../keyPairCalculation/UserKeyPair.role.ts | 10 +- .../CommunityRootTransaction.role.ts | 3 +- .../sendToIota/CreationTransaction.role.ts | 28 ++++- .../DeferredTransferTransaction.role.ts | 41 +++++-- .../RedeemDeferredTransferTransaction.role.ts | 103 ++++++++++++++++++ .../RegisterAddressTransaction.role.ts | 15 ++- .../sendToIota/SendToIota.context.ts | 15 +-- .../sendToIota/TransferTransaction.role.ts | 30 ++++- .../src/manager/KeyPairCacheManager.ts | 30 ++--- dlt-connector/src/utils/typeConverter.ts | 12 ++ dlt-connector/yarn.lock | 4 +- 27 files changed, 403 insertions(+), 96 deletions(-) create mode 100644 dlt-connector/src/data/KeyPairIdentifier.ts create mode 100644 dlt-connector/src/graphql/const.ts create mode 100644 dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.test.ts b/backend/src/apis/dltConnector/DltConnectorClient.test.ts index 5cd7c3269..28c1c969c 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.test.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.test.ts @@ -10,11 +10,9 @@ import { Decimal } from 'decimal.js-light' import { cleanDB, testEnvironment } from '@test/helpers' import { CONFIG } from '@/config' -import { LogError } from '@/server/LogError' import { backendLogger as logger } from '@/server/logger' import { DltConnectorClient } from './DltConnectorClient' -import { TransactionDraft } from './model/TransactionDraft' let con: Connection diff --git a/backend/src/apis/dltConnector/enum/TransactionType.ts b/backend/src/apis/dltConnector/enum/TransactionType.ts index 095f56c47..d12bb3fa2 100644 --- a/backend/src/apis/dltConnector/enum/TransactionType.ts +++ b/backend/src/apis/dltConnector/enum/TransactionType.ts @@ -9,6 +9,7 @@ export enum TransactionType { GROUP_FRIENDS_UPDATE = 'GROUP_FRIENDS_UPDATE', REGISTER_ADDRESS = 'REGISTER_ADDRESS', GRADIDO_DEFERRED_TRANSFER = 'GRADIDO_DEFERRED_TRANSFER', + GRADIDO_REDEEM_DEFERRED_TRANSFER = 'GRADIDO_REDEEM_DEFERRED_TRANSFER', COMMUNITY_ROOT = 'COMMUNITY_ROOT', } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts index 742a0b96d..b761b71c6 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts @@ -25,6 +25,7 @@ export class TransactionLinkDeleteToDltRole extends AbstractTransactionToDltRole ) .andWhere('TransactionLink.deletedAt IS NOT NULL') .withDeleted() + /* const queryBuilder2 = TransactionLink.createQueryBuilder() .leftJoinAndSelect('TransactionLink.user', 'user') .where('TransactionLink.deletedAt IS NOT NULL') @@ -41,6 +42,7 @@ export class TransactionLinkDeleteToDltRole extends AbstractTransactionToDltRole .withDeleted() // eslint-disable-next-line camelcase .orderBy({ TransactionLink_deletedAt: 'ASC', User_id: 'ASC' }) + */ // console.log('query: ', queryBuilder.getSql()) this.self = await queryBuilder.getOne() return this @@ -67,9 +69,9 @@ export class TransactionLinkDeleteToDltRole extends AbstractTransactionToDltRole draft.amount = this.self.amount.abs().toString() const user = this.self.user draft.user = new UserIdentifier(user.communityUuid, new IdentifierSeed(this.self.code)) - draft.linkedUser = new UserIdentifier(user.communityUuid, new CommunityUser(user.gradidoID)) + draft.linkedUser = new UserIdentifier(user.communityUuid, new CommunityUser(user.gradidoID, 1)) draft.createdAt = this.self.deletedAt.toISOString() - draft.type = TransactionType.GRADIDO_TRANSFER + draft.type = TransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER return draft } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts index 916aacbfc..16ba7f6f8 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -40,10 +40,11 @@ export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { + const parameter = { + pubkey: pubkey.convertToHex(), + format: 'base64', + firstTransactionNr, + maxResultCount, + communityId: iotaTopic, + } + logger.info('call listtransactionsforaddress on Node Server via jsonrpc 2.0', parameter) + const response = await client.exec( + 'listtransactionsforaddress', + parameter, + ) + return resolveResponse(response, (result: ConfirmedTransactionList) => { + logger.debug('GradidoNode used time', result.timeUsed) + return result.transactions.map((transactionBase64) => + confirmedTransactionFromBase64(transactionBase64), + ) + }) +} + +export { + getTransaction, + getLastTransaction, + getTransactions, + getAddressType, + getTransactionsForAccount, +} diff --git a/dlt-connector/src/data/KeyPairIdentifier.ts b/dlt-connector/src/data/KeyPairIdentifier.ts new file mode 100644 index 000000000..3a98c2e0e --- /dev/null +++ b/dlt-connector/src/data/KeyPairIdentifier.ts @@ -0,0 +1,72 @@ +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { LogError } from '@/server/LogError' +import { uuid4sToMemoryBlock } from '@/utils/typeConverter' + +export class KeyPairIdentifier { + // used for community key pair if it is only parameter or for user key pair + communityUuid?: string + // if set calculate key pair from seed, ignore all other parameter + seed?: string + // used for user key pair and account key pair, need also communityUuid + userUuid?: string + // used for account key pair, need also userUuid + accountNr?: number + + public constructor(input: UserIdentifier | string | undefined = undefined) { + if (input instanceof UserIdentifier) { + if (input.seed !== undefined) { + this.seed = input.seed.seed + } else { + this.communityUuid = input.communityUuid + this.userUuid = input.communityUser?.uuid + this.accountNr = input.communityUser?.accountNr + } + } else if (typeof input === 'string') { + this.communityUuid = input + } + } + + isCommunityKeyPair(): boolean { + return this.communityUuid !== undefined && this.userUuid === undefined + } + + isSeedKeyPair(): boolean { + return this.seed !== undefined + } + + isUserKeyPair(): boolean { + return ( + this.communityUuid !== undefined && + this.userUuid !== undefined && + this.accountNr === undefined + ) + } + + isAccountKeyPair(): boolean { + return ( + this.communityUuid !== undefined && + this.userUuid !== undefined && + this.accountNr !== undefined + ) + } + + getKey(): string { + if (this.seed && this.isSeedKeyPair()) { + return this.seed + } else if (this.communityUuid && this.isCommunityKeyPair()) { + return this.communityUuid + } + if (this.userUuid && this.communityUuid) { + const communityUserHash = uuid4sToMemoryBlock([this.userUuid, this.communityUuid]) + .calculateHash() + .convertToHex() + if (this.isUserKeyPair()) { + return communityUserHash + } + if (this.accountNr && this.isAccountKeyPair()) { + return communityUserHash + this.accountNr.toString() + } + } + throw new LogError('KeyPairIdentifier: unhandled input type', this) + } +} diff --git a/dlt-connector/src/graphql/const.ts b/dlt-connector/src/graphql/const.ts new file mode 100644 index 000000000..ce7186a54 --- /dev/null +++ b/dlt-connector/src/graphql/const.ts @@ -0,0 +1,2 @@ +export const MEMO_MAX_CHARS = 255 +export const MEMO_MIN_CHARS = 5 diff --git a/dlt-connector/src/graphql/enum/InputTransactionType.ts b/dlt-connector/src/graphql/enum/InputTransactionType.ts index 20e5e40f9..f1b56823e 100755 --- a/dlt-connector/src/graphql/enum/InputTransactionType.ts +++ b/dlt-connector/src/graphql/enum/InputTransactionType.ts @@ -8,6 +8,7 @@ export enum InputTransactionType { GROUP_FRIENDS_UPDATE = 'GROUP_FRIENDS_UPDATE', REGISTER_ADDRESS = 'REGISTER_ADDRESS', GRADIDO_DEFERRED_TRANSFER = 'GRADIDO_DEFERRED_TRANSFER', + GRADIDO_REDEEM_DEFERRED_TRANSFER = 'GRADIDO_REDEEM_DEFERRED_TRANSFER', COMMUNITY_ROOT = 'COMMUNITY_ROOT', } diff --git a/dlt-connector/src/graphql/enum/TransactionErrorType.ts b/dlt-connector/src/graphql/enum/TransactionErrorType.ts index 5a8a2a06b..f89df4afe 100644 --- a/dlt-connector/src/graphql/enum/TransactionErrorType.ts +++ b/dlt-connector/src/graphql/enum/TransactionErrorType.ts @@ -5,6 +5,7 @@ import { registerEnumType } from 'type-graphql' export enum TransactionErrorType { NOT_IMPLEMENTED_YET = 'Not Implemented yet', MISSING_PARAMETER = 'Missing parameter', + INVALID_PARAMETER = 'Invalid parameter', ALREADY_EXIST = 'Already exist', DB_ERROR = 'DB Error', PROTO_DECODE_ERROR = 'Proto Decode Error', diff --git a/dlt-connector/src/graphql/input/TransactionDraft.ts b/dlt-connector/src/graphql/input/TransactionDraft.ts index 3b2099ab6..0306d70e0 100755 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ b/dlt-connector/src/graphql/input/TransactionDraft.ts @@ -1,9 +1,10 @@ // https://www.npmjs.com/package/@apollo/protobufjs import { InputTransactionType } from '@enum/InputTransactionType' import { isValidDateString, isValidNumberString } from '@validator/DateString' -import { IsEnum, IsObject, ValidateNested } from 'class-validator' +import { IsEnum, IsObject, IsPositive, MaxLength, MinLength, ValidateNested } from 'class-validator' import { InputType, Field } from 'type-graphql' +import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql//const' import { AccountType } from '@/graphql/enum/AccountType' import { UserIdentifier } from './UserIdentifier' @@ -26,6 +27,11 @@ export class TransactionDraft { @isValidNumberString() amount?: string + @Field(() => String, { nullable: true }) + @MaxLength(MEMO_MAX_CHARS) + @MinLength(MEMO_MIN_CHARS) + memo?: string + @Field(() => InputTransactionType) @IsEnum(InputTransactionType) type: InputTransactionType @@ -40,9 +46,10 @@ export class TransactionDraft { targetDate?: string // only for deferred transaction - @Field(() => String, { nullable: true }) - @isValidDateString() - timeoutDate?: string + // duration in seconds + @Field(() => Number, { nullable: true }) + @IsPositive() + timeoutDuration?: number // only for register address @Field(() => AccountType, { nullable: true }) diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts index ab7203285..3db0ac26b 100644 --- a/dlt-connector/src/graphql/resolver/AccountsResolver.ts +++ b/dlt-connector/src/graphql/resolver/AccountsResolver.ts @@ -3,9 +3,9 @@ import { AddressType_NONE } from 'gradido-blockchain-js' import { Arg, Query, Resolver } from 'type-graphql' import { getAddressType } from '@/client/GradidoNode' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { KeyPairCalculation } from '@/interactions/keyPairCalculation/KeyPairCalculation.context' import { logger } from '@/logging/logger' -import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' import { uuid4ToHash } from '@/utils/typeConverter' import { TransactionErrorType } from '../enum/TransactionErrorType' @@ -17,7 +17,7 @@ import { TransactionResult } from '../model/TransactionResult' export class AccountResolver { @Query(() => Boolean) async isAccountExist(@Arg('data') userIdentifier: UserIdentifier): Promise { - const accountKeyPair = await KeyPairCalculation(userIdentifier) + const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifier(userIdentifier)) const publicKey = accountKeyPair.getPublicKey() if (!publicKey) { throw new TransactionResult( diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts index 68dd65a21..fb062b011 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -26,6 +26,6 @@ export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { if (!communityRoot) { throw new LogError('invalid confirmed transaction') } - return new KeyPairEd25519(communityRoot.getPubkey()) + return new KeyPairEd25519(communityRoot.getPublicKey()) } } diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts index 3cb1f43cf..0f9137453 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -1,8 +1,9 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { IdentifierSeed } from '@/graphql/input/IdentifierSeed' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { UserIdentifier } from '@/graphql/input/UserIdentifier' import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' +import { LogError } from '@/server/LogError' import { AccountKeyPairRole } from './AccountKeyPair.role' import { ForeignCommunityKeyPairRole } from './ForeignCommunityKeyPair.role' @@ -15,7 +16,7 @@ import { UserKeyPairRole } from './UserKeyPair.role' * @DCI-Context * Context for calculating key pair for signing transactions */ -export async function KeyPairCalculation(input: UserIdentifier | string): Promise { +export async function KeyPairCalculation(input: KeyPairIdentifier): Promise { const cache = KeyPairCacheManager.getInstance() // Try cache lookup first @@ -24,33 +25,49 @@ export async function KeyPairCalculation(input: UserIdentifier | string): Promis return keyPair } - const retrieveKeyPair = async (input: UserIdentifier | string): Promise => { - if (input instanceof UserIdentifier && input.seed) { - return new LinkedTransactionKeyPairRole(input.seed.seed).generateKeyPair() + const retrieveKeyPair = async (input: KeyPairIdentifier): Promise => { + if (input.isSeedKeyPair() && input.seed) { + return new LinkedTransactionKeyPairRole(input.seed).generateKeyPair() + } + if (!input.communityUuid) { + throw new LogError('missing community id') } - - const communityUUID = input instanceof UserIdentifier ? input.communityUuid : input - // If input does not belong to the home community, handle as remote key pair - if (cache.getHomeCommunityUUID() !== communityUUID) { + if (cache.getHomeCommunityUUID() !== input.communityUuid) { const role = input instanceof UserIdentifier ? new RemoteAccountKeyPairRole(input) - : new ForeignCommunityKeyPairRole(input) + : new ForeignCommunityKeyPairRole(input.communityUuid) return await role.retrieveKeyPair() } - let communityKeyPair = cache.findKeyPair(communityUUID) + let communityKeyPair = cache.findKeyPair(input) if (!communityKeyPair) { communityKeyPair = new HomeCommunityKeyPairRole().generateKeyPair() - cache.addKeyPair(communityUUID, communityKeyPair) } - if (input instanceof UserIdentifier) { - const userKeyPair = new UserKeyPairRole(input, communityKeyPair).generateKeyPair() - const accountNr = input.communityUser?.accountNr ?? 1 - return new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() + if (input.isCommunityKeyPair()) { + return communityKeyPair } - return communityKeyPair + const userKeyPairIdentifier = new KeyPairIdentifier() + userKeyPairIdentifier.communityUuid = input.communityUuid + userKeyPairIdentifier.userUuid = input.userUuid + + let userKeyPair = cache.findKeyPair(userKeyPairIdentifier) + if (!userKeyPair && userKeyPairIdentifier.userUuid) { + userKeyPair = new UserKeyPairRole( + userKeyPairIdentifier.userUuid, + communityKeyPair, + ).generateKeyPair() + } + if (!userKeyPair) { + throw new LogError("couldn't generate user key pair") + } + if (input.isUserKeyPair()) { + return userKeyPair + } + + const accountNr = input.accountNr ?? 1 + return new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() } keyPair = await retrieveKeyPair(input) diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts index 6f433a7df..ca724fc99 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -1,24 +1,20 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { LogError } from '@/server/LogError' import { hardenDerivationIndex } from '@/utils/derivationHelper' import { uuid4ToBuffer } from '@/utils/typeConverter' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class UserKeyPairRole extends AbstractKeyPairRole { - public constructor(private user: UserIdentifier, private communityKeys: KeyPairEd25519) { + public constructor(private userUuid: string, private communityKeys: KeyPairEd25519) { super() } public generateKeyPair(): KeyPairEd25519 { // example gradido id: 03857ac1-9cc2-483e-8a91-e5b10f5b8d16 => // wholeHex: '03857ac19cc2483e8a91e5b10f5b8d16'] - if (!this.user.communityUser) { - throw new LogError('missing community user') - } - const wholeHex = uuid4ToBuffer(this.user.communityUser.uuid) + + const wholeHex = uuid4ToBuffer(this.userUuid) const parts = [] for (let i = 0; i < 4; i++) { parts[i] = hardenDerivationIndex(wholeHex.subarray(i * 4, (i + 1) * 4).readUInt32BE()) diff --git a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts index 713a2b906..a1a7b237d 100644 --- a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts @@ -1,5 +1,6 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { CommunityDraft } from '@/graphql/input/CommunityDraft' import { LogError } from '@/server/LogError' import { @@ -27,7 +28,7 @@ export class CommunityRootTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() - const communityKeyPair = await KeyPairCalculation(this.self.uuid) + const communityKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.uuid)) const gmwKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), ) diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index 2865193a9..e3fa9a838 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -1,8 +1,16 @@ -import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' +import { + AuthenticatedEncryption, + EncryptedMemo, + GradidoTransactionBuilder, + GradidoUnit, + TransferAmount, +} from 'gradido-blockchain-js' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { TransactionError } from '@/graphql/model/TransactionError' +import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' @@ -40,15 +48,25 @@ export class CreationTransactionRole extends AbstractTransactionRole { if (!this.self.amount) { throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'creation: amount missing') } + if (!this.self.memo) { + throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'creation: memo missing') + } + const builder = new GradidoTransactionBuilder() - const recipientKeyPair = await KeyPairCalculation(this.self.user) - const signerKeyPair = await KeyPairCalculation(this.self.linkedUser) + const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.user)) + const signerKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.linkedUser)) + const homeCommunityKeyPair = await KeyPairCalculation( + new KeyPairIdentifier(KeyPairCacheManager.getInstance().getHomeCommunityUUID()), + ) builder .setCreatedAt(new Date(this.self.createdAt)) - .setMemo('dummy memo for creation') + .addMemo(new EncryptedMemo(this.self.memo, new AuthenticatedEncryption(homeCommunityKeyPair))) .setTransactionCreation( - new TransferAmount(recipientKeyPair.getPublicKey(), this.self.amount.toString()), + new TransferAmount( + recipientKeyPair.getPublicKey(), + GradidoUnit.fromString(this.self.amount), + ), new Date(this.self.targetDate), ) .sign(signerKeyPair) diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 511efa869..19b4dc649 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -1,5 +1,13 @@ -import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' +import { + AuthenticatedEncryption, + EncryptedMemo, + GradidoTransactionBuilder, + GradidoTransfer, + GradidoUnit, + TransferAmount, +} from 'gradido-blockchain-js' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { TransactionError } from '@/graphql/model/TransactionError' @@ -37,27 +45,42 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { 'deferred transfer: amount missing', ) } - if (!this.self.timeoutDate) { + if (!this.self.memo) { throw new TransactionError( TransactionErrorType.MISSING_PARAMETER, - 'deferred transfer: timeout date missing', + 'deferred transfer: memo missing', + ) + } + if (!this.self.timeoutDuration) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'deferred transfer: timeout duration missing', ) } const builder = new GradidoTransactionBuilder() - const senderKeyPair = await KeyPairCalculation(this.self.user) - const recipientKeyPair = await KeyPairCalculation(this.self.linkedUser) + const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.user)) + const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.linkedUser)) builder .setCreatedAt(new Date(this.self.createdAt)) - .setMemo('dummy memo for transfer') + .addMemo( + new EncryptedMemo( + this.self.memo, + new AuthenticatedEncryption(senderKeyPair), + new AuthenticatedEncryption(recipientKeyPair), + ), + ) .setDeferredTransfer( new GradidoTransfer( - new TransferAmount(senderKeyPair.getPublicKey(), this.self.amount.toString()), + new TransferAmount( + senderKeyPair.getPublicKey(), + GradidoUnit.fromString(this.self.amount), + ), recipientKeyPair.getPublicKey(), ), - new Date(this.self.timeoutDate), + this.self.timeoutDuration, ) - builder.sign(senderKeyPair) + .sign(senderKeyPair) return builder } } diff --git a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts new file mode 100644 index 000000000..eb858c322 --- /dev/null +++ b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts @@ -0,0 +1,103 @@ +import { + GradidoTransactionBuilder, + GradidoTransfer, + GradidoUnit, + TransferAmount, +} from 'gradido-blockchain-js' + +import { getTransactionsForAccount } from '@/client/GradidoNode' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' +import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' +import { TransactionDraft } from '@/graphql/input/TransactionDraft' +import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { TransactionError } from '@/graphql/model/TransactionError' +import { communityUuidToTopic, uuid4ToHash } from '@/utils/typeConverter' + +import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' + +import { AbstractTransactionRole } from './AbstractTransaction.role' + +export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRole { + private linkedUser: UserIdentifier + constructor(protected self: TransactionDraft) { + super() + if (!this.self.linkedUser) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'transfer: linked user missing', + ) + } + this.linkedUser = this.self.linkedUser + } + + getSenderCommunityUuid(): string { + return this.self.user.communityUuid + } + + getRecipientCommunityUuid(): string { + return this.linkedUser.communityUuid + } + + public async getGradidoTransactionBuilder(): Promise { + if (!this.self.amount) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'redeem deferred transfer: amount missing', + ) + } + const builder = new GradidoTransactionBuilder() + const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.user)) + const senderPublicKey = senderKeyPair.getPublicKey() + if (!senderPublicKey) { + throw new TransactionError( + TransactionErrorType.INVALID_PARAMETER, + "redeem deferred transfer: couldn't calculate sender public key", + ) + } + // load deferred transfer transaction from gradido node + const transactions = await getTransactionsForAccount( + senderPublicKey, + communityUuidToTopic(this.getSenderCommunityUuid()), + ) + if (!transactions || transactions.length !== 1) { + throw new TransactionError( + TransactionErrorType.NOT_FOUND, + "redeem deferred transfer: couldn't find deferred transfer on Gradido Node", + ) + } + const deferredTransfer = transactions[0] + const deferredTransferBody = deferredTransfer.getGradidoTransaction()?.getTransactionBody() + if (!deferredTransferBody) { + throw new TransactionError( + TransactionErrorType.NOT_FOUND, + "redeem deferred transfer: couldn't deserialize deferred transfer from Gradido Node", + ) + } + const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.linkedUser)) + + // TODO: fix getMemos in gradido-blockchain-js to return correct data + builder + .setCreatedAt(new Date(this.self.createdAt)) + .addMemo(deferredTransferBody.getMemos()[0]) + .setRedeemDeferredTransfer( + deferredTransfer.getId(), + new GradidoTransfer( + new TransferAmount( + senderKeyPair.getPublicKey(), + GradidoUnit.fromString(this.self.amount), + ), + recipientKeyPair.getPublicKey(), + ), + ) + const senderCommunity = this.self.user.communityUuid + const recipientCommunity = this.linkedUser.communityUuid + if (senderCommunity !== recipientCommunity) { + // we have a cross group transaction + builder + .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) + .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) + } + builder.sign(senderKeyPair) + return builder + } +} diff --git a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts index f8c82586d..70d612e08 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -1,6 +1,7 @@ /* eslint-disable camelcase */ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { TransactionError } from '@/graphql/model/TransactionError' @@ -40,17 +41,25 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { } const builder = new GradidoTransactionBuilder() - const communityKeyPair = await KeyPairCalculation(this.self.user.communityUuid) - const accountKeyPair = await KeyPairCalculation(this.self.user) + const communityKeyPair = await KeyPairCalculation( + new KeyPairIdentifier(this.self.user.communityUuid), + ) + const keyPairIdentifer = new KeyPairIdentifier(this.self.user) + const accountKeyPair = await KeyPairCalculation(keyPairIdentifer) + // unsetting accountNr change identifier from account key pair to user key pair + keyPairIdentifer.accountNr = undefined + const userKeyPair = await KeyPairCalculation(keyPairIdentifer) builder .setCreatedAt(new Date(this.self.createdAt)) .setRegisterAddress( - accountKeyPair.getPublicKey(), + userKeyPair.getPublicKey(), accountTypeToAddressType(this.self.accountType), uuid4ToHash(this.self.user.communityUser.uuid), + accountKeyPair.getPublicKey(), ) .sign(communityKeyPair) .sign(accountKeyPair) + .sign(userKeyPair) return builder } } diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index be02eef55..2607f6c8f 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -17,12 +17,13 @@ import { TransactionRecipe } from '@/graphql/model/TransactionRecipe' import { TransactionResult } from '@/graphql/model/TransactionResult' import { logger } from '@/logging/logger' import { LogError } from '@/server/LogError' -import { uuid4ToHash } from '@/utils/typeConverter' +import { communityUuidToTopic } from '@/utils/typeConverter' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.role' +import { RedeemDeferredTransferTransactionRole } from './RedeemDeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' @@ -87,6 +88,9 @@ export async function SendToIotaContext( case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: role = new DeferredTransferTransactionRole(input) break + case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: + role = new RedeemDeferredTransferTransactionRole(input) + break default: throw new TransactionError( TransactionErrorType.NOT_IMPLEMENTED_YET, @@ -104,22 +108,19 @@ export async function SendToIotaContext( validate(outboundTransaction) const outboundIotaMessageId = await sendViaIota( outboundTransaction, - uuid4ToHash(role.getSenderCommunityUuid()).convertToHex(), + communityUuidToTopic(role.getSenderCommunityUuid()), ) builder.setParentMessageId(outboundIotaMessageId) const inboundTransaction = builder.buildInbound() validate(inboundTransaction) - await sendViaIota( - inboundTransaction, - uuid4ToHash(role.getRecipientCommunityUuid()).convertToHex(), - ) + await sendViaIota(inboundTransaction, communityUuidToTopic(role.getRecipientCommunityUuid())) return new TransactionResult(new TransactionRecipe(outboundTransaction, outboundIotaMessageId)) } else { const transaction = builder.build() validate(transaction) const iotaMessageId = await sendViaIota( transaction, - uuid4ToHash(role.getSenderCommunityUuid()).convertToHex(), + communityUuidToTopic(role.getSenderCommunityUuid()), ) return new TransactionResult(new TransactionRecipe(transaction, iotaMessageId)) } diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index 7a4cd7bb0..dd730f590 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -1,5 +1,12 @@ -import { GradidoTransactionBuilder, TransferAmount } from 'gradido-blockchain-js' +import { + AuthenticatedEncryption, + EncryptedMemo, + GradidoTransactionBuilder, + GradidoUnit, + TransferAmount, +} from 'gradido-blockchain-js' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { TransactionErrorType } from '@/graphql/enum/TransactionErrorType' import { TransactionDraft } from '@/graphql/input/TransactionDraft' import { UserIdentifier } from '@/graphql/input/UserIdentifier' @@ -35,14 +42,27 @@ export class TransferTransactionRole extends AbstractTransactionRole { if (!this.self.amount) { throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'transfer: amount missing') } + if (!this.self.memo) { + throw new TransactionError( + TransactionErrorType.MISSING_PARAMETER, + 'deferred transfer: memo missing', + ) + } const builder = new GradidoTransactionBuilder() - const senderKeyPair = await KeyPairCalculation(this.self.user) - const recipientKeyPair = await KeyPairCalculation(this.linkedUser) + const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.user)) + const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.linkedUser)) + builder .setCreatedAt(new Date(this.self.createdAt)) - .setMemo('dummy memo for transfer') + .addMemo( + new EncryptedMemo( + this.self.memo, + new AuthenticatedEncryption(senderKeyPair), + new AuthenticatedEncryption(recipientKeyPair), + ), + ) .setTransactionTransfer( - new TransferAmount(senderKeyPair.getPublicKey(), this.self.amount.toString()), + new TransferAmount(senderKeyPair.getPublicKey(), GradidoUnit.fromString(this.self.amount)), recipientKeyPair.getPublicKey(), ) const senderCommunity = this.self.user.communityUuid diff --git a/dlt-connector/src/manager/KeyPairCacheManager.ts b/dlt-connector/src/manager/KeyPairCacheManager.ts index f492d127b..c3613f91d 100644 --- a/dlt-connector/src/manager/KeyPairCacheManager.ts +++ b/dlt-connector/src/manager/KeyPairCacheManager.ts @@ -1,8 +1,7 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' +import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -45,30 +44,19 @@ export class KeyPairCacheManager { return this.homeCommunityUUID } - public findKeyPair(input: UserIdentifier | string): KeyPairEd25519 | undefined { - return this.cache.get(this.getKey(input)) + public findKeyPair(input: KeyPairIdentifier): KeyPairEd25519 | undefined { + return this.cache.get(input.getKey()) } - public addKeyPair(input: UserIdentifier | string, keyPair: KeyPairEd25519): void { - const key = this.getKey(input) + public addKeyPair(input: KeyPairIdentifier, keyPair: KeyPairEd25519): void { + const key = input.getKey() if (this.cache.has(key)) { - logger.warn('key already exist, cannot add', key) + logger.warn('key already exist, cannot add', { + key, + publicKey: keyPair.getPublicKey()?.convertToHex(), + }) return } this.cache.set(key, keyPair) } - - protected getKey(input: UserIdentifier | string): string { - if (input instanceof UserIdentifier) { - if (input.communityUser) { - return input.communityUser.uuid - } else if (input.seed) { - return input.seed.seed - } - throw new LogError('unhandled branch') - } else if (typeof input === 'string') { - return input - } - throw new LogError('unhandled input type') - } } diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index 198c15042..219b95376 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -32,6 +32,14 @@ export const uuid4ToMemoryBlock = (uuid: string): MemoryBlock => { return MemoryBlock.fromHex(uuid.replace(/-/g, '')) } +export const uuid4sToMemoryBlock = (uuid: string[]): MemoryBlock => { + let resultHexString = '' + for (let i = 0; i < uuid.length; i++) { + resultHexString += uuid[i].replace(/-/g, '') + } + return MemoryBlock.fromHex(resultHexString) +} + export const uuid4ToHash = (communityUUID: string): MemoryBlock => { return uuid4ToMemoryBlock(communityUUID).calculateHash() } @@ -40,6 +48,10 @@ export const base64ToBuffer = (base64: string): Buffer => { return Buffer.from(base64, 'base64') } +export const communityUuidToTopic = (communityUUID: string): string => { + return uuid4ToHash(communityUUID).convertToHex() +} + export function getEnumValue>( enumType: T, value: number | string, diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock index c4f244816..71cde5091 100644 --- a/dlt-connector/yarn.lock +++ b/dlt-connector/yarn.lock @@ -3277,9 +3277,9 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -"gradido-blockchain-js@git+https://github.com/gradido/gradido-blockchain-js#master": +"gradido-blockchain-js@git+https://github.com/gradido/gradido-blockchain-js#1c75576": version "0.0.1" - resolved "git+https://github.com/gradido/gradido-blockchain-js#5e7bc50af82d30ef0fdbe48414b1f916c592b6f4" + resolved "git+https://github.com/gradido/gradido-blockchain-js#1c755763b7f3f71c2ee9f396da5e9512fa666ee4" dependencies: bindings "^1.5.0" nan "^2.20.0" From 93e327170532ce7ce6f8f151f9513d67ed039589 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 14 Jan 2025 16:45:01 +0100 Subject: [PATCH 22/23] changes for adapting to gradido blockchain changes --- .../dltConnector/enum/DltTransactionType.ts | 1 + .../transactionToDlt/TransactionToDlt.role.ts | 20 ++++++++++--------- .../transactionToDlt.context.ts | 17 ++++++++++++---- .../sendTransactionsToDltConnector.ts | 7 +++++-- database/migrations/0088-merge_dlt_tables.ts | 2 +- .../DeferredTransferTransaction.role.ts | 7 +++++-- .../RedeemDeferredTransferTransaction.role.ts | 6 ++++-- 7 files changed, 40 insertions(+), 20 deletions(-) diff --git a/backend/src/apis/dltConnector/enum/DltTransactionType.ts b/backend/src/apis/dltConnector/enum/DltTransactionType.ts index 80e12daa5..ce1044a7a 100644 --- a/backend/src/apis/dltConnector/enum/DltTransactionType.ts +++ b/backend/src/apis/dltConnector/enum/DltTransactionType.ts @@ -1,4 +1,5 @@ export enum DltTransactionType { + UNKNOWN = 0, REGISTER_ADDRESS = 1, CREATION = 2, TRANSFER = 3, diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts index eb6658835..de96d38cc 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts @@ -48,15 +48,6 @@ export class TransactionToDltRole extends AbstractTransactionToDltRole { await transactionToDlt(dltConnector) await InterruptiveSleepManager.getInstance().sleep( TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, - 1000, + // TODO: put sleep time into config, because it influence performance, + // transactionToDlt call 4 db queries to look for new transactions + CONFIG.PRODUCTION ? 100000 : 1000, ) } catch (e) { // couldn't connect to dlt-connector? We wait diff --git a/database/migrations/0088-merge_dlt_tables.ts b/database/migrations/0088-merge_dlt_tables.ts index ab3db11eb..70ee2d49e 100644 --- a/database/migrations/0088-merge_dlt_tables.ts +++ b/database/migrations/0088-merge_dlt_tables.ts @@ -7,7 +7,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis ALTER TABLE \`dlt_transactions\` CHANGE \`transaction_id\` \`transaction_id\` INT(10) UNSIGNED NULL DEFAULT NULL, ADD \`user_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`transaction_id\`, - ADD \`transaction_link_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`user_id\` + ADD \`transaction_link_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`user_id\`, ADD \`type_id\` INT UNSIGNED NOT NULL AFTER \`transaction_link_id\` ; `) diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 19b4dc649..90783723e 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -1,5 +1,6 @@ import { AuthenticatedEncryption, + DurationSeconds, EncryptedMemo, GradidoTransactionBuilder, GradidoTransfer, @@ -74,11 +75,13 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { new GradidoTransfer( new TransferAmount( senderKeyPair.getPublicKey(), - GradidoUnit.fromString(this.self.amount), + GradidoUnit.fromString(this.self.amount).calculateCompoundInterest( + this.self.timeoutDuration, + ), ), recipientKeyPair.getPublicKey(), ), - this.self.timeoutDuration, + new DurationSeconds(this.self.timeoutDuration), ) .sign(senderKeyPair) return builder diff --git a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts index eb858c322..ae9115485 100644 --- a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts @@ -75,10 +75,8 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo } const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.linkedUser)) - // TODO: fix getMemos in gradido-blockchain-js to return correct data builder .setCreatedAt(new Date(this.self.createdAt)) - .addMemo(deferredTransferBody.getMemos()[0]) .setRedeemDeferredTransfer( deferredTransfer.getId(), new GradidoTransfer( @@ -89,6 +87,10 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo recipientKeyPair.getPublicKey(), ), ) + const memos = deferredTransferBody.getMemos() + for (let i = 0; i < memos.size(); i++) { + builder.addMemo(memos.get(i)) + } const senderCommunity = this.self.user.communityUuid const recipientCommunity = this.linkedUser.communityUuid if (senderCommunity !== recipientCommunity) { From 0306fab49aee92bfc85b69b1796e139590ab9733 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 30 Jun 2025 07:23:01 +0200 Subject: [PATCH 23/23] update database for dlt connector --- .../DltTransaction.ts | 0 .../DltUser.ts | 0 .../User.ts | 3 ++- .../DltTransaction.ts | 0 .../Transaction.ts | 0 .../TransactionLink.ts | 0 .../User.ts | 0 database/entity/DltTransaction.ts | 2 +- database/entity/DltUser.ts | 1 - database/entity/Transaction.ts | 2 +- database/entity/TransactionLink.ts | 2 +- database/entity/User.ts | 2 +- database/logging/DltUserLogging.view.ts | 23 ------------------- ...s_table.ts => 0088-add_dlt_users_table.ts} | 0 ...dlt_tables.ts => 0089-merge_dlt_tables.ts} | 0 15 files changed, 6 insertions(+), 29 deletions(-) rename database/entity/{0087-add_dlt_users_table => 0088-add_dlt_users_table}/DltTransaction.ts (100%) rename database/entity/{0087-add_dlt_users_table => 0088-add_dlt_users_table}/DltUser.ts (100%) rename database/entity/{0087-add_dlt_users_table => 0088-add_dlt_users_table}/User.ts (98%) rename database/entity/{0088-merge_dlt_tables => 0089-merge_dlt_tables}/DltTransaction.ts (100%) rename database/entity/{0088-merge_dlt_tables => 0089-merge_dlt_tables}/Transaction.ts (100%) rename database/entity/{0088-merge_dlt_tables => 0089-merge_dlt_tables}/TransactionLink.ts (100%) rename database/entity/{0088-merge_dlt_tables => 0089-merge_dlt_tables}/User.ts (100%) delete mode 100644 database/entity/DltUser.ts delete mode 100644 database/logging/DltUserLogging.view.ts rename database/migrations/{0087-add_dlt_users_table.ts => 0088-add_dlt_users_table.ts} (100%) rename database/migrations/{0088-merge_dlt_tables.ts => 0089-merge_dlt_tables.ts} (100%) diff --git a/database/entity/0087-add_dlt_users_table/DltTransaction.ts b/database/entity/0088-add_dlt_users_table/DltTransaction.ts similarity index 100% rename from database/entity/0087-add_dlt_users_table/DltTransaction.ts rename to database/entity/0088-add_dlt_users_table/DltTransaction.ts diff --git a/database/entity/0087-add_dlt_users_table/DltUser.ts b/database/entity/0088-add_dlt_users_table/DltUser.ts similarity index 100% rename from database/entity/0087-add_dlt_users_table/DltUser.ts rename to database/entity/0088-add_dlt_users_table/DltUser.ts diff --git a/database/entity/0087-add_dlt_users_table/User.ts b/database/entity/0088-add_dlt_users_table/User.ts similarity index 98% rename from database/entity/0087-add_dlt_users_table/User.ts rename to database/entity/0088-add_dlt_users_table/User.ts index 8d5466241..f9b079a04 100644 --- a/database/entity/0087-add_dlt_users_table/User.ts +++ b/database/entity/0088-add_dlt_users_table/User.ts @@ -16,7 +16,8 @@ import { UserContact } from '../UserContact' import { UserRole } from '../UserRole' import { GeometryTransformer } from '../../src/typeorm/GeometryTransformer' import { Community } from '../Community' -import { DltUser } from '../DltUser' +// removed in current version +import { DltUser } from './DltUser' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { diff --git a/database/entity/0088-merge_dlt_tables/DltTransaction.ts b/database/entity/0089-merge_dlt_tables/DltTransaction.ts similarity index 100% rename from database/entity/0088-merge_dlt_tables/DltTransaction.ts rename to database/entity/0089-merge_dlt_tables/DltTransaction.ts diff --git a/database/entity/0088-merge_dlt_tables/Transaction.ts b/database/entity/0089-merge_dlt_tables/Transaction.ts similarity index 100% rename from database/entity/0088-merge_dlt_tables/Transaction.ts rename to database/entity/0089-merge_dlt_tables/Transaction.ts diff --git a/database/entity/0088-merge_dlt_tables/TransactionLink.ts b/database/entity/0089-merge_dlt_tables/TransactionLink.ts similarity index 100% rename from database/entity/0088-merge_dlt_tables/TransactionLink.ts rename to database/entity/0089-merge_dlt_tables/TransactionLink.ts diff --git a/database/entity/0088-merge_dlt_tables/User.ts b/database/entity/0089-merge_dlt_tables/User.ts similarity index 100% rename from database/entity/0088-merge_dlt_tables/User.ts rename to database/entity/0089-merge_dlt_tables/User.ts diff --git a/database/entity/DltTransaction.ts b/database/entity/DltTransaction.ts index 373e5f593..bc3244dc0 100644 --- a/database/entity/DltTransaction.ts +++ b/database/entity/DltTransaction.ts @@ -1 +1 @@ -export { DltTransaction } from './0088-merge_dlt_tables/DltTransaction' +export { DltTransaction } from './0089-merge_dlt_tables/DltTransaction' diff --git a/database/entity/DltUser.ts b/database/entity/DltUser.ts deleted file mode 100644 index 29c835233..000000000 --- a/database/entity/DltUser.ts +++ /dev/null @@ -1 +0,0 @@ -export { DltUser } from './0087-add_dlt_users_table/DltUser' diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts index 7b014e17a..2f4b2ccfc 100644 --- a/database/entity/Transaction.ts +++ b/database/entity/Transaction.ts @@ -1 +1 @@ -export { Transaction } from './0088-merge_dlt_tables/Transaction' +export { Transaction } from './0089-merge_dlt_tables/Transaction' diff --git a/database/entity/TransactionLink.ts b/database/entity/TransactionLink.ts index ff69e101f..fa8af166d 100644 --- a/database/entity/TransactionLink.ts +++ b/database/entity/TransactionLink.ts @@ -1 +1 @@ -export { TransactionLink } from './0088-merge_dlt_tables/TransactionLink' +export { TransactionLink } from './0089-merge_dlt_tables/TransactionLink' diff --git a/database/entity/User.ts b/database/entity/User.ts index 3836c683e..92b529cb1 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0088-merge_dlt_tables/User' +export { User } from './0089-merge_dlt_tables/User' diff --git a/database/logging/DltUserLogging.view.ts b/database/logging/DltUserLogging.view.ts deleted file mode 100644 index c98c3f351..000000000 --- a/database/logging/DltUserLogging.view.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DltUser } from '../entity/DltUser' -import { AbstractLoggingView } from './AbstractLogging.view' -import { UserLoggingView } from './UserLogging.view' - -export class DltUserLoggingView extends AbstractLoggingView { - public constructor(private self: DltUser) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - id: this.self.id, - user: this.self.user - ? new UserLoggingView(this.self.user).toJSON() - : { id: this.self.userId }, - messageId: this.self.messageId, - verified: this.self.verified, - createdAt: this.dateToString(this.self.createdAt), - verifiedAt: this.dateToString(this.self.verifiedAt), - } - } -} diff --git a/database/migrations/0087-add_dlt_users_table.ts b/database/migrations/0088-add_dlt_users_table.ts similarity index 100% rename from database/migrations/0087-add_dlt_users_table.ts rename to database/migrations/0088-add_dlt_users_table.ts diff --git a/database/migrations/0088-merge_dlt_tables.ts b/database/migrations/0089-merge_dlt_tables.ts similarity index 100% rename from database/migrations/0088-merge_dlt_tables.ts rename to database/migrations/0089-merge_dlt_tables.ts