From b9e138939b1140f2ebca59d7efaa625ac19f8aed Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 3 May 2024 15:20:59 +0200 Subject: [PATCH 01/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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/72] 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 From 78351257ee47fa656baa4816e7e298cbc174955e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 3 Jul 2025 15:35:42 +0200 Subject: [PATCH 24/72] refactor with extensive, experimental use of valibot for typecheck, vailidation and conversation --- .gitignore | 2 +- .../TransactionLinkToDlt.role.ts | 3 +- dlt-connector/.env.template | 21 - dlt-connector/.eslintignore | 4 - dlt-connector/.eslintrc.js | 207 - dlt-connector/.gitignore | 8 - dlt-connector/.nvmrc | 1 - dlt-connector/.prettierrc.js | 9 - dlt-connector/@types/bip32-ed25519/index.d.ts | 1 - dlt-connector/Dockerfile | 119 - dlt-connector/README.md | 1 + dlt-connector/bun.lock | 577 ++ dlt-connector/jest.config.js | 37 - dlt-connector/log4js-config.json | 6 +- dlt-connector/package.json | 97 +- dlt-connector/schema.graphql | 98 - .../src/{manager => }/KeyPairCacheManager.ts | 43 +- dlt-connector/src/client/BackendClient.ts | 86 +- dlt-connector/src/client/GradidoNode.ts | 156 - .../src/client/GradidoNode/input.schema.ts | 33 + .../src/client/GradidoNode/jsonrpc.api.ts | 174 + .../src/client/GradidoNode/output.schema.ts | 0 dlt-connector/src/client/IotaClient.test.ts | 71 - dlt-connector/src/client/IotaClient.ts | 53 - dlt-connector/src/config/const.ts | 1 + dlt-connector/src/config/index.ts | 61 +- .../src/data/KeyPairIdentifier.logic.ts | 97 + dlt-connector/src/data/KeyPairIdentifier.ts | 72 - .../src/{graphql => }/enum/AccountType.ts | 7 - dlt-connector/src/enum/AddressType.ts | 19 + .../src/enum/GradidoNodeErrorCodes.ts | 20 + .../enum/InputTransactionType.ts | 7 - .../enum/TransactionErrorType.ts | 7 - dlt-connector/src/errors.ts | 43 + dlt-connector/src/graphql/arg/CommunityArg.ts | 19 - dlt-connector/src/graphql/const.ts | 2 - .../src/graphql/input/CommunityDraft.ts | 20 - .../src/graphql/input/CommunityUser.ts | 15 - .../src/graphql/input/IdentifierSeed.ts | 15 - .../src/graphql/input/TransactionDraft.ts | 58 - .../src/graphql/input/UserIdentifier.ts | 24 - .../src/graphql/model/TransactionError.ts | 21 - .../src/graphql/model/TransactionRecipe.ts | 27 - .../src/graphql/model/TransactionResult.ts | 28 - .../src/graphql/resolver/AccountsResolver.ts | 36 - .../graphql/resolver/TransactionsResolver.ts | 27 - dlt-connector/src/graphql/schema.ts | 19 - .../src/graphql/validator/DateString.ts | 41 - dlt-connector/src/index.ts | 105 +- .../AbstractRemoteKeyPair.role.ts | 6 + .../ForeignCommunityKeyPair.role.ts | 37 +- .../HomeCommunityKeyPair.role.ts | 10 +- .../KeyPairCalculation.context.ts | 70 +- .../LinkedTransactionKeyPair.role.ts | 5 +- .../RemoteAccountKeyPair.role.ts | 40 +- .../keyPairCalculation/UserKeyPair.role.ts | 6 +- .../CommunityRootTransaction.role.ts | 21 +- .../sendToIota/CreationTransaction.role.ts | 90 +- .../DeferredTransferTransaction.role.ts | 73 +- .../RegisterAddressTransaction.role.ts | 73 +- .../sendToIota/TransferTransaction.role.ts | 62 +- .../src/logging/AbstractLogging.view.ts | 38 - .../src/logging/CommunityUserLogging.view.ts | 17 - .../src/logging/IdentifierSeedLogging.view.ts | 16 - .../logging/TransactionDraftLogging.view.ts | 28 - .../src/logging/UserIdentifierLogging.view.ts | 22 - dlt-connector/src/logging/logger.ts | 13 - dlt-connector/src/schemas/account.schema.ts | 40 + .../src/schemas/rpcParameter.schema.test.ts | 21 + .../src/schemas/rpcParameter.schema.ts | 19 + .../src/schemas/transaction.schema.test.ts | 207 + .../src/schemas/transaction.schema.ts | 87 + .../src/schemas/typeConverter.schema.test.ts | 51 + .../src/schemas/typeConverter.schema.ts | 125 + .../src/schemas/typeGuard.schema.test.ts | 67 + dlt-connector/src/schemas/typeGuard.schema.ts | 146 + dlt-connector/src/server/LogError.test.ts | 27 - dlt-connector/src/server/LogError.ts | 10 - dlt-connector/src/server/cors.ts | 8 - dlt-connector/src/server/createServer.ts | 79 - .../src/utils/derivationHelper.test.ts | 4 +- dlt-connector/src/utils/network.ts | 51 + dlt-connector/src/utils/typeConverter.test.ts | 23 - dlt-connector/src/utils/typeConverter.ts | 120 - dlt-connector/test/ApolloServerMock.ts | 20 - dlt-connector/test/testSetup.ts | 22 - dlt-connector/tsconfig.json | 174 +- dlt-connector/types/global.d.ts | 2 + dlt-connector/yarn.lock | 6476 ----------------- 89 files changed, 2275 insertions(+), 8729 deletions(-) delete mode 100644 dlt-connector/.env.template delete mode 100644 dlt-connector/.eslintignore delete mode 100644 dlt-connector/.eslintrc.js delete mode 100644 dlt-connector/.gitignore delete mode 100644 dlt-connector/.nvmrc delete mode 100644 dlt-connector/.prettierrc.js delete mode 100644 dlt-connector/@types/bip32-ed25519/index.d.ts delete mode 100644 dlt-connector/Dockerfile create mode 100644 dlt-connector/README.md create mode 100644 dlt-connector/bun.lock delete mode 100644 dlt-connector/jest.config.js delete mode 100644 dlt-connector/schema.graphql rename dlt-connector/src/{manager => }/KeyPairCacheManager.ts (55%) delete mode 100644 dlt-connector/src/client/GradidoNode.ts create mode 100644 dlt-connector/src/client/GradidoNode/input.schema.ts create mode 100644 dlt-connector/src/client/GradidoNode/jsonrpc.api.ts create mode 100644 dlt-connector/src/client/GradidoNode/output.schema.ts delete mode 100644 dlt-connector/src/client/IotaClient.test.ts delete mode 100644 dlt-connector/src/client/IotaClient.ts create mode 100644 dlt-connector/src/config/const.ts create mode 100644 dlt-connector/src/data/KeyPairIdentifier.logic.ts delete mode 100644 dlt-connector/src/data/KeyPairIdentifier.ts rename dlt-connector/src/{graphql => }/enum/AccountType.ts (77%) create mode 100644 dlt-connector/src/enum/AddressType.ts create mode 100644 dlt-connector/src/enum/GradidoNodeErrorCodes.ts rename dlt-connector/src/{graphql => }/enum/InputTransactionType.ts (67%) rename dlt-connector/src/{graphql => }/enum/TransactionErrorType.ts (75%) create mode 100644 dlt-connector/src/errors.ts delete mode 100644 dlt-connector/src/graphql/arg/CommunityArg.ts delete mode 100644 dlt-connector/src/graphql/const.ts delete mode 100644 dlt-connector/src/graphql/input/CommunityDraft.ts delete mode 100644 dlt-connector/src/graphql/input/CommunityUser.ts delete mode 100644 dlt-connector/src/graphql/input/IdentifierSeed.ts delete mode 100755 dlt-connector/src/graphql/input/TransactionDraft.ts delete mode 100644 dlt-connector/src/graphql/input/UserIdentifier.ts delete mode 100644 dlt-connector/src/graphql/model/TransactionError.ts delete mode 100644 dlt-connector/src/graphql/model/TransactionRecipe.ts delete mode 100644 dlt-connector/src/graphql/model/TransactionResult.ts delete mode 100644 dlt-connector/src/graphql/resolver/AccountsResolver.ts delete mode 100755 dlt-connector/src/graphql/resolver/TransactionsResolver.ts delete mode 100755 dlt-connector/src/graphql/schema.ts delete mode 100644 dlt-connector/src/graphql/validator/DateString.ts delete mode 100644 dlt-connector/src/logging/AbstractLogging.view.ts delete mode 100644 dlt-connector/src/logging/CommunityUserLogging.view.ts delete mode 100644 dlt-connector/src/logging/IdentifierSeedLogging.view.ts delete mode 100644 dlt-connector/src/logging/TransactionDraftLogging.view.ts delete mode 100644 dlt-connector/src/logging/UserIdentifierLogging.view.ts delete mode 100644 dlt-connector/src/logging/logger.ts create mode 100644 dlt-connector/src/schemas/account.schema.ts create mode 100644 dlt-connector/src/schemas/rpcParameter.schema.test.ts create mode 100644 dlt-connector/src/schemas/rpcParameter.schema.ts create mode 100644 dlt-connector/src/schemas/transaction.schema.test.ts create mode 100644 dlt-connector/src/schemas/transaction.schema.ts create mode 100644 dlt-connector/src/schemas/typeConverter.schema.test.ts create mode 100644 dlt-connector/src/schemas/typeConverter.schema.ts create mode 100644 dlt-connector/src/schemas/typeGuard.schema.test.ts create mode 100644 dlt-connector/src/schemas/typeGuard.schema.ts delete mode 100644 dlt-connector/src/server/LogError.test.ts delete mode 100644 dlt-connector/src/server/LogError.ts delete mode 100644 dlt-connector/src/server/cors.ts delete mode 100755 dlt-connector/src/server/createServer.ts create mode 100644 dlt-connector/src/utils/network.ts delete mode 100644 dlt-connector/src/utils/typeConverter.test.ts delete mode 100644 dlt-connector/src/utils/typeConverter.ts delete mode 100644 dlt-connector/test/ApolloServerMock.ts delete mode 100644 dlt-connector/test/testSetup.ts create mode 100644 dlt-connector/types/global.d.ts delete mode 100644 dlt-connector/yarn.lock diff --git a/.gitignore b/.gitignore index d82288fbd..d98f0c163 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ messages.pot nbproject .metadata /out/* -/.env +.env package-lock.json /deployment/bare_metal/.env /deployment/bare_metal/nginx/sites-available/gradido.conf diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts index 16ba7f6f8..3d2717301 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -1,5 +1,4 @@ -import { DltTransaction } from '@entity/DltTransaction' -import { TransactionLink } from '@entity/TransactionLink' +import { DltTransaction, TransactionLink } from 'database' import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' import { TransactionType } from '@dltConnector/enum/TransactionType' diff --git a/dlt-connector/.env.template b/dlt-connector/.env.template deleted file mode 100644 index ac27481bb..000000000 --- a/dlt-connector/.env.template +++ /dev/null @@ -1,21 +0,0 @@ -CONFIG_VERSION=$DLT_CONNECTOR_CONFIG_VERSION - -JWT_SECRET=$JWT_SECRET - -#IOTA -IOTA_API_URL=$IOTA_API_URL -IOTA_COMMUNITY_ALIAS=$IOTA_COMMUNITY_ALIAS -IOTA_HOME_COMMUNITY_SEED=$IOTA_HOME_COMMUNITY_SEED - -# 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 - -# Route to Backend -BACKEND_SERVER_URL=http://localhost:4000 \ No newline at end of file diff --git a/dlt-connector/.eslintignore b/dlt-connector/.eslintignore deleted file mode 100644 index 1ae86fe5e..000000000 --- a/dlt-connector/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules -**/*.min.js -build -coverage \ No newline at end of file diff --git a/dlt-connector/.eslintrc.js b/dlt-connector/.eslintrc.js deleted file mode 100644 index fa43a5f1a..000000000 --- a/dlt-connector/.eslintrc.js +++ /dev/null @@ -1,207 +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', - 'plugin:dci-lint/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', - }, - ], - // 'dci-lint/literal-role-contracts': 'off' - // 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, - }, - }, - { - 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-connector/.gitignore b/dlt-connector/.gitignore deleted file mode 100644 index 6eadcc884..000000000 --- a/dlt-connector/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/node_modules/ -/.env -/.env.bak -/build/ -package-json.lock -coverage -# emacs -*~ diff --git a/dlt-connector/.nvmrc b/dlt-connector/.nvmrc deleted file mode 100644 index 9dfdb2923..000000000 --- a/dlt-connector/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v19.5.0 \ No newline at end of file diff --git a/dlt-connector/.prettierrc.js b/dlt-connector/.prettierrc.js deleted file mode 100644 index bc1d767d7..000000000 --- a/dlt-connector/.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-connector/@types/bip32-ed25519/index.d.ts b/dlt-connector/@types/bip32-ed25519/index.d.ts deleted file mode 100644 index 7a3375ab6..000000000 --- a/dlt-connector/@types/bip32-ed25519/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'bip32-ed25519' diff --git a/dlt-connector/Dockerfile b/dlt-connector/Dockerfile deleted file mode 100644 index 3bdaf0679..000000000 --- a/dlt-connector/Dockerfile +++ /dev/null @@ -1,119 +0,0 @@ -################################################################################## -# BASE ########################################################################### -################################################################################## -FROM node:19.5.0-alpine3.17 as base -#FROM ubuntu:latest 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" -## App relevant Envs -ENV PORT="6010" - -# Labels -LABEL org.label-schema.build-date="${BUILD_DATE}" -LABEL org.label-schema.name="gradido:dlt-connector" -LABEL org.label-schema.description="Gradido dlt-connector" -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/dlt-connector" -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: @iota/client requirements -# Install Build Tool for Rust for @iota/client -RUN apk add --no-cache rust cargo python3 make g++ - -# Settings -## Expose Container Port -EXPOSE ${PORT} - -## Workdir -RUN mkdir -p ${DOCKER_WORKDIR} -WORKDIR ${DOCKER_WORKDIR} - -RUN mkdir -p /dlt-database - -################################################################################## -# 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 yarn install since the -# node_modules are on another volume and need updating) -CMD /bin/sh -c "cd /dlt-database && yarn install && yarn build && cd /app && yarn install && yarn run dev" - -################################################################################## -# BUILD (Does contain all files and is therefore bloated) ######################## -################################################################################## -FROM base as build - -# Copy everything from dlt-connector -COPY ./dlt-connector/ ./ -# Copy everything from dlt-database -COPY ./dlt-database/ ../dlt-database/ - -# yarn install dlt-connector -RUN yarn install --production=false --frozen-lockfile --non-interactive - -# yarn install dlt-database -RUN cd ../dlt-database && yarn install --production=false --frozen-lockfile --non-interactive - -# yarn build -RUN yarn run build - -# yarn build dlt-database -RUN cd ../dlt-database && yarn run build - -################################################################################## -# TEST ########################################################################### -################################################################################## -FROM build as test - -# Run command -CMD /bin/sh -c "yarn run start" - -################################################################################## -# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) # -################################################################################## -FROM base as production - -# remove iota build tools to have production docker image smaller -RUN apk del rust cargo python3 make g++ - -# Copy "binary"-files from build image -COPY --from=build ${DOCKER_WORKDIR}/build ./build -COPY --from=build ${DOCKER_WORKDIR}/../dlt-database/build ../dlt-database/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 --from=build ${DOCKER_WORKDIR}/../dlt-database/node_modules ../dlt-database/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 tsconfig.json to provide alias path definitions -COPY --from=build ${DOCKER_WORKDIR}/tsconfig.json ./tsconfig.json -# Copy log4js-config.json to provide log configuration -COPY --from=build ${DOCKER_WORKDIR}/log4js-config.json ./log4js-config.json - -# Copy run scripts run/ -# COPY --from=build ${DOCKER_WORKDIR}/run ./run - -# Run command -CMD /bin/sh -c "yarn run start" diff --git a/dlt-connector/README.md b/dlt-connector/README.md new file mode 100644 index 000000000..d56e77437 --- /dev/null +++ b/dlt-connector/README.md @@ -0,0 +1 @@ +# Elysia with Bun runtime diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock new file mode 100644 index 000000000..80b8a8c7b --- /dev/null +++ b/dlt-connector/bun.lock @@ -0,0 +1,577 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "dlt-connector", + "dependencies": { + "@iota/client": "^2.2.4", + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#217d03b", + }, + "devDependencies": { + "@biomejs/biome": "2.0.0", + "@elysiajs/trpc": "^1.1.0", + "@elysiajs/websocket": "^0.2.8", + "@trpc/server": "^11.4.3", + "@types/bun": "^1.2.17", + "dotenv": "^10.0.0", + "elysia": "^1.3.5", + "graphql-request": "^7.2.0", + "jose": "^5.2.2", + "jsonrpc-ts-client": "^0.2.3", + "log4js": "^6.9.1", + "typescript": "^5.8.3", + "uuid": "^8.3.2", + "valibot": "^1.1.0", + "zod": "^3.25.61", + }, + }, + }, + "trustedDependencies": [ + "@iota/client", + ], + "packages": { + "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" }, "bin": { "biome": "bin/biome" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + + "@elysiajs/trpc": ["@elysiajs/trpc@1.1.0", "", { "peerDependencies": { "elysia": ">= 1.1.0" } }, "sha512-M8QWC+Wa5Z5MWY/+uMQuwZ+JoQkp4jOc1ra4SncFy1zSjFGin59LO1AT0pE+DRJaFV17gha9y7cB6Q7GnaJEAw=="], + + "@elysiajs/websocket": ["@elysiajs/websocket@0.2.8", "", { "dependencies": { "nanoid": "^4.0.0", "raikiri": "^0.0.0-beta.3" }, "peerDependencies": { "elysia": ">= 0.2.2" } }, "sha512-K9KLmYL1SYuAV353GvmK0V9DG5w7XTOGsa1H1dGB5BUTzvBaMvnwNeqnJQ3cjf9V1c0EjQds0Ty4LfUFvV45jw=="], + + "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], + + "@iota/client": ["@iota/client@2.2.4", "", { "dependencies": { "neon-cli": "^0.8", "prebuild-install": "^6.1.2" } }, "sha512-6zjtqJgkSgrMUFLbxr9k+zXGnEVw6gjTFn5emN2nKpR78+mwW4jUXuNcy/M194bK4sLHjj0T0L4pRWJ6XTGaew=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.34.37", "", {}, "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw=="], + + "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], + + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], + + "@trpc/server": ["@trpc/server@11.4.3", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-wnWq3wiLlMOlYkaIZz+qbuYA5udPTLS4GVVRyFkr6aT83xpdCHyVtURT+u4hSoIrOXQM9OPCNXSXsAujWZDdaw=="], + + "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], + + "@types/node": ["@types/node@24.0.7", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw=="], + + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], + + "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], + + "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "axios": ["axios@0.24.0", "", { "dependencies": { "follow-redirects": "^1.14.4" } }, "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], + + "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], + + "cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "cmake-js": ["cmake-js@7.3.1", "", { "dependencies": { "axios": "^1.6.5", "debug": "^4", "fs-extra": "^11.2.0", "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" }, "bin": { "cmake-js": "bin/cmake-js" } }, "sha512-aJtHDrTFl8qovjSSqXT9aC2jdGfmP8JQsPtjdLAXFfH1BF4/ImZ27Jx0R61TFg8Apc3pl6e2yBKMveAeRXx2Rw=="], + + "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], + + "command-line-commands": ["command-line-commands@3.0.2", "", { "dependencies": { "array-back": "^4.0.1" } }, "sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw=="], + + "command-line-usage": ["command-line-usage@6.1.3", "", { "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", "table-layout": "^1.0.2", "typical": "^5.2.0" } }, "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw=="], + + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "decompress-response": ["decompress-response@4.2.1", "", { "dependencies": { "mimic-response": "^2.0.0" } }, "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "elysia": ["elysia@1.3.5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "exact-mirror": ["exact-mirror@0.1.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-wFCPCDLmHbKGUb8TOi/IS7jLsgR8WVDGtDK3CzcB4Guf/weq7G+I+DkXiRSZfbemBFOxOINKpraM6ml78vo8Zw=="], + + "execspawn": ["execspawn@1.0.1", "", { "dependencies": { "util-extend": "^1.0.1" } }, "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + + "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], + + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + + "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], + + "file-type": ["file-type@21.0.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.7", "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + + "fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "gauge": ["gauge@2.7.4", "", { "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "git-config": ["git-config@0.0.7", "", { "dependencies": { "iniparser": "~1.0.5" } }, "sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#217d03b", { "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" } }, "gradido-gradido-blockchain-js-217d03b"], + + "graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], + + "graphql-request": ["graphql-request@7.2.0", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0" }, "peerDependencies": { "graphql": "14 - 16" } }, "sha512-0GR7eQHBFYz372u9lxS16cOtEekFlZYB2qOyq8wDvzRmdRSJ0mgUVX1tzNcIzk3G+4NY+mGtSz411wZdeDF/+A=="], + + "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "iniparser": ["iniparser@1.0.5", "", {}, "sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw=="], + + "inquirer": ["inquirer@7.3.3", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" } }, "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], + + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "jsonrpc-ts-client": ["jsonrpc-ts-client@0.2.3", "", { "dependencies": { "axios": "^0.24.0", "debug": "^4.3.3" } }, "sha512-9uYpKrZKN3/3+9MYA/0vdhl9/esn59u6I9Qj6ohczxKwJ+e7DD4prf3i2nSdAl0Wlw5gBHZOL3wajSa1uiE16g=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "log4js": ["log4js@6.9.1", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" } }, "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g=="], + + "make-promises-safe": ["make-promises-safe@5.1.0", "", {}, "sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "memory-stream": ["memory-stream@1.0.0", "", { "dependencies": { "readable-stream": "^3.4.0" } }, "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-response": ["mimic-response@2.1.0", "", {}, "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], + + "nan": ["nan@2.22.2", "", {}, "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ=="], + + "nanoid": ["nanoid@4.0.2", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw=="], + + "napi-build-utils": ["napi-build-utils@1.0.2", "", {}, "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "neon-cli": ["neon-cli@0.8.3", "", { "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-commands": "^3.0.1", "command-line-usage": "^6.1.0", "git-config": "0.0.7", "handlebars": "^4.7.6", "inquirer": "^7.3.3", "make-promises-safe": "^5.1.0", "rimraf": "^3.0.2", "semver": "^7.3.2", "toml": "^3.0.0", "ts-typed-json": "^0.3.2", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" }, "bin": { "neon": "bin/cli.js" } }, "sha512-I44MB8PD0AEyFr/b5icR4sX1tsjdkb2T2uWEStG4Uf5C/jzalZPn7eazbQrW6KDyXNd8bc+LVuOr1v6CGTa1KQ=="], + + "node-abi": ["node-abi@2.30.1", "", { "dependencies": { "semver": "^5.4.1" } }, "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "node-api-headers": ["node-api-headers@1.5.0", "", {}, "sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "npm-path": ["npm-path@2.0.4", "", { "dependencies": { "which": "^1.2.10" }, "bin": { "npm-path": "bin/npm-path" } }, "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw=="], + + "npm-run-path": ["npm-run-path@3.1.0", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg=="], + + "npm-which": ["npm-which@3.0.1", "", { "dependencies": { "commander": "^2.9.0", "npm-path": "^2.0.2", "which": "^1.2.10" }, "bin": { "npm-which": "bin/npm-which.js" } }, "sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A=="], + + "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], + + "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + + "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "prebuild-install": ["prebuild-install@6.1.4", "", { "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^2.21.0", "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^3.0.3", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ=="], + + "prebuildify": ["prebuildify@github:einhornimmond/prebuildify#91f4e76", { "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" }, "bin": { "prebuildify": "./bin.js" } }, "einhornimmond-prebuildify-91f4e76"], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "raikiri": ["raikiri@0.0.0-beta.8", "", {}, "sha512-cH/yfvkiGkN8IBB2MkRHikpPurTnd2sMkQ/xtGpXrp3O76P4ppcWPb+86mJaBDzKaclLnSX+9NnT79D7ifH4/w=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "reduce-flatten": ["reduce-flatten@2.0.0", "", {}, "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], + + "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@3.1.1", "", { "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA=="], + + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + + "streamroller": ["streamroller@3.1.5", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" } }, "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "strtok3": ["strtok3@10.3.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "table-layout": ["table-layout@1.0.2", "", { "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", "typical": "^5.2.0", "wordwrapjs": "^4.0.0" } }, "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A=="], + + "tar": ["tar@6.2.1", "", { "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" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], + + "token-types": ["token-types@6.0.3", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ=="], + + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + + "ts-typed-json": ["ts-typed-json@0.3.2", "", {}, "sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA=="], + + "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], + + "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "util-extend": ["util-extend@1.0.3", "", {}, "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], + + "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wordwrapjs": ["wordwrapjs@4.0.1", "", { "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" } }, "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "cmake-js/axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], + + "cmake-js/fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + + "cmake-js/npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], + + "command-line-commands/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], + + "command-line-usage/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], + + "command-line-usage/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "command-line-usage/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], + + "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + + "memory-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "node-abi/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "npm-path/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + + "npm-which/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + + "prebuildify/node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], + + "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "table-layout/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], + + "table-layout/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + + "tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "wordwrapjs/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + + "bl/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "cmake-js/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "cmake-js/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "cmake-js/npmlog/are-we-there-yet": ["are-we-there-yet@3.0.1", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg=="], + + "cmake-js/npmlog/gauge": ["gauge@4.0.4", "", { "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" } }, "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg=="], + + "command-line-usage/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "command-line-usage/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], + + "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], + + "memory-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "cmake-js/npmlog/are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "command-line-usage/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "command-line-usage/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "cmake-js/npmlog/are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "command-line-usage/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + } +} diff --git a/dlt-connector/jest.config.js b/dlt-connector/jest.config.js deleted file mode 100644 index 652408b23..000000000 --- a/dlt-connector/jest.config.js +++ /dev/null @@ -1,37 +0,0 @@ -/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = { - verbose: true, - preset: 'ts-jest', - collectCoverage: true, - collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'], - coverageThreshold: { - global: { - lines: 72, - }, - }, - setupFiles: ['/test/testSetup.ts'], - setupFilesAfterEnv: [], - modulePathIgnorePatterns: ['/build/'], - moduleNameMapper: { - '@/(.*)': '/src/$1', - '@arg/(.*)': '/src/graphql/arg/$1', - '@controller/(.*)': '/src/controller/$1', - '@enum/(.*)': '/src/graphql/enum/$1', - '@model/(.*)': '/src/graphql/model/$1', - '@resolver/(.*)': '/src/graphql/resolver/$1', - '@input/(.*)': '/src/graphql/input/$1', - '@proto/(.*)': '/src/proto/$1', - '@test/(.*)': '/test/$1', - '@client/(.*)': '/src/client/$1', - '@validator/(.*)': '/src/graphql/validator/$1', - }, -} -/* -@arg/*": ["src/graphql/arg/*"], - "@enum/*": ["src/graphql/enum/*"], - "@input/*": ["src/graphql/input/*"], - "@resolver/*": ["src/graphql/resolver/*"], - "@scalar/*": ["src/graphql/scalar/*"], - "@test/*": ["test/*"], - "@proto/*" : ["src/proto/*"], - */ diff --git a/dlt-connector/log4js-config.json b/dlt-connector/log4js-config.json index 8b2f1b348..6d96cd326 100644 --- a/dlt-connector/log4js-config.json +++ b/dlt-connector/log4js-config.json @@ -8,7 +8,7 @@ "pattern": "yyyy-MM-dd", "layout": { - "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{user}] [%f : %l] - %m" + "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{url}] [%f : %l] - %m" }, "compress": true, "keepFileExt" : true, @@ -22,7 +22,7 @@ "pattern": "yyyy-MM-dd", "layout": { - "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{user}] [%f : %l] - %m" + "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{url}] [%f : %l] - %m" }, "compress": true, "keepFileExt" : true, @@ -40,7 +40,7 @@ "type": "stdout", "layout": { - "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{user}] [%f : %l] - %m" + "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{url}] [%f : %l] - %m" } } }, diff --git a/dlt-connector/package.json b/dlt-connector/package.json index b2a4c194b..bb935e8c7 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -1,73 +1,42 @@ { - "name": "gradido-dlt-connector", - "version": "2.6.0", - "description": "Gradido DLT-Connector", - "main": "src/index.ts", - "repository": "https://github.com/gradido/gradido/", - "author": "Dario Rekowski", - "license": "Apache-2.0", - "private": false, + "name": "dlt-connector", + "version": "1.0.50", "scripts": { - "build": "tsc --build", - "clean": "tsc --build --clean", - "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 --forceExit --detectOpenHandles" + "start": "bun run src/index.ts", + "build": "bun build src/index.ts --outdir=build --target=bun --external=gradido-blockchain-js --external=@iota/client", + "dev": "bun run --watch src/index.ts", + "test": "bun test", + "test:debug": "bun test --inspect-brk", + "typecheck": "tsc --noEmit", + "lint": "biome check --error-on-warnings .", + "lint:fix": "biome check --error-on-warnings . --write" }, "dependencies": { - "@apollo/server": "^4.7.5", - "@apollo/utils.fetcher": "^3.0.0", - "@iota/client": "^2.2.4", - "body-parser": "^1.20.2", - "class-validator": "^0.14.0", - "cors": "^2.8.5", - "cross-env": "^7.0.3", - "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#1c75576", - "graphql": "^16.7.1", - "graphql-request": "^6.1.0", - "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", - "tsconfig-paths": "^4.1.2", - "type-graphql": "^2.0.0-beta.2", - "uuid": "^9.0.1" + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#217d03b", + "@iota/client": "^2.2.4" }, "devDependencies": { - "@eslint-community/eslint-plugin-eslint-comments": "^3.2.1", - "@graphql-tools/mock": "^9.0.0", - "@types/cors": "^2.8.13", - "@types/jest": "^27.0.2", - "@types/node": "^18.11.18", - "@types/sodium-native": "^2.3.5", - "@types/uuid": "^8.3.4", - "@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-dci-lint": "^0.3.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^27.2.1", - "eslint-plugin-n": "^15.7.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-security": "^1.7.1", - "jest": "^27.2.4", - "prettier": "^2.8.7", - "ts-jest": "^27.0.5", - "ts-node": "^10.9.1", - "typescript": "^4.9.4" + "@biomejs/biome": "2.0.0", + "@elysiajs/trpc": "^1.1.0", + "@elysiajs/websocket": "^0.2.8", + "@trpc/server": "^11.4.3", + "@types/bun": "^1.2.17", + "dotenv": "^10.0.0", + "elysia": "^1.3.5", + "graphql-request": "^7.2.0", + "jose": "^5.2.2", + "jsonrpc-ts-client": "^0.2.3", + "log4js": "^6.9.1", + "typescript": "^5.8.3", + "uuid": "^8.3.2", + "valibot": "^1.1.0", + "zod": "^3.25.61" }, "engines": { - "node": ">=14" - } + "node": ">=18" + }, + "module": "src/index.js", + "trustedDependencies": [ + "@iota/client" + ] } diff --git a/dlt-connector/schema.graphql b/dlt-connector/schema.graphql deleted file mode 100644 index 4ee07180d..000000000 --- a/dlt-connector/schema.graphql +++ /dev/null @@ -1,98 +0,0 @@ -# ----------------------------------------------- -# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!! -# !!! DO NOT MODIFY THIS FILE BY YOURSELF !!! -# ----------------------------------------------- - -type Community { - confirmedAt: String! - createdAt: String! - foreign: Boolean! - id: Int! - iotaTopic: String! - rootPublicKeyHex: String! -} - -input CommunityDraft { - createdAt: String! - foreign: Boolean! - uuid: String! -} - -"""The `Decimal` scalar type to represent currency values""" -scalar Decimal - -"""Type of the transaction""" -enum InputTransactionType { - CREATION - RECEIVE - SEND -} - -type Mutation { - addCommunity(data: CommunityDraft!): TransactionResult! - sendTransaction(data: TransactionDraft!): TransactionResult! -} - -type Query { - communities(confirmed: Boolean, foreign: Boolean, uuid: String): [Community!]! - community(confirmed: Boolean, foreign: Boolean, uuid: String): Community! - isCommunityExist(confirmed: Boolean, foreign: Boolean, uuid: String): Boolean! -} - -input TransactionDraft { - amount: Decimal! - backendTransactionId: Int! - createdAt: String! - recipientUser: UserIdentifier! - senderUser: UserIdentifier! - targetDate: String - type: InputTransactionType! -} - -type TransactionError { - message: String! - name: String! - type: TransactionErrorType! -} - -"""Transaction Error Type""" -enum TransactionErrorType { - ALREADY_EXIST - DB_ERROR - INVALID_SIGNATURE - LOGIC_ERROR - MISSING_PARAMETER - NOT_FOUND - NOT_IMPLEMENTED_YET - PROTO_DECODE_ERROR - PROTO_ENCODE_ERROR -} - -type TransactionRecipe { - createdAt: String! - id: Int! - topic: String! - type: TransactionType! -} - -type TransactionResult { - error: TransactionError - recipe: TransactionRecipe - succeed: Boolean! -} - -"""Type of the transaction""" -enum TransactionType { - COMMUNITY_ROOT - GRADIDO_CREATION - GRADIDO_DEFERRED_TRANSFER - GRADIDO_TRANSFER - GROUP_FRIENDS_UPDATE - REGISTER_ADDRESS -} - -input UserIdentifier { - accountNr: Int = 1 - communityUuid: String - uuid: String! -} \ No newline at end of file diff --git a/dlt-connector/src/manager/KeyPairCacheManager.ts b/dlt-connector/src/KeyPairCacheManager.ts similarity index 55% rename from dlt-connector/src/manager/KeyPairCacheManager.ts rename to dlt-connector/src/KeyPairCacheManager.ts index c3613f91d..b5501132c 100644 --- a/dlt-connector/src/manager/KeyPairCacheManager.ts +++ b/dlt-connector/src/KeyPairCacheManager.ts @@ -1,7 +1,8 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' -import { logger } from '@/logging/logger' +import { KeyPairIdentifier } from './data/KeyPairIdentifier.logic' +import { getLogger, Logger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from './config/const' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -9,19 +10,19 @@ import { logger } from '@/logging/logger' * 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 + private homeCommunityUUID: string | undefined + private logger: Logger /** * 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() {} + private constructor() { + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.KeyPairCacheManager`) + } /** * The static method that controls the access to the singleton instance. @@ -41,22 +42,34 @@ export class KeyPairCacheManager { } public getHomeCommunityUUID(): string { + if (!this.homeCommunityUUID) { + throw new Error('home community uuid is not set') + } return this.homeCommunityUUID } - public findKeyPair(input: KeyPairIdentifier): KeyPairEd25519 | undefined { - return this.cache.get(input.getKey()) + public findKeyPair(input: string): KeyPairEd25519 | undefined { + return this.cache.get(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, + public addKeyPair(input: string, keyPair: KeyPairEd25519): void { + if (this.cache.has(input)) { + this.logger.warn('key already exist, cannot add', { + key: input, publicKey: keyPair.getPublicKey()?.convertToHex(), }) return } - this.cache.set(key, keyPair) + this.cache.set(input, keyPair) + } + + public async getKeyPair(input: string, createKeyPair: () => Promise): Promise { + const keyPair = this.cache.get(input) + if (!keyPair) { + const keyPair = await createKeyPair() + this.cache.set(input, keyPair) + return keyPair + } + return keyPair } } diff --git a/dlt-connector/src/client/BackendClient.ts b/dlt-connector/src/client/BackendClient.ts index 77356f5d8..4ee556f17 100644 --- a/dlt-connector/src/client/BackendClient.ts +++ b/dlt-connector/src/client/BackendClient.ts @@ -1,12 +1,11 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ import { gql, GraphQLClient } from 'graphql-request' import { SignJWT } from 'jose' -import { CONFIG } from '@/config' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { logger } from '@/logging/logger' -import { LogError } from '@/server/LogError' +import { CONFIG } from '../config' +import { communitySchema, type Community } from '../schemas/rpcParameter.schema' +import { getLogger, Logger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import * as v from 'valibot' const homeCommunity = gql` query { @@ -17,30 +16,36 @@ const homeCommunity = gql` } } ` -interface Community { - homeCommunity: { - uuid: string - foreign: boolean - creationDate: string - } -} + // 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 BackendClient { - // eslint-disable-next-line no-use-before-define private static instance: BackendClient client: GraphQLClient + logger: Logger + /** * 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() {} + private constructor() { + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.BackendClient`) + this.logger.addContext('url', CONFIG.BACKEND_SERVER_URL) + this.client = new GraphQLClient(CONFIG.BACKEND_SERVER_URL, { + headers: { + 'content-type': 'application/json', + }, + method: 'GET', + jsonSerializer: { + parse: JSON.parse, + stringify: JSON.stringify, + }, + }) + } /** * The static method that controls the access to the singleton instance. @@ -51,44 +56,29 @@ export class BackendClient { public static getInstance(): BackendClient | undefined { if (!BackendClient.instance) { BackendClient.instance = new BackendClient() - } - if (!BackendClient.instance.client) { - try { - BackendClient.instance.client = new GraphQLClient(CONFIG.BACKEND_SERVER_URL, { - headers: { - 'content-type': 'application/json', - }, - method: 'GET', - jsonSerializer: { - parse: JSON.parse, - stringify: JSON.stringify, - }, - }) - } catch (e) { - logger.error("couldn't connect to backend: ", e) - return - } - } + } return BackendClient.instance } - public async getHomeCommunityDraft(): Promise { - logger.info('check home community on backend') - const { data, errors } = await this.client.rawRequest( + public async getHomeCommunityDraft(): Promise { + this.logger.info('check home community on backend') + const { data, errors } = await this.client.rawRequest<{ homeCommunity: Community }>( homeCommunity, - {}, - { - authorization: 'Bearer ' + (await this.createJWTToken()), - }, + {}, // empty variables + await this.getRequestHeader(), ) if (errors) { - throw new LogError('error getting home community from backend', errors) + throw errors[0] + } + return v.parse(communitySchema, data.homeCommunity) + } + + private async getRequestHeader(): Promise<{ + authorization: string + }> { + return { + authorization: 'Bearer ' + (await this.createJWTToken()), } - const communityDraft = new CommunityDraft() - communityDraft.uuid = data.homeCommunity.uuid - communityDraft.foreign = data.homeCommunity.foreign - communityDraft.createdAt = data.homeCommunity.creationDate - return communityDraft } private async createJWTToken(): Promise { diff --git a/dlt-connector/src/client/GradidoNode.ts b/dlt-connector/src/client/GradidoNode.ts deleted file mode 100644 index 9e47ead87..000000000 --- a/dlt-connector/src/client/GradidoNode.ts +++ /dev/null @@ -1,156 +0,0 @@ -/* eslint-disable camelcase */ -import { AddressType, ConfirmedTransaction, MemoryBlock, 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 } 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), - ) -} - -async function getTransactionsForAccount( - pubkey: MemoryBlock, - iotaTopic: string, - maxResultCount = 0, - firstTransactionNr = 1, -): Promise { - 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/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts new file mode 100644 index 000000000..27b4ad79e --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -0,0 +1,33 @@ +import * as v from 'valibot' +import { uuid4ToTopicSchema } from '../../schemas/typeConverter.schema' + +export enum TransactionFormatType { + BASE64 = 'base64', + JSON = 'json', +} + +export const transactionFormatTypeSchema = v.nullish( + v.enum(TransactionFormatType), + TransactionFormatType.BASE64 +) + +export type TransactionFormatTypeInput = v.InferInput + +export const getTransactionsInputSchema = v.object({ + format: transactionFormatTypeSchema, + // default value is 1, from first transactions + fromTransactionId: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), + // default value is 100, max 100 transactions + maxResultCount: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), + communityId: uuid4ToTopicSchema, +}) + +export type GetTransactionsInputType = v.InferInput + +export const getTransactionInputSchema = v.object({ + transactionIdentifier: v.object({ + iotaTopic: uuid4ToTopicSchema, + transactionNr: v.number(), + iotaMessageId: v.string(), + }), +}) \ No newline at end of file diff --git a/dlt-connector/src/client/GradidoNode/jsonrpc.api.ts b/dlt-connector/src/client/GradidoNode/jsonrpc.api.ts new file mode 100644 index 000000000..83a700b4d --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/jsonrpc.api.ts @@ -0,0 +1,174 @@ +/* eslint-disable camelcase */ +import { AddressType, ConfirmedTransaction, MemoryBlock, 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 { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import * as v from 'valibot' +import { confirmedTransactionFromBase64Schema } from '../../schemas/typeConverter.schema' +import { isPortOpenRetry } from '../../utils/network' +import { TransactionIdentifierInput, transactionIdentifierSchema } from '../../schemas/transaction.schema' +import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' +import { GetTransactionsInputType, TransactionFormatTypeInput, getTransactionsInputSchema, transactionFormatTypeSchema } from './input.schema' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) + +const client = new JsonRpcClient({ + url: CONFIG.NODE_SERVER_URL, +}) + + +interface ConfirmedTransactionList { + transactions: string[] + timeUsed: string +} + +interface ConfirmedTransactionResponse { + transaction: string + timeUsed: string +} + +interface AddressTypeResult { + addressType: string +} + +interface FindUserResponse { + pubkey: string + timeUsed: string +} + +export class GradidoNodeRequestError extends Error { + private response?: JsonRpcEitherResponse + constructor(message: string, response?: JsonRpcEitherResponse) { + super(message) + this.name = 'GradidoNodeRequestError' + this.response = response + } + getResponse(): JsonRpcEitherResponse | undefined { + return this.response + } +} + +function resolveResponse(response: JsonRpcEitherResponse, onSuccess: (result: T) => R): R { + if (response.isSuccess()) { + return onSuccess(response.result) + } else if (response.isError()) { + throw new GradidoNodeRequestError(response.error.message, response) + } + throw new GradidoNodeRequestError('no success and no error') +} + +async function getTransactions(input: GetTransactionsInputType): Promise { + const parameter = v.parse(getTransactionsInputSchema, input) + logger.debug('call getTransactions with ', parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + const response = await client.exec('getTransactions', parameter) + return resolveResponse(response, (result: ConfirmedTransactionList) => { + logger.info(`call getTransactions, used ${result.timeUsed}`) + return result.transactions.map((transactionBase64) => + v.parse(confirmedTransactionFromBase64Schema, transactionBase64), + ) + }) +} + +async function getTransaction( + transactionIdentifier: TransactionIdentifierInput, + format: TransactionFormatTypeInput +) +: Promise { + const parameter = { + ...v.parse(transactionIdentifierSchema, transactionIdentifier), + format: v.parse(transactionFormatTypeSchema, format), + } + logger.debug('call gettransaction with ', parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + const response = await client.exec('gettransaction', parameter) + return resolveResponse(response, (result: ConfirmedTransactionResponse) => { + logger.info(`call gettransaction, used ${result.timeUsed}`) + return result.transaction && result.transaction !== '' + ? v.parse(confirmedTransactionFromBase64Schema, result.transaction) + : undefined + }) +} + +async function getLastTransaction(iotaTopic: string): Promise { + const parameter = { + format: 'base64', + communityId: iotaTopic, + } + logger.debug('call getlasttransaction with ', parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + const response = await client.exec('getlasttransaction', parameter) + return resolveResponse(response, (result: ConfirmedTransactionResponse) => { + logger.info(`call getlasttransaction, used ${result.timeUsed}`) + return result.transaction && result.transaction !== '' + ? v.parse(confirmedTransactionFromBase64Schema, result.transaction) + : undefined + }) +} + +async function getAddressType(pubkey: Buffer, iotaTopic: string): Promise { + const parameter = { + pubkey: pubkey.toString('hex'), + communityId: iotaTopic, + } + logger.debug('call getaddresstype with ', parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + const response = await client.exec('getaddresstype', parameter) + return resolveResponse(response, (result: AddressTypeResult) => { + logger.info(`call getaddresstype`) + return stringToAddressType(result.addressType) + }) +} + +async function findUserByNameHash(nameHash: MemoryBlock, iotaTopic: string): Promise { + const parameter = { + nameHash: nameHash.convertToHex(), + communityId: iotaTopic, + } + logger.debug('call findUserByNameHash with ', parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + const response = await client.exec('findUserByNameHash', parameter) + if (response.isError() && response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND) { + return undefined + } + return resolveResponse(response, (result: FindUserResponse) => { + logger.info(`call findUserByNameHash, used ${result.timeUsed}`) + return result.pubkey && result.pubkey !== '' ? MemoryBlock.fromHex(result.pubkey) : undefined + }) +} + +async function getTransactionsForAccount( + pubkey: MemoryBlock, + iotaTopic: string, + maxResultCount = 0, + firstTransactionNr = 1, +): Promise { + const parameter = { + pubkey: pubkey.convertToHex(), + format: 'base64', + firstTransactionNr, + maxResultCount, + communityId: iotaTopic, + } + logger.debug('call listtransactionsforaddress with ', parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + const response = await client.exec('listtransactionsforaddress', parameter) + return resolveResponse(response, (result: ConfirmedTransactionList) => { + logger.info(`call listtransactionsforaddress, used ${result.timeUsed}`) + return result.transactions.map((transactionBase64) => + v.parse(confirmedTransactionFromBase64Schema, transactionBase64), + ) + }) +} + +export { + getTransaction, + getLastTransaction, + getTransactions, + getAddressType, + getTransactionsForAccount, + findUserByNameHash, +} diff --git a/dlt-connector/src/client/GradidoNode/output.schema.ts b/dlt-connector/src/client/GradidoNode/output.schema.ts new file mode 100644 index 000000000..e69de29bb diff --git a/dlt-connector/src/client/IotaClient.test.ts b/dlt-connector/src/client/IotaClient.test.ts deleted file mode 100644 index 5bee71b2e..000000000 --- a/dlt-connector/src/client/IotaClient.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ - -import { sendMessage, receiveMessage } from '@/client/IotaClient' - -jest.mock('@iota/client', () => { - const mockMessageSender = jest.fn().mockImplementation(() => { - return { - index: jest.fn().mockReturnThis(), - data: jest.fn().mockReturnThis(), - submit: jest - .fn() - .mockReturnValue('5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710'), - } - }) - const mockMessageFinder = jest.fn().mockImplementation(() => { - return { - data: jest.fn().mockReturnValue({ - message: { - networkId: '1454675179895816119', - parentMessageIds: [ - '5f30efecca59fdfef7c103e85ef691b2b1dc474e9eae9056888a6d58605083e7', - '77cef2fb405daedcd7469e009bb87a6d9a4840e618cdb599cd21a30a9fec88dc', - '7d2cfb39f40585ba568a29ad7e85c1478b2584496eb736d4001ac344f6a6cacf', - 'c66da602874220dfa26925f6be540d37c0084d37cd04726fcc5be9d80b36f850', - ], - payload: { - type: 2, - index: '4752414449444f3a205465737448656c6c6f57656c7431', - data: '48656c6c6f20576f726c64202d20546875204a756e20303820323032332031343a35393a343520474d542b3030303020284b6f6f7264696e69657274652057656c747a65697429', - }, - nonce: '13835058055282465157', - }, - messageId: '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', - }), - } - }) - - const mockClient = { - message: mockMessageSender, - getMessage: mockMessageFinder, - } - const mockClientBuilder = { - node: jest.fn().mockReturnThis(), - build: jest.fn(() => mockClient), - } - return { - ClientBuilder: jest.fn(() => mockClientBuilder), - } -}) - -describe('Iota Tests', () => { - it('test mocked sendDataMessage', async () => { - const result = await sendMessage('Test Message', 'topic') - expect(result).toBe('5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710') - }) - - it('should mock getMessage', async () => { - const result = await receiveMessage( - '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', - ) - expect(result).toMatchObject({ - message: { - payload: { - data: '48656c6c6f20576f726c64202d20546875204a756e20303820323032332031343a35393a343520474d542b3030303020284b6f6f7264696e69657274652057656c747a65697429', - index: '4752414449444f3a205465737448656c6c6f57656c7431', - }, - }, - messageId: '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710', - }) - }) -}) diff --git a/dlt-connector/src/client/IotaClient.ts b/dlt-connector/src/client/IotaClient.ts deleted file mode 100644 index 3f2d318fa..000000000 --- a/dlt-connector/src/client/IotaClient.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ClientBuilder } from '@iota/client' -import { MessageWrapper } from '@iota/client/lib/types' - -import { CONFIG } from '@/config' -const client = new ClientBuilder().node(CONFIG.IOTA_API_URL).build() - -/** - * send data message onto iota tangle - * @param {string | Uint8Array} message - the message as utf based string, will be converted to hex automatically from @iota/client - * @param {string | Uint8Array} topic - the iota topic to which the message will be sended - * @return {Promise} the iota message typed - */ -function sendMessage( - message: string | Uint8Array, - topic: string | Uint8Array, -): Promise { - return client.message().index(topic).data(message).submit() -} - -/** - * receive message for known message id from iota tangle - * @param {string} messageId - as hex string - * @return {Promise} the iota message typed - */ -function receiveMessage(messageId: string): Promise { - return client.getMessage().data(messageId) -} - -export { sendMessage, receiveMessage } - -/** - * example for message: -```json -{ - message: { - networkId: '1454675179895816119', - parentMessageIds: [ - '5f30efecca59fdfef7c103e85ef691b2b1dc474e9eae9056888a6d58605083e7', - '77cef2fb405daedcd7469e009bb87a6d9a4840e618cdb599cd21a30a9fec88dc', - '7d2cfb39f40585ba568a29ad7e85c1478b2584496eb736d4001ac344f6a6cacf', - 'c66da602874220dfa26925f6be540d37c0084d37cd04726fcc5be9d80b36f850' - ], - payload: { - type: 2, - index: '4752414449444f3a205465737448656c6c6f57656c7431', - data: '48656c6c6f20576f726c64202d20546875204a756e20303820323032332031343a35393a343520474d542b3030303020284b6f6f7264696e69657274652057656c747a65697429' - }, - nonce: '13835058055282465157' - }, - messageId: '5498130bc3918e1a7143969ce05805502417e3e1bd596d3c44d6a0adeea22710' -} -``` - */ diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts new file mode 100644 index 000000000..14b5cf215 --- /dev/null +++ b/dlt-connector/src/config/const.ts @@ -0,0 +1 @@ +export const LOG4JS_BASE_CATEGORY = 'dlt' diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 806d3fd50..2d016eee2 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -2,65 +2,48 @@ import dotenv from 'dotenv' dotenv.config() -const constants = { +const logging = { LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', - CONFIG_VERSION: { - DEFAULT: 'DEFAULT', - EXPECTED: 'v7.2024-09-24', - CURRENT: '', - }, } const server = { - PRODUCTION: process.env.NODE_ENV === 'production' ?? false, - JWT_SECRET: process.env.JWT_SECRET ?? 'secret123', -} - -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 ?? null, -} - -const dltConnector = { + PRODUCTION: process.env.NODE_ENV === 'production', DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT ?? 6010, } -const nodeServer = { - NODE_SERVER_URL: process.env.NODE_SERVER_URL ?? 'http://localhost:8340', -} - -const gradidoBlockchain = { +const secrets = { + JWT_SECRET: process.env.JWT_SECRET ?? 'secret123', 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', } -const backendServer = { - BACKEND_SERVER_URL: process.env.BACKEND_SERVER_URL ?? 'http://backend:4000', +const iota = { + IOTA_HOME_COMMUNITY_SEED: process.env.IOTA_HOME_COMMUNITY_SEED ?? null, } -// 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}"`, - ) +const apis = { + CONNECT_TIMEOUT_MS: process.env.CONNECT_TIMEOUT_MS + ? Number.parseInt(process.env.CONNECT_TIMEOUT_MS) + : 1000, + CONNECT_RETRY_COUNT: process.env.CONNECT_RETRY_COUNT + ? Number.parseInt(process.env.CONNECT_RETRY_COUNT) + : 15, + CONNECT_RETRY_DELAY_MS: process.env.CONNECT_RETRY_DELAY_MS + ? Number.parseInt(process.env.CONNECT_RETRY_DELAY_MS) + : 500, + IOTA_API_URL: process.env.IOTA_API_URL ?? 'https://chrysalis-nodes.iota.org', + NODE_SERVER_URL: process.env.NODE_SERVER_URL ?? 'http://127.0.0.1:8340', + BACKEND_SERVER_URL: process.env.BACKEND_SERVER_URL ?? 'http://127.0.0.1:4000', } export const CONFIG = { - ...constants, + ...logging, ...server, + ...secrets, ...iota, - ...dltConnector, - ...nodeServer, - ...gradidoBlockchain, - ...backendServer, + ...apis, } diff --git a/dlt-connector/src/data/KeyPairIdentifier.logic.ts b/dlt-connector/src/data/KeyPairIdentifier.logic.ts new file mode 100644 index 000000000..b0bade47b --- /dev/null +++ b/dlt-connector/src/data/KeyPairIdentifier.logic.ts @@ -0,0 +1,97 @@ +import { MemoryBlock } from 'gradido-blockchain-js' +import { IdentifierAccount, IdentifierAccountInput, identifierAccountSchema } from '../schemas/account.schema' +import { ParameterError } from '../errors' +import * as v from 'valibot' + +export class KeyPairIdentifierLogic { + public identifier: IdentifierAccount + public constructor(identifier: IdentifierAccountInput) { + // check if data structure is like expected and fill in defaults + this.identifier = v.parse(identifierAccountSchema, identifier) + } + + isCommunityKeyPair(): boolean { + return !this.identifier.seed && !this.identifier.account + } + + isSeedKeyPair(): boolean { + return this.identifier.seed !== undefined + } + + isUserKeyPair(): boolean { + return ( + this.identifier.seed === undefined && + this.identifier.account != undefined && + this.identifier.account.accountNr === 0 + ) + } + + isAccountKeyPair(): boolean { + return ( + this.identifier.seed === undefined && + this.identifier.account != undefined && + this.identifier.account.accountNr > 0 + ) + } + + getSeed(): string { + if (!this.identifier.seed) { + throw new Error('get seed called on non seed key pair identifier, please check first with isSeedKeyPair()') + } + return this.identifier.seed.seed + } + + getCommunityUuid(): string { + return this.identifier.communityUuid + } + + getUserUuid(): string { + if (!this.identifier.account) { + throw new Error( + 'get user uuid called on non user key pair identifier, please check first with isUserKeyPair() or isAccountKeyPair()' + ) + } + return this.identifier.account.userUuid + } + + getAccountNr(): number { + if (!this.identifier.account?.accountNr) { + throw new Error( + 'get account nr called on non account key pair identifier, please check first with isAccountKeyPair()' + ) + } + return this.identifier.account.accountNr + } + + getSeedKey(): string { return this.getSeed() } + getCommunityKey(): string { return this.getCommunityUuid() } + getCommunityUserKey(): string { + return this.createCommunityUserHash() + } + getCommunityUserAccountKey(): string { + return this.createCommunityUserHash() + this.getAccountNr().toString() + } + + getKey(): string { + if (this.isSeedKeyPair()) { + return this.getSeedKey() + } else if (this.isCommunityKeyPair()) { + return this.getCommunityKey() + } else if (this.isUserKeyPair()) { + return this.getCommunityUserKey() + } else if (this.isAccountKeyPair()) { + return this.getCommunityUserAccountKey() + } + throw new ParameterError('KeyPairIdentifier: unhandled input type') + } + + private createCommunityUserHash(): string { + if (!this.identifier.account?.userUuid || !this.identifier.communityUuid) { + throw new ParameterError('userUuid and/or communityUuid is undefined') + } + const resultHexString = + this.identifier.communityUuid.replace(/-/g, '') + + this.identifier.account.userUuid.replace(/-/g, '') + return MemoryBlock.fromHex(resultHexString).calculateHash().convertToHex() + } +} diff --git a/dlt-connector/src/data/KeyPairIdentifier.ts b/dlt-connector/src/data/KeyPairIdentifier.ts deleted file mode 100644 index 3a98c2e0e..000000000 --- a/dlt-connector/src/data/KeyPairIdentifier.ts +++ /dev/null @@ -1,72 +0,0 @@ -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/enum/AccountType.ts b/dlt-connector/src/enum/AccountType.ts similarity index 77% rename from dlt-connector/src/graphql/enum/AccountType.ts rename to dlt-connector/src/enum/AccountType.ts index 810c89044..8d8e5fcc0 100644 --- a/dlt-connector/src/graphql/enum/AccountType.ts +++ b/dlt-connector/src/enum/AccountType.ts @@ -1,5 +1,3 @@ -import { registerEnumType } from 'type-graphql' - /** * enum for graphql * describe input account type in UserAccountDraft @@ -14,8 +12,3 @@ export enum AccountType { SUBACCOUNT = 'SUBACCOUNT', // no creations allowed CRYPTO_ACCOUNT = 'CRYPTO_ACCOUNT', // user control his keys, no creations } - -registerEnumType(AccountType, { - name: 'AccountType', // this one is mandatory - description: 'Type of account', // this one is optional -}) diff --git a/dlt-connector/src/enum/AddressType.ts b/dlt-connector/src/enum/AddressType.ts new file mode 100644 index 000000000..0e0d8bb30 --- /dev/null +++ b/dlt-connector/src/enum/AddressType.ts @@ -0,0 +1,19 @@ +import { + AddressType_COMMUNITY_AUF, + AddressType_COMMUNITY_GMW, + AddressType_COMMUNITY_HUMAN, + AddressType_COMMUNITY_PROJECT, + AddressType_CRYPTO_ACCOUNT, + AddressType_NONE, + AddressType_SUBACCOUNT, +} from 'gradido-blockchain-js' + +export enum AddressType { + COMMUNITY_AUF = AddressType_COMMUNITY_AUF, + COMMUNITY_GMW = AddressType_COMMUNITY_GMW, + COMMUNITY_HUMAN = AddressType_COMMUNITY_HUMAN, + COMMUNITY_PROJECT = AddressType_COMMUNITY_PROJECT, + CRYPTO_ACCOUNT = AddressType_CRYPTO_ACCOUNT, + NONE = AddressType_NONE, + SUBACCOUNT = AddressType_SUBACCOUNT, +} \ No newline at end of file diff --git a/dlt-connector/src/enum/GradidoNodeErrorCodes.ts b/dlt-connector/src/enum/GradidoNodeErrorCodes.ts new file mode 100644 index 000000000..49153dc15 --- /dev/null +++ b/dlt-connector/src/enum/GradidoNodeErrorCodes.ts @@ -0,0 +1,20 @@ +export enum GradidoNodeErrorCodes { + NONE = 0, + GRADIDO_NODE_ERROR = -10000, + UNKNOWN_GROUP = -10001, + NOT_IMPLEMENTED = -10002, + TRANSACTION_NOT_FOUND = -10003, + JSON_RPC_ERROR_ADDRESS_NOT_FOUND = -10004, + // 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. +} \ No newline at end of file diff --git a/dlt-connector/src/graphql/enum/InputTransactionType.ts b/dlt-connector/src/enum/InputTransactionType.ts similarity index 67% rename from dlt-connector/src/graphql/enum/InputTransactionType.ts rename to dlt-connector/src/enum/InputTransactionType.ts index f1b56823e..65c806afc 100755 --- a/dlt-connector/src/graphql/enum/InputTransactionType.ts +++ b/dlt-connector/src/enum/InputTransactionType.ts @@ -1,5 +1,3 @@ -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 { @@ -11,8 +9,3 @@ export enum InputTransactionType { GRADIDO_REDEEM_DEFERRED_TRANSFER = 'GRADIDO_REDEEM_DEFERRED_TRANSFER', COMMUNITY_ROOT = 'COMMUNITY_ROOT', } - -registerEnumType(InputTransactionType, { - name: 'InputTransactionType', // this one is mandatory - description: 'Type of the transaction', // this one is optional -}) diff --git a/dlt-connector/src/graphql/enum/TransactionErrorType.ts b/dlt-connector/src/enum/TransactionErrorType.ts similarity index 75% rename from dlt-connector/src/graphql/enum/TransactionErrorType.ts rename to dlt-connector/src/enum/TransactionErrorType.ts index f89df4afe..0da6ebb53 100644 --- a/dlt-connector/src/graphql/enum/TransactionErrorType.ts +++ b/dlt-connector/src/enum/TransactionErrorType.ts @@ -1,5 +1,3 @@ -import { registerEnumType } from 'type-graphql' - // enum for graphql // error groups for resolver answers export enum TransactionErrorType { @@ -15,8 +13,3 @@ export enum TransactionErrorType { NOT_FOUND = 'Not found', VALIDATION_ERROR = 'Validation Error', } - -registerEnumType(TransactionErrorType, { - name: 'TransactionErrorType', - description: 'Transaction Error Type', -}) diff --git a/dlt-connector/src/errors.ts b/dlt-connector/src/errors.ts new file mode 100644 index 000000000..73e6fd0f4 --- /dev/null +++ b/dlt-connector/src/errors.ts @@ -0,0 +1,43 @@ +import { TransactionIdentifier } from './schemas/transaction.schema' +import { IdentifierAccount } from './schemas/account.schema' + +export class GradidoNodeError extends Error { + constructor(message: string) { + super(message) + this.name = 'GradidoNodeError' + } +} + +export class GradidoNodeMissingTransactionError extends GradidoNodeError { + public transactionIdentifier?: TransactionIdentifier + constructor(message: string, transactionIdentifier?: TransactionIdentifier) { + super(message) + this.name = 'GradidoNodeMissingTransactionError' + this.transactionIdentifier = transactionIdentifier + } +} + +export class GradidoNodeMissingUserError extends GradidoNodeError { + public userIdentifier?: IdentifierAccount + constructor(message: string, userIdentifier?: IdentifierAccount) { + super(message) + this.name = 'GradidoNodeMissingUserError' + this.userIdentifier = userIdentifier + } +} + +export class GradidoNodeInvalidTransactionError extends GradidoNodeError { + public transactionIdentifier?: TransactionIdentifier + constructor(message: string, transactionIdentifier?: TransactionIdentifier) { + super(message) + this.name = 'GradidoNodeInvalidTransactionError' + this.transactionIdentifier = transactionIdentifier + } +} + +export class ParameterError extends Error { + constructor(message: string) { + super(message) + this.name = 'ParameterError' + } +} diff --git a/dlt-connector/src/graphql/arg/CommunityArg.ts b/dlt-connector/src/graphql/arg/CommunityArg.ts deleted file mode 100644 index 59f65943e..000000000 --- a/dlt-connector/src/graphql/arg/CommunityArg.ts +++ /dev/null @@ -1,19 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { IsBoolean, IsUUID } from 'class-validator' -import { ArgsType, Field } from 'type-graphql' - -@ArgsType() -export class CommunityArg { - @Field(() => String, { nullable: true }) - @IsUUID('4') - uuid?: string - - @Field(() => Boolean, { nullable: true }) - @IsBoolean() - foreign?: boolean - - @Field(() => Boolean, { nullable: true }) - @IsBoolean() - confirmed?: boolean -} diff --git a/dlt-connector/src/graphql/const.ts b/dlt-connector/src/graphql/const.ts deleted file mode 100644 index ce7186a54..000000000 --- a/dlt-connector/src/graphql/const.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const MEMO_MAX_CHARS = 255 -export const MEMO_MIN_CHARS = 5 diff --git a/dlt-connector/src/graphql/input/CommunityDraft.ts b/dlt-connector/src/graphql/input/CommunityDraft.ts deleted file mode 100644 index 0b26e68d0..000000000 --- a/dlt-connector/src/graphql/input/CommunityDraft.ts +++ /dev/null @@ -1,20 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { isValidDateString } from '@validator/DateString' -import { IsBoolean, IsUUID } from 'class-validator' -import { Field, InputType } from 'type-graphql' - -@InputType() -export class CommunityDraft { - @Field(() => String) - @IsUUID('4') - uuid: string - - @Field(() => Boolean) - @IsBoolean() - foreign: boolean - - @Field(() => String) - @isValidDateString() - createdAt: string -} diff --git a/dlt-connector/src/graphql/input/CommunityUser.ts b/dlt-connector/src/graphql/input/CommunityUser.ts deleted file mode 100644 index 97eff7a76..000000000 --- a/dlt-connector/src/graphql/input/CommunityUser.ts +++ /dev/null @@ -1,15 +0,0 @@ -// 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/IdentifierSeed.ts b/dlt-connector/src/graphql/input/IdentifierSeed.ts deleted file mode 100644 index f09ad2f8b..000000000 --- a/dlt-connector/src/graphql/input/IdentifierSeed.ts +++ /dev/null @@ -1,15 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -import { IsString } from 'class-validator' -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 deleted file mode 100755 index 0306d70e0..000000000 --- a/dlt-connector/src/graphql/input/TransactionDraft.ts +++ /dev/null @@ -1,58 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs -import { InputTransactionType } from '@enum/InputTransactionType' -import { isValidDateString, isValidNumberString } from '@validator/DateString' -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' - -@InputType() -export class TransactionDraft { - @Field(() => UserIdentifier) - @IsObject() - @ValidateNested() - user: UserIdentifier - - // not used for simply register address - @Field(() => UserIdentifier, { nullable: true }) - @IsObject() - @ValidateNested() - linkedUser?: UserIdentifier - - // not used for register address - @Field(() => String, { nullable: true }) - @isValidNumberString() - amount?: string - - @Field(() => String, { nullable: true }) - @MaxLength(MEMO_MAX_CHARS) - @MinLength(MEMO_MIN_CHARS) - memo?: string - - @Field(() => InputTransactionType) - @IsEnum(InputTransactionType) - type: InputTransactionType - - @Field(() => String) - @isValidDateString() - createdAt: string - - // only for creation transactions - @Field(() => String, { nullable: true }) - @isValidDateString() - targetDate?: string - - // only for deferred transaction - // duration in seconds - @Field(() => Number, { nullable: true }) - @IsPositive() - timeoutDuration?: number - - // only for register address - @Field(() => AccountType, { nullable: true }) - @IsEnum(AccountType) - accountType?: AccountType -} diff --git a/dlt-connector/src/graphql/input/UserIdentifier.ts b/dlt-connector/src/graphql/input/UserIdentifier.ts deleted file mode 100644 index f622c24e4..000000000 --- a/dlt-connector/src/graphql/input/UserIdentifier.ts +++ /dev/null @@ -1,24 +0,0 @@ -// https://www.npmjs.com/package/@apollo/protobufjs - -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') - communityUuid: string - - @Field(() => CommunityUser, { nullable: true }) - @IsObject() - @ValidateNested() - communityUser?: CommunityUser - - @Field(() => IdentifierSeed, { nullable: true }) - @IsObject() - @ValidateNested() - seed?: IdentifierSeed -} diff --git a/dlt-connector/src/graphql/model/TransactionError.ts b/dlt-connector/src/graphql/model/TransactionError.ts deleted file mode 100644 index eee54e19c..000000000 --- a/dlt-connector/src/graphql/model/TransactionError.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ObjectType, Field } from 'type-graphql' - -import { TransactionErrorType } from '../enum/TransactionErrorType' - -@ObjectType() -export class TransactionError implements Error { - constructor(type: TransactionErrorType, message: string) { - this.type = type - this.message = message - this.name = type.toString() - } - - @Field(() => TransactionErrorType) - type: TransactionErrorType - - @Field(() => String) - message: string - - @Field(() => String) - name: string -} diff --git a/dlt-connector/src/graphql/model/TransactionRecipe.ts b/dlt-connector/src/graphql/model/TransactionRecipe.ts deleted file mode 100644 index eae7f1a6f..000000000 --- a/dlt-connector/src/graphql/model/TransactionRecipe.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { GradidoTransaction, MemoryBlock, transactionTypeToString } from 'gradido-blockchain-js' -import { Field, ObjectType } from 'type-graphql' - -import { LogError } from '@/server/LogError' - -@ObjectType() -export class TransactionRecipe { - public constructor(transaction: GradidoTransaction, messageId: MemoryBlock) { - const body = transaction.getTransactionBody() - if (!body) { - throw new LogError('invalid gradido transaction, cannot geht valid TransactionBody') - } - - this.createdAt = body.getCreatedAt().getDate().toString() - this.type = transactionTypeToString(body?.getTransactionType()) - this.messageIdHex = messageId.convertToHex() - } - - @Field(() => String) - createdAt: string - - @Field(() => String) - type: string - - @Field(() => String) - messageIdHex: string -} diff --git a/dlt-connector/src/graphql/model/TransactionResult.ts b/dlt-connector/src/graphql/model/TransactionResult.ts deleted file mode 100644 index 346920310..000000000 --- a/dlt-connector/src/graphql/model/TransactionResult.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ObjectType, Field } from 'type-graphql' - -import { TransactionError } from './TransactionError' -import { TransactionRecipe } from './TransactionRecipe' - -@ObjectType() -export class TransactionResult { - constructor(content?: TransactionError | TransactionRecipe) { - this.succeed = true - if (content instanceof TransactionError) { - this.error = content - this.succeed = false - } else if (content instanceof TransactionRecipe) { - this.recipe = content - } - } - - // the error if one happened - @Field(() => TransactionError, { nullable: true }) - error?: TransactionError - - // if no error happened, the message id of the iota transaction - @Field(() => TransactionRecipe, { nullable: true }) - recipe?: TransactionRecipe - - @Field(() => Boolean) - succeed: boolean -} diff --git a/dlt-connector/src/graphql/resolver/AccountsResolver.ts b/dlt-connector/src/graphql/resolver/AccountsResolver.ts deleted file mode 100644 index 3db0ac26b..000000000 --- a/dlt-connector/src/graphql/resolver/AccountsResolver.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* eslint-disable camelcase */ -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 { uuid4ToHash } from '@/utils/typeConverter' - -import { TransactionErrorType } from '../enum/TransactionErrorType' -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 { - const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifier(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 addressType !== AddressType_NONE - } -} diff --git a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts b/dlt-connector/src/graphql/resolver/TransactionsResolver.ts deleted file mode 100755 index e7d1c105e..000000000 --- a/dlt-connector/src/graphql/resolver/TransactionsResolver.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Resolver, Arg, Mutation } from 'type-graphql' - -import { SendToIotaContext } from '@/interactions/sendToIota/SendToIota.context' - -import { TransactionDraft } from '../input/TransactionDraft' -import { TransactionError } from '../model/TransactionError' -import { TransactionResult } from '../model/TransactionResult' - -@Resolver() -export class TransactionResolver { - @Mutation(() => TransactionResult) - async sendTransaction( - @Arg('data') - transactionDraft: TransactionDraft, - ): Promise { - try { - return await SendToIotaContext(transactionDraft) - // 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/graphql/schema.ts b/dlt-connector/src/graphql/schema.ts deleted file mode 100755 index f0e2f7198..000000000 --- a/dlt-connector/src/graphql/schema.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { GraphQLSchema } from 'graphql' -import { buildSchema } from 'type-graphql' - -import { AccountResolver } from './resolver/AccountsResolver' -import { TransactionResolver } from './resolver/TransactionsResolver' - -export const schema = async (): Promise => { - return buildSchema({ - resolvers: [TransactionResolver, AccountResolver], - validate: { - validationError: { target: false }, - skipMissingProperties: true, - skipNullProperties: true, - skipUndefinedProperties: false, - forbidUnknownValues: true, - stopAtFirstError: true, - }, - }) -} diff --git a/dlt-connector/src/graphql/validator/DateString.ts b/dlt-connector/src/graphql/validator/DateString.ts deleted file mode 100644 index 0445c1bbe..000000000 --- a/dlt-connector/src/graphql/validator/DateString.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { registerDecorator, ValidationOptions } from 'class-validator' - -export function isValidDateString(validationOptions?: ValidationOptions) { - // eslint-disable-next-line @typescript-eslint/ban-types - return function (object: Object, propertyName: string) { - registerDecorator({ - name: 'isValidDateString', - target: object.constructor, - propertyName, - options: validationOptions, - validator: { - validate(value: string): boolean { - return !isNaN(Date.parse(value)) - }, - defaultMessage(): string { - return `${propertyName} must be a valid date string` - }, - }, - }) - } -} - -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` - }, - }, - }) - } -} diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index ac5366127..ce5ab8fb3 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,45 +1,22 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import 'reflect-metadata' - +import { Elysia } from 'elysia' +import { CONFIG } from './config' import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' - -import { CONFIG } from '@/config' - +import { getLogger, configure } from 'log4js' +import { readFileSync } from 'node:fs' +import { isPortOpenRetry } from './utils/network' 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 { uuid4ToHash } from './utils/typeConverter' - -async function waitForServer( - backend: BackendClient, - retryIntervalMs: number, - maxRetries: number, -): Promise { - let retries = 0 - while (retries < maxRetries) { - logger.info(`Attempt ${retries + 1} for connecting to backend`) - - try { - // Make a HEAD request to the server - return await backend.getHomeCommunityDraft() - } catch (error) { - logger.info('Server is not reachable: ', error) - } - - // Server is not reachable, wait and retry - await new Promise((resolve) => setTimeout(resolve, retryIntervalMs)) - retries++ - } - - throw new LogError('Max retries exceeded. Server did not become reachable.') -} +import { KeyPairCacheManager } from './KeyPairCacheManager' +import { communityUuidToTopicSchema } from './schemas/rpcParameter.schema' +import { parse } from 'valibot' +import { getTransaction } from './client/GradidoNode/jsonrpc.api' async function main() { + // configure log4js + // TODO: replace late by loader from config-schema + const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8')) + configure(options) + const logger = getLogger('dlt') + // TODO: replace with schema validation if (CONFIG.IOTA_HOME_COMMUNITY_SEED) { try { const seed = MemoryBlock.fromHex(CONFIG.IOTA_HOME_COMMUNITY_SEED) @@ -47,62 +24,50 @@ async function main() { throw new Error('seed need to be greater than 32 Bytes') } } catch (error) { - throw new LogError( + logger.error( 'IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long', - error, ) + process.exit(1) } } + // 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() // ask backend for home community if we haven't one const backend = BackendClient.getInstance() if (!backend) { - throw new LogError('cannot create backend client') + throw new Error('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) - logger.info('home community topic: %s', uuid4ToHash(communityDraft.uuid).convertToHex()) + // wait for backend server + await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) + const homeCommunity = await backend.getHomeCommunityDraft() + KeyPairCacheManager.getInstance().setHomeCommunityUUID(homeCommunity.uuid) + logger.info('home community topic: %s', parse(communityUuidToTopicSchema, homeCommunity.uuid)) logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) // ask gradido node if community blockchain was created try { - const firstTransaction = await getTransaction( - 1, - uuid4ToHash(communityDraft.uuid).convertToHex(), - ) - if (!firstTransaction) { + const topic = parse(communityUuidToTopicSchema, homeCommunity.uuid) + if (!await getTransaction(1, topic)) { // if not exist, create community root transaction - await SendToIotaContext(communityDraft) + await SendToIotaContext(homeCommunity) } } 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) + logger.error('error requesting gradido node: ', e) } - app.listen(CONFIG.DLT_CONNECTOR_PORT, () => { - // eslint-disable-next-line no-console - console.log(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) - }) - - process.on('exit', () => { - // Add shutdown logic here. - }) + + const app = new Elysia() + .get('/', () => "Hello Elysia") + .listen(CONFIG.DLT_CONNECTOR_PORT, () => { + logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) + }) } main().catch((e) => { - // eslint-disable-next-line no-console + // biome-ignore lint/suspicious/noConsole: maybe logger isn't initialized here console.error(e) - // eslint-disable-next-line n/no-process-exit process.exit(1) }) diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts index 1450d9cdb..0a4168f0d 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts @@ -1,5 +1,11 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' +import { communityUuidToTopicSchema } from '../../schemas/rpcParameter.schema' +import * as v from 'valibot' export abstract class AbstractRemoteKeyPairRole { + protected topic: string + public constructor(communityUuid: string) { + this.topic = v.parse(communityUuidToTopicSchema, communityUuid) + } public abstract retrieveKeyPair(): Promise } diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts index fb062b011..f4b25cd57 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -1,30 +1,43 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { getTransaction } from '@/client/GradidoNode' -import { LogError } from '@/server/LogError' -import { uuid4ToHash } from '@/utils/typeConverter' +import { getTransaction } from '../../client/GradidoNode/jsonrpc.api' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' +import { GradidoNodeInvalidTransactionError, GradidoNodeMissingTransactionError } from '../../errors' export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { - public constructor(private communityUuid: string) { - super() + public constructor(communityUuid: string) { + super(communityUuid) } public async retrieveKeyPair(): Promise { - const firstTransaction = await getTransaction(1, uuid4ToHash(this.communityUuid).convertToHex()) + const transactionIdentifier = { + transactionNr: 1, + iotaTopic: this.topic, + } + const firstTransaction = await getTransaction(transactionIdentifier) if (!firstTransaction) { - throw new LogError( - "GradidoNode Server don't know this community with uuid " + this.communityUuid, - ) + throw new GradidoNodeMissingTransactionError('Cannot find transaction', transactionIdentifier) } const transactionBody = firstTransaction.getGradidoTransaction()?.getTransactionBody() - if (!transactionBody || !transactionBody.isCommunityRoot()) { - throw new LogError('get invalid confirmed transaction from gradido node') + if (!transactionBody) { + throw new GradidoNodeInvalidTransactionError( + 'Invalid transaction, body is missing', + transactionIdentifier + ) + } + if (!transactionBody.isCommunityRoot()) { + throw new GradidoNodeInvalidTransactionError( + 'Invalid transaction, community root type expected', + transactionIdentifier + ) } const communityRoot = transactionBody.getCommunityRoot() if (!communityRoot) { - throw new LogError('invalid confirmed transaction') + throw new GradidoNodeInvalidTransactionError( + 'Invalid transaction, community root is missing', + transactionIdentifier + ) } return new KeyPairEd25519(communityRoot.getPublicKey()) } diff --git a/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts index b888351cd..81b9a016c 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts @@ -1,21 +1,21 @@ import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' -import { CONFIG } from '@/config' -import { LogError } from '@/server/LogError' - +import { CONFIG } from '../../config' +import { ParameterError } from '../../errors' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class HomeCommunityKeyPairRole extends AbstractKeyPairRole { public generateKeyPair(): KeyPairEd25519 { + // TODO: prevent this check with valibot test on config if (!CONFIG.IOTA_HOME_COMMUNITY_SEED) { - throw new LogError( + throw new Error( '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") + throw new ParameterError("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 index 0f9137453..c6164119c 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -1,10 +1,7 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' -import { UserIdentifier } from '@/graphql/input/UserIdentifier' -import { KeyPairCacheManager } from '@/manager/KeyPairCacheManager' -import { LogError } from '@/server/LogError' - +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { KeyPairCacheManager } from '../../KeyPairCacheManager' import { AccountKeyPairRole } from './AccountKeyPair.role' import { ForeignCommunityKeyPairRole } from './ForeignCommunityKeyPair.role' import { HomeCommunityKeyPairRole } from './HomeCommunityKeyPair.role' @@ -16,61 +13,46 @@ import { UserKeyPairRole } from './UserKeyPair.role' * @DCI-Context * Context for calculating key pair for signing transactions */ -export async function KeyPairCalculation(input: KeyPairIdentifier): Promise { +export async function KeyPairCalculation(input: KeyPairIdentifierLogic): Promise { const cache = KeyPairCacheManager.getInstance() - - // Try cache lookup first - let keyPair = cache.findKeyPair(input) - if (keyPair) { - return keyPair - } - - 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') + return await cache.getKeyPair(input.getKey(), async () => { + if (input.isSeedKeyPair()) { + return new LinkedTransactionKeyPairRole(input.getSeed()).generateKeyPair() } // If input does not belong to the home community, handle as remote key pair - if (cache.getHomeCommunityUUID() !== input.communityUuid) { + if (cache.getHomeCommunityUUID() !== input.getCommunityUuid()) { const role = - input instanceof UserIdentifier - ? new RemoteAccountKeyPairRole(input) - : new ForeignCommunityKeyPairRole(input.communityUuid) + input.isAccountKeyPair() + ? new RemoteAccountKeyPairRole(input.identifier) + : new ForeignCommunityKeyPairRole(input.getCommunityUuid()) return await role.retrieveKeyPair() } - - let communityKeyPair = cache.findKeyPair(input) + const communityKeyPair = await cache.getKeyPair(input.getCommunityKey(), async () => { + return new HomeCommunityKeyPairRole().generateKeyPair() + }) if (!communityKeyPair) { - communityKeyPair = new HomeCommunityKeyPairRole().generateKeyPair() + throw new Error("couldn't generate community key pair") } if (input.isCommunityKeyPair()) { 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, + const userKeyPair = await cache.getKeyPair(input.getCommunityUserKey(), async () => { + return new UserKeyPairRole( + input.getUserUuid(), communityKeyPair, ).generateKeyPair() - } + }) if (!userKeyPair) { - throw new LogError("couldn't generate user key pair") + throw new Error("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) - cache.addKeyPair(input, keyPair) - return keyPair + const accountNr = input.getAccountNr() + const accountKeyPair = new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() + if (input.isAccountKeyPair()) { + return accountKeyPair + } + throw new Error("couldn't generate account key pair, unexpected type") + }) } diff --git a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts index 39a20dd7a..d31fd9814 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts @@ -1,8 +1,7 @@ import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' -import { LogError } from '@/server/LogError' - import { AbstractKeyPairRole } from './AbstractKeyPair.role' +import { ParameterError } from '../../errors' export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { public constructor(private seed: string) { @@ -15,7 +14,7 @@ export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { 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) + throw new ParameterError(`error creating Ed25519 KeyPair from seed: ${this.seed.substring(0, 5)}...`) } return keyPair } diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts index 132e86499..6432366f4 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -1,39 +1,29 @@ 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 { findUserByNameHash } from '../../client/GradidoNode/jsonrpc.api' +import { IdentifierAccount } from '../../schemas/account.schema' +import { GradidoNodeMissingUserError, ParameterError } from '../../errors' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' +import { uuid4ToHashSchema } from '../../schemas/typeConverter.schema' +import * as v from 'valibot' export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { - public constructor(private user: UserIdentifier) { - super() + public constructor(private identifier: IdentifierAccount) { + super(identifier.communityUuid) } public async retrieveKeyPair(): Promise { - if (!this.user.communityUser) { - throw new LogError('missing community user') + if (!this.identifier.account) { + throw new ParameterError('missing account') } - const nameHash = uuid4ToHash(this.user.communityUser.uuid) - const confirmedTransactions = await getTransactions( - 0, - 30, - uuid4ToHash(this.user.communityUuid).convertToHex(), + const accountPublicKey = await findUserByNameHash( + v.parse(uuid4ToHashSchema, this.identifier.account.userUuid), + this.topic, ) - 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()) - } - } + if (accountPublicKey) { + return new KeyPairEd25519(accountPublicKey) } - throw new LogError( - 'cannot find remote user in first 30 transaction from remote blockchain, please wait for better recover implementation', - ) + throw new GradidoNodeMissingUserError('cannot find remote user', this.identifier) } } diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts index ca724fc99..3762266b2 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -1,8 +1,6 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { hardenDerivationIndex } from '@/utils/derivationHelper' -import { uuid4ToBuffer } from '@/utils/typeConverter' - +import { hardenDerivationIndex } from '../../utils/derivationHelper' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class UserKeyPairRole extends AbstractKeyPairRole { @@ -14,7 +12,7 @@ export class UserKeyPairRole extends AbstractKeyPairRole { // example gradido id: 03857ac1-9cc2-483e-8a91-e5b10f5b8d16 => // wholeHex: '03857ac19cc2483e8a91e5b10f5b8d16'] - const wholeHex = uuid4ToBuffer(this.userUuid) + const wholeHex = Buffer.from(this.userUuid.replace(/-/g, ''), 'hex') 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 a1a7b237d..8771c6789 100644 --- a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts @@ -1,34 +1,37 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' -import { KeyPairIdentifier } from '@/data/KeyPairIdentifier' -import { CommunityDraft } from '@/graphql/input/CommunityDraft' -import { LogError } from '@/server/LogError' +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { AUF_ACCOUNT_DERIVATION_INDEX, GMW_ACCOUNT_DERIVATION_INDEX, hardenDerivationIndex, -} from '@/utils/derivationHelper' +} from '../../utils/derivationHelper' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' +import { Community, CommunityInput, communitySchema } from '../../schemas/rpcParameter.schema' +import * as v from 'valibot' export class CommunityRootTransactionRole extends AbstractTransactionRole { - constructor(private self: CommunityDraft) { + private com: Community + constructor(input: CommunityInput) { super() + this.com = v.parse(communitySchema, input) } getSenderCommunityUuid(): string { - return this.self.uuid + return this.com.uuid } getRecipientCommunityUuid(): string { - throw new LogError('cannot be used as cross group transaction') + throw new Error('cannot be used as cross group transaction') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() - const communityKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.uuid)) + const communityKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic({ communityUuid: this.com.uuid })) const gmwKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), ) @@ -36,7 +39,7 @@ export class CommunityRootTransactionRole extends AbstractTransactionRole { hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), ) builder - .setCreatedAt(new Date(this.self.createdAt)) + .setCreatedAt(this.com.createdAt) .setCommunityRoot( communityKeyPair.getPublicKey(), gmwKeyPair.getPublicKey(), diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index e3fa9a838..c930e1725 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -2,72 +2,80 @@ 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 { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { CreationTransactionInput, creationTransactionSchema, CreationTransaction } from '../../schemas/transaction.schema' +import { KeyPairCacheManager } from '../../KeyPairCacheManager' +import { TRPCError } from '@trpc/server' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - +import * as v from 'valibot' import { AbstractTransactionRole } from './AbstractTransaction.role' +import { Uuidv4, uuidv4Schema } from '../../schemas/typeConverter.schema' export class CreationTransactionRole extends AbstractTransactionRole { - constructor(private self: TransactionDraft) { + private tx: CreationTransaction + private homeCommunityUuid: Uuidv4 + constructor(input: CreationTransactionInput) { super() + this.tx = v.parse(creationTransactionSchema, input) + this.homeCommunityUuid = v.parse( + uuidv4Schema, + KeyPairCacheManager.getInstance().getHomeCommunityUUID() + ) + if ( + this.homeCommunityUuid !== this.tx.user.communityUuid || + this.homeCommunityUuid !== this.tx.linkedUser.communityUuid + ) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'creation: both recipient and signer must belong to home community', + }) + } } getSenderCommunityUuid(): string { - return this.self.user.communityUuid + return this.tx.user.communityUuid } getRecipientCommunityUuid(): string { - throw new TransactionError( - TransactionErrorType.LOGIC_ERROR, - 'creation: cannot be used as cross group transaction', - ) + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'creation: cannot be used as cross group transaction', + }) } public async getGradidoTransactionBuilder(): Promise { - if (!this.self.targetDate) { - 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') - } - if (!this.self.memo) { - throw new TransactionError(TransactionErrorType.MISSING_PARAMETER, 'creation: memo missing') - } - const builder = new GradidoTransactionBuilder() - 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()), + // Recipient: user (account owner) + const recipientKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.tx.user) ) - + // Signer: linkedUser (admin/moderator) + const signerKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.tx.linkedUser) + ) + const homeCommunityKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic({ + communityUuid: this.homeCommunityUuid + }), + ) + // Memo: encrypted, home community and recipient can decrypt it builder - .setCreatedAt(new Date(this.self.createdAt)) - .addMemo(new EncryptedMemo(this.self.memo, new AuthenticatedEncryption(homeCommunityKeyPair))) + .setCreatedAt(this.tx.createdAt) + .addMemo(new EncryptedMemo( + this.tx.memo, + new AuthenticatedEncryption(homeCommunityKeyPair), + new AuthenticatedEncryption(recipientKeyPair), + )) .setTransactionCreation( new TransferAmount( recipientKeyPair.getPublicKey(), - GradidoUnit.fromString(this.self.amount), + this.tx.amount, ), - new Date(this.self.targetDate), + this.tx.targetDate, ) .sign(signerKeyPair) return builder diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 90783723e..655542537 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -1,72 +1,57 @@ import { AuthenticatedEncryption, - DurationSeconds, 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' - +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' +import { DeferredTransferTransactionInput, deferredTransferTransactionSchema, DeferredTransferTransaction } from '../../schemas/transaction.schema' +import * as v from 'valibot' +import { TRPCError } from '@trpc/server' +import { identifierSeedSchema, IdentifierSeed } from '../../schemas/account.schema' export class DeferredTransferTransactionRole extends AbstractTransactionRole { - constructor(protected self: TransactionDraft) { + private tx: DeferredTransferTransaction + private seed: IdentifierSeed + constructor(protected input: DeferredTransferTransactionInput) { super() + this.tx = v.parse(deferredTransferTransactionSchema, input) + this.seed = v.parse(identifierSeedSchema, input.linkedUser.seed) } getSenderCommunityUuid(): string { - return this.self.user.communityUuid + return this.tx.user.communityUuid } getRecipientCommunityUuid(): string { - throw new TransactionError( - TransactionErrorType.LOGIC_ERROR, - 'deferred transfer: cannot be used as cross group transaction', - ) + throw new TRPCError({ + code: 'NOT_IMPLEMENTED', + message: 'deferred transfer: cannot be used as cross group transaction yet', + }) } 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.memo) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - '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(new KeyPairIdentifier(this.self.user)) - const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.self.linkedUser)) + const senderKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.tx.user) + ) + const recipientKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic({ + communityUuid: this.tx.linkedUser.communityUuid, + seed: this.seed, + }) + ) builder - .setCreatedAt(new Date(this.self.createdAt)) + .setCreatedAt(this.tx.createdAt) .addMemo( new EncryptedMemo( - this.self.memo, + this.tx.memo, new AuthenticatedEncryption(senderKeyPair), new AuthenticatedEncryption(recipientKeyPair), ), @@ -75,13 +60,13 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { new GradidoTransfer( new TransferAmount( senderKeyPair.getPublicKey(), - GradidoUnit.fromString(this.self.amount).calculateCompoundInterest( - this.self.timeoutDuration, + this.tx.amount.calculateCompoundInterest( + this.tx.timeoutDuration.getSeconds(), ), ), recipientKeyPair.getPublicKey(), ), - new DurationSeconds(this.self.timeoutDuration), + this.tx.timeoutDuration, ) .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 70d612e08..a664a34c0 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -1,60 +1,69 @@ /* 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' -import { LogError } from '@/server/LogError' -import { accountTypeToAddressType, uuid4ToHash } from '@/utils/typeConverter' +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' +import { RegisterAddressTransactionInput, registerAddressTransactionSchema, RegisterAddressTransaction } from '../../schemas/transaction.schema' +import { IdentifierAccount, IdentifierCommunityAccount, identifierCommunityAccountSchema } from '../../schemas/account.schema' +import * as v from 'valibot' +import { TRPCError } from '@trpc/server' +import { uuid4ToHashSchema } from '../../schemas/typeConverter.schema' export class RegisterAddressTransactionRole extends AbstractTransactionRole { - constructor(private self: TransactionDraft) { + private tx: RegisterAddressTransaction + private account: IdentifierCommunityAccount + constructor(input: RegisterAddressTransactionInput) { super() + this.tx = v.parse(registerAddressTransactionSchema, input) + this.account = v.parse(identifierCommunityAccountSchema, input.user.account) } getSenderCommunityUuid(): string { - return this.self.user.communityUuid + return this.tx.user.communityUuid } getRecipientCommunityUuid(): string { - throw new LogError('cannot yet be used as cross group transaction') + throw new TRPCError({ + code: 'NOT_IMPLEMENTED', + message: 'register address: cannot be used as cross group transaction yet', + }) } 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( - new KeyPairIdentifier(this.self.user.communityUuid), + new KeyPairIdentifierLogic({ communityUuid: this.tx.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) + const userKeyPairIdentifier: IdentifierAccount = { + communityUuid: this.tx.user.communityUuid, + account: { + userUuid: this.account.userUuid, + accountNr: 0, + }, + } + const accountKeyPairIdentifier: IdentifierAccount = { + communityUuid: this.tx.user.communityUuid, + account: { + userUuid: this.account.userUuid, + accountNr: this.account.accountNr, + }, + } + const userKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(userKeyPairIdentifier) + ) + const accountKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(accountKeyPairIdentifier) + ) + builder - .setCreatedAt(new Date(this.self.createdAt)) + .setCreatedAt(this.tx.createdAt) .setRegisterAddress( userKeyPair.getPublicKey(), - accountTypeToAddressType(this.self.accountType), - uuid4ToHash(this.self.user.communityUser.uuid), + this.tx.accountType, + v.parse(uuid4ToHashSchema, this.account.userUuid), accountKeyPair.getPublicKey(), ) .sign(communityKeyPair) diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index dd730f590..344efeba5 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -2,76 +2,62 @@ 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' -import { TransactionError } from '@/graphql/model/TransactionError' -import { uuid4ToHash } from '@/utils/typeConverter' - +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' +import { TransferTransactionInput, transferTransactionSchema, TransferTransaction } from '../../schemas/transaction.schema' +import * as v from 'valibot' +import { uuid4ToTopicSchema } from '../../schemas/typeConverter.schema' export class TransferTransactionRole extends AbstractTransactionRole { - private linkedUser: UserIdentifier - constructor(private self: TransactionDraft) { + private tx: TransferTransaction + constructor(input: TransferTransactionInput) { super() - if (!this.self.linkedUser) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'transfer: linked user missing', - ) - } - this.linkedUser = this.self.linkedUser + this.tx = v.parse(transferTransactionSchema, input) } getSenderCommunityUuid(): string { - return this.self.user.communityUuid + return this.tx.user.communityUuid } getRecipientCommunityUuid(): string { - return this.linkedUser.communityUuid + return this.tx.linkedUser.communityUuid } public async getGradidoTransactionBuilder(): Promise { - 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(new KeyPairIdentifier(this.self.user)) - const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.linkedUser)) + // sender + signer + const senderKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.tx.user) + ) + // recipient + const recipientKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.tx.linkedUser) + ) builder - .setCreatedAt(new Date(this.self.createdAt)) + .setCreatedAt(new Date(this.tx.createdAt)) .addMemo( new EncryptedMemo( - this.self.memo, + this.tx.memo, new AuthenticatedEncryption(senderKeyPair), new AuthenticatedEncryption(recipientKeyPair), ), ) .setTransactionTransfer( - new TransferAmount(senderKeyPair.getPublicKey(), GradidoUnit.fromString(this.self.amount)), + new TransferAmount(senderKeyPair.getPublicKey(), this.tx.amount), recipientKeyPair.getPublicKey(), ) - const senderCommunity = this.self.user.communityUuid - const recipientCommunity = this.linkedUser.communityUuid + const senderCommunity = this.tx.user.communityUuid + const recipientCommunity = this.tx.linkedUser.communityUuid if (senderCommunity !== recipientCommunity) { // we have a cross group transaction builder - .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) - .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) + .setSenderCommunity(v.parse(uuid4ToTopicSchema, senderCommunity)) + .setRecipientCommunity(v.parse(uuid4ToTopicSchema, recipientCommunity)) } builder.sign(senderKeyPair) return builder diff --git a/dlt-connector/src/logging/AbstractLogging.view.ts b/dlt-connector/src/logging/AbstractLogging.view.ts deleted file mode 100644 index ddb1cb6ed..000000000 --- a/dlt-connector/src/logging/AbstractLogging.view.ts +++ /dev/null @@ -1,38 +0,0 @@ -import util from 'util' - -import { Timestamp, TimestampSeconds } from 'gradido-blockchain-js' - -export abstract class AbstractLoggingView { - protected bufferStringFormat: BufferEncoding = 'hex' - - // This function gets called automatically when JSON.stringify() is called on this class instance - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public abstract toJSON(): any - public toString(): string { - return JSON.stringify(this.toJSON(), null, 2) - } - - // called form console.log or log4js logging functions - [util.inspect.custom](): string { - return this.toString() - } - - protected dateToString(date: Date | undefined | null): string | undefined { - if (date) { - return date.toISOString() - } - return undefined - } - - protected timestampSecondsToDateString(timestamp: TimestampSeconds): string | undefined { - if (timestamp && timestamp.getSeconds()) { - return timestamp.getDate().toISOString() - } - } - - protected timestampToDateString(timestamp: Timestamp): string | undefined { - if (timestamp && (timestamp.getSeconds() || timestamp.getNanos())) { - return timestamp.getDate().toISOString() - } - } -} diff --git a/dlt-connector/src/logging/CommunityUserLogging.view.ts b/dlt-connector/src/logging/CommunityUserLogging.view.ts deleted file mode 100644 index f1b421cd6..000000000 --- a/dlt-connector/src/logging/CommunityUserLogging.view.ts +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index d34012e17..000000000 --- a/dlt-connector/src/logging/IdentifierSeedLogging.view.ts +++ /dev/null @@ -1,16 +0,0 @@ -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/TransactionDraftLogging.view.ts b/dlt-connector/src/logging/TransactionDraftLogging.view.ts deleted file mode 100644 index 8f9e11331..000000000 --- a/dlt-connector/src/logging/TransactionDraftLogging.view.ts +++ /dev/null @@ -1,28 +0,0 @@ -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' -import { UserIdentifierLoggingView } from './UserIdentifierLogging.view' - -export class TransactionDraftLoggingView extends AbstractLoggingView { - public constructor(private self: TransactionDraft) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - user: new UserIdentifierLoggingView(this.self.user).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, - targetDate: this.self.targetDate, - } - } -} diff --git a/dlt-connector/src/logging/UserIdentifierLogging.view.ts b/dlt-connector/src/logging/UserIdentifierLogging.view.ts deleted file mode 100644 index 16343551f..000000000 --- a/dlt-connector/src/logging/UserIdentifierLogging.view.ts +++ /dev/null @@ -1,22 +0,0 @@ -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) { - super() - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - public toJSON(): any { - return { - communityUuid: this.self.communityUuid, - 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/logging/logger.ts b/dlt-connector/src/logging/logger.ts deleted file mode 100644 index bec2ec578..000000000 --- a/dlt-connector/src/logging/logger.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { readFileSync } from 'fs' - -import log4js from 'log4js' - -import { CONFIG } from '@/config' - -const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8')) - -log4js.configure(options) - -const logger = log4js.getLogger('dlt') - -export { logger } diff --git a/dlt-connector/src/schemas/account.schema.ts b/dlt-connector/src/schemas/account.schema.ts new file mode 100644 index 000000000..4242558b3 --- /dev/null +++ b/dlt-connector/src/schemas/account.schema.ts @@ -0,0 +1,40 @@ + +import * as v from 'valibot' +import { uuidv4Schema } from './typeConverter.schema' + +// use code from transaction links +export const identifierSeedSchema = v.object({ + seed: v.pipe( + v.string('expect string type'), + v.length(24, 'expect seed length 24') + ) +}) + +export type IdentifierSeed = v.InferOutput + +// identifier for gradido community accounts, inside a community +export const identifierCommunityAccountSchema = v.object({ + userUuid: uuidv4Schema, + accountNr: v.nullish(v.number('expect number type'), 0), +}) + +export type IdentifierCommunityAccount = v.InferOutput + +// identifier for gradido account, including the community uuid +export const identifierAccountSchema = v.pipe( + v.object({ + communityUuid: uuidv4Schema, + account: v.nullish(identifierCommunityAccountSchema, undefined), + seed: v.nullish(identifierSeedSchema, undefined), + }), + v.custom((value: any) => { + const setFieldsCount = Number(value.seed !== undefined) + Number(value.account !== undefined) + if (setFieldsCount !== 1) { + return false + } + return true + }, 'expect seed or account') +) + +export type IdentifierAccountInput = v.InferInput +export type IdentifierAccount = v.InferOutput diff --git a/dlt-connector/src/schemas/rpcParameter.schema.test.ts b/dlt-connector/src/schemas/rpcParameter.schema.test.ts new file mode 100644 index 000000000..8680c3958 --- /dev/null +++ b/dlt-connector/src/schemas/rpcParameter.schema.test.ts @@ -0,0 +1,21 @@ +import { communitySchema } from './rpcParameter.schema' +import { uuidv4Schema } from './typeGuard.schema' +import * as v from 'valibot' +// only for IDE, bun don't need this to work +import { describe, expect, it } from 'bun:test' + +describe('rpcParameter.schema', () => { + it('community', () => { + expect(v.parse(communitySchema, { + uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', + foreign: false, + createdAt: '2021-01-01', + })).toEqual( + { + uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), + foreign: false, + createdAt: new Date('2021-01-01'), + }, + ) + }) +}) diff --git a/dlt-connector/src/schemas/rpcParameter.schema.ts b/dlt-connector/src/schemas/rpcParameter.schema.ts new file mode 100644 index 000000000..0a05dd86c --- /dev/null +++ b/dlt-connector/src/schemas/rpcParameter.schema.ts @@ -0,0 +1,19 @@ +import * as v from 'valibot' +import { uuidv4Schema } from './typeGuard.schema' +import { dateSchema } from './typeConverter.schema' + +/** + * Schema Definitions for rpc call parameter, when dlt-connector is called from backend + */ + +/** + * Schema for community, for creating new CommunityRoot Transaction on gradido blockchain + */ +export const communitySchema = v.object({ + uuid: uuidv4Schema, + foreign: v.boolean('expect boolean type'), + createdAt: dateSchema, +}) + +export type CommunityInput = v.InferInput +export type Community = v.InferOutput diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts new file mode 100644 index 000000000..e7459175c --- /dev/null +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -0,0 +1,207 @@ +import { describe, it, expect } from 'bun:test' +import { transactionIdentifierSchema, transactionSchema, TransactionInput, memoSchema } from './transaction.schema' +import { InputTransactionType } from '../enum/InputTransactionType' +import { v4 as uuidv4 } from 'uuid' +import * as v from 'valibot' +import { GradidoUnit, DurationSeconds } from 'gradido-blockchain-js' +import { randomBytes } from 'crypto' + +const transactionLinkCode = (date: Date): string => { + const time = date.getTime().toString(16) + return ( + randomBytes(12) + .toString('hex') + .substring(0, 24 - time.length) + time + ) +} + +describe('transaction schemas', () => { + + describe('transactionIdentifierSchema ', () => { + it('valid, transaction identified by transactionNr and topic', () => { + expect(v.parse(transactionIdentifierSchema, { + transactionNr: 1, + iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + })).toEqual({ + transactionNr: 1, + iotaMessageId: undefined, + iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + }) + }) + it('valid, transaction identified by iotaMessageId and topic', () => { + expect(v.parse(transactionIdentifierSchema, { + iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', + iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + })).toEqual({ + transactionNr: 0, + iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', + iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + }) + }) + it('invalid, missing topic', () => { + expect(() => v.parse(transactionIdentifierSchema, { + transactionNr: 1, + iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', + })).toThrowError(new Error('Invalid key: Expected "iotaTopic" but received undefined')) + }) + it('invalid, transactionNr and iotaMessageId set', () => { + expect(() => v.parse(transactionIdentifierSchema, { + transactionNr: 1, + iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', + iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + })).toThrowError(new Error('expect transactionNr or iotaMessageId not both')) + }) + }) + + describe('transactionSchema', () => { + it('valid, register new user address', () => { + const registerAddress: TransactionInput = { + user: { + communityUuid: uuidv4(), + account: { + userUuid: uuidv4(), + } + }, + type: InputTransactionType.REGISTER_ADDRESS, + createdAt: '2022-01-01T00:00:00.000Z', + } + expect(v.parse(transactionSchema, registerAddress)).toEqual({ + user: { + communityUuid: registerAddress.user.communityUuid, + account: { + userUuid: registerAddress.user.account!.userUuid, + accountNr: 1, + } + }, + type: registerAddress.type, + createdAt: new Date(registerAddress.createdAt), + }) + }) + it('valid, gradido transfer', () => { + const communityUuid = uuidv4() + const gradidoTransfer: TransactionInput = { + user: { + communityUuid, + account: { + userUuid: uuidv4(), + } + }, + linkedUser: { + communityUuid, + account: { + userUuid: uuidv4(), + } + }, + amount: '100', + memo: 'TestMemo', + type: InputTransactionType.GRADIDO_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + } + expect(v.parse(transactionSchema, gradidoTransfer)).toEqual({ + user: { + communityUuid, + account: { + userUuid: gradidoTransfer.user.account!.userUuid, + accountNr: 1, + } + }, + linkedUser: { + communityUuid, + account: { + userUuid: gradidoTransfer.linkedUser!.account!.userUuid, + accountNr: 1, + } + }, + amount: GradidoUnit.fromString(gradidoTransfer.amount!), + memo: gradidoTransfer.memo, + type: gradidoTransfer.type, + createdAt: new Date(gradidoTransfer.createdAt), + }) + }) + + it('valid, gradido creation', () => { + const communityUuid = uuidv4() + const gradidoCreation: TransactionInput = { + user: { + communityUuid, + account: { + userUuid: uuidv4(), + } + }, + linkedUser: { + communityUuid, + account: { + userUuid: uuidv4(), + } + }, + amount: '1000', + memo: 'For your help', + type: InputTransactionType.GRADIDO_CREATION, + createdAt: '2022-01-01T00:00:00.000Z', + targetDate: '2021-11-01T10:00' + } + expect(v.parse(transactionSchema, gradidoCreation)).toEqual({ + user: { + communityUuid, + account: { + userUuid: gradidoCreation.user.account!.userUuid, + accountNr: 1, + } + }, + linkedUser: { + communityUuid, + account: { + userUuid: gradidoCreation.linkedUser!.account!.userUuid, + accountNr: 1, + } + }, + amount: GradidoUnit.fromString(gradidoCreation.amount!), + memo: gradidoCreation.memo, + type: gradidoCreation.type, + createdAt: new Date(gradidoCreation.createdAt), + targetDate: new Date(gradidoCreation.targetDate!), + }) + }) + it('valid, gradido transaction link / deferred transfer', () => { + const gradidoTransactionLink: TransactionInput = { + user: { + communityUuid: uuidv4(), + account: { + userUuid: uuidv4(), + } + }, + linkedUser: { + communityUuid: uuidv4(), + seed: { + seed: transactionLinkCode(new Date()), + } + }, + amount: '100', + memo: 'use link wisely', + type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + timeoutDuration: 60*60*24*30, + } + expect(v.parse(transactionSchema, gradidoTransactionLink)).toEqual({ + user: { + communityUuid: gradidoTransactionLink.user.communityUuid, + account: { + userUuid: gradidoTransactionLink.user.account!.userUuid, + accountNr: 1, + } + }, + linkedUser: { + communityUuid: gradidoTransactionLink.linkedUser!.communityUuid, + seed: { + seed: gradidoTransactionLink.linkedUser!.seed!.seed, + } + }, + amount: GradidoUnit.fromString(gradidoTransactionLink.amount!), + memo: gradidoTransactionLink.memo, + type: gradidoTransactionLink.type, + createdAt: new Date(gradidoTransactionLink.createdAt), + timeoutDuration: new DurationSeconds(gradidoTransactionLink.timeoutDuration!), + }) + }) + }) +}) \ No newline at end of file diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts new file mode 100644 index 000000000..1a2bdae44 --- /dev/null +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -0,0 +1,87 @@ +import * as v from 'valibot' +import { dateFromStringSchema } from './typeConverter.schema' +import { identifierAccountSchema } from './account.schema' +import { InputTransactionType } from '../enum/InputTransactionType' +import { accountTypeToAddressTypeSchema } from './typeConverter.schema' + +// allow TransactionIdentifier to only contain either transactionNr or iotaMessageId +export const transactionIdentifierSchema = v.pipe( + v.object({ + transactionNr: v.nullish( + v.pipe(v.number('expect number type'), v.minValue(0, 'expect number >= 0')), + 0 + ), + iotaMessageId: v.nullish(iotaMessageIdSchema, undefined), + communityId: uuid4ToTopicSchema, + }), + v.custom((value: any) => { + const setFieldsCount = Number(value.transactionNr !== 0) + Number(value.iotaMessageId !== undefined) + if (setFieldsCount !== 1) { + return false + } + return true + }, 'expect transactionNr or iotaMessageId not both') +) +export type TransactionIdentifierInput = v.InferInput +export type TransactionIdentifier = v.InferOutput + +export const transactionSchema = v.object({ + user: identifierAccountSchema, + linkedUser: v.nullish(identifierAccountSchema, undefined), + amount: v.nullish(amountToGradidoUnitSchema, undefined), + memo: v.nullish(memoSchema, undefined), + type: v.enum(InputTransactionType), + createdAt: dateFromStringSchema, + targetDate: v.nullish(dateFromStringSchema, undefined), + timeoutDuration: v.nullish(timeoutDurationSchema, undefined), + accountType: v.nullish(accountTypeToAddressTypeSchema, undefined), +}) + +export type TransactionInput = v.InferInput +export type Transaction = v.InferOutput + +export const creationTransactionSchema = v.object({ + user: identifierAccountSchema, + linkedUser: identifierAccountSchema, + amount: amountToGradidoUnitSchema, + memo: memoSchema, + createdAt: dateFromStringSchema, + targetDate: dateFromStringSchema, +}) + +export type CreationTransactionInput = v.InferInput +export type CreationTransaction = v.InferOutput + +export const transferTransactionSchema = v.object({ + user: identifierAccountSchema, + linkedUser: identifierAccountSchema, + amount: amountToGradidoUnitSchema, + memo: memoSchema, + createdAt: dateFromStringSchema, +}) + +export type TransferTransactionInput = v.InferInput +export type TransferTransaction = v.InferOutput + +// linked user is later needed for move account transaction +export const registerAddressTransactionSchema = v.object({ + user: identifierAccountSchema, + createdAt: dateFromStringSchema, + accountType: accountTypeToAddressTypeSchema, +}) + +export type RegisterAddressTransactionInput = v.InferInput +export type RegisterAddressTransaction = v.InferOutput + + +export const deferredTransferTransactionSchema = v.object({ + user: identifierAccountSchema, + linkedUser: identifierAccountSchema, + amount: amountToGradidoUnitSchema, + memo: memoSchema, + createdAt: dateFromStringSchema, + timeoutDuration: timeoutDurationSchema, +}) + +export type DeferredTransferTransactionInput = v.InferInput +export type DeferredTransferTransaction = v.InferOutput diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts new file mode 100644 index 000000000..b4ca7b7c3 --- /dev/null +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -0,0 +1,51 @@ + +import { accountTypeSchema, addressTypeSchema, confirmedTransactionFromBase64Schema } from './typeConverter.schema' +import * as v from 'valibot' +// only for IDE, bun don't need this to work +import { describe, expect, it } from 'bun:test' +import { dateSchema } from './typeConverter.schema' +import { AddressType_COMMUNITY_AUF } from 'gradido-blockchain-js' +import { AccountType } from '../enum/AccountType' + +describe('basic.schema', () => { + + describe('date', () => { + it('from string', () => { + const date = v.parse(dateSchema, '2021-01-01:10:10') + expect(date.toISOString()).toBe('2021-01-01T10:10:00.000Z') + }) + it('from Date', () => { + const date = v.parse(dateSchema, new Date('2021-01-01')) + expect(date.toISOString()).toBe('2021-01-01T00:00:00.000Z') + }) + it('invalid date', () => { + expect(() => v.parse(dateSchema, 'invalid date')).toThrow(new Error('invalid date')) + }) + }) + + describe('AddressType and AccountType', () => { + it('AddressType from AddressType', () => { + const addressType = v.parse(addressTypeSchema, AddressType_COMMUNITY_AUF) + expect(addressType).toBe(AddressType_COMMUNITY_AUF) + }) + it('AddressType from AccountType', () => { + const accountType = v.parse(addressTypeSchema, AccountType.COMMUNITY_AUF) + expect(accountType).toBe(AddressType_COMMUNITY_AUF) + }) + it('AccountType from AccountType', () => { + const accountType = v.parse(accountTypeSchema, AccountType.COMMUNITY_AUF) + expect(accountType).toBe(AccountType.COMMUNITY_AUF) + }) + it('AccountType from AddressType', () => { + const accountType = v.parse(accountTypeSchema, AddressType_COMMUNITY_AUF) + expect(accountType).toBe(AccountType.COMMUNITY_AUF) + }) + }) + + it('confirmedTransactionFromBase64Schema', () => { + const confirmedTransaction = v.parse(confirmedTransactionFromBase64Schema, 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') + expect(confirmedTransaction.getId()).toBe(7) + expect(confirmedTransaction.getConfirmedAt().getSeconds()).toBe(1609464130) + expect(confirmedTransaction.getVersionNumber()).toBe('3.4') + }) +}) diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts new file mode 100644 index 000000000..f3d5fd803 --- /dev/null +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -0,0 +1,125 @@ +import { + AddressType as AddressType, + AddressType_COMMUNITY_AUF, + AddressType_COMMUNITY_GMW, + AddressType_COMMUNITY_HUMAN, + AddressType_COMMUNITY_PROJECT, + AddressType_CRYPTO_ACCOUNT, + AddressType_NONE, + AddressType_SUBACCOUNT, + ConfirmedTransaction, + DeserializeType_CONFIRMED_TRANSACTION, + InteractionDeserialize, + MemoryBlock, +} from 'gradido-blockchain-js' +import { AccountType } from '../enum/AccountType' +// import { AddressType as AddressTypeWrapper } from '../enum/AddressType' +import * as v from 'valibot' + +/** + * dateSchema for creating a date from string or Date object + */ +export const dateSchema = v.pipe( + v.union([ + v.string('expect valid date string'), + v.instance(Date, 'expect Date object') + ]), + v.transform((input) => { + let date: Date + if (input instanceof Date) { + date = input + } else { + date = new Date(input) + } + if (isNaN(date.getTime())) { + throw new Error('invalid date') + } + return date + }) +) + +/** + * AddressType is defined in gradido-blockchain C++ Code + * AccountType is the enum defined in TypeScript but with the same options + * addressTypeSchema and accountTypeSchema are for easy handling and conversion between both + */ + +const accountToAddressMap: Record = { + [AccountType.COMMUNITY_AUF]: AddressType_COMMUNITY_AUF, + [AccountType.COMMUNITY_GMW]: AddressType_COMMUNITY_GMW, + [AccountType.COMMUNITY_HUMAN]: AddressType_COMMUNITY_HUMAN, + [AccountType.COMMUNITY_PROJECT]: AddressType_COMMUNITY_PROJECT, + [AccountType.CRYPTO_ACCOUNT]: AddressType_CRYPTO_ACCOUNT, + [AccountType.SUBACCOUNT]: AddressType_SUBACCOUNT, + [AccountType.NONE]: AddressType_NONE, +} + +const addressToAccountMap: Record = Object.entries(accountToAddressMap).reduce((acc, [accKey, addrVal]) => { + acc[addrVal] = String(accKey) as AccountType + return acc; +}, {} as Record) + +function isAddressType(val: unknown): val is AddressType { + return typeof val === 'number' && Object.keys(addressToAccountMap).includes(val.toString()) +} + +function isAccountType(val: unknown): val is AccountType { + return Object.values(AccountType).includes(val as AccountType); +} + +/** + * Schema for address type, can also convert from account type (if used with v.parse) + */ +export const addressTypeSchema = v.pipe( + v.union([ + v.enum(AccountType, 'expect account type'), + v.custom((val): val is AddressType => isAddressType(val), 'expect AddressType'), + ]), + v.transform((value) => { + if (isAddressType(value)) { + return value; + } + return accountToAddressMap[value as AccountType] ?? AddressType_NONE + }), +) + +/** + * Schema for account type, can also convert from address type (if used with v.parse) + */ +export const accountTypeSchema = v.pipe( + v.union([ + v.custom(isAddressType, 'expect AddressType'), + v.enum(AccountType, 'expect AccountType'), + ]), + v.transform((value) => { + if (isAccountType(value)) { + return value; + } + return addressToAccountMap[value as AddressType] ?? AccountType.NONE; + }), +) + +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 Error("invalid data, couldn't deserialize") + } + return confirmedTransaction +} + +export const confirmedTransactionFromBase64Schema = v.pipe( + v.pipe( + v.string('expect confirmed Transaction base64 as string type'), + v.base64('expect to be valid base64') + ), + v.transform( + (base64: string) => confirmedTransactionFromBase64(base64), + ), +) + + diff --git a/dlt-connector/src/schemas/typeGuard.schema.test.ts b/dlt-connector/src/schemas/typeGuard.schema.test.ts new file mode 100644 index 000000000..02266c0bc --- /dev/null +++ b/dlt-connector/src/schemas/typeGuard.schema.test.ts @@ -0,0 +1,67 @@ +import { describe, it, expect } from 'bun:test' +import { uuidv4Schema, topicIndexSchema, uuid4HashSchema, memoSchema } from './typeGuard.schema' +import * as v from 'valibot' +import { v4 as uuidv4 } from 'uuid' +import { MemoryBlock } from 'gradido-blockchain-js' + +describe('typeGuard.schema', () => { + describe('Uuidv4', () => { + const uuidv4String = uuidv4() + const uuidv4Hash = MemoryBlock.fromHex(uuidv4String.replace(/-/g, '')).calculateHash() + + it('from string to uuidv4', () => { + const uuidv4Value = v.parse(uuidv4Schema, uuidv4String) + expect(uuidv4Value.toString()).toBe(uuidv4String) + }) + + it('from uuidv4 to hash', () => { + const uuidv4Value = v.parse(uuidv4Schema, uuidv4String) + const uuidv4HashParsed = v.parse(uuid4HashSchema, uuidv4Value) + expect(uuidv4HashParsed.copyAsString()).toBe(uuidv4Hash.copyAsString()) + }) + + it('from uuidv4 string to hash', () => { + const uuidv4HashParsed = v.parse(uuid4HashSchema, uuidv4String) + expect(uuidv4HashParsed.copyAsString()).toBe(uuidv4Hash.copyAsString()) + }) + + it('from uuidv4 hash to topicIndex (hash in hex format', () => { + const uuidv4HashParsed = v.parse(uuid4HashSchema, uuidv4String) + const topicIndex = v.parse(topicIndexSchema, uuidv4HashParsed) + expect(topicIndex.toString()).toBe(uuidv4Hash.convertToHex()) + }) + + it('from uuidv4 to topicIndex (hash in hex format)', () => { + const uuidv4Value = v.parse(uuidv4Schema, uuidv4String) + const topicIndex = v.parse(topicIndexSchema, uuidv4Value) + expect(topicIndex.toString()).toBe(uuidv4Hash.convertToHex()) + }) + + it('from uuidv4 string to topicIndex (hash in hex format)', () => { + const topicIndex = v.parse(topicIndexSchema, uuidv4String) + expect(topicIndex.toString()).toBe(uuidv4Hash.convertToHex()) + }) + }) + describe('Basic Type Schemas for transactions', () => { + describe('Memo', () => { + it('min length', () => { + const memoValue = 'memo1' + const memoValueParsed = v.parse(memoSchema, memoValue) + expect(memoValueParsed.toString()).toBe(memoValue) + }) + it('max length', () => { + const memoValue = 's'.repeat(255) + const memoValueParsed = v.parse(memoSchema, memoValue) + expect(memoValueParsed.toString()).toBe(memoValue) + }) + it('to short', () => { + const memoValue = 'memo' + expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length >= 5')) + }) + it('to long', () => { + const memoValue = 's'.repeat(256) + expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length <= 255')) + }) + }) + }) +}) \ No newline at end of file diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts new file mode 100644 index 000000000..6ec33d732 --- /dev/null +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -0,0 +1,146 @@ +/** + * # TypeGuards + * Expand TypeScript Default Types with custom type which a based on a default type (or class) + * Use valibot, so we can describe the type and validate it easy at runtime + * After transpiling TypeScript unique symbol are gone + * Infos at opaque type in typescript: https://evertpot.com/opaque-ts-types/ + * + * declare const validAmount: unique symbol + * export type Amount = number & { [validAmount]: true }; + * Can be compared with using `typedef int Amount;` in C/C++ + * Example: + * To create a instance of Amount: + * `const amount: Amount = v.parse(amountSchema, 1.21)` + * must be called and ensure the value is valid + * If it isn't valid, v.parse will throw an error + */ + +import { validate, version } from 'uuid' +import * as v from 'valibot' +import { MemoryBlock, DurationSeconds, GradidoUnit } from 'gradido-blockchain-js' + +/** + * type guard for uuid v4 + * create with `v.parse(uuidv4Schema, 'uuid')` + * uuidv4 is used for communityUuid and userUuid + */ +declare const validUuidv4: unique symbol +export type Uuidv4 = string & { [validUuidv4]: true }; + +export const uuidv4Schema = v.custom((value) => + (typeof value === 'string' && validate(value) && version(value) === 4), + 'uuid v4 expected' +) + +/** + * type guard for uuid v4 hash + * const uuidv4Value: Uuidv4 = v.parse(uuidv4Schema, 'uuid') + * create with `v.parse(uuidv4HashSchema, uuidv4Value)` + * uuidv4Hash is uuidv4 value hashed with BLAKE2b as Binary Type MemoryBlock from gradido-blockchain similar to Node.js Buffer Type, + * used for iota topic + */ +declare const validUuidv4Hash: unique symbol +export type Uuidv4Hash = MemoryBlock & { [validUuidv4Hash]: true }; + +export const uuid4HashSchema = v.pipe( + uuidv4Schema, + v.transform( + (input: Uuidv4) => MemoryBlock.fromHex(input.replace(/-/g, '')).calculateHash() as Uuidv4Hash, + ) +) + +/** + * type guard for topic index + * const uuidv4Value: Uuidv4 = v.parse(uuidv4Schema, 'uuid') + * const uuidv4Hash: Uuidv4Hash = v.parse(uuid4HashSchema, uuidv4Value) + * create with `v.parse(topicIndexSchema, uuidv4Hash)` + * topicIndex is uuidv4Hash value converted to hex string used for iota topic + * The beauty of valibot allow also parse a uuidv4 string directly to topicIndex + * const topic: TopicIndex = v.parse(topicIndexSchema, 'uuid') + */ +declare const validTopicIndex: unique symbol +export type TopicIndex = string & { [validTopicIndex]: true }; + +export const topicIndexSchema = v.pipe( + v.union([uuidv4Schema, v.custom((val): val is Uuidv4Hash => val instanceof MemoryBlock)]), + v.transform((input) => { + const hash = typeof input === 'string' + ? MemoryBlock.fromHex(input.replace(/-/g, '')).calculateHash() + : input; + return hash.convertToHex() as TopicIndex; + }) +) + +/** + * type guard for memo + * create with `v.parse(memoSchema, 'memo')` + * memo string inside bounds [5, 255] + */ +export const MEMO_MIN_CHARS = 5 +export const MEMO_MAX_CHARS = 255 + +declare const validMemo: unique symbol +export type Memo = string & { [validMemo]: true }; + +export const memoSchema = v.pipe( + v.string('expect string type'), + v.maxLength(MEMO_MAX_CHARS, `expect string length <= ${MEMO_MAX_CHARS}`), + v.minLength(MEMO_MIN_CHARS, `expect string length >= ${MEMO_MIN_CHARS}`), + v.transform( + (input: string) => input as Memo, + ), +) + +/** + * type guard for timeout duration + * create with `v.parse(timeoutDurationSchema, 123)` + * timeout duration is a number in seconds inside bounds + * [1 hour, 3 months] + * for Transaction Links / Deferred Transactions + * seconds starting from createdAt Date in which the transaction link can be redeemed + */ +const LINKED_TRANSACTION_TIMEOUT_DURATION_MIN = 60*60 +const LINKED_TRANSACTION_TIMEOUT_DURATION_MAX = 60*60*24*31*3 + +declare const validTimeoutDuration: unique symbol +export type TimeoutDuration = DurationSeconds & { [validTimeoutDuration]: true }; + +export const timeoutDurationSchema = v.pipe( + v.number('expect number type'), + v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), + v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), + v.transform( + (input: number) => new DurationSeconds(input) as TimeoutDuration, + ), +) + +/** + * type guard for amount + * create with `v.parse(amountSchema, '123')` + * amount is a string representing a positive decimal number, compatible with decimal.js + */ +declare const validAmount: unique symbol +export type Amount = string & { [validAmount]: true }; + +export const amountSchema = v.pipe( + v.string('expect string type'), + v.regex(/^[0-9]+(\.[0-9]+)?$/, 'expect positive number'), + v.transform( + (input: string) => input as Amount, + ), +) + +/** + * type guard for gradido amount + * create with `v.parse(gradidoAmountSchema, '123')` + * gradido amount is a string representing a positive decimal number, compatible with decimal.js + */ +declare const validGradidoAmount: unique symbol +export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true }; + +export const gradidoAmountSchema = v.pipe( + amountSchema, + v.transform( + (input: Amount) => GradidoUnit.fromString(input) as GradidoAmount, + ), +) \ No newline at end of file diff --git a/dlt-connector/src/server/LogError.test.ts b/dlt-connector/src/server/LogError.test.ts deleted file mode 100644 index 115567a8b..000000000 --- a/dlt-connector/src/server/LogError.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import { logger } from '@test/testSetup' - -import { LogError } from './LogError' - -describe('LogError', () => { - it('logs an Error when created', () => { - /* eslint-disable-next-line no-new */ - new LogError('new LogError') - expect(logger.error).toBeCalledWith('new LogError') - }) - - it('logs an Error including additional data when created', () => { - /* eslint-disable-next-line no-new */ - new LogError('new LogError', { some: 'data' }) - expect(logger.error).toBeCalledWith('new LogError', { some: 'data' }) - }) - - it('does not contain additional data in Error object when thrown', () => { - try { - throw new LogError('new LogError', { someWeirdValue123: 'arbitraryData456' }) - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - } catch (e: any) { - expect(e.stack).not.toMatch(/(someWeirdValue123|arbitraryData456)/i) - } - }) -}) diff --git a/dlt-connector/src/server/LogError.ts b/dlt-connector/src/server/LogError.ts deleted file mode 100644 index 69aca1978..000000000 --- a/dlt-connector/src/server/LogError.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -import { logger } from '@/logging/logger' - -export class LogError extends Error { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - constructor(msg: string, ...details: any[]) { - super(msg) - logger.error(msg, ...details) - } -} diff --git a/dlt-connector/src/server/cors.ts b/dlt-connector/src/server/cors.ts deleted file mode 100644 index 95663695d..000000000 --- a/dlt-connector/src/server/cors.ts +++ /dev/null @@ -1,8 +0,0 @@ -import corsLib from 'cors' - -const corsOptions = { - origin: '*', - exposedHeaders: ['token'], -} - -export const cors = corsLib(corsOptions) diff --git a/dlt-connector/src/server/createServer.ts b/dlt-connector/src/server/createServer.ts deleted file mode 100755 index 9cc29124c..000000000 --- a/dlt-connector/src/server/createServer.ts +++ /dev/null @@ -1,79 +0,0 @@ -import 'reflect-metadata' - -import { ApolloServer } from '@apollo/server' -import { expressMiddleware } from '@apollo/server/express4' -import bodyParser from 'body-parser' -import cors from 'cors' -import express, { Express } from 'express' -// graphql -import { slowDown } from 'express-slow-down' -import helmet from 'helmet' -import { Logger } from 'log4js' - -import { schema } from '@/graphql/schema' -import { logger as dltLogger } from '@/logging/logger' - -type ServerDef = { apollo: ApolloServer; app: Express } - -interface MyContext { - token?: string -} - -const createServer = async ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - // context: any = serverContext, - logger: Logger = dltLogger, - // localization: i18n.I18n = i18n, -): Promise => { - logger.addContext('user', 'unknown') - logger.debug('createServer...') - - // Express Server - const app = express() - - // Apollo Server - const apollo = new ApolloServer({ - schema: await schema(), - introspection: true, - // context, - // plugins - logger, - }) - // Helmet helps secure Express apps by setting HTTP response headers. - app.use(helmet()) - - // rate limiter/ slow down to many requests - const limiter = slowDown({ - windowMs: 1000, // 1 second - delayAfter: 10, // Allow 10 requests per 1 second. - delayMs: (hits) => hits * 50, // Add 100 ms of delay to every request after the 10th one. - /** - * So: - * - * - requests 1-10 are not delayed. - * - request 11 is delayed by 550ms - * - request 12 is delayed by 600ms - * - request 13 is delayed by 650ms - * - * and so on. After 1 seconds, the delay is reset to 0. - */ - }) - app.use(limiter) - // because of nginx proxy, needed for limiter - app.set('trust proxy', 1) - - await apollo.start() - app.use( - '/', - cors(), - bodyParser.json(), - expressMiddleware(apollo, { - context: async ({ req }) => ({ token: req.headers.token }), - }), - ) - logger.debug('createServer...successful') - - return { apollo, app } -} - -export default createServer diff --git a/dlt-connector/src/utils/derivationHelper.test.ts b/dlt-connector/src/utils/derivationHelper.test.ts index 6d3d690ee..63e7b6993 100644 --- a/dlt-connector/src/utils/derivationHelper.test.ts +++ b/dlt-connector/src/utils/derivationHelper.test.ts @@ -1,6 +1,6 @@ -import 'reflect-metadata' - import { hardenDerivationIndex, HARDENED_KEY_BITMASK } from './derivationHelper' +// only for IDE, bun don't need this to work +import { describe, expect, it } from 'bun:test' describe('utils', () => { it('test bitmask for hardened keys', () => { diff --git a/dlt-connector/src/utils/network.ts b/dlt-connector/src/utils/network.ts new file mode 100644 index 000000000..8c4244c36 --- /dev/null +++ b/dlt-connector/src/utils/network.ts @@ -0,0 +1,51 @@ +import net from 'node:net' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { CONFIG } from '../config' + +export async function isPortOpen( + url: string, + timeoutMs: number = CONFIG.CONNECT_TIMEOUT_MS, +): Promise { + return new Promise((resolve) => { + const socket = new net.Socket() + const { hostname, port } = new URL(url) + + // auto-destroy socket after timeout + const timer = setTimeout(() => { + socket.destroy() + resolve(false) + }, timeoutMs) + + socket.connect(Number(port), hostname, () => { + // connection successful + clearTimeout(timer) + socket.end() + resolve(true) + }) + + socket.on('error', (err: any) => { + clearTimeout(timer) + socket.destroy() + const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.network.isPortOpen`) + logger.addContext('url', url) + logger.error(`${err.message}: ${err.code}`) + resolve(false) + }) + }) +} + +const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) + +export async function isPortOpenRetry( + url: string, + timeoutMs: number = CONFIG.CONNECT_TIMEOUT_MS, + delayMs: number = CONFIG.CONNECT_RETRY_DELAY_MS, + retries: number = CONFIG.CONNECT_RETRY_COUNT, +): Promise { + for (let i = 0; i < retries; i++) { + if (await isPortOpen(url, timeoutMs)) return true + await wait(delayMs) + } + throw new Error(`${url} port is not open after ${retries} retries`) +} \ No newline at end of file diff --git a/dlt-connector/src/utils/typeConverter.test.ts b/dlt-connector/src/utils/typeConverter.test.ts deleted file mode 100644 index 527e9dd17..000000000 --- a/dlt-connector/src/utils/typeConverter.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import 'reflect-metadata' - -import { base64ToBuffer, uuid4ToHash, uuid4ToBuffer } from './typeConverter' - -describe('utils/typeConverter', () => { - it('uuid4ToBuffer', () => { - expect(uuid4ToBuffer('4f28e081-5c39-4dde-b6a4-3bde71de8d65')).toStrictEqual( - Buffer.from('4f28e0815c394ddeb6a43bde71de8d65', 'hex'), - ) - }) - - it('iotaTopicFromCommunityUUID', () => { - expect(uuid4ToHash('4f28e081-5c39-4dde-b6a4-3bde71de8d65')).toBe( - '3138b3590311fdf0a823e173caa9487b7d275c23fab07106b4b1364cb038affd', - ) - }) - - 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 deleted file mode 100644 index 219b95376..000000000 --- a/dlt-connector/src/utils/typeConverter.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* eslint-disable camelcase */ -import { - AddressType, - AddressType_COMMUNITY_AUF, - AddressType_COMMUNITY_GMW, - AddressType_COMMUNITY_HUMAN, - AddressType_COMMUNITY_PROJECT, - AddressType_CRYPTO_ACCOUNT, - AddressType_NONE, - AddressType_SUBACCOUNT, - ConfirmedTransaction, - DeserializeType_CONFIRMED_TRANSACTION, - InteractionDeserialize, - MemoryBlock, -} from 'gradido-blockchain-js' - -import { AccountType } from '@/graphql/enum/AccountType' -import { LogError } from '@/server/LogError' - -export const uuid4ToBuffer = (uuid: string): Buffer => { - // Remove dashes from the UUIDv4 string - const cleanedUUID = uuid.replace(/-/g, '') - - // Create a Buffer object from the hexadecimal values - const buffer = Buffer.from(cleanedUUID, 'hex') - - return buffer -} - -export const uuid4ToMemoryBlock = (uuid: string): MemoryBlock => { - // Remove dashes from the UUIDv4 string - 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() -} - -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, -): T[keyof T] | undefined { - if (typeof value === 'number' && typeof enumType === 'object') { - return enumType[value as keyof T] as T[keyof T] - } else if (typeof value === 'string') { - for (const key in enumType) { - if (enumType[key as keyof T] === value) { - return enumType[key as keyof T] as T[keyof T] - } - } - } - return undefined -} - -export const accountTypeToAddressType = (type: AccountType): 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 - } -} - -export const addressTypeToAccountType = (type: AddressType): 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 - } -} - -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/ApolloServerMock.ts b/dlt-connector/test/ApolloServerMock.ts deleted file mode 100644 index c13df2407..000000000 --- a/dlt-connector/test/ApolloServerMock.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ApolloServer } from '@apollo/server' -import { addMocksToSchema } from '@graphql-tools/mock' - -import { schema } from '@/graphql/schema' - -let apolloTestServer: ApolloServer - -export async function createApolloTestServer() { - if (apolloTestServer === undefined) { - apolloTestServer = new ApolloServer({ - // addMocksToSchema accepts a schema instance and provides - // mocked data for each field in the schema - schema: addMocksToSchema({ - schema: await schema(), - preserveResolvers: true, - }), - }) - } - return apolloTestServer -} diff --git a/dlt-connector/test/testSetup.ts b/dlt-connector/test/testSetup.ts deleted file mode 100644 index 71170cbf0..000000000 --- a/dlt-connector/test/testSetup.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { logger } from '@/logging/logger' - -jest.setTimeout(1000000) - -jest.mock('@/logging/logger', () => { - const originalModule = jest.requireActual('@/logging/logger') - return { - __esModule: true, - ...originalModule, - logger: { - addContext: jest.fn(), - trace: jest.fn(), - debug: jest.fn(), - warn: jest.fn(), - info: jest.fn(), - error: jest.fn(), - fatal: jest.fn(), - }, - } -}) - -export { logger } diff --git a/dlt-connector/tsconfig.json b/dlt-connector/tsconfig.json index 2ce9731e3..51dc1dd77 100644 --- a/dlt-connector/tsconfig.json +++ b/dlt-connector/tsconfig.json @@ -1,88 +1,104 @@ { + "include": ["src/**/*", "types/**/*"], "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ + /* Visit https://aka.ms/tsconfig 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": "./", /* 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'). */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - /* 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. */ + /* Language and Environment */ + "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - /* 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'. */ - "@/*": ["src/*"], - "@arg/*": ["src/graphql/arg/*"], - "@enum/*": ["src/graphql/enum/*"], - "@input/*": ["src/graphql/input/*"], - "@model/*": ["src/graphql/model/*"], - "@resolver/*": ["src/graphql/resolver/*"], - "@test/*": ["test/*"], - "@proto/*" : ["src/proto/*"], - "@validator/*" : ["src/graphql/validator/*"], - }, - // "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. */ - // "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. */ + /* Modules */ + "module": "ES2022", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + "types": ["bun-types"], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - /* 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. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - /* Experimental Options */ - "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - }, - "references": [ - { - // add 'prepend' if you want to include the referenced project in your output file - // "prepend": true - } - ] + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } } diff --git a/dlt-connector/types/global.d.ts b/dlt-connector/types/global.d.ts new file mode 100644 index 000000000..793328940 --- /dev/null +++ b/dlt-connector/types/global.d.ts @@ -0,0 +1,2 @@ +// types/global.d.ts +/// = 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -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== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -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== - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -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" - -import-local@^3.0.2: - 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" - -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.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, 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== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -iniparser@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/iniparser/-/iniparser-1.0.5.tgz#836d6befe6dfbfcee0bccf1cf9f2acc7027f783d" - integrity sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw== - -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -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" - -ipaddr.js@1.9.1: - version "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.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-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -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-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -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.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, 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: - 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@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -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-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - 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-potential-custom-element-name@^1.0.1: - version "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-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-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-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-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -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== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - 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" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - 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" - -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" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.0.0, jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.2.4: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== - dependencies: - "@jest/core" "^27.5.1" - import-local "^3.0.2" - jest-cli "^27.5.1" - -jose@^5.2.2: - 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" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.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" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -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@2.x, json5@^2.2.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -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" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - 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" - -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" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.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" - -libphonenumber-js@^1.10.53: - 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" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.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.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.get@^4.4.2: - version "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" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -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== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash@^4.17.19, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log4js@^6.7.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" - integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - flatted "^3.2.7" - rfdc "^1.3.0" - streamroller "^3.1.5" - -loglevel@^1.6.8: - 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== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -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" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -make-error@1.x, 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== - -make-promises-safe@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/make-promises-safe/-/make-promises-safe-5.1.0.tgz#dd9d311f555bcaa144f12e225b3d37785f0aa8f2" - integrity sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g== - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -media-typer@0.3.0: - version "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" - 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== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -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" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -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-response@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" - integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== - -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" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -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" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -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== - -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== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.1: - version "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.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== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -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" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -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== - -negotiator@0.6.3, negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -neon-cli@^0.8: - version "0.8.3" - resolved "https://registry.yarnpkg.com/neon-cli/-/neon-cli-0.8.3.tgz#dea3a00021a07b9ef05e73464e45c94a2bf0fd3a" - integrity sha512-I44MB8PD0AEyFr/b5icR4sX1tsjdkb2T2uWEStG4Uf5C/jzalZPn7eazbQrW6KDyXNd8bc+LVuOr1v6CGTa1KQ== - dependencies: - chalk "^4.1.0" - command-line-args "^5.1.1" - command-line-commands "^3.0.1" - command-line-usage "^6.1.0" - git-config "0.0.7" - handlebars "^4.7.6" - inquirer "^7.3.3" - make-promises-safe "^5.1.0" - rimraf "^3.0.2" - semver "^7.3.2" - toml "^3.0.0" - ts-typed-json "^0.3.2" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^3.0.0" - -node-abi@^2.21.0: - version "2.30.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" - integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== - 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" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -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.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" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258" - integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ== - dependencies: - chokidar "^3.5.2" - debug "^3.2.7" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^5.7.1" - simple-update-notifier "^1.0.7" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -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" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - 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" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - 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.12" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" - integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== - -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== - -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.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.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -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.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -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.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.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" - -onetime@^5.1.0, 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" - -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" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -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@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.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" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -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" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -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== - -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.0.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-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-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" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -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, 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" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pirates@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - 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" - integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== - dependencies: - detect-libc "^1.0.3" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^2.21.0" - npmlog "^4.0.1" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^3.0.3" - 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" - 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== - -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -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== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -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" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - 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" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -pump@^3.0.0: - 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.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -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.6" - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -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== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - 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" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -readable-stream@^2.0.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - 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@^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== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reduce-flatten@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" - integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== - -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== - -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== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -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-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -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.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== - -resolve@^1.20.0, resolve@^1.22.1, 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" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -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== - -rfdc@^1.3.0: - 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" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.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" - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -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.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: - 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": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.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" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -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" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -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 "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.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-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" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -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, 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.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.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== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" - integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-update-notifier@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" - integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== - dependencies: - semver "~7.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -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" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" - integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - 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" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - 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" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -streamroller@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" - integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - fs-extra "^8.1.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - 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.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.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.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@^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" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - 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-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-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -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-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== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, 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-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.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== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table-layout@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" - integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== - dependencies: - array-back "^4.0.1" - deep-extend "~0.6.0" - typical "^5.2.0" - wordwrapjs "^4.0.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -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== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - 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" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -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== - -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -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" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -touch@^3.1.0: - 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.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" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-jest@^27.0.5: - version "27.1.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.5.tgz#0ddf1b163fbaae3d5b7504a1e65c914a95cff297" - integrity sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-node@^10.9.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" - -ts-typed-json@^0.3.2: - version "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.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" - -tsconfig-paths@^4.1.2: - version "4.2.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -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" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.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-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -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== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-graphql@^2.0.0-beta.2: - 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: - "@graphql-yoga/subscription" "^5.0.0" - "@types/node" "^20.14.0" - "@types/semver" "^7.5.6" - graphql-query-complexity "^0.12.0" - semver "^7.5.4" - tslib "^2.6.2" - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -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" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.9.4: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -typical@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" - integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== - -uglify-js@^3.1.4: - 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" - 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" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -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" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^0.2.0: - version "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.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.2" - picocolors "^1.0.1" - -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" - -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" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.1, 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== - -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" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^9.0.0, uuid@^9.0.1: - 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== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== - dependencies: - builtins "^1.0.3" - -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" - resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" - integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-mimetype@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -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@^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.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" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wordwrapjs@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" - integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== - dependencies: - reduce-flatten "^2.0.0" - typical "^5.2.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" - -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== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.4.6: - 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" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -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@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -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.x, 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.2.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.7.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== From 6e2269a4992a1e3cf5837d1fbd7158404ab44903 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 1 Aug 2025 12:54:26 +0200 Subject: [PATCH 25/72] introduce valibot, elysia.js, trpc and drop apollo/graphql-server --- bun.lock | 5 + dlt-connector/bun.lock | 6 +- dlt-connector/package.json | 2 +- dlt-connector/src/client/GradidoNode/api.ts | 167 +++++++++++++++++ .../src/client/GradidoNode/input.schema.ts | 49 ++--- .../src/client/GradidoNode/jsonrpc.api.ts | 174 ------------------ .../src/client/GradidoNode/jsonrpc.ts | 54 ++++++ .../src/client/{ => backend}/BackendClient.ts | 6 +- .../backend/community.schema.test.ts} | 6 +- .../backend/community.schema.ts} | 4 +- dlt-connector/src/data/Uuidv4Hash.ts | 33 ++++ dlt-connector/src/enum/AccountType.ts | 3 +- dlt-connector/src/enum/AddressType.ts | 2 + dlt-connector/src/index.ts | 37 ++-- .../AbstractRemoteKeyPair.role.ts | 2 +- .../ForeignCommunityKeyPair.role.ts | 2 +- .../RemoteAccountKeyPair.role.ts | 2 +- .../CommunityRootTransaction.role.ts | 2 +- dlt-connector/src/schemas/account.schema.ts | 3 +- dlt-connector/src/schemas/base.schema.ts | 11 ++ .../src/schemas/transaction.schema.ts | 22 +-- .../src/schemas/typeConverter.schema.test.ts | 12 +- .../src/schemas/typeConverter.schema.ts | 89 ++------- .../src/schemas/typeGuard.schema.test.ts | 70 ++----- dlt-connector/src/schemas/typeGuard.schema.ts | 113 ++++++++---- dlt-connector/src/server/index.ts | 77 ++++++++ dlt-connector/src/utils/typeConverter.ts | 72 ++++++++ 27 files changed, 607 insertions(+), 418 deletions(-) create mode 100644 dlt-connector/src/client/GradidoNode/api.ts delete mode 100644 dlt-connector/src/client/GradidoNode/jsonrpc.api.ts create mode 100644 dlt-connector/src/client/GradidoNode/jsonrpc.ts rename dlt-connector/src/client/{ => backend}/BackendClient.ts (93%) rename dlt-connector/src/{schemas/rpcParameter.schema.test.ts => client/backend/community.schema.test.ts} (76%) rename dlt-connector/src/{schemas/rpcParameter.schema.ts => client/backend/community.schema.ts} (79%) create mode 100644 dlt-connector/src/data/Uuidv4Hash.ts create mode 100644 dlt-connector/src/schemas/base.schema.ts create mode 100644 dlt-connector/src/server/index.ts create mode 100644 dlt-connector/src/utils/typeConverter.ts diff --git a/bun.lock b/bun.lock index 7087ef10f..c6242a0e6 100644 --- a/bun.lock +++ b/bun.lock @@ -184,12 +184,15 @@ "dependencies": { "database": "*", "esbuild": "^0.25.2", + "jose": "^4.14.4", "log4js": "^6.9.1", + "shared": "*", "zod": "^3.25.61", }, "devDependencies": { "@biomejs/biome": "2.0.0", "@types/node": "^17.0.21", + "type-graphql": "^1.1.1", "typescript": "^4.9.5", }, }, @@ -295,6 +298,7 @@ "await-semaphore": "0.1.3", "class-validator": "^0.13.2", "config-schema": "*", + "core": "*", "cors": "2.8.5", "database": "*", "decimal.js-light": "^2.5.1", @@ -423,6 +427,7 @@ "dependencies": { "decimal.js-light": "^2.5.1", "esbuild": "^0.25.2", + "jose": "^4.14.4", "log4js": "^6.9.1", "zod": "^3.25.61", }, diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 80b8a8c7b..2d3860900 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -5,7 +5,7 @@ "name": "dlt-connector", "dependencies": { "@iota/client": "^2.2.4", - "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#217d03b", + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#9a5f392", }, "devDependencies": { "@biomejs/biome": "2.0.0", @@ -232,7 +232,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#217d03b", { "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" } }, "gradido-gradido-blockchain-js-217d03b"], + "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#9a5f392", { "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#65d94455fab86b902c0d59bb9c06ac70470e56b2" } }, "gradido-gradido-blockchain-js-9a5f392"], "graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], @@ -356,7 +356,7 @@ "prebuild-install": ["prebuild-install@6.1.4", "", { "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^2.21.0", "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^3.0.3", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ=="], - "prebuildify": ["prebuildify@github:einhornimmond/prebuildify#91f4e76", { "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" }, "bin": { "prebuildify": "./bin.js" } }, "einhornimmond-prebuildify-91f4e76"], + "prebuildify": ["prebuildify@github:einhornimmond/prebuildify#65d9445", { "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" }, "bin": { "prebuildify": "./bin.js" } }, "einhornimmond-prebuildify-65d9445"], "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], diff --git a/dlt-connector/package.json b/dlt-connector/package.json index bb935e8c7..08804bc0f 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -12,7 +12,7 @@ "lint:fix": "biome check --error-on-warnings . --write" }, "dependencies": { - "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#217d03b", + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#9a5f392", "@iota/client": "^2.2.4" }, "devDependencies": { diff --git a/dlt-connector/src/client/GradidoNode/api.ts b/dlt-connector/src/client/GradidoNode/api.ts new file mode 100644 index 000000000..fa8672a23 --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/api.ts @@ -0,0 +1,167 @@ +import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import * as v from 'valibot' +import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' +import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' +import { rpcCall, rpcCallResolved, GradidoNodeRequestError } from './jsonrpc' +import { + TransactionsRangeInput, + TransactionIdentifierInput, + transactionsRangeSchema, + transactionIdentifierSchema +} from './input.schema' +import { Uuidv4Hash } from '../../data/Uuidv4Hash' +import { Hex32, Hex32Input, hex32Schema } from '../../schemas/typeGuard.schema' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) + +/** + * getTransactions + * get list of confirmed transactions from a specific community + * @param input fromTransactionId is the id of the first transaction to return + * @param input maxResultCount is the max number of transactions to return + * @param input topic is the community topic + * @returns list of confirmed transactions + * @throws GradidoNodeRequestError + * @example + * ``` + * const transactions = await getTransactions({ + * fromTransactionId: 1, + * maxResultCount: 100, + * topic: communityUuid, + * }) + * ``` + */ +async function getTransactions(input: TransactionsRangeInput): Promise { + const parameter = { ...v.parse(transactionsRangeSchema, input), format: 'base64' } + const result = await rpcCallResolved<{transactions: string[]}>('getTransactions', parameter) + return result.transactions.map((transactionBase64) => + v.parse(confirmedTransactionSchema, transactionBase64), + ) +} + +/** + * getTransaction + * get a specific confirmed transaction from a specific community + * @param transactionIdentifier + * @returns the confirmed transaction or undefined if transaction is not found + * @throws GradidoNodeRequestError + */ +async function getTransaction(transactionIdentifier: TransactionIdentifierInput) +: Promise { + const parameter = { + ...v.parse(transactionIdentifierSchema, transactionIdentifier), + format: 'base64', + } + const response = await rpcCall<{ transaction: string }>('gettransaction', parameter) + if (response.isSuccess()) { + return v.parse(confirmedTransactionSchema, response.result.transaction) + } + if (response.isError()) { + if (response.error.code === GradidoNodeErrorCodes.TRANSACTION_NOT_FOUND) { + return undefined + } + } + throw new GradidoNodeRequestError(response.error.message, response) +} + +/** + * getLastTransaction + * get the last confirmed transaction from a specific community + * @param iotaTopic the community topic + * @returns the last confirmed transaction or undefined if blockchain for community is empty or not found + * @throws GradidoNodeRequestError + */ + +async function getLastTransaction(iotaTopic: Uuidv4Hash): Promise { + const response = await rpcCall<{ transaction: string }>('getlasttransaction', { + format: 'base64', + topic: iotaTopic.getAsHexString(), + }) + if (response.isSuccess()) { + return v.parse(confirmedTransactionSchema, response.result.transaction) + } + if (response.isError()) { + if (response.error.code === GradidoNodeErrorCodes.GRADIDO_NODE_ERROR) { + return undefined + } + throw new GradidoNodeRequestError(response.error.message, response) + } +} + +/** + * getAddressType + * get the address type of a specific user + * can be used to check if user/account exists on blockchain + * look also for gmw, auf and deferred transfer accounts + * @param pubkey the public key of the user or account + * @param iotaTopic the community topic + * @returns the address type of the user/account or undefined + * @throws GradidoNodeRequestError + */ + +async function getAddressType(pubkey: Hex32Input, iotaTopic: Uuidv4Hash): Promise { + const parameter = { + pubkey: v.parse(hex32Schema, pubkey), + communityId: iotaTopic.getAsHexString(), + } + const response = await rpcCallResolved<{ addressType: string }>('getaddresstype', parameter) + return v.parse(addressTypeSchema, response.addressType) +} + +/** + * findUserByNameHash + * find a user by name hash + * @param nameHash the name hash of the user + * @param iotaTopic the community topic + * @returns the public key of the user as hex32 string or undefined if user is not found + * @throws GradidoNodeRequestError + */ +async function findUserByNameHash(nameHash: Uuidv4Hash, iotaTopic: Uuidv4Hash): Promise { + const parameter = { + nameHash: nameHash.getAsHexString(), + communityId: iotaTopic.getAsHexString(), + } + const response = await rpcCall<{ pubkey: string; timeUsed: string }>('findUserByNameHash', parameter) + if(response.isSuccess()) { + logger.info(`call findUserByNameHash, used ${response.result.timeUsed}`) + return v.parse(hex32Schema, response.result.pubkey) + } + if (response.isError() && response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND) { + logger.debug(`call findUserByNameHash, return with error: ${response.error.message}`) + } + return undefined +} + +/** + * getTransactionsForAccount + * get list of confirmed transactions for a specific account + * @param transactionRange the range of transactions to return + * @param pubkey the public key of the account + * @returns list of confirmed transactions + * @throws GradidoNodeRequestError + */ +async function getTransactionsForAccount( + transactionRange: TransactionsRangeInput, + pubkey: Hex32Input, +): Promise { + const parameter = { + ...v.parse(transactionsRangeSchema, transactionRange), + pubkey: v.parse(hex32Schema, pubkey), + format: 'base64', + } + const response = await rpcCallResolved<{transactions: string[]}>('listtransactionsforaddress', parameter) + return response.transactions.map((transactionBase64) => + v.parse(confirmedTransactionSchema, transactionBase64), + ) +} + +export { + getTransaction, + getLastTransaction, + getTransactions, + getAddressType, + getTransactionsForAccount, + findUserByNameHash, +} diff --git a/dlt-connector/src/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts index 27b4ad79e..b207f935a 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -1,33 +1,36 @@ import * as v from 'valibot' -import { uuid4ToTopicSchema } from '../../schemas/typeConverter.schema' +import { hex32Schema, iotaMessageIdSchema } from '../../schemas/typeGuard.schema' -export enum TransactionFormatType { - BASE64 = 'base64', - JSON = 'json', -} - -export const transactionFormatTypeSchema = v.nullish( - v.enum(TransactionFormatType), - TransactionFormatType.BASE64 -) - -export type TransactionFormatTypeInput = v.InferInput - -export const getTransactionsInputSchema = v.object({ - format: transactionFormatTypeSchema, +export const transactionsRangeSchema = v.object({ // default value is 1, from first transactions fromTransactionId: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), // default value is 100, max 100 transactions maxResultCount: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), - communityId: uuid4ToTopicSchema, + topic: hex32Schema, }) -export type GetTransactionsInputType = v.InferInput +export type TransactionsRangeInput = v.InferInput -export const getTransactionInputSchema = v.object({ - transactionIdentifier: v.object({ - iotaTopic: uuid4ToTopicSchema, - transactionNr: v.number(), - iotaMessageId: v.string(), + +// allow TransactionIdentifier to only contain either transactionNr or iotaMessageId +export const transactionIdentifierSchema = v.pipe( + v.object({ + transactionNr: v.nullish( + v.pipe(v.number('expect number type'), v.minValue(1, 'expect number >= 1')), + undefined + ), + iotaMessageId: v.nullish(iotaMessageIdSchema, undefined), + topic: hex32Schema, }), -}) \ No newline at end of file + v.custom((value: any) => { + const setFieldsCount = Number(value.transactionNr !== undefined) + Number(value.iotaMessageId !== undefined) + if (setFieldsCount !== 1) { + return false + } + return true + }, 'expect transactionNr or iotaMessageId not both') +) + +export type TransactionIdentifierInput = v.InferInput +export type TransactionIdentifier = v.InferOutput + diff --git a/dlt-connector/src/client/GradidoNode/jsonrpc.api.ts b/dlt-connector/src/client/GradidoNode/jsonrpc.api.ts deleted file mode 100644 index 83a700b4d..000000000 --- a/dlt-connector/src/client/GradidoNode/jsonrpc.api.ts +++ /dev/null @@ -1,174 +0,0 @@ -/* eslint-disable camelcase */ -import { AddressType, ConfirmedTransaction, MemoryBlock, 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 { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import * as v from 'valibot' -import { confirmedTransactionFromBase64Schema } from '../../schemas/typeConverter.schema' -import { isPortOpenRetry } from '../../utils/network' -import { TransactionIdentifierInput, transactionIdentifierSchema } from '../../schemas/transaction.schema' -import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' -import { GetTransactionsInputType, TransactionFormatTypeInput, getTransactionsInputSchema, transactionFormatTypeSchema } from './input.schema' - -const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) - -const client = new JsonRpcClient({ - url: CONFIG.NODE_SERVER_URL, -}) - - -interface ConfirmedTransactionList { - transactions: string[] - timeUsed: string -} - -interface ConfirmedTransactionResponse { - transaction: string - timeUsed: string -} - -interface AddressTypeResult { - addressType: string -} - -interface FindUserResponse { - pubkey: string - timeUsed: string -} - -export class GradidoNodeRequestError extends Error { - private response?: JsonRpcEitherResponse - constructor(message: string, response?: JsonRpcEitherResponse) { - super(message) - this.name = 'GradidoNodeRequestError' - this.response = response - } - getResponse(): JsonRpcEitherResponse | undefined { - return this.response - } -} - -function resolveResponse(response: JsonRpcEitherResponse, onSuccess: (result: T) => R): R { - if (response.isSuccess()) { - return onSuccess(response.result) - } else if (response.isError()) { - throw new GradidoNodeRequestError(response.error.message, response) - } - throw new GradidoNodeRequestError('no success and no error') -} - -async function getTransactions(input: GetTransactionsInputType): Promise { - const parameter = v.parse(getTransactionsInputSchema, input) - logger.debug('call getTransactions with ', parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - const response = await client.exec('getTransactions', parameter) - return resolveResponse(response, (result: ConfirmedTransactionList) => { - logger.info(`call getTransactions, used ${result.timeUsed}`) - return result.transactions.map((transactionBase64) => - v.parse(confirmedTransactionFromBase64Schema, transactionBase64), - ) - }) -} - -async function getTransaction( - transactionIdentifier: TransactionIdentifierInput, - format: TransactionFormatTypeInput -) -: Promise { - const parameter = { - ...v.parse(transactionIdentifierSchema, transactionIdentifier), - format: v.parse(transactionFormatTypeSchema, format), - } - logger.debug('call gettransaction with ', parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - const response = await client.exec('gettransaction', parameter) - return resolveResponse(response, (result: ConfirmedTransactionResponse) => { - logger.info(`call gettransaction, used ${result.timeUsed}`) - return result.transaction && result.transaction !== '' - ? v.parse(confirmedTransactionFromBase64Schema, result.transaction) - : undefined - }) -} - -async function getLastTransaction(iotaTopic: string): Promise { - const parameter = { - format: 'base64', - communityId: iotaTopic, - } - logger.debug('call getlasttransaction with ', parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - const response = await client.exec('getlasttransaction', parameter) - return resolveResponse(response, (result: ConfirmedTransactionResponse) => { - logger.info(`call getlasttransaction, used ${result.timeUsed}`) - return result.transaction && result.transaction !== '' - ? v.parse(confirmedTransactionFromBase64Schema, result.transaction) - : undefined - }) -} - -async function getAddressType(pubkey: Buffer, iotaTopic: string): Promise { - const parameter = { - pubkey: pubkey.toString('hex'), - communityId: iotaTopic, - } - logger.debug('call getaddresstype with ', parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - const response = await client.exec('getaddresstype', parameter) - return resolveResponse(response, (result: AddressTypeResult) => { - logger.info(`call getaddresstype`) - return stringToAddressType(result.addressType) - }) -} - -async function findUserByNameHash(nameHash: MemoryBlock, iotaTopic: string): Promise { - const parameter = { - nameHash: nameHash.convertToHex(), - communityId: iotaTopic, - } - logger.debug('call findUserByNameHash with ', parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - const response = await client.exec('findUserByNameHash', parameter) - if (response.isError() && response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND) { - return undefined - } - return resolveResponse(response, (result: FindUserResponse) => { - logger.info(`call findUserByNameHash, used ${result.timeUsed}`) - return result.pubkey && result.pubkey !== '' ? MemoryBlock.fromHex(result.pubkey) : undefined - }) -} - -async function getTransactionsForAccount( - pubkey: MemoryBlock, - iotaTopic: string, - maxResultCount = 0, - firstTransactionNr = 1, -): Promise { - const parameter = { - pubkey: pubkey.convertToHex(), - format: 'base64', - firstTransactionNr, - maxResultCount, - communityId: iotaTopic, - } - logger.debug('call listtransactionsforaddress with ', parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - const response = await client.exec('listtransactionsforaddress', parameter) - return resolveResponse(response, (result: ConfirmedTransactionList) => { - logger.info(`call listtransactionsforaddress, used ${result.timeUsed}`) - return result.transactions.map((transactionBase64) => - v.parse(confirmedTransactionFromBase64Schema, transactionBase64), - ) - }) -} - -export { - getTransaction, - getLastTransaction, - getTransactions, - getAddressType, - getTransactionsForAccount, - findUserByNameHash, -} diff --git a/dlt-connector/src/client/GradidoNode/jsonrpc.ts b/dlt-connector/src/client/GradidoNode/jsonrpc.ts new file mode 100644 index 000000000..6cd053d87 --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/jsonrpc.ts @@ -0,0 +1,54 @@ +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' +import { isPortOpenRetry } from '../../utils/network' +import { CONFIG } from '../../config' +import JsonRpcClient from 'jsonrpc-ts-client' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) + +export const client = new JsonRpcClient({ + url: CONFIG.NODE_SERVER_URL, +}) + +export class GradidoNodeRequestError extends Error { + private response?: JsonRpcEitherResponse + constructor(message: string, response?: JsonRpcEitherResponse) { + super(message) + this.name = 'GradidoNodeRequestError' + this.response = response + } + getResponse(): JsonRpcEitherResponse | undefined { + return this.response + } +} + +// return result on success or throw error +export function resolveResponse(response: JsonRpcEitherResponse, onSuccess: (result: T) => R): R { + if (response.isSuccess()) { + return onSuccess(response.result) + } else if (response.isError()) { + throw new GradidoNodeRequestError(response.error.message, response) + } + throw new GradidoNodeRequestError('no success and no error') +} + +type WithTimeUsed = T & { timeUsed?: string } + +// template rpcCall, check first if port is open before executing json rpc 2.0 request +export async function rpcCall(method: string, parameter: any): Promise> { + logger.debug('call %s with %s', method, parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + return client.exec(method, parameter) +} + +// template rpcCall, check first if port is open before executing json rpc 2.0 request, throw error on failure, return result on success +export async function rpcCallResolved(method: string, parameter: any): Promise { + const response = await rpcCall>(method, parameter) + return resolveResponse(response, (result: WithTimeUsed) => { + if (result.timeUsed) { + logger.info(`call %s, used ${result.timeUsed}`, method) + } + return result as T + }) +} \ No newline at end of file diff --git a/dlt-connector/src/client/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts similarity index 93% rename from dlt-connector/src/client/BackendClient.ts rename to dlt-connector/src/client/backend/BackendClient.ts index 4ee556f17..50904d198 100644 --- a/dlt-connector/src/client/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -1,10 +1,10 @@ import { gql, GraphQLClient } from 'graphql-request' import { SignJWT } from 'jose' -import { CONFIG } from '../config' -import { communitySchema, type Community } from '../schemas/rpcParameter.schema' +import { CONFIG } from '../../config' +import { communitySchema, type Community } from './community.schema' import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' const homeCommunity = gql` diff --git a/dlt-connector/src/schemas/rpcParameter.schema.test.ts b/dlt-connector/src/client/backend/community.schema.test.ts similarity index 76% rename from dlt-connector/src/schemas/rpcParameter.schema.test.ts rename to dlt-connector/src/client/backend/community.schema.test.ts index 8680c3958..42cf9dc7e 100644 --- a/dlt-connector/src/schemas/rpcParameter.schema.test.ts +++ b/dlt-connector/src/client/backend/community.schema.test.ts @@ -1,10 +1,10 @@ -import { communitySchema } from './rpcParameter.schema' -import { uuidv4Schema } from './typeGuard.schema' +import { communitySchema } from './community.schema' +import { uuidv4Schema } from '../../schemas/typeGuard.schema' import * as v from 'valibot' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' -describe('rpcParameter.schema', () => { +describe('community.schema', () => { it('community', () => { expect(v.parse(communitySchema, { uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', diff --git a/dlt-connector/src/schemas/rpcParameter.schema.ts b/dlt-connector/src/client/backend/community.schema.ts similarity index 79% rename from dlt-connector/src/schemas/rpcParameter.schema.ts rename to dlt-connector/src/client/backend/community.schema.ts index 0a05dd86c..af8cf01bd 100644 --- a/dlt-connector/src/schemas/rpcParameter.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -1,6 +1,6 @@ import * as v from 'valibot' -import { uuidv4Schema } from './typeGuard.schema' -import { dateSchema } from './typeConverter.schema' +import { uuidv4Schema } from '../../schemas/typeGuard.schema' +import { dateSchema } from '../../schemas/typeConverter.schema' /** * Schema Definitions for rpc call parameter, when dlt-connector is called from backend diff --git a/dlt-connector/src/data/Uuidv4Hash.ts b/dlt-connector/src/data/Uuidv4Hash.ts new file mode 100644 index 000000000..541f412d2 --- /dev/null +++ b/dlt-connector/src/data/Uuidv4Hash.ts @@ -0,0 +1,33 @@ +import { MemoryBlock } from 'gradido-blockchain-js' +import { Uuidv4, Hex32, hex32Schema, MemoryBlock32, memoryBlock32Schema } from '../schemas/typeGuard.schema' +import * as v from 'valibot' + +/** + * Uuidv4Hash is a class that represents a uuidv4 BLAKE2b hash + * to get the hash, the - in the uuidv4 will be removed and the result interpreted as hex string + * then the hash will be calculated with BLAKE2b algorithm + * crypto_generichash from libsodium will be called when calling MemoryBlock.calculateHash() + * + * This will be used as NameHash for user identification (user uuid as input) + * This will be used as IotaTopic for transactions (community uuid as input) + */ +export class Uuidv4Hash { + uuidv4Hash: MemoryBlock32 + // used for caching hex string representation of uuidv4Hash + uuidv4HashString: Hex32 | undefined + + constructor(uuidv4: Uuidv4) { + this.uuidv4Hash = v.parse(memoryBlock32Schema, MemoryBlock.fromHex(uuidv4.replace(/-/g, '')).calculateHash()) + } + + getAsMemoryBlock(): MemoryBlock32 { + return this.uuidv4Hash + } + + getAsHexString(): Hex32 { + if (!this.uuidv4HashString) { + this.uuidv4HashString = v.parse(hex32Schema, this.uuidv4Hash) + } + return this.uuidv4HashString + } +} diff --git a/dlt-connector/src/enum/AccountType.ts b/dlt-connector/src/enum/AccountType.ts index 8d8e5fcc0..b1c2b1150 100644 --- a/dlt-connector/src/enum/AccountType.ts +++ b/dlt-connector/src/enum/AccountType.ts @@ -10,5 +10,6 @@ export enum AccountType { 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 + CRYPTO_ACCOUNT = 'CRYPTO_ACCOUNT', // user control his keys, no creations, + DEFERRED_TRANSFER = 'DEFERRED_TRANSFER', // no creations allowed } diff --git a/dlt-connector/src/enum/AddressType.ts b/dlt-connector/src/enum/AddressType.ts index 0e0d8bb30..8ac2f05fc 100644 --- a/dlt-connector/src/enum/AddressType.ts +++ b/dlt-connector/src/enum/AddressType.ts @@ -6,6 +6,7 @@ import { AddressType_CRYPTO_ACCOUNT, AddressType_NONE, AddressType_SUBACCOUNT, + AddressType_DEFERRED_TRANSFER, } from 'gradido-blockchain-js' export enum AddressType { @@ -16,4 +17,5 @@ export enum AddressType { CRYPTO_ACCOUNT = AddressType_CRYPTO_ACCOUNT, NONE = AddressType_NONE, SUBACCOUNT = AddressType_SUBACCOUNT, + DEFERRED_TRANSFER = AddressType_DEFERRED_TRANSFER, } \ No newline at end of file diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index ce5ab8fb3..7681719ed 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -4,11 +4,13 @@ import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' import { getLogger, configure } from 'log4js' import { readFileSync } from 'node:fs' import { isPortOpenRetry } from './utils/network' -import { BackendClient } from './client/BackendClient' +import { BackendClient } from './client/backend/BackendClient' import { KeyPairCacheManager } from './KeyPairCacheManager' -import { communityUuidToTopicSchema } from './schemas/rpcParameter.schema' -import { parse } from 'valibot' -import { getTransaction } from './client/GradidoNode/jsonrpc.api' +import { getTransaction } from './client/GradidoNode/api' +import { Uuidv4Hash } from './data/Uuidv4Hash' +import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' +import { keyGenerationSeedSchema } from './schemas/base.schema' +import * as v from 'valibot' async function main() { // configure log4js @@ -16,21 +18,12 @@ async function main() { const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8')) configure(options) const logger = getLogger('dlt') - // TODO: replace with schema validation - if (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 (error) { - logger.error( - 'IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long', - ) - process.exit(1) - } + // check if valid seed for root key pair generation is present + if (!v.safeParse(keyGenerationSeedSchema, CONFIG.IOTA_HOME_COMMUNITY_SEED).success) { + logger.error('IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long') + process.exit(1) } - + // load crypto keys for gradido blockchain lib loadCryptoKeys( MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), @@ -46,19 +39,19 @@ async function main() { await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) const homeCommunity = await backend.getHomeCommunityDraft() KeyPairCacheManager.getInstance().setHomeCommunityUUID(homeCommunity.uuid) - logger.info('home community topic: %s', parse(communityUuidToTopicSchema, homeCommunity.uuid)) + const topic = new Uuidv4Hash(homeCommunity.uuid).getAsHexString() + logger.info('home community topic: %s', topic) logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) // ask gradido node if community blockchain was created try { - const topic = parse(communityUuidToTopicSchema, homeCommunity.uuid) - if (!await getTransaction(1, topic)) { + if (!await getTransaction({ transactionNr: 1, topic })) { // if not exist, create community root transaction await SendToIotaContext(homeCommunity) } } catch (e) { logger.error('error requesting gradido node: ', e) } - + // listen for rpc request from backend (replace graphql with json rpc) const app = new Elysia() .get('/', () => "Hello Elysia") .listen(CONFIG.DLT_CONNECTOR_PORT, () => { diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts index 0a4168f0d..235deadac 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts @@ -1,5 +1,5 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { communityUuidToTopicSchema } from '../../schemas/rpcParameter.schema' +import { communityUuidToTopicSchema } from '../../client/backend/community.schema' import * as v from 'valibot' export abstract class AbstractRemoteKeyPairRole { diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts index f4b25cd57..803b1d216 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -1,6 +1,6 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { getTransaction } from '../../client/GradidoNode/jsonrpc.api' +import { getTransaction } from '../../client/GradidoNode/api' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' import { GradidoNodeInvalidTransactionError, GradidoNodeMissingTransactionError } from '../../errors' diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts index 6432366f4..4ae1af7d9 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -1,6 +1,6 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { findUserByNameHash } from '../../client/GradidoNode/jsonrpc.api' +import { findUserByNameHash } from '../../client/GradidoNode/api' import { IdentifierAccount } from '../../schemas/account.schema' import { GradidoNodeMissingUserError, ParameterError } from '../../errors' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' diff --git a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts index 8771c6789..3beaa633d 100644 --- a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts @@ -10,7 +10,7 @@ import { import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' -import { Community, CommunityInput, communitySchema } from '../../schemas/rpcParameter.schema' +import { Community, CommunityInput, communitySchema } from '../../client/backend/community.schema' import * as v from 'valibot' export class CommunityRootTransactionRole extends AbstractTransactionRole { diff --git a/dlt-connector/src/schemas/account.schema.ts b/dlt-connector/src/schemas/account.schema.ts index 4242558b3..ee85b5cea 100644 --- a/dlt-connector/src/schemas/account.schema.ts +++ b/dlt-connector/src/schemas/account.schema.ts @@ -1,6 +1,5 @@ - import * as v from 'valibot' -import { uuidv4Schema } from './typeConverter.schema' +import { uuidv4Schema } from './typeGuard.schema' // use code from transaction links export const identifierSeedSchema = v.object({ diff --git a/dlt-connector/src/schemas/base.schema.ts b/dlt-connector/src/schemas/base.schema.ts new file mode 100644 index 000000000..8a9f3af3d --- /dev/null +++ b/dlt-connector/src/schemas/base.schema.ts @@ -0,0 +1,11 @@ +import * as v from 'valibot' +import { MemoryBlock } from 'gradido-blockchain-js' + +export const keyGenerationSeedSchema = v.pipe( + v.string('expect string type'), + v.hexadecimal('expect hexadecimal string'), + v.length(64, 'expect seed length minimum 64 characters (32 Bytes)'), + v.transform( + (input: string) => MemoryBlock.fromHex(input), + ), +) \ No newline at end of file diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index 1a2bdae44..ac654da5e 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -4,29 +4,9 @@ import { identifierAccountSchema } from './account.schema' import { InputTransactionType } from '../enum/InputTransactionType' import { accountTypeToAddressTypeSchema } from './typeConverter.schema' -// allow TransactionIdentifier to only contain either transactionNr or iotaMessageId -export const transactionIdentifierSchema = v.pipe( - v.object({ - transactionNr: v.nullish( - v.pipe(v.number('expect number type'), v.minValue(0, 'expect number >= 0')), - 0 - ), - iotaMessageId: v.nullish(iotaMessageIdSchema, undefined), - communityId: uuid4ToTopicSchema, - }), - v.custom((value: any) => { - const setFieldsCount = Number(value.transactionNr !== 0) + Number(value.iotaMessageId !== undefined) - if (setFieldsCount !== 1) { - return false - } - return true - }, 'expect transactionNr or iotaMessageId not both') -) -export type TransactionIdentifierInput = v.InferInput -export type TransactionIdentifier = v.InferOutput export const transactionSchema = v.object({ - user: identifierAccountSchema, + user: identifierAccountScmhema, linkedUser: v.nullish(identifierAccountSchema, undefined), amount: v.nullish(amountToGradidoUnitSchema, undefined), memo: v.nullish(memoSchema, undefined), diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index b4ca7b7c3..7537e3b59 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -1,10 +1,10 @@ -import { accountTypeSchema, addressTypeSchema, confirmedTransactionFromBase64Schema } from './typeConverter.schema' +import { accountTypeSchema, addressTypeSchema, confirmedTransactionSchema } from './typeConverter.schema' import * as v from 'valibot' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' import { dateSchema } from './typeConverter.schema' -import { AddressType_COMMUNITY_AUF } from 'gradido-blockchain-js' +import { AddressType_COMMUNITY_AUF, AddressType_COMMUNITY_PROJECT } from 'gradido-blockchain-js' import { AccountType } from '../enum/AccountType' describe('basic.schema', () => { @@ -24,6 +24,10 @@ describe('basic.schema', () => { }) describe('AddressType and AccountType', () => { + it('AddressType from string', () => { + const addressType = v.parse(addressTypeSchema, 'COMMUNITY_AUF') + expect(addressType).toBe(AddressType_COMMUNITY_AUF) + }) it('AddressType from AddressType', () => { const addressType = v.parse(addressTypeSchema, AddressType_COMMUNITY_AUF) expect(addressType).toBe(AddressType_COMMUNITY_AUF) @@ -42,8 +46,8 @@ describe('basic.schema', () => { }) }) - it('confirmedTransactionFromBase64Schema', () => { - const confirmedTransaction = v.parse(confirmedTransactionFromBase64Schema, 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') + it('confirmedTransactionSchema', () => { + const confirmedTransaction = v.parse(confirmedTransactionSchema, 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') expect(confirmedTransaction.getId()).toBe(7) expect(confirmedTransaction.getConfirmedAt().getSeconds()).toBe(1609464130) expect(confirmedTransaction.getVersionNumber()).toBe('3.4') diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts index f3d5fd803..4f6eb6b42 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -1,20 +1,10 @@ import { AddressType as AddressType, - AddressType_COMMUNITY_AUF, - AddressType_COMMUNITY_GMW, - AddressType_COMMUNITY_HUMAN, - AddressType_COMMUNITY_PROJECT, - AddressType_CRYPTO_ACCOUNT, - AddressType_NONE, - AddressType_SUBACCOUNT, ConfirmedTransaction, - DeserializeType_CONFIRMED_TRANSACTION, - InteractionDeserialize, - MemoryBlock, } from 'gradido-blockchain-js' import { AccountType } from '../enum/AccountType' -// import { AddressType as AddressTypeWrapper } from '../enum/AddressType' import * as v from 'valibot' +import { confirmedTransactionFromBase64, isAddressType, toAddressType, toAccountType } from '../utils/typeConverter' /** * dateSchema for creating a date from string or Date object @@ -42,45 +32,14 @@ export const dateSchema = v.pipe( * AddressType is defined in gradido-blockchain C++ Code * AccountType is the enum defined in TypeScript but with the same options * addressTypeSchema and accountTypeSchema are for easy handling and conversion between both - */ - -const accountToAddressMap: Record = { - [AccountType.COMMUNITY_AUF]: AddressType_COMMUNITY_AUF, - [AccountType.COMMUNITY_GMW]: AddressType_COMMUNITY_GMW, - [AccountType.COMMUNITY_HUMAN]: AddressType_COMMUNITY_HUMAN, - [AccountType.COMMUNITY_PROJECT]: AddressType_COMMUNITY_PROJECT, - [AccountType.CRYPTO_ACCOUNT]: AddressType_CRYPTO_ACCOUNT, - [AccountType.SUBACCOUNT]: AddressType_SUBACCOUNT, - [AccountType.NONE]: AddressType_NONE, -} - -const addressToAccountMap: Record = Object.entries(accountToAddressMap).reduce((acc, [accKey, addrVal]) => { - acc[addrVal] = String(accKey) as AccountType - return acc; -}, {} as Record) - -function isAddressType(val: unknown): val is AddressType { - return typeof val === 'number' && Object.keys(addressToAccountMap).includes(val.toString()) -} - -function isAccountType(val: unknown): val is AccountType { - return Object.values(AccountType).includes(val as AccountType); -} - -/** * Schema for address type, can also convert from account type (if used with v.parse) */ export const addressTypeSchema = v.pipe( v.union([ v.enum(AccountType, 'expect account type'), - v.custom((val): val is AddressType => isAddressType(val), 'expect AddressType'), + v.custom(isAddressType, 'expect AddressType'), ]), - v.transform((value) => { - if (isAddressType(value)) { - return value; - } - return accountToAddressMap[value as AccountType] ?? AddressType_NONE - }), + v.transform((value) => toAddressType(value)), ) /** @@ -91,34 +50,24 @@ export const accountTypeSchema = v.pipe( v.custom(isAddressType, 'expect AddressType'), v.enum(AccountType, 'expect AccountType'), ]), - v.transform((value) => { - if (isAccountType(value)) { - return value; - } - return addressToAccountMap[value as AddressType] ?? AccountType.NONE; - }), + v.transform((value) => toAccountType(value)), ) -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 Error("invalid data, couldn't deserialize") - } - return confirmedTransaction -} - -export const confirmedTransactionFromBase64Schema = v.pipe( - v.pipe( - v.string('expect confirmed Transaction base64 as string type'), - v.base64('expect to be valid base64') - ), - v.transform( - (base64: string) => confirmedTransactionFromBase64(base64), +export const confirmedTransactionSchema = v.pipe( + v.union([ + v.instance(ConfirmedTransaction, 'expect ConfirmedTransaction'), + v.pipe( + v.string('expect confirmed Transaction base64 as string type'), + v.base64('expect to be valid base64') + ), + ]), + v.transform( + (data: string | ConfirmedTransaction) => { + if (data instanceof ConfirmedTransaction) { + return data + } + return confirmedTransactionFromBase64(data) + }, ), ) diff --git a/dlt-connector/src/schemas/typeGuard.schema.test.ts b/dlt-connector/src/schemas/typeGuard.schema.test.ts index 02266c0bc..27781c868 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.test.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.test.ts @@ -1,67 +1,37 @@ import { describe, it, expect } from 'bun:test' -import { uuidv4Schema, topicIndexSchema, uuid4HashSchema, memoSchema } from './typeGuard.schema' +import { uuidv4Schema, memoSchema } from './typeGuard.schema' import * as v from 'valibot' import { v4 as uuidv4 } from 'uuid' -import { MemoryBlock } from 'gradido-blockchain-js' describe('typeGuard.schema', () => { describe('Uuidv4', () => { const uuidv4String = uuidv4() - const uuidv4Hash = MemoryBlock.fromHex(uuidv4String.replace(/-/g, '')).calculateHash() it('from string to uuidv4', () => { const uuidv4Value = v.parse(uuidv4Schema, uuidv4String) expect(uuidv4Value.toString()).toBe(uuidv4String) }) - - it('from uuidv4 to hash', () => { - const uuidv4Value = v.parse(uuidv4Schema, uuidv4String) - const uuidv4HashParsed = v.parse(uuid4HashSchema, uuidv4Value) - expect(uuidv4HashParsed.copyAsString()).toBe(uuidv4Hash.copyAsString()) - }) - - it('from uuidv4 string to hash', () => { - const uuidv4HashParsed = v.parse(uuid4HashSchema, uuidv4String) - expect(uuidv4HashParsed.copyAsString()).toBe(uuidv4Hash.copyAsString()) - }) - - it('from uuidv4 hash to topicIndex (hash in hex format', () => { - const uuidv4HashParsed = v.parse(uuid4HashSchema, uuidv4String) - const topicIndex = v.parse(topicIndexSchema, uuidv4HashParsed) - expect(topicIndex.toString()).toBe(uuidv4Hash.convertToHex()) - }) - - it('from uuidv4 to topicIndex (hash in hex format)', () => { - const uuidv4Value = v.parse(uuidv4Schema, uuidv4String) - const topicIndex = v.parse(topicIndexSchema, uuidv4Value) - expect(topicIndex.toString()).toBe(uuidv4Hash.convertToHex()) - }) - - it('from uuidv4 string to topicIndex (hash in hex format)', () => { - const topicIndex = v.parse(topicIndexSchema, uuidv4String) - expect(topicIndex.toString()).toBe(uuidv4Hash.convertToHex()) - }) }) describe('Basic Type Schemas for transactions', () => { - describe('Memo', () => { - it('min length', () => { - const memoValue = 'memo1' - const memoValueParsed = v.parse(memoSchema, memoValue) - expect(memoValueParsed.toString()).toBe(memoValue) - }) - it('max length', () => { - const memoValue = 's'.repeat(255) - const memoValueParsed = v.parse(memoSchema, memoValue) - expect(memoValueParsed.toString()).toBe(memoValue) - }) - it('to short', () => { - const memoValue = 'memo' - expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length >= 5')) - }) - it('to long', () => { - const memoValue = 's'.repeat(256) - expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length <= 255')) - }) + describe('Memo', () => { + it('min length', () => { + const memoValue = 'memo1' + const memoValueParsed = v.parse(memoSchema, memoValue) + expect(memoValueParsed.toString()).toBe(memoValue) + }) + it('max length', () => { + const memoValue = 's'.repeat(255) + const memoValueParsed = v.parse(memoSchema, memoValue) + expect(memoValueParsed.toString()).toBe(memoValue) + }) + it('to short', () => { + const memoValue = 'memo' + expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length >= 5')) + }) + it('to long', () => { + const memoValue = 's'.repeat(256) + expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length <= 255')) }) }) + }) }) \ No newline at end of file diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts index 6ec33d732..d5a1a32dd 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -13,6 +13,7 @@ * `const amount: Amount = v.parse(amountSchema, 1.21)` * must be called and ensure the value is valid * If it isn't valid, v.parse will throw an error + * Alternatively v.safeParse can be used, this don't throw but it return null on error */ import { validate, version } from 'uuid' @@ -27,48 +28,89 @@ import { MemoryBlock, DurationSeconds, GradidoUnit } from 'gradido-blockchain-js declare const validUuidv4: unique symbol export type Uuidv4 = string & { [validUuidv4]: true }; -export const uuidv4Schema = v.custom((value) => - (typeof value === 'string' && validate(value) && version(value) === 4), - 'uuid v4 expected' +export const uuidv4Schema = v.pipe( + v.string('expect string type'), + v.custom((value) => + (typeof value === 'string' && validate(value) && version(value) === 4), + 'uuid v4 expected' + ), + v.transform( + (input: string) => input as Uuidv4, + ), +) + +export type Uuidv4Input = v.InferInput + +/** + * type guard for memory block size 32 + * create with `v.parse(memoryBlock32Schema, MemoryBlock.fromHex('39568d7e148a0afee7f27a67dbf7d4e87d1fdec958e2680df98a469690ffc1a2'))` + * memoryBlock32 is a non-empty MemoryBlock with size 32 + */ + +declare const validMemoryBlock32: unique symbol +export type MemoryBlock32 = MemoryBlock & { [validMemoryBlock32]: true }; + +export const memoryBlock32Schema = v.pipe( + v.instance(MemoryBlock, 'expect MemoryBlock type'), + v.custom( + (val): boolean => val instanceof MemoryBlock && val.size() === 32 && !val.isEmpty(), + 'expect MemoryBlock size = 32 and not empty' + ), + v.transform( + (input: MemoryBlock) => input as MemoryBlock32, + ), ) /** - * type guard for uuid v4 hash - * const uuidv4Value: Uuidv4 = v.parse(uuidv4Schema, 'uuid') - * create with `v.parse(uuidv4HashSchema, uuidv4Value)` - * uuidv4Hash is uuidv4 value hashed with BLAKE2b as Binary Type MemoryBlock from gradido-blockchain similar to Node.js Buffer Type, - * used for iota topic + * type guard for hex string of length 64 (binary size = 32) + * create with `v.parse(hex32Schema, '39568d7e148a0afee7f27a67dbf7d4e87d1fdec958e2680df98a469690ffc1a2')` + * or `v.parse(hex32Schema, MemoryBlock.fromHex('39568d7e148a0afee7f27a67dbf7d4e87d1fdec958e2680df98a469690ffc1a2'))` + * hex32 is a hex string of length 64 (binary size = 32) */ -declare const validUuidv4Hash: unique symbol -export type Uuidv4Hash = MemoryBlock & { [validUuidv4Hash]: true }; +declare const validHex32: unique symbol +export type Hex32 = string & { [validHex32]: true }; -export const uuid4HashSchema = v.pipe( - uuidv4Schema, - v.transform( - (input: Uuidv4) => MemoryBlock.fromHex(input.replace(/-/g, '')).calculateHash() as Uuidv4Hash, - ) +export const hex32Schema = v.pipe( + v.union([ + v.pipe( + v.string('expect string type'), + v.hexadecimal('expect hexadecimal string'), + v.length(64, 'expect string length = 64'), + ), + memoryBlock32Schema, + ]), + v.transform( + (input: string | MemoryBlock32 | Hex32) => { + if (typeof input === 'string') { + return input as Hex32 + } + return input.convertToHex() as Hex32 + }, + ), ) -/** - * type guard for topic index - * const uuidv4Value: Uuidv4 = v.parse(uuidv4Schema, 'uuid') - * const uuidv4Hash: Uuidv4Hash = v.parse(uuid4HashSchema, uuidv4Value) - * create with `v.parse(topicIndexSchema, uuidv4Hash)` - * topicIndex is uuidv4Hash value converted to hex string used for iota topic - * The beauty of valibot allow also parse a uuidv4 string directly to topicIndex - * const topic: TopicIndex = v.parse(topicIndexSchema, 'uuid') - */ -declare const validTopicIndex: unique symbol -export type TopicIndex = string & { [validTopicIndex]: true }; +export type Hex32Input = v.InferInput -export const topicIndexSchema = v.pipe( - v.union([uuidv4Schema, v.custom((val): val is Uuidv4Hash => val instanceof MemoryBlock)]), - v.transform((input) => { - const hash = typeof input === 'string' - ? MemoryBlock.fromHex(input.replace(/-/g, '')).calculateHash() - : input; - return hash.convertToHex() as TopicIndex; - }) +/** + * type guard for iota message id + * create with `v.parse(iotaMessageIdSchema, '822387692a7cfd3f07f25742e91e248af281d771ee03a432c2e178e5533f786c')` + * iota message id is a hex string of length 64 + */ +declare const validIotaMessageId: unique symbol +export type IotaMessageId = Hex32 & { [validIotaMessageId]: true }; + +export const iotaMessageIdSchema = v.pipe( + v.union([ + v.pipe( + v.string('expect string type'), + v.hexadecimal('expect hexadecimal string'), + v.length(64, 'expect string length = 64'), + ), + memoryBlock32Schema, + ]), + v.transform( + (input: string | MemoryBlock32) => v.parse(hex32Schema, input) as IotaMessageId, + ), ) /** @@ -133,7 +175,8 @@ export const amountSchema = v.pipe( /** * type guard for gradido amount * create with `v.parse(gradidoAmountSchema, '123')` - * gradido amount is a string representing a positive decimal number, compatible with decimal.js + * gradido amount is a GradidoUnit representing a positive gradido amount stored intern as integer with 4 decimal places + * GradidoUnit is native implemented in gradido-blockchain-js in c++ and has functions for decay calculation */ declare const validGradidoAmount: unique symbol export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true }; diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts new file mode 100644 index 000000000..b9bd3c06c --- /dev/null +++ b/dlt-connector/src/server/index.ts @@ -0,0 +1,77 @@ +import { initTRPC, TRPCError } from '@trpc/server' +import * as v from 'valibot' +import { identifierAccountSchema } from '../schemas/account.schema' +import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' +import { getAddressType } from '../client/GradidoNode/api' +import { Uuidv4Hash } from '../data/Uuidv4Hash' +import { hex32Schema } from '../schemas/typeGuard.schema' +import { AddressType_NONE } from 'gradido-blockchain-js' + +export const t = initTRPC.create() +const publicProcedure = t.procedure +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) + +export const appRouter = t.router({ + isAccountExist: publicProcedure + .input(identifierAccountSchema) + .output(v.boolean()) + .query(async ({ input: userIdentifier }) => { + const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(userIdentifier)) + const publicKey = accountKeyPair.getPublicKey() + if (!publicKey) { + throw new TRPCError({ + code: 'NOT_FOUND', + message: "couldn't calculate account key pair", + }) + } + + // ask gradido node server for account type, if type !== NONE account exist + const addressType = await getAddressType( + v.parse(hex32Schema, publicKey.get()), + new Uuidv4Hash(userIdentifier.communityUuid), + ) + logger.info('isAccountExist') + if(logger.isDebugEnabled()) { + logger.debug('params', userIdentifier) + } + return addressType !== AddressType_NONE + }), + + sendTransaction: publicProcedure + .input(transactionDraftSchema) + .output(v.instanceof(TransactionResult)) + .mutation(async ({ input: transactionDraft }) => { + try { + return await SendToIotaContext(transactionDraft) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + if (error instanceof TransactionError) { + return new TransactionResult(error) + } else { + throw error + } + } + }) +}) + +/* + +async sendTransaction( + @Arg('data') + transactionDraft: TransactionDraft, + ): Promise { + try { + return await SendToIotaContext(transactionDraft) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + if (error instanceof TransactionError) { + return new TransactionResult(error) + } else { + throw error + } + } + } + */ \ No newline at end of file diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts new file mode 100644 index 000000000..a1f912581 --- /dev/null +++ b/dlt-connector/src/utils/typeConverter.ts @@ -0,0 +1,72 @@ +import { + ConfirmedTransaction, + MemoryBlock, + InteractionDeserialize, + DeserializeType_CONFIRMED_TRANSACTION, + AddressType_COMMUNITY_AUF, + AddressType_COMMUNITY_GMW, + AddressType_COMMUNITY_HUMAN, + AddressType_COMMUNITY_PROJECT, + AddressType_CRYPTO_ACCOUNT, + AddressType_SUBACCOUNT, + AddressType_DEFERRED_TRANSFER, + AddressType_NONE, + AddressType, +} from 'gradido-blockchain-js' +import { AccountType } from '../enum/AccountType' + +export const confirmedTransactionFromBase64 = (base64: string): ConfirmedTransaction => { + const confirmedTransactionBinaryPtr = MemoryBlock.createPtr(MemoryBlock.fromBase64(base64)) + const deserializer = new InteractionDeserialize( + confirmedTransactionBinaryPtr, + DeserializeType_CONFIRMED_TRANSACTION, + ) + deserializer.run() + const confirmedTransaction = deserializer.getConfirmedTransaction() + if (!confirmedTransaction) { + throw new Error("invalid data, couldn't deserialize") + } + return confirmedTransaction +} + +/** + * AddressType is defined in gradido-blockchain C++ Code + * AccountType is the enum defined in TypeScript but with the same options + */ +const accountToAddressMap: Record = { + [AccountType.COMMUNITY_AUF]: AddressType_COMMUNITY_AUF, + [AccountType.COMMUNITY_GMW]: AddressType_COMMUNITY_GMW, + [AccountType.COMMUNITY_HUMAN]: AddressType_COMMUNITY_HUMAN, + [AccountType.COMMUNITY_PROJECT]: AddressType_COMMUNITY_PROJECT, + [AccountType.CRYPTO_ACCOUNT]: AddressType_CRYPTO_ACCOUNT, + [AccountType.SUBACCOUNT]: AddressType_SUBACCOUNT, + [AccountType.DEFERRED_TRANSFER]: AddressType_DEFERRED_TRANSFER, + [AccountType.NONE]: AddressType_NONE, +} + +const addressToAccountMap: Record = Object.entries(accountToAddressMap).reduce((acc, [accKey, addrVal]) => { + acc[addrVal] = String(accKey) as AccountType + return acc; +}, {} as Record) + +export function isAddressType(val: unknown): val is AddressType { + return typeof val === 'number' && Object.keys(addressToAccountMap).includes(val.toString()) +} + +export function isAccountType(val: unknown): val is AccountType { + return Object.values(AccountType).includes(val as AccountType); +} + +export function toAddressType(input: AccountType | AddressType): AddressType { + if (isAddressType(input)) { + return input + } + return accountToAddressMap[input as AccountType] ?? AddressType_NONE +} + +export function toAccountType(input: AccountType | AddressType): AccountType { + if (isAccountType(input)) { + return input + } + return addressToAccountMap[input as AddressType] ?? AccountType.NONE +} From eb29dde8c3a8950601347b9dad393f15b828742e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 16 Aug 2025 16:38:41 +0200 Subject: [PATCH 26/72] finalize refactoring, change for using hiero instead of iota --- dlt-connector/biome.json | 154 +++ dlt-connector/bun.lock | 923 +++++++++++++++++- dlt-connector/package.json | 10 +- dlt-connector/src/KeyPairCacheManager.ts | 21 +- dlt-connector/src/client/GradidoNode/api.ts | 73 +- .../src/client/GradidoNode/input.schema.ts | 21 +- .../src/client/GradidoNode/jsonrpc.ts | 22 +- dlt-connector/src/client/HieroClient.ts | 74 ++ .../src/client/backend/BackendClient.ts | 25 +- .../client/backend/community.schema.test.ts | 26 +- .../src/client/backend/community.schema.ts | 16 +- dlt-connector/src/config/index.ts | 13 +- dlt-connector/src/config/schema.ts | 24 + .../src/data/KeyPairIdentifier.logic.ts | 45 +- dlt-connector/src/data/Uuidv4Hash.ts | 17 +- dlt-connector/src/enum/AddressType.ts | 4 +- .../src/enum/GradidoNodeErrorCodes.ts | 2 +- .../src/enum/InputTransactionType.ts | 22 +- dlt-connector/src/errors.ts | 2 +- dlt-connector/src/index.ts | 37 +- .../AbstractRemoteKeyPair.role.ts | 9 +- .../keyPairCalculation/AccountKeyPair.role.ts | 5 +- .../ForeignCommunityKeyPair.role.ts | 21 +- .../KeyPairCalculation.context.ts | 14 +- .../LinkedTransactionKeyPair.role.ts | 7 +- .../RemoteAccountKeyPair.role.ts | 13 +- .../keyPairCalculation/UserKeyPair.role.ts | 5 +- .../UserKeyPairRole.test.ts | 64 ++ .../sendToIota/AbstractTransaction.role.ts | 5 +- .../CommunityRootTransaction.role.ts | 26 +- .../sendToIota/CreationTransaction.role.ts | 75 +- .../DeferredTransferTransaction.role.ts | 53 +- .../RedeemDeferredTransferTransaction.role.ts | 91 +- .../RegisterAddressTransaction.role.ts | 77 +- .../sendToIota/SendToIota.context.ts | 145 ++- .../sendToIota/TransferTransaction.role.ts | 45 +- dlt-connector/src/schemas/account.schema.ts | 11 +- dlt-connector/src/schemas/base.schema.ts | 8 +- .../src/schemas/transaction.schema.test.ts | 295 +++--- .../src/schemas/transaction.schema.ts | 94 +- .../src/schemas/typeConverter.schema.test.ts | 19 +- .../src/schemas/typeConverter.schema.ts | 29 +- .../src/schemas/typeGuard.schema.test.ts | 14 +- dlt-connector/src/schemas/typeGuard.schema.ts | 154 +-- dlt-connector/src/server/index.ts | 142 ++- dlt-connector/src/server/input.schema.ts | 19 + .../src/utils/derivationHelper.test.ts | 2 +- dlt-connector/src/utils/network.ts | 16 +- dlt-connector/src/utils/typeConverter.ts | 29 +- 49 files changed, 2146 insertions(+), 872 deletions(-) create mode 100644 dlt-connector/biome.json create mode 100644 dlt-connector/src/client/HieroClient.ts create mode 100644 dlt-connector/src/config/schema.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts create mode 100644 dlt-connector/src/server/input.schema.ts diff --git a/dlt-connector/biome.json b/dlt-connector/biome.json new file mode 100644 index 000000000..3ec5af1be --- /dev/null +++ b/dlt-connector/biome.json @@ -0,0 +1,154 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", + "vcs": { "enabled": false, "clientKind": "git", "useIgnoreFile": false }, + "files": { + "ignoreUnknown": false, + "includes": [ + "**/package.json", + "src/**/*.js", + "src/**/*.ts", + "!**/build", + "!**/node_modules", + "!**/coverage" + ] + }, + "formatter": { + "enabled": true, + "useEditorconfig": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 2, + "lineEnding": "lf", + "lineWidth": 100, + "attributePosition": "auto", + "bracketSpacing": true + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": false, + "complexity": { + "noExtraBooleanCast": "error", + "noUselessCatch": "error", + "noUselessConstructor": "error", + "noUselessLoneBlockStatements": "error", + "noUselessRename": "error", + "noUselessTernary": "error", + "noUselessUndefinedInitialization": "error", + "noVoid": "error", + "useLiteralKeys": "error", + "useRegexLiterals": "error", + "noAdjacentSpacesInRegex": "error", + "noCommaOperator": "error" + }, + "correctness": { + "noConstAssign": "error", + "noConstantCondition": "error", + "noEmptyCharacterClassInRegex": "error", + "noEmptyPattern": "error", + "noGlobalObjectCalls": "error", + "noInnerDeclarations": "error", + "noInvalidConstructorSuper": "error", + "noInvalidUseBeforeDeclaration": "error", + "noNodejsModules": "off", + "noNonoctalDecimalEscape": "error", + "noPrecisionLoss": "error", + "noSelfAssign": "error", + "noSetterReturn": "error", + "noSwitchDeclarations": "error", + "noUndeclaredVariables": "error", + "noUnreachable": "error", + "noUnreachableSuper": "error", + "noUnsafeFinally": "error", + "noUnsafeOptionalChaining": "error", + "noUnusedLabels": "error", + "noUnusedVariables": "error", + "useIsNan": "error", + "useValidForDirection": "error", + "useYield": "error", + "noInvalidBuiltinInstantiation": "error", + "useValidTypeof": "error" + }, + "security": { "noGlobalEval": "error" }, + "style": { + "noDefaultExport": "error", + "noYodaExpression": "error", + "useBlockStatements": "error", + "useConsistentBuiltinInstantiation": "error", + "useConst": "error", + "useImportType": "off", + "useSingleVarDeclarator": "error", + "useArrayLiterals": "error" + }, + "suspicious": { + "noAsyncPromiseExecutor": "error", + "noCatchAssign": "error", + "noClassAssign": "error", + "noCompareNegZero": "error", + "noConsole": "error", + "noControlCharactersInRegex": "error", + "noDebugger": "error", + "noDoubleEquals": "error", + "noDuplicateCase": "error", + "noDuplicateClassMembers": "error", + "noDuplicateObjectKeys": "error", + "noDuplicateParameters": "error", + "noEmptyBlockStatements": "error", + "noFallthroughSwitchClause": "error", + "noFunctionAssign": "error", + "noGlobalAssign": "error", + "noImportAssign": "error", + "noMisleadingCharacterClass": "error", + "noPrototypeBuiltins": "error", + "noRedeclare": "error", + "noSelfCompare": "error", + "noShadowRestrictedNames": "error", + "noSparseArray": "error", + "noUnsafeNegation": "error", + "useDefaultSwitchClauseLast": "error", + "useGetterReturn": "error", + "noWith": "error", + "noVar": "warn" + } + }, + "includes": ["**", "!**/node_modules", "!**/*.min.js", "!**/build", "!**/coverage"] + }, + "javascript": { + "formatter": { + "jsxQuoteStyle": "single", + "quoteProperties": "asNeeded", + "trailingCommas": "all", + "semicolons": "asNeeded", + "arrowParentheses": "always", + "bracketSameLine": false, + "quoteStyle": "single", + "attributePosition": "auto", + "bracketSpacing": true + }, + "globals": [ + "document", + "navigator", + "window", + "describe", + "test", + "it", + "expect", + "beforeAll", + "beforeEach", + "afterAll", + "afterEach", + "jest" + ], + "parser": { + "unsafeParameterDecoratorsEnabled": true + } + }, + "overrides": [ + { + "includes": ["**/*.ts", "**/*.tsx"], + "linter": { "rules": { "complexity": { "noVoid": "error" } } } + }, + { "includes": ["**/*.test.ts"], "linter": { "rules": {} } } + ] +} diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 2d3860900..5795142a4 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -11,10 +11,13 @@ "@biomejs/biome": "2.0.0", "@elysiajs/trpc": "^1.1.0", "@elysiajs/websocket": "^0.2.8", + "@hashgraph/sdk": "^2.70.0", + "@sinclair/typebox": "^0.34.33", + "@sinclair/typemap": "^0.10.1", "@trpc/server": "^11.4.3", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", - "elysia": "^1.3.5", + "elysia": "1.3.8", "graphql-request": "^7.2.0", "jose": "^5.2.2", "jsonrpc-ts-client": "^0.2.3", @@ -30,6 +33,176 @@ "@iota/client", ], "packages": { + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + + "@babel/core": ["@babel/core@7.28.3", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.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" } }, "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ=="], + + "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" } }, "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g=="], + + "@babel/helpers": ["@babel/helpers@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw=="], + + "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + + "@babel/plugin-proposal-export-default-from": ["@babel/plugin-proposal-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], + + "@babel/plugin-syntax-export-default-from": ["@babel/plugin-syntax-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg=="], + + "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="], + + "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A=="], + + "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/runtime": ["@babel/runtime@7.28.3", "", {}, "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + + "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" }, "bin": { "biome": "bin/biome" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], @@ -48,25 +221,193 @@ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], + "@elysiajs/trpc": ["@elysiajs/trpc@1.1.0", "", { "peerDependencies": { "elysia": ">= 1.1.0" } }, "sha512-M8QWC+Wa5Z5MWY/+uMQuwZ+JoQkp4jOc1ra4SncFy1zSjFGin59LO1AT0pE+DRJaFV17gha9y7cB6Q7GnaJEAw=="], "@elysiajs/websocket": ["@elysiajs/websocket@0.2.8", "", { "dependencies": { "nanoid": "^4.0.0", "raikiri": "^0.0.0-beta.3" }, "peerDependencies": { "elysia": ">= 0.2.2" } }, "sha512-K9KLmYL1SYuAV353GvmK0V9DG5w7XTOGsa1H1dGB5BUTzvBaMvnwNeqnJQ3cjf9V1c0EjQds0Ty4LfUFvV45jw=="], + "@ethersproject/abi": ["@ethersproject/abi@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q=="], + + "@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], + + "@ethersproject/abstract-signer": ["@ethersproject/abstract-signer@5.8.0", "", { "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0" } }, "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA=="], + + "@ethersproject/address": ["@ethersproject/address@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/rlp": "^5.8.0" } }, "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA=="], + + "@ethersproject/base64": ["@ethersproject/base64@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0" } }, "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ=="], + + "@ethersproject/bignumber": ["@ethersproject/bignumber@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA=="], + + "@ethersproject/bytes": ["@ethersproject/bytes@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A=="], + + "@ethersproject/constants": ["@ethersproject/constants@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0" } }, "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg=="], + + "@ethersproject/hash": ["@ethersproject/hash@5.8.0", "", { "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", "@ethersproject/base64": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA=="], + + "@ethersproject/keccak256": ["@ethersproject/keccak256@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng=="], + + "@ethersproject/logger": ["@ethersproject/logger@5.8.0", "", {}, "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA=="], + + "@ethersproject/networks": ["@ethersproject/networks@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg=="], + + "@ethersproject/properties": ["@ethersproject/properties@5.8.0", "", { "dependencies": { "@ethersproject/logger": "^5.8.0" } }, "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw=="], + + "@ethersproject/rlp": ["@ethersproject/rlp@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q=="], + + "@ethersproject/signing-key": ["@ethersproject/signing-key@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w=="], + + "@ethersproject/strings": ["@ethersproject/strings@5.8.0", "", { "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/logger": "^5.8.0" } }, "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg=="], + + "@ethersproject/transactions": ["@ethersproject/transactions@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@ethersproject/signing-key": "^5.8.0" } }, "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg=="], + + "@ethersproject/web": ["@ethersproject/web@5.8.0", "", { "dependencies": { "@ethersproject/base64": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw=="], + "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@hashgraph/cryptography": ["@hashgraph/cryptography@1.9.0", "", { "dependencies": { "@noble/curves": "^1.8.1", "asn1js": "^3.0.6", "bignumber.js": "^9.1.1", "bn.js": "^5.2.1", "buffer": "^6.0.3", "crypto-js": "^4.2.0", "forge-light": "1.1.4", "js-base64": "^3.7.7", "react-native-get-random-values": "^1.11.0", "spark-md5": "^3.0.2", "tweetnacl": "^1.0.3", "utf8": "^3.0.0" } }, "sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg=="], + + "@hashgraph/proto": ["@hashgraph/proto@2.20.0", "", { "dependencies": { "long": "^5.2.3", "protobufjs": "7.2.5" } }, "sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA=="], + + "@hashgraph/sdk": ["@hashgraph/sdk@2.70.0", "", { "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@grpc/grpc-js": "^1.12.6", "@hashgraph/cryptography": "1.9.0", "@hashgraph/proto": "2.20.0", "bignumber.js": "^9.1.1", "bn.js": "^5.1.1", "crypto-js": "^4.2.0", "js-base64": "^3.7.4", "long": "^5.3.1", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "protobufjs": "7.2.5", "rfc4648": "^1.5.3", "utf8": "^3.0.0" } }, "sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ=="], + "@iota/client": ["@iota/client@2.2.4", "", { "dependencies": { "neon-cli": "^0.8", "prebuild-install": "^6.1.2" } }, "sha512-6zjtqJgkSgrMUFLbxr9k+zXGnEVw6gjTFn5emN2nKpR78+mwW4jUXuNcy/M194bK4sLHjj0T0L4pRWJ6XTGaew=="], - "@sinclair/typebox": ["@sinclair/typebox@0.34.37", "", {}, "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw=="], + "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], + + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="], + + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3" } }, "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA=="], + + "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="], + + "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="], + + "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + + "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="], + + "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.30", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@react-native/assets-registry": ["@react-native/assets-registry@0.81.0", "", {}, "sha512-rZs8ziQ1YRV3Z5Mw5AR7YcgI3q1Ya9NIx6nyuZAT9wDSSjspSi+bww+Hargh/a4JfV2Ajcxpn9X9UiFJr1ddPw=="], + + "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.81.0", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.0" } }, "sha512-MEMlW91+2Kk9GiObRP1Nc6oTdiyvmSEbPMSC6kzUzDyouxnh5/x28uyNySmB2nb6ivcbmQ0lxaU059+CZSkKXQ=="], + + "@react-native/babel-preset": ["@react-native/babel-preset@0.81.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.81.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-RKMgCUGsso/2b32kgg24lB68LJ6qr2geLoSQTbisY6Usye0uXeXCgbZZDbILIX9upL4uzU4staMldRZ0v08F1g=="], + + "@react-native/codegen": ["@react-native/codegen@0.81.0", "", { "dependencies": { "glob": "^7.1.1", "hermes-parser": "0.29.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/core": "*" } }, "sha512-gPFutgtj8YqbwKKt3YpZKamUBGd9YZJV51Jq2aiDZ9oThkg1frUBa20E+Jdi7jKn982wjBMxAklAR85QGQ4xMA=="], + + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.81.0", "", { "dependencies": { "@react-native/dev-middleware": "0.81.0", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.1", "metro-config": "^0.83.1", "metro-core": "^0.83.1", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli"] }, "sha512-n04ACkCaLR54NmA/eWiDpjC16pHr7+yrbjQ6OEdRoXbm5EfL8FEre2kDAci7pfFdiSMpxdRULDlKpfQ+EV/GAQ=="], + + "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.81.0", "", {}, "sha512-N/8uL2CGQfwiQRYFUNfmaYxRDSoSeOmFb56rb0PDnP3XbS5+X9ee7X4bdnukNHLGfkRdH7sVjlB8M5zE8XJOhw=="], + + "@react-native/dev-middleware": ["@react-native/dev-middleware@0.81.0", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.0", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-J/HeC/+VgRyGECPPr9rAbe5S0OL6MCIrvrC/kgNKSME5+ZQLCiTpt3pdAoAMXwXiF9a02Nmido0DnyM1acXTIA=="], + + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.81.0", "", {}, "sha512-LGNtPXO1RKLws5ORRb4Q4YULi2qxM4qZRuARtwqM/1f2wyZVggqapoV0OXlaXaz+GiEd2ll3ROE4CcLN6J93jg=="], + + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.81.0", "", {}, "sha512-whXZWIogzoGpqdyTjqT89M6DXmlOkWqNpWoVOAwVi8XFCMO+L7WTk604okIgO6gdGZcP1YtFpQf9JusbKrv/XA=="], + + "@react-native/metro-babel-transformer": ["@react-native/metro-babel-transformer@0.81.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@react-native/babel-preset": "0.81.0", "hermes-parser": "0.29.1", "nullthrows": "^1.1.1" } }, "sha512-Mwovr4jJ3JTnbHEQLhdcMvS82LjijpqCydXl1aH2N16WVCrE5oSNFiqTt6NpZBw9zkJX7nijsY+xeCy6m+KK3Q=="], + + "@react-native/metro-config": ["@react-native/metro-config@0.81.0", "", { "dependencies": { "@react-native/js-polyfills": "0.81.0", "@react-native/metro-babel-transformer": "0.81.0", "metro-config": "^0.83.1", "metro-runtime": "^0.83.1" } }, "sha512-5eqLP4TCERHGRYDJSZa//O98CGDFNNEwHVvhs65Msfy6hAoSdw5pAAuTrsQwmbTBp0Fkvu7Bx8BZDhiferZsHg=="], + + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.81.0", "", {}, "sha512-3gEu/29uFgz+81hpUgdlOojM4rjHTIPwxpfygFNY60V6ywZih3eLDTS8kAjNZfPFHQbcYrNorJzwnL5yFF/uLw=="], + + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.81.0", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-p14QC5INHkbMZ96158sUxkSwN6zp138W11G+CRGoLJY4Q9WRJBCe7wHR5Owyy3XczQXrIih/vxAXwgYeZ2XByg=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.34.39", "", {}, "sha512-keEoFsevmLwAedzacnTVmra66GViRH3fhWO1M+nZ8rUgpPJyN4mcvqlGr3QMrQXx4L8KNwW0q9/BeHSEoO4teg=="], + + "@sinclair/typemap": ["@sinclair/typemap@0.10.1", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.30", "valibot": "^1.0.0", "zod": "^3.24.1" } }, "sha512-UXR0fhu/n3c9B6lB+SLI5t1eVpt9i9CdDrp2TajRe3LbKiUhCTZN2kSfJhjPnpc3I59jMRIhgew7+0HlMi08mg=="], + + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="], "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@trpc/server": ["@trpc/server@11.4.3", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-wnWq3wiLlMOlYkaIZz+qbuYA5udPTLS4GVVRyFkr6aT83xpdCHyVtURT+u4hSoIrOXQM9OPCNXSXsAujWZDdaw=="], + "@trpc/server": ["@trpc/server@11.4.4", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-VkJb2xnb4rCynuwlCvgPBh5aM+Dco6fBBIo6lWAdJJRYVwtyE5bxNZBgUvRRz/cFSEAy0vmzLxF7aABDJfK5Rg=="], - "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - "@types/node": ["@types/node@24.0.7", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-YIEUUr4yf8q8oQoXPpSlnvKNVKDQlPMWrmOcgzoduo7kvA2UF0/BwJ/eMKFTiTtkNL17I0M6Xe2tvwFU7be6iw=="], + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/bun": ["@types/bun@1.2.20", "", { "dependencies": { "bun-types": "1.2.20" } }, "sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA=="], + + "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], + + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + + "@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], + + "@types/react": ["@types/react@19.1.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg=="], + + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + + "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], @@ -74,40 +415,102 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], + "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], + + "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="], + + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + "axios": ["axios@0.24.0", "", { "dependencies": { "follow-redirects": "^1.14.4" } }, "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA=="], + "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], + + "babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.29.1", "", { "dependencies": { "hermes-parser": "0.29.1" } }, "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA=="], + + "babel-plugin-transform-flow-enums": ["babel-plugin-transform-flow-enums@0.0.2", "", { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } }, "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^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.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^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-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], + + "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + "bn.js": ["bn.js@5.2.2", "", {}, "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw=="], + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], - "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "browserslist": ["browserslist@4.25.2", "", { "dependencies": { "caniuse-lite": "^1.0.30001733", "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], - "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], + "bun-types": ["bun-types@1.2.20", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + "caller-callsite": ["caller-callsite@2.0.0", "", { "dependencies": { "callsites": "^2.0.0" } }, "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ=="], + + "caller-path": ["caller-path@2.0.0", "", { "dependencies": { "caller-callsite": "^2.0.0" } }, "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A=="], + + "callsites": ["callsites@2.0.0", "", {}, "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001735", "", {}, "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + "chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], + + "chromium-edge-launcher": ["chromium-edge-launcher@0.2.0", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0", "mkdirp": "^1.0.4", "rimraf": "^3.0.2" } }, "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg=="], + + "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], "cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="], @@ -124,6 +527,8 @@ "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], @@ -136,14 +541,28 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "connect": ["connect@3.7.0", "", { "dependencies": { "debug": "2.6.9", "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" } }, "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ=="], + "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + "core-js-compat": ["core-js-compat@3.45.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA=="], + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], + + "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], + "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="], + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], "decompress-response": ["decompress-response@4.2.1", "", { "dependencies": { "mimic-response": "^2.0.0" } }, "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw=="], @@ -154,18 +573,34 @@ "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], "dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "elysia": ["elysia@1.3.5", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.2", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-XVIKXlKFwUT7Sta8GY+wO5reD9I0rqAEtaz1Z71UgJb61csYt8Q3W9al8rtL5RgumuRR8e3DNdzlUN9GkC4KDw=="], + "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.202", "", {}, "sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg=="], + + "elliptic": ["elliptic@6.6.1", "", { "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" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], + + "elysia": ["elysia@1.3.8", "", { "dependencies": { "cookie": "^1.0.2", "exact-mirror": "0.1.3", "fast-decode-uri-component": "^1.0.1" }, "optionalDependencies": { "@sinclair/typebox": "^0.34.33", "openapi-types": "^12.1.3" }, "peerDependencies": { "file-type": ">= 20.0.0", "typescript": ">= 5.0.0" } }, "sha512-kxYFhegJbUEf5otzmisEvGt3R7d/dPBNVERO2nHo0kFqKBHyj5slArc90mSRKLfi1vamMtPcz67rL6Zeg5F2yg=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -176,18 +611,40 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], - "exact-mirror": ["exact-mirror@0.1.2", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-wFCPCDLmHbKGUb8TOi/IS7jLsgR8WVDGtDK3CzcB4Guf/weq7G+I+DkXiRSZfbemBFOxOINKpraM6ml78vo8Zw=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "exact-mirror": ["exact-mirror@0.1.3", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-yI62LpSby0ItzPJF05C4DRycVAoknRiCIDOLOCCs9zaEKylOXQtOFM3flX54S44swpRz584vk3P70yWQodsLlg=="], "execspawn": ["execspawn@1.0.1", "", { "dependencies": { "util-extend": "^1.0.1" } }, "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg=="], "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + "exponential-backoff": ["exponential-backoff@3.1.2", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="], + "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], + "fast-base64-decode": ["fast-base64-decode@1.0.0", "", {}, "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q=="], + + "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], + "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-redact": ["fast-redact@3.5.0", "", {}, "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A=="], + + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], @@ -196,13 +653,25 @@ "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], + "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], + "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="], - "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + + "forge-light": ["forge-light@1.1.4", "", {}, "sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], @@ -212,14 +681,20 @@ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "gauge": ["gauge@2.7.4", "", { "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], "git-config": ["git-config@0.0.7", "", { "dependencies": { "iniparser": "~1.0.5" } }, "sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA=="], @@ -248,12 +723,32 @@ "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], + + "hermes-estree": ["hermes-estree@0.29.1", "", {}, "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ=="], + + "hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="], + + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], + + "import-fresh": ["import-fresh@2.0.0", "", { "dependencies": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" } }, "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -264,30 +759,140 @@ "inquirer": ["inquirer@7.3.3", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" } }, "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA=="], + "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="], + + "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], + + "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], + + "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], + + "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="], + + "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="], + + "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="], + + "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="], + + "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], + + "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="], + + "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], + "jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="], + "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], + + "js-base64": ["js-base64@3.7.8", "", {}, "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow=="], + + "js-sha3": ["js-sha3@0.8.0", "", {}, "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], + + "jsc-safe-url": ["jsc-safe-url@0.2.4", "", {}, "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "jsonrpc-ts-client": ["jsonrpc-ts-client@0.2.3", "", { "dependencies": { "axios": "^0.24.0", "debug": "^4.3.3" } }, "sha512-9uYpKrZKN3/3+9MYA/0vdhl9/esn59u6I9Qj6ohczxKwJ+e7DD4prf3i2nSdAl0Wlw5gBHZOL3wajSa1uiE16g=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], + + "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], + "log4js": ["log4js@6.9.1", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" } }, "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g=="], + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "make-promises-safe": ["make-promises-safe@5.1.0", "", {}, "sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g=="], + "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], + + "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + "memoize-one": ["memoize-one@5.2.1", "", {}, "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="], + "memory-stream": ["memory-stream@1.0.0", "", { "dependencies": { "readable-stream": "^3.4.0" } }, "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "metro": ["metro@0.83.1", "", { "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", "connect": "^3.6.5", "debug": "^4.4.0", "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "hermes-parser": "0.29.1", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", "metro-babel-transformer": "0.83.1", "metro-cache": "0.83.1", "metro-cache-key": "0.83.1", "metro-config": "0.83.1", "metro-core": "0.83.1", "metro-file-map": "0.83.1", "metro-resolver": "0.83.1", "metro-runtime": "0.83.1", "metro-source-map": "0.83.1", "metro-symbolicate": "0.83.1", "metro-transform-plugins": "0.83.1", "metro-transform-worker": "0.83.1", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", "source-map": "^0.5.6", "throat": "^5.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { "metro": "src/cli.js" } }, "sha512-UGKepmTxoGD4HkQV8YWvpvwef7fUujNtTgG4Ygf7m/M0qjvb9VuDmAsEU+UdriRX7F61pnVK/opz89hjKlYTXA=="], + + "metro-babel-transformer": ["metro-babel-transformer@0.83.1", "", { "dependencies": { "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", "hermes-parser": "0.29.1", "nullthrows": "^1.1.1" } }, "sha512-r3xAD3964E8dwDBaZNSO2aIIvWXjIK80uO2xo0/pi3WI8XWT9h5SCjtGWtMtE5PRWw+t20TN0q1WMRsjvhC1rQ=="], + + "metro-cache": ["metro-cache@0.83.1", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.1" } }, "sha512-7N/Ad1PHa1YMWDNiyynTPq34Op2qIE68NWryGEQ4TSE3Zy6a8GpsYnEEZE4Qi6aHgsE+yZHKkRczeBgxhnFIxQ=="], + + "metro-cache-key": ["metro-cache-key@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-ZUs+GD5CNeDLxx5UUWmfg26IL+Dnbryd+TLqTlZnDEgehkIa11kUSvgF92OFfJhONeXzV4rZDRGNXoo6JT+8Gg=="], + + "metro-config": ["metro-config@0.83.1", "", { "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.83.1", "metro-cache": "0.83.1", "metro-core": "0.83.1", "metro-runtime": "0.83.1" } }, "sha512-HJhpZx3wyOkux/jeF1o7akFJzZFdbn6Zf7UQqWrvp7gqFqNulQ8Mju09raBgPmmSxKDl4LbbNeigkX0/nKY1QA=="], + + "metro-core": ["metro-core@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", "metro-resolver": "0.83.1" } }, "sha512-uVL1eAJcMFd2o2Q7dsbpg8COaxjZBBGaXqO2OHnivpCdfanraVL8dPmY6It9ZeqWLOihUKZ2yHW4b6soVCzH/Q=="], + + "metro-file-map": ["metro-file-map@0.83.1", "", { "dependencies": { "debug": "^4.4.0", "fb-watchman": "^2.0.0", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", "invariant": "^2.2.4", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "nullthrows": "^1.1.1", "walker": "^1.0.7" } }, "sha512-Yu429lnexKl44PttKw3nhqgmpBR+6UQ/tRaYcxPeEShtcza9DWakCn7cjqDTQZtWR2A8xSNv139izJMyQ4CG+w=="], + + "metro-minify-terser": ["metro-minify-terser@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" } }, "sha512-kmooOxXLvKVxkh80IVSYO4weBdJDhCpg5NSPkjzzAnPJP43u6+usGXobkTWxxrAlq900bhzqKek4pBsUchlX6A=="], + + "metro-resolver": ["metro-resolver@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-t8j46kiILAqqFS5RNa+xpQyVjULxRxlvMidqUswPEk5nQVNdlJslqizDm/Et3v/JKwOtQGkYAQCHxP1zGStR/g=="], + + "metro-runtime": ["metro-runtime@0.83.1", "", { "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" } }, "sha512-3Ag8ZS4IwafL/JUKlaeM6/CbkooY+WcVeqdNlBG0m4S0Qz0om3rdFdy1y6fYBpl6AwXJwWeMuXrvZdMuByTcRA=="], + + "metro-source-map": ["metro-source-map@0.83.1", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-symbolicate": "0.83.1", "nullthrows": "^1.1.1", "ob1": "0.83.1", "source-map": "^0.5.6", "vlq": "^1.0.0" } }, "sha512-De7Vbeo96fFZ2cqmI0fWwVJbtHIwPZv++LYlWSwzTiCzxBDJORncN0LcT48Vi2UlQLzXJg+/CuTAcy7NBVh69A=="], + + "metro-symbolicate": ["metro-symbolicate@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", "metro-source-map": "0.83.1", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "bin": { "metro-symbolicate": "src/index.js" } }, "sha512-wPxYkONlq/Sv8Ji7vHEx5OzFouXAMQJjpcPW41ySKMLP/Ir18SsiJK2h4YkdKpYrTS1+0xf8oqF6nxCsT3uWtg=="], + + "metro-transform-plugins": ["metro-transform-plugins@0.83.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.3", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" } }, "sha512-1Y+I8oozXwhuS0qwC+ezaHXBf0jXW4oeYn4X39XWbZt9X2HfjodqY9bH9r6RUTsoiK7S4j8Ni2C91bUC+sktJQ=="], + + "metro-transform-worker": ["metro-transform-worker@0.83.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/generator": "^7.25.0", "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "metro": "0.83.1", "metro-babel-transformer": "0.83.1", "metro-cache": "0.83.1", "metro-cache-key": "0.83.1", "metro-minify-terser": "0.83.1", "metro-source-map": "0.83.1", "metro-transform-plugins": "0.83.1", "nullthrows": "^1.1.1" } }, "sha512-owCrhPyUxdLgXEEEAL2b14GWTPZ2zYuab1VQXcfEy0sJE71iciD7fuMcrngoufh7e7UHDZ56q4ktXg8wgiYA1Q=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], @@ -296,6 +901,10 @@ "mimic-response": ["mimic-response@2.1.0", "", {}, "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="], + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -312,12 +921,14 @@ "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], - "nan": ["nan@2.22.2", "", {}, "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ=="], + "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], "nanoid": ["nanoid@4.0.2", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw=="], "napi-build-utils": ["napi-build-utils@1.0.2", "", {}, "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="], + "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], "neon-cli": ["neon-cli@0.8.3", "", { "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-commands": "^3.0.1", "command-line-usage": "^6.1.0", "git-config": "0.0.7", "handlebars": "^4.7.6", "inquirer": "^7.3.3", "make-promises-safe": "^5.1.0", "rimraf": "^3.0.2", "semver": "^7.3.2", "toml": "^3.0.0", "ts-typed-json": "^0.3.2", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" }, "bin": { "neon": "bin/cli.js" } }, "sha512-I44MB8PD0AEyFr/b5icR4sX1tsjdkb2T2uWEStG4Uf5C/jzalZPn7eazbQrW6KDyXNd8bc+LVuOr1v6CGTa1KQ=="], @@ -330,6 +941,12 @@ "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + "npm-path": ["npm-path@2.0.4", "", { "dependencies": { "which": "^1.2.10" }, "bin": { "npm-path": "bin/npm-path" } }, "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw=="], "npm-run-path": ["npm-run-path@3.1.0", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg=="], @@ -338,44 +955,132 @@ "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], + "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], + "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], + "ob1": ["ob1@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + + "on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], + + "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pino": ["pino@9.9.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ=="], + + "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], + + "pino-pretty": ["pino-pretty@13.1.1", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^3.0.2", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA=="], + + "pino-std-serializers": ["pino-std-serializers@7.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + "prebuild-install": ["prebuild-install@6.1.4", "", { "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^2.21.0", "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^3.0.3", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ=="], "prebuildify": ["prebuildify@github:einhornimmond/prebuildify#65d9445", { "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" }, "bin": { "prebuildify": "./bin.js" } }, "einhornimmond-prebuildify-65d9445"], + "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], + + "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], + + "protobufjs": ["protobufjs@7.2.5", "", { "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" } }, "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A=="], + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], + + "pvutils": ["pvutils@1.1.3", "", {}, "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ=="], + + "queue": ["queue@6.0.2", "", { "dependencies": { "inherits": "~2.0.3" } }, "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA=="], + + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + "raikiri": ["raikiri@0.0.0-beta.8", "", {}, "sha512-cH/yfvkiGkN8IBB2MkRHikpPurTnd2sMkQ/xtGpXrp3O76P4ppcWPb+86mJaBDzKaclLnSX+9NnT79D7ifH4/w=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + "react": ["react@19.1.1", "", {}, "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ=="], + + "react-devtools-core": ["react-devtools-core@6.1.5", "", { "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" } }, "sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA=="], + + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "react-native": ["react-native@0.81.0", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.0", "@react-native/codegen": "0.81.0", "@react-native/community-cli-plugin": "0.81.0", "@react-native/gradle-plugin": "0.81.0", "@react-native/js-polyfills": "0.81.0", "@react-native/normalize-colors": "0.81.0", "@react-native/virtualized-lists": "0.81.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.83.1", "metro-source-map": "^0.83.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.26.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "^19.1.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-RDWhewHGsAa5uZpwIxnJNiv5tW2y6/DrQUjEBdAHPzGMwuMTshern2s4gZaWYeRU3SQguExVddCjiss9IBhxqA=="], + + "react-native-get-random-values": ["react-native-get-random-values@1.11.0", "", { "dependencies": { "fast-base64-decode": "^1.0.0" }, "peerDependencies": { "react-native": ">=0.56" } }, "sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ=="], + + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + "readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + "reduce-flatten": ["reduce-flatten@2.0.0", "", {}, "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="], + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], + + "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], + + "regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], + "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], @@ -386,27 +1091,63 @@ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "secure-json-parse": ["secure-json-parse@4.0.0", "", {}, "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA=="], + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "send": ["send@0.19.0", "", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" } }, "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw=="], + + "serialize-error": ["serialize-error@2.1.0", "", {}, "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw=="], + + "serve-static": ["serve-static@1.16.2", "", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.19.0" } }, "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw=="], + "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], + "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], "simple-get": ["simple-get@3.1.1", "", { "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA=="], + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "spark-md5": ["spark-md5@3.0.2", "", {}, "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="], + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], + + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], + + "statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], "streamroller": ["streamroller@3.1.5", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" } }, "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw=="], @@ -416,12 +1157,14 @@ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], - "strtok3": ["strtok3@10.3.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw=="], + "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="], "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "table-layout": ["table-layout@1.0.2", "", { "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", "typical": "^5.2.0", "wordwrapjs": "^4.0.0" } }, "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A=="], "tar": ["tar@6.2.1", "", { "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" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], @@ -430,40 +1173,74 @@ "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + "terser": ["terser@5.43.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg=="], + + "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], + + "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], - "token-types": ["token-types@6.0.3", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-IKJ6EzuPPWtKtEIEPpIdXv9j5j2LGJEYk0CKY2efgKoYKLBiZdh6iQkLVBow/CB3phyWAWCyk+bZeaimJn6uRQ=="], + "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="], "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], "ts-typed-json": ["ts-typed-json@0.3.2", "", {}, "sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA=="], - "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], - "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], - "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], + "uint8array-extras": ["uint8array-extras@1.4.1", "", {}, "sha512-+NWHrac9dvilNgme+gP4YrBSumsaMZP0fNBtXXFIf33RLLKEcBUKaQZ7ULUbS0sBfcjxIZ4V96OTRkCbM7hxpw=="], - "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.0", "", {}, "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.1.0", "", {}, "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="], "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + "url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="], + "utf8": ["utf8@3.0.0", "", {}, "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], "util-extend": ["util-extend@1.0.3", "", {}, "sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA=="], + "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], @@ -472,6 +1249,12 @@ "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], + "vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], + + "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], + + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], @@ -484,6 +1267,10 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="], + + "ws": ["ws@6.2.3", "", { "dependencies": { "async-limiter": "~1.0.0" } }, "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], @@ -492,13 +1279,35 @@ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "zod": ["zod@3.25.67", "", {}, "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw=="], + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "cmake-js/axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], + "chrome-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "cmake-js/fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + "chromium-edge-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "cmake-js/axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + + "cmake-js/fs-extra": ["fs-extra@11.3.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g=="], "cmake-js/npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], @@ -510,14 +1319,44 @@ "command-line-usage/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], + + "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], + "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], + + "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "memory-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "node-abi/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], @@ -528,8 +1367,32 @@ "prebuildify/node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + + "rxjs/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + + "send/on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "table-layout/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], @@ -542,9 +1405,7 @@ "wordwrapjs/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], - "bl/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - - "cmake-js/fs-extra/jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + "cmake-js/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "cmake-js/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -556,13 +1417,17 @@ "command-line-usage/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - "memory-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "cmake-js/npmlog/are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -570,8 +1435,6 @@ "command-line-usage/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "cmake-js/npmlog/are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], - "command-line-usage/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], } } diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 08804bc0f..5bb4f4f08 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -1,6 +1,11 @@ { "name": "dlt-connector", + "repository": "git@github.com:gradido/gradido.git", + "description": "Gradido DLT-Connector", + "author": "Gradido Academy - https://www.gradido.net", + "license": "Apache-2.0", "version": "1.0.50", + "private": true, "scripts": { "start": "bun run src/index.ts", "build": "bun build src/index.ts --outdir=build --target=bun --external=gradido-blockchain-js --external=@iota/client", @@ -19,10 +24,13 @@ "@biomejs/biome": "2.0.0", "@elysiajs/trpc": "^1.1.0", "@elysiajs/websocket": "^0.2.8", + "@hashgraph/sdk": "^2.70.0", + "@sinclair/typebox": "^0.34.33", + "@sinclair/typemap": "^0.10.1", "@trpc/server": "^11.4.3", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", - "elysia": "^1.3.5", + "elysia": "1.3.8", "graphql-request": "^7.2.0", "jose": "^5.2.2", "jsonrpc-ts-client": "^0.2.3", diff --git a/dlt-connector/src/KeyPairCacheManager.ts b/dlt-connector/src/KeyPairCacheManager.ts index b5501132c..a74780471 100644 --- a/dlt-connector/src/KeyPairCacheManager.ts +++ b/dlt-connector/src/KeyPairCacheManager.ts @@ -1,8 +1,8 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { KeyPairIdentifier } from './data/KeyPairIdentifier.logic' import { getLogger, Logger } from 'log4js' import { LOG4JS_BASE_CATEGORY } from './config/const' +import { HieroId } from './schemas/typeGuard.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -13,7 +13,7 @@ import { LOG4JS_BASE_CATEGORY } from './config/const' export class KeyPairCacheManager { private static instance: KeyPairCacheManager private cache: Map = new Map() - private homeCommunityUUID: string | undefined + private homeCommunityTopicId: HieroId | undefined private logger: Logger /** @@ -37,15 +37,15 @@ export class KeyPairCacheManager { return KeyPairCacheManager.instance } - public setHomeCommunityUUID(uuid: string): void { - this.homeCommunityUUID = uuid + public setHomeCommunityTopicId(topicId: HieroId): void { + this.homeCommunityTopicId = topicId } - public getHomeCommunityUUID(): string { - if (!this.homeCommunityUUID) { - throw new Error('home community uuid is not set') + public getHomeCommunityTopicId(): HieroId { + if (!this.homeCommunityTopicId) { + throw new Error('home community topic id is not set') } - return this.homeCommunityUUID + return this.homeCommunityTopicId } public findKeyPair(input: string): KeyPairEd25519 | undefined { @@ -63,7 +63,10 @@ export class KeyPairCacheManager { this.cache.set(input, keyPair) } - public async getKeyPair(input: string, createKeyPair: () => Promise): Promise { + public async getKeyPair( + input: string, + createKeyPair: () => Promise, + ): Promise { const keyPair = this.cache.get(input) if (!keyPair) { const keyPair = await createKeyPair() diff --git a/dlt-connector/src/client/GradidoNode/api.ts b/dlt-connector/src/client/GradidoNode/api.ts index fa8672a23..383f1c3f4 100644 --- a/dlt-connector/src/client/GradidoNode/api.ts +++ b/dlt-connector/src/client/GradidoNode/api.ts @@ -1,18 +1,18 @@ import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' -import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' -import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' -import { rpcCall, rpcCallResolved, GradidoNodeRequestError } from './jsonrpc' -import { - TransactionsRangeInput, - TransactionIdentifierInput, - transactionsRangeSchema, - transactionIdentifierSchema -} from './input.schema' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { Uuidv4Hash } from '../../data/Uuidv4Hash' -import { Hex32, Hex32Input, hex32Schema } from '../../schemas/typeGuard.schema' +import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' +import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' +import { Hex32, Hex32Input, HieroId, hex32Schema } from '../../schemas/typeGuard.schema' +import { + TransactionIdentifierInput, + TransactionsRangeInput, + transactionIdentifierSchema, + transactionsRangeSchema, +} from './input.schema' +import { GradidoNodeRequestError, rpcCall, rpcCallResolved } from './jsonrpc' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) @@ -21,7 +21,7 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) * get list of confirmed transactions from a specific community * @param input fromTransactionId is the id of the first transaction to return * @param input maxResultCount is the max number of transactions to return - * @param input topic is the community topic + * @param input topic is the community hiero topic id * @returns list of confirmed transactions * @throws GradidoNodeRequestError * @example @@ -35,7 +35,7 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) */ async function getTransactions(input: TransactionsRangeInput): Promise { const parameter = { ...v.parse(transactionsRangeSchema, input), format: 'base64' } - const result = await rpcCallResolved<{transactions: string[]}>('getTransactions', parameter) + const result = await rpcCallResolved<{ transactions: string[] }>('getTransactions', parameter) return result.transactions.map((transactionBase64) => v.parse(confirmedTransactionSchema, transactionBase64), ) @@ -44,12 +44,13 @@ async function getTransactions(input: TransactionsRangeInput): Promise { +async function getTransaction( + transactionIdentifier: TransactionIdentifierInput, +): Promise { const parameter = { ...v.parse(transactionIdentifierSchema, transactionIdentifier), format: 'base64', @@ -74,7 +75,9 @@ async function getTransaction(transactionIdentifier: TransactionIdentifierInput) * @throws GradidoNodeRequestError */ -async function getLastTransaction(iotaTopic: Uuidv4Hash): Promise { +async function getLastTransaction( + iotaTopic: Uuidv4Hash, +): Promise { const response = await rpcCall<{ transaction: string }>('getlasttransaction', { format: 'base64', topic: iotaTopic.getAsHexString(), @@ -92,19 +95,19 @@ async function getLastTransaction(iotaTopic: Uuidv4Hash): Promise { +async function getAddressType(pubkey: Hex32Input, hieroTopic: HieroId): Promise { const parameter = { pubkey: v.parse(hex32Schema, pubkey), - communityId: iotaTopic.getAsHexString(), + communityId: hieroTopic, } const response = await rpcCallResolved<{ addressType: string }>('getaddresstype', parameter) return v.parse(addressTypeSchema, response.addressType) @@ -118,17 +121,26 @@ async function getAddressType(pubkey: Hex32Input, iotaTopic: Uuidv4Hash): Promis * @returns the public key of the user as hex32 string or undefined if user is not found * @throws GradidoNodeRequestError */ -async function findUserByNameHash(nameHash: Uuidv4Hash, iotaTopic: Uuidv4Hash): Promise { +async function findUserByNameHash( + nameHash: Uuidv4Hash, + hieroTopic: HieroId, +): Promise { const parameter = { nameHash: nameHash.getAsHexString(), - communityId: iotaTopic.getAsHexString(), + communityId: hieroTopic, } - const response = await rpcCall<{ pubkey: string; timeUsed: string }>('findUserByNameHash', parameter) - if(response.isSuccess()) { + const response = await rpcCall<{ pubkey: string; timeUsed: string }>( + 'findUserByNameHash', + parameter, + ) + if (response.isSuccess()) { logger.info(`call findUserByNameHash, used ${response.result.timeUsed}`) return v.parse(hex32Schema, response.result.pubkey) } - if (response.isError() && response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND) { + if ( + response.isError() && + response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND + ) { logger.debug(`call findUserByNameHash, return with error: ${response.error.message}`) } return undefined @@ -136,10 +148,10 @@ async function findUserByNameHash(nameHash: Uuidv4Hash, iotaTopic: Uuidv4Hash): /** * getTransactionsForAccount - * get list of confirmed transactions for a specific account + * get list of confirmed transactions for a specific account * @param transactionRange the range of transactions to return * @param pubkey the public key of the account - * @returns list of confirmed transactions + * @returns list of confirmed transactions * @throws GradidoNodeRequestError */ async function getTransactionsForAccount( @@ -151,7 +163,10 @@ async function getTransactionsForAccount( pubkey: v.parse(hex32Schema, pubkey), format: 'base64', } - const response = await rpcCallResolved<{transactions: string[]}>('listtransactionsforaddress', parameter) + const response = await rpcCallResolved<{ transactions: string[] }>( + 'listtransactionsforaddress', + parameter, + ) return response.transactions.map((transactionBase64) => v.parse(confirmedTransactionSchema, transactionBase64), ) diff --git a/dlt-connector/src/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts index b207f935a..218805c3f 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -1,36 +1,35 @@ import * as v from 'valibot' -import { hex32Schema, iotaMessageIdSchema } from '../../schemas/typeGuard.schema' +import { hieroIdSchema, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' export const transactionsRangeSchema = v.object({ // default value is 1, from first transactions - fromTransactionId: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), + fromTransactionId: v.nullish(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), // default value is 100, max 100 transactions - maxResultCount: v.undefinedable(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), - topic: hex32Schema, + maxResultCount: v.nullish(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), + topic: hieroIdSchema, }) export type TransactionsRangeInput = v.InferInput - // allow TransactionIdentifier to only contain either transactionNr or iotaMessageId export const transactionIdentifierSchema = v.pipe( v.object({ transactionNr: v.nullish( v.pipe(v.number('expect number type'), v.minValue(1, 'expect number >= 1')), - undefined + undefined, ), - iotaMessageId: v.nullish(iotaMessageIdSchema, undefined), - topic: hex32Schema, + hieroTransactionId: v.nullish(hieroTransactionIdSchema, undefined), + topic: hieroIdSchema, }), v.custom((value: any) => { - const setFieldsCount = Number(value.transactionNr !== undefined) + Number(value.iotaMessageId !== undefined) + const setFieldsCount = + Number(value.transactionNr !== undefined) + Number(value.hieroTransactionId !== undefined) if (setFieldsCount !== 1) { return false } return true - }, 'expect transactionNr or iotaMessageId not both') + }, 'expect transactionNr or hieroTransactionId not both'), ) export type TransactionIdentifierInput = v.InferInput export type TransactionIdentifier = v.InferOutput - diff --git a/dlt-connector/src/client/GradidoNode/jsonrpc.ts b/dlt-connector/src/client/GradidoNode/jsonrpc.ts index 6cd053d87..b93ff65f0 100644 --- a/dlt-connector/src/client/GradidoNode/jsonrpc.ts +++ b/dlt-connector/src/client/GradidoNode/jsonrpc.ts @@ -1,9 +1,9 @@ -import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' -import { isPortOpenRetry } from '../../utils/network' -import { CONFIG } from '../../config' import JsonRpcClient from 'jsonrpc-ts-client' +import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' +import { getLogger } from 'log4js' +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { isPortOpenRetry } from '../../utils/network' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) @@ -24,7 +24,10 @@ export class GradidoNodeRequestError extends Error { } // return result on success or throw error -export function resolveResponse(response: JsonRpcEitherResponse, onSuccess: (result: T) => R): R { +export function resolveResponse( + response: JsonRpcEitherResponse, + onSuccess: (result: T) => R, +): R { if (response.isSuccess()) { return onSuccess(response.result) } else if (response.isError()) { @@ -36,7 +39,10 @@ export function resolveResponse(response: JsonRpcEitherResponse, onSucc type WithTimeUsed = T & { timeUsed?: string } // template rpcCall, check first if port is open before executing json rpc 2.0 request -export async function rpcCall(method: string, parameter: any): Promise> { +export async function rpcCall( + method: string, + parameter: any, +): Promise> { logger.debug('call %s with %s', method, parameter) await isPortOpenRetry(CONFIG.NODE_SERVER_URL) return client.exec(method, parameter) @@ -51,4 +57,4 @@ export async function rpcCallResolved(method: string, parameter: any): Promis } return result as T }) -} \ No newline at end of file +} diff --git a/dlt-connector/src/client/HieroClient.ts b/dlt-connector/src/client/HieroClient.ts new file mode 100644 index 000000000..d7be17eb3 --- /dev/null +++ b/dlt-connector/src/client/HieroClient.ts @@ -0,0 +1,74 @@ +import { + AccountBalance, + AccountBalanceQuery, + Client, + LocalProvider, + PrivateKey, + TopicMessageSubmitTransaction, + TransactionReceipt, + TransactionResponse, + Wallet, +} from '@hashgraph/sdk' +import { GradidoTransaction } from 'gradido-blockchain-js' +import { getLogger, Logger } from 'log4js' +import { CONFIG } from '../config' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { HieroId } from '../schemas/typeGuard.schema' + +export class HieroClient { + private static instance: HieroClient + wallet: Wallet + logger: Logger + + private constructor() { + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.HieroClient`) + const provider = LocalProvider.fromClient(Client.forName(CONFIG.HIERO_HEDERA_NETWORK)) + let operatorKey: PrivateKey + if (CONFIG.HIERO_OPERATOR_KEY.length === 64) { + operatorKey = PrivateKey.fromStringED25519(CONFIG.HIERO_OPERATOR_KEY) + } else { + operatorKey = PrivateKey.fromStringECDSA(CONFIG.HIERO_OPERATOR_KEY) + } + this.wallet = new Wallet(CONFIG.HIERO_OPERATOR_ID, operatorKey, provider) + } + + public static getInstance(): HieroClient { + if (!CONFIG.HIERO_ACTIVE) { + throw new Error('hiero is disabled via config...') + } + if (!HieroClient.instance) { + HieroClient.instance = new HieroClient() + } + + return HieroClient.instance + } + + public async sendMessage( + topicId: HieroId, + transaction: GradidoTransaction, + ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { + const serializedTransaction = transaction.getSerializedTransaction() + if (!serializedTransaction) { + throw new Error('cannot serialize transaction') + } + // send one message + const hieroTransaction = await new TopicMessageSubmitTransaction({ + topicId, + message: serializedTransaction.data(), + }).freezeWithSigner(this.wallet) + const signedHieroTransaction = await hieroTransaction.signWithSigner(this.wallet) + const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) + const sendReceipt = await sendResponse.getReceiptWithSigner(this.wallet) + this.logger.info( + `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, + ) + return { receipt: sendReceipt, response: sendResponse } + } + + public async getBalance(): Promise { + const balance = await new AccountBalanceQuery() + .setAccountId(this.wallet.getAccountId()) + .executeWithSigner(this.wallet) + return balance + } +} diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index 50904d198..7e98f82f9 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -1,21 +1,10 @@ -import { gql, GraphQLClient } from 'graphql-request' +import { GraphQLClient, gql } from 'graphql-request' import { SignJWT } from 'jose' - -import { CONFIG } from '../../config' -import { communitySchema, type Community } from './community.schema' import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' - -const homeCommunity = gql` - query { - homeCommunity { - uuid - foreign - creationDate - } - } -` +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { type Community, communitySchema, homeCommunityGraphqlQuery } from './community.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -26,7 +15,7 @@ const homeCommunity = gql` export class BackendClient { private static instance: BackendClient client: GraphQLClient - logger: Logger + logger: Logger /** * The Singleton's constructor should always be private to prevent direct @@ -56,14 +45,14 @@ export class BackendClient { public static getInstance(): BackendClient | undefined { if (!BackendClient.instance) { BackendClient.instance = new BackendClient() - } + } return BackendClient.instance } public async getHomeCommunityDraft(): Promise { this.logger.info('check home community on backend') const { data, errors } = await this.client.rawRequest<{ homeCommunity: Community }>( - homeCommunity, + homeCommunityGraphqlQuery, {}, // empty variables await this.getRequestHeader(), ) diff --git a/dlt-connector/src/client/backend/community.schema.test.ts b/dlt-connector/src/client/backend/community.schema.test.ts index 42cf9dc7e..4d2931ed0 100644 --- a/dlt-connector/src/client/backend/community.schema.test.ts +++ b/dlt-connector/src/client/backend/community.schema.test.ts @@ -1,21 +1,21 @@ -import { communitySchema } from './community.schema' -import { uuidv4Schema } from '../../schemas/typeGuard.schema' -import * as v from 'valibot' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' +import * as v from 'valibot' +import { uuidv4Schema } from '../../schemas/typeGuard.schema' +import { communitySchema } from './community.schema' describe('community.schema', () => { it('community', () => { - expect(v.parse(communitySchema, { - uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', - foreign: false, - createdAt: '2021-01-01', - })).toEqual( - { - uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), + expect( + v.parse(communitySchema, { + uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', foreign: false, - createdAt: new Date('2021-01-01'), - }, - ) + createdAt: '2021-01-01', + }), + ).toEqual({ + uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), + foreign: false, + createdAt: new Date('2021-01-01'), + }) }) }) diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts index af8cf01bd..182a41368 100644 --- a/dlt-connector/src/client/backend/community.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -1,6 +1,7 @@ +import { gql } from 'graphql-request' import * as v from 'valibot' -import { uuidv4Schema } from '../../schemas/typeGuard.schema' import { dateSchema } from '../../schemas/typeConverter.schema' +import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' /** * Schema Definitions for rpc call parameter, when dlt-connector is called from backend @@ -11,9 +12,22 @@ import { dateSchema } from '../../schemas/typeConverter.schema' */ export const communitySchema = v.object({ uuid: uuidv4Schema, + topicId: hieroIdSchema, foreign: v.boolean('expect boolean type'), createdAt: dateSchema, }) export type CommunityInput = v.InferInput export type Community = v.InferOutput + +// graphql query for getting home community in tune with community schema +export const homeCommunityGraphqlQuery = gql` + query { + homeCommunity { + uuid + topicId + foreign + creationDate + } + } +` diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 2d016eee2..9a9889cda 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -1,5 +1,6 @@ /* eslint-disable n/no-process-env */ import dotenv from 'dotenv' + dotenv.config() const logging = { @@ -25,7 +26,16 @@ const iota = { IOTA_HOME_COMMUNITY_SEED: process.env.IOTA_HOME_COMMUNITY_SEED ?? null, } -const apis = { +const hiero = { + HIERO_ACTIVE: process.env.HIERO_ACTIVE === 'true' || false, + HIERO_HEDERA_NETWORK: process.env.HIERO_HEDERA_NETWORK ?? 'testnet', + HIERO_OPERATOR_ID: process.env.HIERO_OPERATOR_ID ?? '0.0.2', + HIERO_OPERATOR_KEY: + process.env.HIERO_OPERATOR_KEY ?? + '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137', +} + +const apis = { CONNECT_TIMEOUT_MS: process.env.CONNECT_TIMEOUT_MS ? Number.parseInt(process.env.CONNECT_TIMEOUT_MS) : 1000, @@ -45,5 +55,6 @@ export const CONFIG = { ...server, ...secrets, ...iota, + ...hiero, ...apis, } diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts new file mode 100644 index 000000000..b9a170e43 --- /dev/null +++ b/dlt-connector/src/config/schema.ts @@ -0,0 +1,24 @@ +import * as v from 'valibot' + +export const HIERO_ACTIVE = v.nullish( + v.boolean('Flag to indicate if the Hiero (Hedera Hashgraph Ledger) service is used.'), + false, +) + +export const HIERO_HEDERA_NETWORK = v.nullish( + v.union([v.literal('mainnet'), v.literal('testnet'), v.literal('previewnet')]), + 'testnet', +) + +export const HIERO_OPERATOR_ID = v.nullish( + v.pipe(v.string('The operator ID for Hiero integration'), v.regex(/^[0-9]+\.[0-9]+\.[0-9]+$/)), + '0.0.2', +) + +export const HIERO_OPERATOR_KEY = v.nullish( + v.pipe( + v.string('The operator key for Hiero integration, default is for local default node'), + v.regex(/^[0-9a-fA-F]{64,96}$/), + ), + '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137', +) diff --git a/dlt-connector/src/data/KeyPairIdentifier.logic.ts b/dlt-connector/src/data/KeyPairIdentifier.logic.ts index b0bade47b..437d9a458 100644 --- a/dlt-connector/src/data/KeyPairIdentifier.logic.ts +++ b/dlt-connector/src/data/KeyPairIdentifier.logic.ts @@ -1,14 +1,10 @@ import { MemoryBlock } from 'gradido-blockchain-js' -import { IdentifierAccount, IdentifierAccountInput, identifierAccountSchema } from '../schemas/account.schema' import { ParameterError } from '../errors' -import * as v from 'valibot' +import { IdentifierAccount } from '../schemas/account.schema' +import { HieroId } from '../schemas/typeGuard.schema' export class KeyPairIdentifierLogic { - public identifier: IdentifierAccount - public constructor(identifier: IdentifierAccountInput) { - // check if data structure is like expected and fill in defaults - this.identifier = v.parse(identifierAccountSchema, identifier) - } + public constructor(public identifier: IdentifierAccount) {} isCommunityKeyPair(): boolean { return !this.identifier.seed && !this.identifier.account @@ -36,19 +32,21 @@ export class KeyPairIdentifierLogic { getSeed(): string { if (!this.identifier.seed) { - throw new Error('get seed called on non seed key pair identifier, please check first with isSeedKeyPair()') + throw new Error( + 'get seed called on non seed key pair identifier, please check first with isSeedKeyPair()', + ) } return this.identifier.seed.seed } - getCommunityUuid(): string { - return this.identifier.communityUuid + getCommunityTopicId(): HieroId { + return this.identifier.communityTopicId } getUserUuid(): string { if (!this.identifier.account) { throw new Error( - 'get user uuid called on non user key pair identifier, please check first with isUserKeyPair() or isAccountKeyPair()' + 'get user uuid called on non user key pair identifier, please check first with isUserKeyPair() or isAccountKeyPair()', ) } return this.identifier.account.userUuid @@ -57,19 +55,23 @@ export class KeyPairIdentifierLogic { getAccountNr(): number { if (!this.identifier.account?.accountNr) { throw new Error( - 'get account nr called on non account key pair identifier, please check first with isAccountKeyPair()' + 'get account nr called on non account key pair identifier, please check first with isAccountKeyPair()', ) } return this.identifier.account.accountNr } - getSeedKey(): string { return this.getSeed() } - getCommunityKey(): string { return this.getCommunityUuid() } - getCommunityUserKey(): string { + getSeedKey(): string { + return this.getSeed() + } + getCommunityKey(): HieroId { + return this.getCommunityTopicId() + } + getCommunityUserKey(): string { return this.createCommunityUserHash() } - getCommunityUserAccountKey(): string { - return this.createCommunityUserHash() + this.getAccountNr().toString() + getCommunityUserAccountKey(): string { + return this.createCommunityUserHash() + this.getAccountNr().toString() } getKey(): string { @@ -86,12 +88,11 @@ export class KeyPairIdentifierLogic { } private createCommunityUserHash(): string { - if (!this.identifier.account?.userUuid || !this.identifier.communityUuid) { - throw new ParameterError('userUuid and/or communityUuid is undefined') + if (!this.identifier.account?.userUuid || !this.identifier.communityTopicId) { + throw new ParameterError('userUuid and/or communityTopicId is undefined') } - const resultHexString = - this.identifier.communityUuid.replace(/-/g, '') - + this.identifier.account.userUuid.replace(/-/g, '') + const resultHexString = + this.identifier.communityTopicId + this.identifier.account.userUuid.replace(/-/g, '') return MemoryBlock.fromHex(resultHexString).calculateHash().convertToHex() } } diff --git a/dlt-connector/src/data/Uuidv4Hash.ts b/dlt-connector/src/data/Uuidv4Hash.ts index 541f412d2..338dd4d4d 100644 --- a/dlt-connector/src/data/Uuidv4Hash.ts +++ b/dlt-connector/src/data/Uuidv4Hash.ts @@ -1,13 +1,19 @@ import { MemoryBlock } from 'gradido-blockchain-js' -import { Uuidv4, Hex32, hex32Schema, MemoryBlock32, memoryBlock32Schema } from '../schemas/typeGuard.schema' import * as v from 'valibot' +import { + Hex32, + hex32Schema, + MemoryBlock32, + memoryBlock32Schema, + Uuidv4, +} from '../schemas/typeGuard.schema' /** * Uuidv4Hash is a class that represents a uuidv4 BLAKE2b hash * to get the hash, the - in the uuidv4 will be removed and the result interpreted as hex string - * then the hash will be calculated with BLAKE2b algorithm + * then the hash will be calculated with BLAKE2b algorithm * crypto_generichash from libsodium will be called when calling MemoryBlock.calculateHash() - * + * * This will be used as NameHash for user identification (user uuid as input) * This will be used as IotaTopic for transactions (community uuid as input) */ @@ -17,7 +23,10 @@ export class Uuidv4Hash { uuidv4HashString: Hex32 | undefined constructor(uuidv4: Uuidv4) { - this.uuidv4Hash = v.parse(memoryBlock32Schema, MemoryBlock.fromHex(uuidv4.replace(/-/g, '')).calculateHash()) + this.uuidv4Hash = v.parse( + memoryBlock32Schema, + MemoryBlock.fromHex(uuidv4.replace(/-/g, '')).calculateHash(), + ) } getAsMemoryBlock(): MemoryBlock32 { diff --git a/dlt-connector/src/enum/AddressType.ts b/dlt-connector/src/enum/AddressType.ts index 8ac2f05fc..a19abbf78 100644 --- a/dlt-connector/src/enum/AddressType.ts +++ b/dlt-connector/src/enum/AddressType.ts @@ -4,9 +4,9 @@ import { AddressType_COMMUNITY_HUMAN, AddressType_COMMUNITY_PROJECT, AddressType_CRYPTO_ACCOUNT, + AddressType_DEFERRED_TRANSFER, AddressType_NONE, AddressType_SUBACCOUNT, - AddressType_DEFERRED_TRANSFER, } from 'gradido-blockchain-js' export enum AddressType { @@ -18,4 +18,4 @@ export enum AddressType { NONE = AddressType_NONE, SUBACCOUNT = AddressType_SUBACCOUNT, DEFERRED_TRANSFER = AddressType_DEFERRED_TRANSFER, -} \ No newline at end of file +} diff --git a/dlt-connector/src/enum/GradidoNodeErrorCodes.ts b/dlt-connector/src/enum/GradidoNodeErrorCodes.ts index 49153dc15..afbf9dd4d 100644 --- a/dlt-connector/src/enum/GradidoNodeErrorCodes.ts +++ b/dlt-connector/src/enum/GradidoNodeErrorCodes.ts @@ -17,4 +17,4 @@ export enum GradidoNodeErrorCodes { // -32603 Internal error Internal JSON - RPC error. INTERNAL_ERROR = -32603, // -32000 to -32099 Server error Reserved for implementation-defined server-errors. -} \ No newline at end of file +} diff --git a/dlt-connector/src/enum/InputTransactionType.ts b/dlt-connector/src/enum/InputTransactionType.ts index 65c806afc..4aa4fc8cf 100755 --- a/dlt-connector/src/enum/InputTransactionType.ts +++ b/dlt-connector/src/enum/InputTransactionType.ts @@ -1,11 +1,11 @@ -// enum for graphql but with int because it is the same in backend -// for transaction type from backend -export enum InputTransactionType { - GRADIDO_TRANSFER = 'GRADIDO_TRANSFER', - GRADIDO_CREATION = 'GRADIDO_CREATION', - 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', -} +// enum for graphql but with int because it is the same in backend +// for transaction type from backend +export enum InputTransactionType { + GRADIDO_TRANSFER = 'GRADIDO_TRANSFER', + GRADIDO_CREATION = 'GRADIDO_CREATION', + 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/errors.ts b/dlt-connector/src/errors.ts index 73e6fd0f4..c9be7c2a2 100644 --- a/dlt-connector/src/errors.ts +++ b/dlt-connector/src/errors.ts @@ -1,5 +1,5 @@ -import { TransactionIdentifier } from './schemas/transaction.schema' import { IdentifierAccount } from './schemas/account.schema' +import { TransactionIdentifier } from './schemas/transaction.schema' export class GradidoNodeError extends Error { constructor(message: string) { diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 7681719ed..68b7f4803 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,16 +1,16 @@ -import { Elysia } from 'elysia' -import { CONFIG } from './config' -import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' -import { getLogger, configure } from 'log4js' import { readFileSync } from 'node:fs' -import { isPortOpenRetry } from './utils/network' -import { BackendClient } from './client/backend/BackendClient' -import { KeyPairCacheManager } from './KeyPairCacheManager' -import { getTransaction } from './client/GradidoNode/api' -import { Uuidv4Hash } from './data/Uuidv4Hash' -import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' -import { keyGenerationSeedSchema } from './schemas/base.schema' +import { Elysia } from 'elysia' +import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' +import { configure, getLogger } from 'log4js' import * as v from 'valibot' +import { BackendClient } from './client/backend/BackendClient' +import { getTransaction } from './client/GradidoNode/api' +import { CONFIG } from './config' +import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' +import { KeyPairCacheManager } from './KeyPairCacheManager' +import { keyGenerationSeedSchema } from './schemas/base.schema' +import { isPortOpenRetry } from './utils/network' +import { appRoutes } from './server' async function main() { // configure log4js @@ -23,7 +23,7 @@ async function main() { logger.error('IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long') process.exit(1) } - + // load crypto keys for gradido blockchain lib loadCryptoKeys( MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), @@ -38,22 +38,21 @@ async function main() { // wait for backend server await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) const homeCommunity = await backend.getHomeCommunityDraft() - KeyPairCacheManager.getInstance().setHomeCommunityUUID(homeCommunity.uuid) - const topic = new Uuidv4Hash(homeCommunity.uuid).getAsHexString() - logger.info('home community topic: %s', topic) + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.topicId) + logger.info('home community topic: %s', homeCommunity.topicId) logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) // ask gradido node if community blockchain was created try { - if (!await getTransaction({ transactionNr: 1, topic })) { + if (!(await getTransaction({ transactionNr: 1, topic: homeCommunity.topicId }))) { // if not exist, create community root transaction await SendToIotaContext(homeCommunity) } } catch (e) { logger.error('error requesting gradido node: ', e) } - // listen for rpc request from backend (replace graphql with json rpc) - const app = new Elysia() - .get('/', () => "Hello Elysia") + // listen for rpc request from backend (graphql replaced with trpc and elysia) + new Elysia() + .use(appRoutes) .listen(CONFIG.DLT_CONNECTOR_PORT, () => { logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) }) diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts index 235deadac..30b824d86 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts @@ -1,11 +1,10 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' -import { communityUuidToTopicSchema } from '../../client/backend/community.schema' -import * as v from 'valibot' +import { HieroId } from '../../schemas/typeGuard.schema' export abstract class AbstractRemoteKeyPairRole { - protected topic: string - public constructor(communityUuid: string) { - this.topic = v.parse(communityUuidToTopicSchema, communityUuid) + protected topic: HieroId + public constructor(communityTopicId: HieroId) { + this.topic = communityTopicId } public abstract retrieveKeyPair(): Promise } diff --git a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts index 517d33ae1..62ce06ecf 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts @@ -3,7 +3,10 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class AccountKeyPairRole extends AbstractKeyPairRole { - public constructor(private accountNr: number, private userKeyPair: KeyPairEd25519) { + public constructor( + private accountNr: number, + private userKeyPair: KeyPairEd25519, + ) { super() } diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts index 803b1d216..0d73d891d 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -1,19 +1,22 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' import { getTransaction } from '../../client/GradidoNode/api' - +import { + GradidoNodeInvalidTransactionError, + GradidoNodeMissingTransactionError, +} from '../../errors' +import { HieroId } from '../../schemas/typeGuard.schema' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' -import { GradidoNodeInvalidTransactionError, GradidoNodeMissingTransactionError } from '../../errors' export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { - public constructor(communityUuid: string) { - super(communityUuid) + public constructor(communityTopicId: HieroId) { + super(communityTopicId) } public async retrieveKeyPair(): Promise { const transactionIdentifier = { transactionNr: 1, - iotaTopic: this.topic, + topic: this.topic, } const firstTransaction = await getTransaction(transactionIdentifier) if (!firstTransaction) { @@ -22,21 +25,21 @@ export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { const transactionBody = firstTransaction.getGradidoTransaction()?.getTransactionBody() if (!transactionBody) { throw new GradidoNodeInvalidTransactionError( - 'Invalid transaction, body is missing', - transactionIdentifier + 'Invalid transaction, body is missing', + transactionIdentifier, ) } if (!transactionBody.isCommunityRoot()) { throw new GradidoNodeInvalidTransactionError( 'Invalid transaction, community root type expected', - transactionIdentifier + transactionIdentifier, ) } const communityRoot = transactionBody.getCommunityRoot() if (!communityRoot) { throw new GradidoNodeInvalidTransactionError( 'Invalid transaction, community root is missing', - transactionIdentifier + transactionIdentifier, ) } 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 c6164119c..883b214e8 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts @@ -20,11 +20,10 @@ export async function KeyPairCalculation(input: KeyPairIdentifierLogic): Promise return new LinkedTransactionKeyPairRole(input.getSeed()).generateKeyPair() } // If input does not belong to the home community, handle as remote key pair - if (cache.getHomeCommunityUUID() !== input.getCommunityUuid()) { - const role = - input.isAccountKeyPair() - ? new RemoteAccountKeyPairRole(input.identifier) - : new ForeignCommunityKeyPairRole(input.getCommunityUuid()) + if (cache.getHomeCommunityTopicId() !== input.getCommunityTopicId()) { + const role = input.isAccountKeyPair() + ? new RemoteAccountKeyPairRole(input.identifier) + : new ForeignCommunityKeyPairRole(input.getCommunityTopicId()) return await role.retrieveKeyPair() } const communityKeyPair = await cache.getKeyPair(input.getCommunityKey(), async () => { @@ -37,10 +36,7 @@ export async function KeyPairCalculation(input: KeyPairIdentifierLogic): Promise return communityKeyPair } const userKeyPair = await cache.getKeyPair(input.getCommunityUserKey(), async () => { - return new UserKeyPairRole( - input.getUserUuid(), - communityKeyPair, - ).generateKeyPair() + return new UserKeyPairRole(input.getUserUuid(), communityKeyPair).generateKeyPair() }) if (!userKeyPair) { throw new Error("couldn't generate user key pair") diff --git a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts index d31fd9814..bb4aeedd8 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts @@ -1,7 +1,6 @@ import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' - -import { AbstractKeyPairRole } from './AbstractKeyPair.role' import { ParameterError } from '../../errors' +import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { public constructor(private seed: string) { @@ -14,7 +13,9 @@ export class LinkedTransactionKeyPairRole extends AbstractKeyPairRole { const hash = new MemoryBlock(this.seed).calculateHash() const keyPair = KeyPairEd25519.create(hash) if (!keyPair) { - throw new ParameterError(`error creating Ed25519 KeyPair from seed: ${this.seed.substring(0, 5)}...`) + throw new ParameterError( + `error creating Ed25519 KeyPair from seed: ${this.seed.substring(0, 5)}...`, + ) } return keyPair } diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts index 4ae1af7d9..d1658d608 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -1,15 +1,14 @@ -import { KeyPairEd25519 } from 'gradido-blockchain-js' +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' import { findUserByNameHash } from '../../client/GradidoNode/api' -import { IdentifierAccount } from '../../schemas/account.schema' +import { Uuidv4Hash } from '../../data/Uuidv4Hash' import { GradidoNodeMissingUserError, ParameterError } from '../../errors' +import { IdentifierAccount } from '../../schemas/account.schema' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' -import { uuid4ToHashSchema } from '../../schemas/typeConverter.schema' -import * as v from 'valibot' export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { public constructor(private identifier: IdentifierAccount) { - super(identifier.communityUuid) + super(identifier.communityTopicId) } public async retrieveKeyPair(): Promise { @@ -18,11 +17,11 @@ export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { } const accountPublicKey = await findUserByNameHash( - v.parse(uuid4ToHashSchema, this.identifier.account.userUuid), + new Uuidv4Hash(this.identifier.account.userUuid), this.topic, ) if (accountPublicKey) { - return new KeyPairEd25519(accountPublicKey) + return new KeyPairEd25519(MemoryBlock.createPtr(MemoryBlock.fromHex(accountPublicKey))) } throw new GradidoNodeMissingUserError('cannot find remote user', this.identifier) } diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts index 3762266b2..a2f57898c 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -4,7 +4,10 @@ import { hardenDerivationIndex } from '../../utils/derivationHelper' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class UserKeyPairRole extends AbstractKeyPairRole { - public constructor(private userUuid: string, private communityKeys: KeyPairEd25519) { + public constructor( + private userUuid: string, + private communityKeys: KeyPairEd25519, + ) { super() } diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts new file mode 100644 index 000000000..bf05b584c --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts @@ -0,0 +1,64 @@ +import { beforeAll, describe, expect, it } from 'bun:test' +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' +import { v4 as uuidv4 } from 'uuid' +import { UserKeyPairRole } from './UserKeyPair.role' + +let communityKeyPair: KeyPairEd25519 +describe('UserKeyPairRole', () => { + beforeAll(() => { + communityKeyPair = KeyPairEd25519.create(new MemoryBlock('test').calculateHash())! + }) + it('should generate key pair', () => { + const userUUidPublicKeyPairs = [ + { + userUuid: '648f28cc-209c-4696-b381-5156fc1a7bcb', + publicKeyHex: 'ebd636d7e1e7177c0990d2ce836d8ced8b05ad75d62a7120a5d4a67bdd9dddb9', + }, + { + userUuid: 'fb65ef70-4c33-4dbc-aca8-3bae2609b04b', + publicKeyHex: 'd89fe30c53852dc2c8281581e6904da396c3104fc11c0a6d9b4a0afa5ce54dc1', + }, + { + userUuid: 'd58b6355-a337-4c80-b593-18d78b5cdab0', + publicKeyHex: 'dafb51eb8143cc7b2559235978ab845922ca8efa938ece078f45957ae3b92458', + }, + { + userUuid: '61144289-f69b-43a7-8b7d-5dcf3fa8ca68', + publicKeyHex: '8d4db4ecfb65e40d1a4d4d4858be1ddd54b64aa845ceaa6698c336424ae0fc58', + }, + { + userUuid: 'c63e6870-196c-4013-b30a-d0a5170e8150', + publicKeyHex: 'c240a8978da03f24d75108c4f06550a9bde46c902684a6d19d8b990819f518c8', + }, + { + userUuid: '6b40a2c9-4c0f-426d-bb55-353967e89aa2', + publicKeyHex: '75531146e27b557085c09545e7a5e95f7bfd66d0de30c31befc34e4061f4e148', + }, + { + userUuid: '50c47820-6d15-449d-89c3-b1fd02674c80', + publicKeyHex: '2c9ccb9914009bb6f24e41659223a5f8ce200cb5a4abdd808db57819f43c0ea2', + }, + { + userUuid: 'dc902954-bfc1-412e-b2f6-857e8bd45f0f', + publicKeyHex: '4546870cf56093755c1f410a53c5908a5f30f26bc553110779e8bf5b841d904a', + }, + { + userUuid: 'd77cd665-0d60-4033-a887-07944466ccbe', + publicKeyHex: '6563a5ca2944ba47391afd11a46e65bb7eb90657179dbc2d6be88af9ffa849a9', + }, + { + userUuid: 'ee83ed52-8a37-4a8a-8eed-ffaaac7d0d03', + publicKeyHex: '03968833ee5d4839cb9091f39f76c9f5ca35f117b953229b59549cce907a60ea', + }, + ] + for (let i = 0; i < userUUidPublicKeyPairs.length; i++) { + const pair = userUUidPublicKeyPairs[i] + const userKeyPairRole = new UserKeyPairRole(pair.userUuid, communityKeyPair) + const accountKeyPair = userKeyPairRole.generateKeyPair() + expect(accountKeyPair).toBeDefined() + const publicKeyHex = accountKeyPair.getPublicKey()?.convertToHex() + expect(publicKeyHex).toHaveLength(64) + expect(publicKeyHex).toBe(pair.publicKeyHex) + } + }) +}) diff --git a/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts index ac9120e3d..df9ce2c59 100644 --- a/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts @@ -1,7 +1,8 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' +import { HieroId } from '../../schemas/typeGuard.schema' export abstract class AbstractTransactionRole { abstract getGradidoTransactionBuilder(): Promise - abstract getSenderCommunityUuid(): string - abstract getRecipientCommunityUuid(): string + abstract getSenderCommunityTopicId(): HieroId + abstract getRecipientCommunityTopicId(): HieroId } diff --git a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts index 3beaa633d..c59939ccb 100644 --- a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts @@ -1,45 +1,41 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' - +import { Community } from '../../client/backend/community.schema' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { HieroId } from '../../schemas/typeGuard.schema' import { AUF_ACCOUNT_DERIVATION_INDEX, GMW_ACCOUNT_DERIVATION_INDEX, hardenDerivationIndex, } from '../../utils/derivationHelper' - import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' -import { Community, CommunityInput, communitySchema } from '../../client/backend/community.schema' -import * as v from 'valibot' export class CommunityRootTransactionRole extends AbstractTransactionRole { - private com: Community - constructor(input: CommunityInput) { + constructor(private readonly community: Community) { super() - this.com = v.parse(communitySchema, input) } - getSenderCommunityUuid(): string { - return this.com.uuid + getSenderCommunityTopicId(): HieroId { + return this.community.topicId } - getRecipientCommunityUuid(): string { + getRecipientCommunityTopicId(): HieroId { throw new Error('cannot be used as cross group transaction') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const communityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ communityUuid: this.com.uuid })) + new KeyPairIdentifierLogic({ communityTopicId: this.community.topicId }), + ) const gmwKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), - ) + ) // as unknown as KeyPairEd25519 const aufKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), - ) + ) // as unknown as KeyPairEd25519 builder - .setCreatedAt(this.com.createdAt) + .setCreatedAt(this.community.createdAt) .setCommunityRoot( communityKeyPair.getPublicKey(), gmwKeyPair.getPublicKey(), diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts index c930e1725..834f813c2 100644 --- a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts @@ -4,78 +4,69 @@ import { GradidoTransactionBuilder, TransferAmount, } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { CreationTransactionInput, creationTransactionSchema, CreationTransaction } from '../../schemas/transaction.schema' import { KeyPairCacheManager } from '../../KeyPairCacheManager' -import { TRPCError } from '@trpc/server' - +import { + CreationTransaction, + creationTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' -import * as v from 'valibot' import { AbstractTransactionRole } from './AbstractTransaction.role' -import { Uuidv4, uuidv4Schema } from '../../schemas/typeConverter.schema' export class CreationTransactionRole extends AbstractTransactionRole { - private tx: CreationTransaction - private homeCommunityUuid: Uuidv4 - constructor(input: CreationTransactionInput) { + private readonly homeCommunityTopicId: HieroId + private readonly creationTransaction: CreationTransaction + constructor(transaction: Transaction) { super() - this.tx = v.parse(creationTransactionSchema, input) - this.homeCommunityUuid = v.parse( - uuidv4Schema, - KeyPairCacheManager.getInstance().getHomeCommunityUUID() - ) + this.creationTransaction = parse(creationTransactionSchema, transaction) + this.homeCommunityTopicId = KeyPairCacheManager.getInstance().getHomeCommunityTopicId() if ( - this.homeCommunityUuid !== this.tx.user.communityUuid || - this.homeCommunityUuid !== this.tx.linkedUser.communityUuid + this.homeCommunityTopicId !== this.creationTransaction.user.communityTopicId || + this.homeCommunityTopicId !== this.creationTransaction.linkedUser.communityTopicId ) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'creation: both recipient and signer must belong to home community', - }) + throw new Error('creation: both recipient and signer must belong to home community') } } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.creationTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'creation: cannot be used as cross group transaction', - }) + getRecipientCommunityTopicId(): HieroId { + throw new Error('creation: cannot be used as cross group transaction') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // Recipient: user (account owner) const recipientKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.user) + new KeyPairIdentifierLogic(this.creationTransaction.user), ) // Signer: linkedUser (admin/moderator) const signerKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.linkedUser) + new KeyPairIdentifierLogic(this.creationTransaction.linkedUser), ) const homeCommunityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ - communityUuid: this.homeCommunityUuid + new KeyPairIdentifierLogic({ + communityTopicId: this.homeCommunityTopicId, }), ) // Memo: encrypted, home community and recipient can decrypt it builder - .setCreatedAt(this.tx.createdAt) - .addMemo(new EncryptedMemo( - this.tx.memo, - new AuthenticatedEncryption(homeCommunityKeyPair), - new AuthenticatedEncryption(recipientKeyPair), - )) - .setTransactionCreation( - new TransferAmount( - recipientKeyPair.getPublicKey(), - this.tx.amount, + .setCreatedAt(this.creationTransaction.createdAt) + .addMemo( + new EncryptedMemo( + this.creationTransaction.memo, + new AuthenticatedEncryption(homeCommunityKeyPair), + new AuthenticatedEncryption(recipientKeyPair), ), - this.tx.targetDate, + ) + .setTransactionCreation( + new TransferAmount(recipientKeyPair.getPublicKey(), this.creationTransaction.amount), + this.creationTransaction.targetDate, ) .sign(signerKeyPair) return builder diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts index 655542537..36569d708 100644 --- a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts @@ -5,53 +5,52 @@ import { GradidoTransfer, TransferAmount, } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { IdentifierSeed, identifierSeedSchema } from '../../schemas/account.schema' +import { + DeferredTransferTransaction, + deferredTransferTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' -import { DeferredTransferTransactionInput, deferredTransferTransactionSchema, DeferredTransferTransaction } from '../../schemas/transaction.schema' -import * as v from 'valibot' -import { TRPCError } from '@trpc/server' -import { identifierSeedSchema, IdentifierSeed } from '../../schemas/account.schema' export class DeferredTransferTransactionRole extends AbstractTransactionRole { - private tx: DeferredTransferTransaction - private seed: IdentifierSeed - constructor(protected input: DeferredTransferTransactionInput) { + private readonly seed: IdentifierSeed + private readonly deferredTransferTransaction: DeferredTransferTransaction + constructor(transaction: Transaction) { super() - this.tx = v.parse(deferredTransferTransactionSchema, input) - this.seed = v.parse(identifierSeedSchema, input.linkedUser.seed) + this.deferredTransferTransaction = parse(deferredTransferTransactionSchema, transaction) + this.seed = parse(identifierSeedSchema, this.deferredTransferTransaction.linkedUser.seed) } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.deferredTransferTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - throw new TRPCError({ - code: 'NOT_IMPLEMENTED', - message: 'deferred transfer: cannot be used as cross group transaction yet', - }) + getRecipientCommunityTopicId(): HieroId { + throw new Error('deferred transfer: cannot be used as cross group transaction yet') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const senderKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.user) + new KeyPairIdentifierLogic(this.deferredTransferTransaction.user), ) const recipientKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ - communityUuid: this.tx.linkedUser.communityUuid, + new KeyPairIdentifierLogic({ + communityTopicId: this.deferredTransferTransaction.linkedUser.communityTopicId, seed: this.seed, - }) + }), ) builder - .setCreatedAt(this.tx.createdAt) + .setCreatedAt(this.deferredTransferTransaction.createdAt) .addMemo( new EncryptedMemo( - this.tx.memo, + this.deferredTransferTransaction.memo, new AuthenticatedEncryption(senderKeyPair), new AuthenticatedEncryption(recipientKeyPair), ), @@ -60,13 +59,13 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { new GradidoTransfer( new TransferAmount( senderKeyPair.getPublicKey(), - this.tx.amount.calculateCompoundInterest( - this.tx.timeoutDuration.getSeconds(), + this.deferredTransferTransaction.amount.calculateCompoundInterest( + this.deferredTransferTransaction.timeoutDuration.getSeconds(), ), ), recipientKeyPair.getPublicKey(), ), - this.tx.timeoutDuration, + this.deferredTransferTransaction.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 ae9115485..3d2574681 100644 --- a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts @@ -1,88 +1,71 @@ +import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' +import { parse } from 'valibot' +import { getTransactionsForAccount } from '../../client/GradidoNode/api' +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' 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' - + RedeemDeferredTransferTransaction, + redeemDeferredTransferTransactionSchema, + Transaction, + UserAccount, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRole { - private linkedUser: UserIdentifier - constructor(protected self: TransactionDraft) { + private linkedUser: UserAccount + private readonly redeemDeferredTransferTransaction: RedeemDeferredTransferTransaction + constructor(transaction: Transaction) { super() - if (!this.self.linkedUser) { - throw new TransactionError( - TransactionErrorType.MISSING_PARAMETER, - 'transfer: linked user missing', - ) - } - this.linkedUser = this.self.linkedUser + this.redeemDeferredTransferTransaction = parse( + redeemDeferredTransferTransactionSchema, + transaction, + ) + this.linkedUser = this.redeemDeferredTransferTransaction.linkedUser } - getSenderCommunityUuid(): string { - return this.self.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.redeemDeferredTransferTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - return this.linkedUser.communityUuid + getRecipientCommunityTopicId(): HieroId { + return this.linkedUser.communityTopicId } 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 senderKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.redeemDeferredTransferTransaction.user), + ) const senderPublicKey = senderKeyPair.getPublicKey() if (!senderPublicKey) { - throw new TransactionError( - TransactionErrorType.INVALID_PARAMETER, - "redeem deferred transfer: couldn't calculate sender public key", - ) + throw new Error("redeem deferred transfer: couldn't calculate sender public key") } // load deferred transfer transaction from gradido node const transactions = await getTransactionsForAccount( - senderPublicKey, - communityUuidToTopic(this.getSenderCommunityUuid()), + { maxResultCount: 2, topic: this.getSenderCommunityTopicId() }, + senderPublicKey.convertToHex(), ) if (!transactions || transactions.length !== 1) { - throw new TransactionError( - TransactionErrorType.NOT_FOUND, - "redeem deferred transfer: couldn't find deferred transfer on Gradido Node", - ) + throw new Error("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, + throw new Error( "redeem deferred transfer: couldn't deserialize deferred transfer from Gradido Node", ) } - const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifier(this.linkedUser)) + const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(this.linkedUser)) builder - .setCreatedAt(new Date(this.self.createdAt)) + .setCreatedAt(this.redeemDeferredTransferTransaction.createdAt) .setRedeemDeferredTransfer( deferredTransfer.getId(), new GradidoTransfer( new TransferAmount( senderKeyPair.getPublicKey(), - GradidoUnit.fromString(this.self.amount), + this.redeemDeferredTransferTransaction.amount, ), recipientKeyPair.getPublicKey(), ), @@ -91,13 +74,11 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo for (let i = 0; i < memos.size(); i++) { builder.addMemo(memos.get(i)) } - const senderCommunity = this.self.user.communityUuid - const recipientCommunity = this.linkedUser.communityUuid + const senderCommunity = this.redeemDeferredTransferTransaction.user.communityTopicId + const recipientCommunity = this.linkedUser.communityTopicId if (senderCommunity !== recipientCommunity) { // we have a cross group transaction - builder - .setSenderCommunity(uuid4ToHash(senderCommunity).convertToHex()) - .setRecipientCommunity(uuid4ToHash(recipientCommunity).convertToHex()) + builder.setSenderCommunity(senderCommunity).setRecipientCommunity(recipientCommunity) } 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 a664a34c0..5eee0f164 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts @@ -1,69 +1,60 @@ -/* eslint-disable camelcase */ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' - +import { Uuidv4Hash } from '../../data/Uuidv4Hash' +import { + IdentifierCommunityAccount, + identifierCommunityAccountSchema, +} from '../../schemas/account.schema' +import { + RegisterAddressTransaction, + registerAddressTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' - import { AbstractTransactionRole } from './AbstractTransaction.role' -import { RegisterAddressTransactionInput, registerAddressTransactionSchema, RegisterAddressTransaction } from '../../schemas/transaction.schema' -import { IdentifierAccount, IdentifierCommunityAccount, identifierCommunityAccountSchema } from '../../schemas/account.schema' -import * as v from 'valibot' -import { TRPCError } from '@trpc/server' -import { uuid4ToHashSchema } from '../../schemas/typeConverter.schema' export class RegisterAddressTransactionRole extends AbstractTransactionRole { - private tx: RegisterAddressTransaction - private account: IdentifierCommunityAccount - constructor(input: RegisterAddressTransactionInput) { + private readonly registerAddressTransaction: RegisterAddressTransaction + private readonly account: IdentifierCommunityAccount + constructor(input: Transaction) { super() - this.tx = v.parse(registerAddressTransactionSchema, input) - this.account = v.parse(identifierCommunityAccountSchema, input.user.account) + this.registerAddressTransaction = parse(registerAddressTransactionSchema, input) + this.account = parse(identifierCommunityAccountSchema, input.user.account) } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.registerAddressTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - throw new TRPCError({ - code: 'NOT_IMPLEMENTED', - message: 'register address: cannot be used as cross group transaction yet', - }) + getRecipientCommunityTopicId(): HieroId { + throw new Error('register address: cannot be used as cross group transaction yet') } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const communityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ communityUuid: this.tx.user.communityUuid }), - ) - const userKeyPairIdentifier: IdentifierAccount = { - communityUuid: this.tx.user.communityUuid, - account: { - userUuid: this.account.userUuid, - accountNr: 0, - }, - } - const accountKeyPairIdentifier: IdentifierAccount = { - communityUuid: this.tx.user.communityUuid, - account: { - userUuid: this.account.userUuid, - accountNr: this.account.accountNr, - }, - } - const userKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(userKeyPairIdentifier) + new KeyPairIdentifierLogic({ + communityTopicId: this.registerAddressTransaction.user.communityTopicId, + }), ) + const accountKeyPairIdentifier = this.registerAddressTransaction.user + // when accountNr is 0 it is the user account + const userKeyPairIdentifier = accountKeyPairIdentifier + userKeyPairIdentifier.account.accountNr = 0 + + const userKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(userKeyPairIdentifier)) const accountKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(accountKeyPairIdentifier) + new KeyPairIdentifierLogic(accountKeyPairIdentifier), ) builder - .setCreatedAt(this.tx.createdAt) + .setCreatedAt(this.registerAddressTransaction.createdAt) .setRegisterAddress( userKeyPair.getPublicKey(), - this.tx.accountType, - v.parse(uuid4ToHashSchema, this.account.userUuid), + this.registerAddressTransaction.accountType, + new Uuidv4Hash(this.account.userUuid).getAsMemoryBlock(), accountKeyPair.getPublicKey(), ) .sign(communityKeyPair) diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index 2607f6c8f..288ccfc77 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -1,24 +1,17 @@ /* eslint-disable camelcase */ import { GradidoTransaction, - InteractionSerialize, - InteractionValidate, - MemoryBlock, + 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 { 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 { communityUuidToTopic } from '@/utils/typeConverter' - +import { getLogger } from 'log4js' +import { safeParse, parse } from 'valibot' +import { Community, communitySchema } from '../../client/backend/community.schema' +import { HieroClient } from '../../client/HieroClient' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { Transaction, transactionSchema } from '../../schemas/transaction.schema' +import { HieroId, HieroTransactionId, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' @@ -26,6 +19,9 @@ import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.r import { RedeemDeferredTransferTransactionRole } from './RedeemDeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' +import { InputTransactionType } from '../../enum/InputTransactionType' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToIota.SendToIotaContext`) /** * @DCI-Context @@ -33,95 +29,74 @@ import { TransferTransactionRole } from './TransferTransaction.role' * send every transaction only once to iota! */ export async function SendToIotaContext( - input: TransactionDraft | CommunityDraft, -): Promise { + input: Transaction | Community, +): Promise { + // let gradido blockchain validator run, it will throw an exception when something is wrong 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 validator = new InteractionValidate(transaction) + validator.run(ValidateType_SINGLE) } - const sendViaIota = async ( + // send transaction as hiero topic message + const sendViaHiero = 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) + topic: HieroId, + ): Promise => { + const client = HieroClient.getInstance() + const resultMessage = await client.sendMessage(topic, gradidoTransaction) + const transactionId = resultMessage.response.transactionId.toString() + logger.info('transmitted Gradido Transaction to Iota', { transactionId }) + return transactionId } - let role: AbstractTransactionRole - if (input instanceof TransactionDraft) { - 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 - case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: - role = new RedeemDeferredTransferTransactionRole(input) - break - default: - throw new TransactionError( - TransactionErrorType.NOT_IMPLEMENTED_YET, - 'not supported transaction type: ' + input.type, - ) + // choose correct role based on transaction type and input type + const chooseCorrectRole = (input: Transaction | Community): AbstractTransactionRole => { + const transactionParsingResult = safeParse(transactionSchema, input) + const communityParsingResult = safeParse(communitySchema, input) + if (transactionParsingResult.success) { + const transaction = transactionParsingResult.output + switch (transaction.type) { + case InputTransactionType.GRADIDO_CREATION: + return new CreationTransactionRole(transaction) + case InputTransactionType.GRADIDO_TRANSFER: + return new TransferTransactionRole(transaction) + case InputTransactionType.REGISTER_ADDRESS: + return new RegisterAddressTransactionRole(transaction) + case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: + return new DeferredTransferTransactionRole(transaction) + case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: + return new RedeemDeferredTransferTransactionRole(transaction) + default: + throw new Error('not supported transaction type: ' + transaction.type) + } + } else if (communityParsingResult.success) { + return new CommunityRootTransactionRole(communityParsingResult.output) + } else { + throw new Error('not expected input') } - } else if (input instanceof CommunityDraft) { - role = new CommunityRootTransactionRole(input) - } else { - throw new LogError('not expected input') } + + const role = chooseCorrectRole(input) const builder = await role.getGradidoTransactionBuilder() if (builder.isCrossCommunityTransaction()) { const outboundTransaction = builder.buildOutbound() validate(outboundTransaction) - const outboundIotaMessageId = await sendViaIota( + const outboundIotaMessageId = await sendViaHiero( outboundTransaction, - communityUuidToTopic(role.getSenderCommunityUuid()), + role.getSenderCommunityTopicId(), ) - builder.setParentMessageId(outboundIotaMessageId) + builder.setParentMessageId(MemoryBlock.createPtr(new MemoryBlock(outboundIotaMessageId))) const inboundTransaction = builder.buildInbound() validate(inboundTransaction) - await sendViaIota(inboundTransaction, communityUuidToTopic(role.getRecipientCommunityUuid())) - return new TransactionResult(new TransactionRecipe(outboundTransaction, outboundIotaMessageId)) + await sendViaHiero(inboundTransaction, role.getRecipientCommunityTopicId()) + return parse(hieroTransactionIdSchema, outboundIotaMessageId) } else { const transaction = builder.build() validate(transaction) - const iotaMessageId = await sendViaIota( + const iotaMessageId = await sendViaHiero( transaction, - communityUuidToTopic(role.getSenderCommunityUuid()), + role.getSenderCommunityTopicId(), ) - return new TransactionResult(new TransactionRecipe(transaction, iotaMessageId)) + return parse(hieroTransactionIdSchema, iotaMessageId) } } diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts index 344efeba5..f244bf472 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts @@ -4,60 +4,61 @@ import { GradidoTransactionBuilder, TransferAmount, } from 'gradido-blockchain-js' - +import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { + TransferTransaction, + transferTransactionSchema, + Transaction, +} from '../../schemas/transaction.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' -import { TransferTransactionInput, transferTransactionSchema, TransferTransaction } from '../../schemas/transaction.schema' -import * as v from 'valibot' -import { uuid4ToTopicSchema } from '../../schemas/typeConverter.schema' +import { HieroId } from '../../schemas/typeGuard.schema' export class TransferTransactionRole extends AbstractTransactionRole { - private tx: TransferTransaction - constructor(input: TransferTransactionInput) { + private transferTransaction: TransferTransaction + constructor(input: Transaction) { super() - this.tx = v.parse(transferTransactionSchema, input) + this.transferTransaction = parse(transferTransactionSchema, input) } - getSenderCommunityUuid(): string { - return this.tx.user.communityUuid + getSenderCommunityTopicId(): HieroId { + return this.transferTransaction.user.communityTopicId } - getRecipientCommunityUuid(): string { - return this.tx.linkedUser.communityUuid + getRecipientCommunityTopicId(): HieroId { + return this.transferTransaction.linkedUser.communityTopicId } public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // sender + signer - const senderKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.user) - ) + const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(this.transferTransaction.user)) // recipient const recipientKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(this.tx.linkedUser) + new KeyPairIdentifierLogic(this.transferTransaction.linkedUser), ) builder - .setCreatedAt(new Date(this.tx.createdAt)) + .setCreatedAt(this.transferTransaction.createdAt) .addMemo( new EncryptedMemo( - this.tx.memo, + this.transferTransaction.memo, new AuthenticatedEncryption(senderKeyPair), new AuthenticatedEncryption(recipientKeyPair), ), ) .setTransactionTransfer( - new TransferAmount(senderKeyPair.getPublicKey(), this.tx.amount), + new TransferAmount(senderKeyPair.getPublicKey(), this.transferTransaction.amount), recipientKeyPair.getPublicKey(), ) - const senderCommunity = this.tx.user.communityUuid - const recipientCommunity = this.tx.linkedUser.communityUuid + const senderCommunity = this.transferTransaction.user.communityTopicId + const recipientCommunity = this.transferTransaction.linkedUser.communityTopicId if (senderCommunity !== recipientCommunity) { // we have a cross group transaction builder - .setSenderCommunity(v.parse(uuid4ToTopicSchema, senderCommunity)) - .setRecipientCommunity(v.parse(uuid4ToTopicSchema, recipientCommunity)) + .setSenderCommunity(senderCommunity) + .setRecipientCommunity(recipientCommunity) } builder.sign(senderKeyPair) return builder diff --git a/dlt-connector/src/schemas/account.schema.ts b/dlt-connector/src/schemas/account.schema.ts index ee85b5cea..7be2cd4f2 100644 --- a/dlt-connector/src/schemas/account.schema.ts +++ b/dlt-connector/src/schemas/account.schema.ts @@ -1,12 +1,9 @@ import * as v from 'valibot' -import { uuidv4Schema } from './typeGuard.schema' +import { hieroIdSchema, uuidv4Schema } from './typeGuard.schema' // use code from transaction links export const identifierSeedSchema = v.object({ - seed: v.pipe( - v.string('expect string type'), - v.length(24, 'expect seed length 24') - ) + seed: v.pipe(v.string('expect string type'), v.length(24, 'expect seed length 24')), }) export type IdentifierSeed = v.InferOutput @@ -22,7 +19,7 @@ export type IdentifierCommunityAccount = v.InferOutput diff --git a/dlt-connector/src/schemas/base.schema.ts b/dlt-connector/src/schemas/base.schema.ts index 8a9f3af3d..2e065f55d 100644 --- a/dlt-connector/src/schemas/base.schema.ts +++ b/dlt-connector/src/schemas/base.schema.ts @@ -1,11 +1,9 @@ -import * as v from 'valibot' import { MemoryBlock } from 'gradido-blockchain-js' +import * as v from 'valibot' export const keyGenerationSeedSchema = v.pipe( v.string('expect string type'), v.hexadecimal('expect hexadecimal string'), v.length(64, 'expect seed length minimum 64 characters (32 Bytes)'), - v.transform( - (input: string) => MemoryBlock.fromHex(input), - ), -) \ No newline at end of file + v.transform((input: string) => MemoryBlock.fromHex(input)), +) diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index e7459175c..2c4da487a 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -1,10 +1,26 @@ -import { describe, it, expect } from 'bun:test' -import { transactionIdentifierSchema, transactionSchema, TransactionInput, memoSchema } from './transaction.schema' -import { InputTransactionType } from '../enum/InputTransactionType' -import { v4 as uuidv4 } from 'uuid' -import * as v from 'valibot' -import { GradidoUnit, DurationSeconds } from 'gradido-blockchain-js' +import { describe, expect, it, beforeAll } from 'bun:test' import { randomBytes } from 'crypto' +import { DurationSeconds, GradidoUnit } from 'gradido-blockchain-js' +import { v4 as uuidv4 } from 'uuid' +import { parse } from 'valibot' +import { InputTransactionType } from '../enum/InputTransactionType' +import { + TransactionInput, + transactionSchema, +} from './transaction.schema' +import { transactionIdentifierSchema } from '../client/GradidoNode/input.schema' +import { + gradidoAmountSchema, + HieroId, + hieroIdSchema, + HieroTransactionId, + hieroTransactionIdSchema, + Memo, + memoSchema, + timeoutDurationSchema, + Uuidv4, + uuidv4Schema +} from '../schemas/typeGuard.schema' const transactionLinkCode = (date: Date): string => { const time = date.getTime().toString(16) @@ -14,149 +30,154 @@ const transactionLinkCode = (date: Date): string => { .substring(0, 24 - time.length) + time ) } +let topic: HieroId +const topicString = '0.0.261' +let hieroTransactionId: HieroTransactionId +beforeAll(() => { + topic = parse(hieroIdSchema, topicString) + hieroTransactionId = parse(hieroTransactionIdSchema, '0.0.261-1755348116-1281621') +}) describe('transaction schemas', () => { - describe('transactionIdentifierSchema ', () => { it('valid, transaction identified by transactionNr and topic', () => { - expect(v.parse(transactionIdentifierSchema, { - transactionNr: 1, - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' - })).toEqual({ - transactionNr: 1, - iotaMessageId: undefined, - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + expect( + parse(transactionIdentifierSchema, { + transactionNr: 1, + topic: topicString, + }), + ).toEqual({ + transactionNr: 1, + hieroTransactionId: undefined, + topic, }) }) - it('valid, transaction identified by iotaMessageId and topic', () => { - expect(v.parse(transactionIdentifierSchema, { - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' - })).toEqual({ - transactionNr: 0, - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' + it('valid, transaction identified by hieroTransactionId and topic', () => { + expect( + parse(transactionIdentifierSchema, { + hieroTransactionId: '0.0.261-1755348116-1281621', + topic: topicString, + }), + ).toEqual({ + hieroTransactionId, + topic }) }) it('invalid, missing topic', () => { - expect(() => v.parse(transactionIdentifierSchema, { - transactionNr: 1, - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - })).toThrowError(new Error('Invalid key: Expected "iotaTopic" but received undefined')) + expect(() => + parse(transactionIdentifierSchema, { + transactionNr: 1, + hieroTransactionId: '0.0.261-1755348116-1281621', + }), + ).toThrowError(new Error('Invalid key: Expected "topic" but received undefined')) }) it('invalid, transactionNr and iotaMessageId set', () => { - expect(() => v.parse(transactionIdentifierSchema, { - transactionNr: 1, - iotaMessageId: '1b33a3cf7eb5dde04ed7ae571db1763006811ff6b7bb35b3d1c780de153af9dd', - iotaTopic: 'c00b210fc0a189df054eb9dafb584c527e9aeb537a62a35d44667f54529c73f5' - })).toThrowError(new Error('expect transactionNr or iotaMessageId not both')) + expect(() => + parse(transactionIdentifierSchema, { + transactionNr: 1, + hieroTransactionId: '0.0.261-1755348116-1281621', + topic + }), + ).toThrowError(new Error('expect transactionNr or hieroTransactionId not both')) }) }) - describe('transactionSchema', () => { + describe('transactionSchema', () => { + let userUuid: Uuidv4 + let userUuidString: string + let memoString: string + let memo: Memo + beforeAll(() => { + userUuidString = uuidv4() + userUuid = parse(uuidv4Schema, userUuidString) + memoString = 'TestMemo' + memo = parse(memoSchema, memoString) + }) it('valid, register new user address', () => { const registerAddress: TransactionInput = { - user: { - communityUuid: uuidv4(), - account: { - userUuid: uuidv4(), - } - }, - type: InputTransactionType.REGISTER_ADDRESS, + user: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + type: InputTransactionType.REGISTER_ADDRESS, createdAt: '2022-01-01T00:00:00.000Z', } - expect(v.parse(transactionSchema, registerAddress)).toEqual({ + expect(parse(transactionSchema, registerAddress)).toEqual({ user: { - communityUuid: registerAddress.user.communityUuid, + communityTopicId: topic, account: { - userUuid: registerAddress.user.account!.userUuid, - accountNr: 1, - } + userUuid, + accountNr: 0, + }, }, type: registerAddress.type, createdAt: new Date(registerAddress.createdAt), }) - }) + }) it('valid, gradido transfer', () => { - const communityUuid = uuidv4() const gradidoTransfer: TransactionInput = { - user: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - linkedUser: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - amount: '100', - memo: 'TestMemo', - type: InputTransactionType.GRADIDO_TRANSFER, - createdAt: '2022-01-01T00:00:00.000Z', - } - expect(v.parse(transactionSchema, gradidoTransfer)).toEqual({ user: { - communityUuid, - account: { - userUuid: gradidoTransfer.user.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, linkedUser: { - communityUuid, - account: { - userUuid: gradidoTransfer.linkedUser!.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, - amount: GradidoUnit.fromString(gradidoTransfer.amount!), - memo: gradidoTransfer.memo, + amount: '100', + memo: memoString, + type: InputTransactionType.GRADIDO_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + } + expect(parse(transactionSchema, gradidoTransfer)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + linkedUser: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + amount: parse(gradidoAmountSchema, gradidoTransfer.amount!), + memo, type: gradidoTransfer.type, createdAt: new Date(gradidoTransfer.createdAt), }) }) it('valid, gradido creation', () => { - const communityUuid = uuidv4() const gradidoCreation: TransactionInput = { - user: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - linkedUser: { - communityUuid, - account: { - userUuid: uuidv4(), - } - }, - amount: '1000', - memo: 'For your help', - type: InputTransactionType.GRADIDO_CREATION, - createdAt: '2022-01-01T00:00:00.000Z', - targetDate: '2021-11-01T10:00' - } - expect(v.parse(transactionSchema, gradidoCreation)).toEqual({ user: { - communityUuid, - account: { - userUuid: gradidoCreation.user.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, linkedUser: { - communityUuid, - account: { - userUuid: gradidoCreation.linkedUser!.account!.userUuid, - accountNr: 1, - } + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, - amount: GradidoUnit.fromString(gradidoCreation.amount!), - memo: gradidoCreation.memo, + amount: '1000', + memo: memoString, + type: InputTransactionType.GRADIDO_CREATION, + createdAt: '2022-01-01T00:00:00.000Z', + targetDate: '2021-11-01T10:00', + } + expect(parse(transactionSchema, gradidoCreation)).toEqual({ + user: { + communityTopicId: topic, + account: { userUuid, accountNr: 0 }, + }, + linkedUser: { + communityTopicId: topic, + account: { userUuid, accountNr: 0 }, + }, + amount: parse(gradidoAmountSchema, gradidoCreation.amount!), + memo, type: gradidoCreation.type, createdAt: new Date(gradidoCreation.createdAt), targetDate: new Date(gradidoCreation.targetDate!), @@ -164,44 +185,44 @@ describe('transaction schemas', () => { }) it('valid, gradido transaction link / deferred transfer', () => { const gradidoTransactionLink: TransactionInput = { - user: { - communityUuid: uuidv4(), - account: { - userUuid: uuidv4(), - } - }, - linkedUser: { - communityUuid: uuidv4(), - seed: { - seed: transactionLinkCode(new Date()), - } - }, - amount: '100', - memo: 'use link wisely', - type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, - createdAt: '2022-01-01T00:00:00.000Z', - timeoutDuration: 60*60*24*30, - } - expect(v.parse(transactionSchema, gradidoTransactionLink)).toEqual({ user: { - communityUuid: gradidoTransactionLink.user.communityUuid, + communityTopicId: topicString, account: { - userUuid: gradidoTransactionLink.user.account!.userUuid, - accountNr: 1, - } + userUuid: userUuidString, + }, }, linkedUser: { - communityUuid: gradidoTransactionLink.linkedUser!.communityUuid, + communityTopicId: topicString, + seed: { + seed: transactionLinkCode(new Date()), + }, + }, + amount: '100', + memo: memoString, + type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + timeoutDuration: 60 * 60 * 24 * 30, + } + expect(parse(transactionSchema, gradidoTransactionLink)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + linkedUser: { + communityTopicId: topic, seed: { seed: gradidoTransactionLink.linkedUser!.seed!.seed, - } + }, }, - amount: GradidoUnit.fromString(gradidoTransactionLink.amount!), - memo: gradidoTransactionLink.memo, + amount: parse(gradidoAmountSchema, gradidoTransactionLink.amount!), + memo, type: gradidoTransactionLink.type, createdAt: new Date(gradidoTransactionLink.createdAt), - timeoutDuration: new DurationSeconds(gradidoTransactionLink.timeoutDuration!), + timeoutDuration: parse(timeoutDurationSchema, gradidoTransactionLink.timeoutDuration!), }) }) }) -}) \ No newline at end of file +}) diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index ac654da5e..de75bda89 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -1,43 +1,66 @@ import * as v from 'valibot' -import { dateFromStringSchema } from './typeConverter.schema' -import { identifierAccountSchema } from './account.schema' import { InputTransactionType } from '../enum/InputTransactionType' -import { accountTypeToAddressTypeSchema } from './typeConverter.schema' - +import { + identifierAccountSchema, + identifierCommunityAccountSchema, + identifierSeedSchema, +} from './account.schema' +import { accountTypeSchema, addressTypeSchema, dateSchema } from './typeConverter.schema' +import { + gradidoAmountSchema, + hieroIdSchema, + memoSchema, + timeoutDurationSchema, +} from './typeGuard.schema' export const transactionSchema = v.object({ - user: identifierAccountScmhema, + user: identifierAccountSchema, linkedUser: v.nullish(identifierAccountSchema, undefined), - amount: v.nullish(amountToGradidoUnitSchema, undefined), + amount: v.nullish(gradidoAmountSchema, undefined), memo: v.nullish(memoSchema, undefined), type: v.enum(InputTransactionType), - createdAt: dateFromStringSchema, - targetDate: v.nullish(dateFromStringSchema, undefined), + createdAt: dateSchema, + targetDate: v.nullish(dateSchema, undefined), timeoutDuration: v.nullish(timeoutDurationSchema, undefined), - accountType: v.nullish(accountTypeToAddressTypeSchema, undefined), + accountType: v.nullish(accountTypeSchema, undefined), }) export type TransactionInput = v.InferInput export type Transaction = v.InferOutput +// if the account is identified by seed +export const seedAccountSchema = v.object({ + communityTopicId: hieroIdSchema, + seed: identifierSeedSchema, +}) + +// if the account is identified by userUuid and accountNr +export const userAccountSchema = v.object({ + communityTopicId: hieroIdSchema, + account: identifierCommunityAccountSchema, +}) + +export type UserAccountInput = v.InferInput +export type UserAccount = v.InferOutput + export const creationTransactionSchema = v.object({ - user: identifierAccountSchema, - linkedUser: identifierAccountSchema, - amount: amountToGradidoUnitSchema, + user: userAccountSchema, + linkedUser: userAccountSchema, + amount: gradidoAmountSchema, memo: memoSchema, - createdAt: dateFromStringSchema, - targetDate: dateFromStringSchema, + createdAt: dateSchema, + targetDate: dateSchema, }) export type CreationTransactionInput = v.InferInput export type CreationTransaction = v.InferOutput export const transferTransactionSchema = v.object({ - user: identifierAccountSchema, - linkedUser: identifierAccountSchema, - amount: amountToGradidoUnitSchema, + user: userAccountSchema, + linkedUser: userAccountSchema, + amount: gradidoAmountSchema, memo: memoSchema, - createdAt: dateFromStringSchema, + createdAt: dateSchema, }) export type TransferTransactionInput = v.InferInput @@ -45,23 +68,40 @@ export type TransferTransaction = v.InferOutput export type RegisterAddressTransaction = v.InferOutput - +// deferred transfer transaction: from user account to seed export const deferredTransferTransactionSchema = v.object({ - user: identifierAccountSchema, - linkedUser: identifierAccountSchema, - amount: amountToGradidoUnitSchema, + user: userAccountSchema, + linkedUser: seedAccountSchema, + amount: gradidoAmountSchema, memo: memoSchema, - createdAt: dateFromStringSchema, + createdAt: dateSchema, timeoutDuration: timeoutDurationSchema, }) -export type DeferredTransferTransactionInput = v.InferInput +export type DeferredTransferTransactionInput = v.InferInput< + typeof deferredTransferTransactionSchema +> export type DeferredTransferTransaction = v.InferOutput + +// redeem deferred transaction: from seed to user account +export const redeemDeferredTransferTransactionSchema = v.object({ + user: seedAccountSchema, + linkedUser: userAccountSchema, + amount: gradidoAmountSchema, + createdAt: dateSchema, +}) + +export type RedeemDeferredTransferTransactionInput = v.InferInput< + typeof redeemDeferredTransferTransactionSchema +> +export type RedeemDeferredTransferTransaction = v.InferOutput< + typeof redeemDeferredTransferTransactionSchema +> diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index 7537e3b59..2ec02d12e 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -1,14 +1,16 @@ - -import { accountTypeSchema, addressTypeSchema, confirmedTransactionSchema } from './typeConverter.schema' -import * as v from 'valibot' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' -import { dateSchema } from './typeConverter.schema' import { AddressType_COMMUNITY_AUF, AddressType_COMMUNITY_PROJECT } from 'gradido-blockchain-js' +import * as v from 'valibot' import { AccountType } from '../enum/AccountType' +import { + accountTypeSchema, + addressTypeSchema, + confirmedTransactionSchema, + dateSchema, +} from './typeConverter.schema' describe('basic.schema', () => { - describe('date', () => { it('from string', () => { const date = v.parse(dateSchema, '2021-01-01:10:10') @@ -45,9 +47,12 @@ describe('basic.schema', () => { expect(accountType).toBe(AccountType.COMMUNITY_AUF) }) }) - + it('confirmedTransactionSchema', () => { - const confirmedTransaction = v.parse(confirmedTransactionSchema, 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA') + const confirmedTransaction = v.parse( + confirmedTransactionSchema, + 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + ) expect(confirmedTransaction.getId()).toBe(7) expect(confirmedTransaction.getConfirmedAt().getSeconds()).toBe(1609464130) expect(confirmedTransaction.getVersionNumber()).toBe('3.4') diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts index 4f6eb6b42..3fb6e55ba 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -1,21 +1,20 @@ -import { - AddressType as AddressType, - ConfirmedTransaction, -} from 'gradido-blockchain-js' -import { AccountType } from '../enum/AccountType' +import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' import * as v from 'valibot' -import { confirmedTransactionFromBase64, isAddressType, toAddressType, toAccountType } from '../utils/typeConverter' +import { AccountType } from '../enum/AccountType' +import { + confirmedTransactionFromBase64, + isAddressType, + toAccountType, + toAddressType, +} from '../utils/typeConverter' /** * dateSchema for creating a date from string or Date object */ export const dateSchema = v.pipe( - v.union([ - v.string('expect valid date string'), - v.instance(Date, 'expect Date object') - ]), + v.union([v.string('expect valid date string'), v.instance(Date, 'expect Date object')]), v.transform((input) => { - let date: Date + let date: Date if (input instanceof Date) { date = input } else { @@ -25,7 +24,7 @@ export const dateSchema = v.pipe( throw new Error('invalid date') } return date - }) + }), ) /** @@ -39,7 +38,7 @@ export const addressTypeSchema = v.pipe( v.enum(AccountType, 'expect account type'), v.custom(isAddressType, 'expect AddressType'), ]), - v.transform((value) => toAddressType(value)), + v.transform((value) => toAddressType(value)), ) /** @@ -58,7 +57,7 @@ export const confirmedTransactionSchema = v.pipe( v.instance(ConfirmedTransaction, 'expect ConfirmedTransaction'), v.pipe( v.string('expect confirmed Transaction base64 as string type'), - v.base64('expect to be valid base64') + v.base64('expect to be valid base64'), ), ]), v.transform( @@ -70,5 +69,3 @@ export const confirmedTransactionSchema = v.pipe( }, ), ) - - diff --git a/dlt-connector/src/schemas/typeGuard.schema.test.ts b/dlt-connector/src/schemas/typeGuard.schema.test.ts index 27781c868..ecd9eca7a 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.test.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.test.ts @@ -1,7 +1,7 @@ -import { describe, it, expect } from 'bun:test' -import { uuidv4Schema, memoSchema } from './typeGuard.schema' -import * as v from 'valibot' +import { describe, expect, it } from 'bun:test' import { v4 as uuidv4 } from 'uuid' +import * as v from 'valibot' +import { memoSchema, uuidv4Schema } from './typeGuard.schema' describe('typeGuard.schema', () => { describe('Uuidv4', () => { @@ -14,7 +14,7 @@ describe('typeGuard.schema', () => { }) describe('Basic Type Schemas for transactions', () => { describe('Memo', () => { - it('min length', () => { + it('min length', () => { const memoValue = 'memo1' const memoValueParsed = v.parse(memoSchema, memoValue) expect(memoValueParsed.toString()).toBe(memoValue) @@ -30,8 +30,10 @@ describe('typeGuard.schema', () => { }) it('to long', () => { const memoValue = 's'.repeat(256) - expect(() => v.parse(memoSchema, memoValue)).toThrow(new Error('expect string length <= 255')) + expect(() => v.parse(memoSchema, memoValue)).toThrow( + new Error('expect string length <= 255'), + ) }) }) }) -}) \ No newline at end of file +}) diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts index d5a1a32dd..bddb7048f 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -1,24 +1,24 @@ /** - * # TypeGuards + * # TypeGuards * Expand TypeScript Default Types with custom type which a based on a default type (or class) * Use valibot, so we can describe the type and validate it easy at runtime * After transpiling TypeScript unique symbol are gone * Infos at opaque type in typescript: https://evertpot.com/opaque-ts-types/ - * + * * declare const validAmount: unique symbol * export type Amount = number & { [validAmount]: true }; * Can be compared with using `typedef int Amount;` in C/C++ - * Example: + * Example: * To create a instance of Amount: - * `const amount: Amount = v.parse(amountSchema, 1.21)` + * `const amount: Amount = v.parse(amountSchema, 1.21)` * must be called and ensure the value is valid * If it isn't valid, v.parse will throw an error * Alternatively v.safeParse can be used, this don't throw but it return null on error */ +import { DurationSeconds, GradidoUnit, MemoryBlock, MemoryBlockPtr } from 'gradido-blockchain-js' import { validate, version } from 'uuid' import * as v from 'valibot' -import { MemoryBlock, DurationSeconds, GradidoUnit } from 'gradido-blockchain-js' /** * type guard for uuid v4 @@ -26,17 +26,15 @@ import { MemoryBlock, DurationSeconds, GradidoUnit } from 'gradido-blockchain-js * uuidv4 is used for communityUuid and userUuid */ declare const validUuidv4: unique symbol -export type Uuidv4 = string & { [validUuidv4]: true }; +export type Uuidv4 = string & { [validUuidv4]: true } export const uuidv4Schema = v.pipe( v.string('expect string type'), - v.custom((value) => - (typeof value === 'string' && validate(value) && version(value) === 4), - 'uuid v4 expected' - ), - v.transform( - (input: string) => input as Uuidv4, + v.custom( + (value) => typeof value === 'string' && validate(value) && version(value) === 4, + 'uuid v4 expected', ), + v.transform((input: string) => input as Uuidv4), ) export type Uuidv4Input = v.InferInput @@ -48,16 +46,30 @@ export type Uuidv4Input = v.InferInput */ declare const validMemoryBlock32: unique symbol -export type MemoryBlock32 = MemoryBlock & { [validMemoryBlock32]: true }; +export type MemoryBlock32 = MemoryBlockPtr & { [validMemoryBlock32]: true } export const memoryBlock32Schema = v.pipe( - v.instance(MemoryBlock, 'expect MemoryBlock type'), - v.custom( - (val): boolean => val instanceof MemoryBlock && val.size() === 32 && !val.isEmpty(), - 'expect MemoryBlock size = 32 and not empty' - ), - v.transform( - (input: MemoryBlock) => input as MemoryBlock32, + v.union([ + v.instance(MemoryBlock, 'expect MemoryBlock type'), + v.instance(MemoryBlockPtr, 'expect MemoryBlockPtr type'), + ]), + v.custom((val): boolean => { + if (val instanceof MemoryBlockPtr) { + return val.size() === 32 && !val.isEmpty() + } + if (val instanceof MemoryBlock) { + return val.size() === 32 && !val.isEmpty() + } + return false + }, 'expect MemoryBlock size = 32 and not empty'), + v.transform( + (input: MemoryBlock | MemoryBlockPtr) => { + let memoryBlock: MemoryBlockPtr = input as MemoryBlockPtr + if (input instanceof MemoryBlock) { + memoryBlock = MemoryBlock.createPtr(input) + } + return memoryBlock as MemoryBlock32 + }, ), ) @@ -68,7 +80,7 @@ export const memoryBlock32Schema = v.pipe( * hex32 is a hex string of length 64 (binary size = 32) */ declare const validHex32: unique symbol -export type Hex32 = string & { [validHex32]: true }; +export type Hex32 = string & { [validHex32]: true } export const hex32Schema = v.pipe( v.union([ @@ -79,40 +91,50 @@ export const hex32Schema = v.pipe( ), memoryBlock32Schema, ]), - v.transform( - (input: string | MemoryBlock32 | Hex32) => { - if (typeof input === 'string') { - return input as Hex32 - } - return input.convertToHex() as Hex32 - }, - ), + v.transform((input: string | MemoryBlock32 | Hex32) => { + if (typeof input === 'string') { + return input as Hex32 + } + return input.convertToHex() as Hex32 + }), ) export type Hex32Input = v.InferInput /** - * type guard for iota message id - * create with `v.parse(iotaMessageIdSchema, '822387692a7cfd3f07f25742e91e248af281d771ee03a432c2e178e5533f786c')` - * iota message id is a hex string of length 64 + * type guard for hiero id + * create with `v.parse(hieroIdSchema, '0.0.2')` + * hiero id is a hiero id of the form 0.0.2 */ -declare const validIotaMessageId: unique symbol -export type IotaMessageId = Hex32 & { [validIotaMessageId]: true }; +declare const validHieroId: unique symbol +export type HieroId = string & { [validHieroId]: true } -export const iotaMessageIdSchema = v.pipe( - v.union([ - v.pipe( - v.string('expect string type'), - v.hexadecimal('expect hexadecimal string'), - v.length(64, 'expect string length = 64'), - ), - memoryBlock32Schema, - ]), - v.transform( - (input: string | MemoryBlock32) => v.parse(hex32Schema, input) as IotaMessageId, - ), +export const hieroIdSchema = v.pipe( + v.string('expect hiero id type, three 64 Bit Numbers separated by . for example 0.0.2'), + v.regex(/^[0-9]+\.[0-9]+\.[0-9]+$/), + v.transform((input: string) => input as HieroId), ) +export type HieroIdInput = v.InferInput + +/** + * type guard for hiero transaction id + * create with `v.parse(hieroTransactionIdSchema, '0.0.141760-1755138896-607329203')` + * hiero transaction id is a hiero transaction id of the form 0.0.141760-1755138896-607329203 + * basically it is a Hiero id with a timestamp seconds-nanoseconds since 1970-01-01T00:00:00Z + * seconds is int64, nanoseconds int32 + */ +declare const validHieroTransactionId: unique symbol +export type HieroTransactionId = string & { [validHieroTransactionId]: true } + +export const hieroTransactionIdSchema = v.pipe( + v.string('expect hiero transaction id type, for example 0.0.141760-1755138896-607329203'), + v.regex(/^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-[0-9]+$/), + v.transform((input: string) => input as HieroTransactionId), +) + +export type HieroTransactionIdInput = v.InferInput + /** * type guard for memo * create with `v.parse(memoSchema, 'memo')` @@ -122,38 +144,36 @@ export const MEMO_MIN_CHARS = 5 export const MEMO_MAX_CHARS = 255 declare const validMemo: unique symbol -export type Memo = string & { [validMemo]: true }; +export type Memo = string & { [validMemo]: true } export const memoSchema = v.pipe( - v.string('expect string type'), + v.string('expect string type'), v.maxLength(MEMO_MAX_CHARS, `expect string length <= ${MEMO_MAX_CHARS}`), v.minLength(MEMO_MIN_CHARS, `expect string length >= ${MEMO_MIN_CHARS}`), - v.transform( - (input: string) => input as Memo, - ), + v.transform((input: string) => input as Memo), ) /** * type guard for timeout duration * create with `v.parse(timeoutDurationSchema, 123)` - * timeout duration is a number in seconds inside bounds + * timeout duration is a number in seconds inside bounds * [1 hour, 3 months] * for Transaction Links / Deferred Transactions * seconds starting from createdAt Date in which the transaction link can be redeemed */ -const LINKED_TRANSACTION_TIMEOUT_DURATION_MIN = 60*60 -const LINKED_TRANSACTION_TIMEOUT_DURATION_MAX = 60*60*24*31*3 +const LINKED_TRANSACTION_TIMEOUT_DURATION_MIN = 60 * 60 +const LINKED_TRANSACTION_TIMEOUT_DURATION_MAX = 60 * 60 * 24 * 31 * 3 declare const validTimeoutDuration: unique symbol -export type TimeoutDuration = DurationSeconds & { [validTimeoutDuration]: true }; +export type TimeoutDuration = DurationSeconds & { [validTimeoutDuration]: true } export const timeoutDurationSchema = v.pipe( - v.number('expect number type'), - v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), - v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), - v.transform( - (input: number) => new DurationSeconds(input) as TimeoutDuration, - ), + v.number('expect number type'), + v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), + v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), + v.transform( + (input: number) => new DurationSeconds(input) as TimeoutDuration, + ), ) /** @@ -162,14 +182,12 @@ export const timeoutDurationSchema = v.pipe( * amount is a string representing a positive decimal number, compatible with decimal.js */ declare const validAmount: unique symbol -export type Amount = string & { [validAmount]: true }; +export type Amount = string & { [validAmount]: true } export const amountSchema = v.pipe( - v.string('expect string type'), + v.string('expect string type'), v.regex(/^[0-9]+(\.[0-9]+)?$/, 'expect positive number'), - v.transform( - (input: string) => input as Amount, - ), + v.transform((input: string) => input as Amount), ) /** @@ -179,11 +197,11 @@ export const amountSchema = v.pipe( * GradidoUnit is native implemented in gradido-blockchain-js in c++ and has functions for decay calculation */ declare const validGradidoAmount: unique symbol -export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true }; +export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true } export const gradidoAmountSchema = v.pipe( amountSchema, v.transform( (input: Amount) => GradidoUnit.fromString(input) as GradidoAmount, ), -) \ No newline at end of file +) diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index b9bd3c06c..1a6ac945b 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,77 +1,75 @@ -import { initTRPC, TRPCError } from '@trpc/server' -import * as v from 'valibot' -import { identifierAccountSchema } from '../schemas/account.schema' -import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' -import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../config/const' -import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' -import { getAddressType } from '../client/GradidoNode/api' -import { Uuidv4Hash } from '../data/Uuidv4Hash' -import { hex32Schema } from '../schemas/typeGuard.schema' +import { Elysia, status } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' +import { getLogger } from 'log4js' +import * as v from 'valibot' +import { getAddressType } from '../client/GradidoNode/api' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' +import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' +import { SendToIotaContext } from '../interactions/sendToIota/SendToIota.context' +import { IdentifierAccount, identifierAccountSchema } from '../schemas/account.schema' +import { + accountIdentifierSeedSchema, + accountIdentifierUserSchema, + existSchema, +} from './input.schema' -export const t = initTRPC.create() -const publicProcedure = t.procedure const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) -export const appRouter = t.router({ - isAccountExist: publicProcedure - .input(identifierAccountSchema) - .output(v.boolean()) - .query(async ({ input: userIdentifier }) => { - const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(userIdentifier)) - const publicKey = accountKeyPair.getPublicKey() - if (!publicKey) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: "couldn't calculate account key pair", - }) - } - - // ask gradido node server for account type, if type !== NONE account exist - const addressType = await getAddressType( - v.parse(hex32Schema, publicKey.get()), - new Uuidv4Hash(userIdentifier.communityUuid), - ) - logger.info('isAccountExist') - if(logger.isDebugEnabled()) { - logger.debug('params', userIdentifier) - } - return addressType !== AddressType_NONE - }), - - sendTransaction: publicProcedure - .input(transactionDraftSchema) - .output(v.instanceof(TransactionResult)) - .mutation(async ({ input: transactionDraft }) => { - try { - return await SendToIotaContext(transactionDraft) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - if (error instanceof TransactionError) { - return new TransactionResult(error) - } else { - throw error - } - } - }) -}) - -/* - -async sendTransaction( - @Arg('data') - transactionDraft: TransactionDraft, - ): Promise { - try { - return await SendToIotaContext(transactionDraft) - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (error: any) { - if (error instanceof TransactionError) { - return new TransactionResult(error) - } else { - throw error - } - } +async function isAccountExist(identifierAccount: IdentifierAccount): Promise { + const startTime = Date.now() + const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(identifierAccount)) + const publicKey = accountKeyPair.getPublicKey() + if (!publicKey) { + throw status(404, "couldn't calculate account key pair") } - */ \ No newline at end of file + + // ask gradido node server for account type, if type !== NONE account exist + const addressType = await getAddressType( + publicKey.convertToHex(), + identifierAccount.communityTopicId, + ) + const endTime = Date.now() + logger.info( + `isAccountExist: ${addressType !== AddressType_NONE}, time used: ${endTime - startTime}ms`, + ) + if (logger.isDebugEnabled()) { + logger.debug('params', identifierAccount) + } + return addressType !== AddressType_NONE +} + +export const appRoutes = new Elysia() + .get( + '/isAccountExist/:communityTopicId/:userUuid/:accountNr', + async ({ params: { communityTopicId, userUuid, accountNr } }) => { + const accountIdentifier = v.parse(identifierAccountSchema, { + communityTopicId, + account: { userUuid, accountNr }, + }) + return { exists: await isAccountExist(accountIdentifier) } + }, + // validation schemas + { params: accountIdentifierUserSchema, response: existSchema }, + ) + .get( + '/isAccountExist/:communityTopicId/:seed', + async ({ params: { communityTopicId, seed } }) => { + const accountIdentifier = v.parse(identifierAccountSchema, { + communityTopicId, + seed: { seed }, + }) + return { exists: await isAccountExist(accountIdentifier) } + }, + // validation schemas + { params: accountIdentifierSeedSchema, response: existSchema }, + ) + .post( + '/sendTransaction', + async ({ body }) => { + const transactionDraft = v.parse(transactionDraftSchema, body) + return await SendToIotaContext(transactionDraft) + }, + // validation schemas + { body: transactionDraftSchema, response: v.instanceof(TransactionResult) }, + ) diff --git a/dlt-connector/src/server/input.schema.ts b/dlt-connector/src/server/input.schema.ts new file mode 100644 index 000000000..c6aa463e5 --- /dev/null +++ b/dlt-connector/src/server/input.schema.ts @@ -0,0 +1,19 @@ +import { TypeBoxFromValibot } from '@sinclair/typemap' +import { t } from 'elysia' +import { hieroIdSchema, uuidv4Schema } from '../schemas/typeGuard.schema' + +export const accountIdentifierUserSchema = t.Object({ + communityTopicId: TypeBoxFromValibot(hieroIdSchema), + userUuid: TypeBoxFromValibot(uuidv4Schema), + accountNr: t.Number().positive(), +}) + +// identifier for a gradido account created by transaction link / deferred transfer +export const accountIdentifierSeedSchema = t.Object({ + communityTopicId: TypeBoxFromValibot(hieroIdSchema), + seed: TypeBoxFromValibot(uuidv4Schema), +}) + +export const existSchema = t.Object({ + exists: t.Boolean(), +}) diff --git a/dlt-connector/src/utils/derivationHelper.test.ts b/dlt-connector/src/utils/derivationHelper.test.ts index 63e7b6993..994d36f28 100644 --- a/dlt-connector/src/utils/derivationHelper.test.ts +++ b/dlt-connector/src/utils/derivationHelper.test.ts @@ -1,6 +1,6 @@ -import { hardenDerivationIndex, HARDENED_KEY_BITMASK } from './derivationHelper' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' +import { HARDENED_KEY_BITMASK, hardenDerivationIndex } from './derivationHelper' describe('utils', () => { it('test bitmask for hardened keys', () => { diff --git a/dlt-connector/src/utils/network.ts b/dlt-connector/src/utils/network.ts index 8c4244c36..5f348c640 100644 --- a/dlt-connector/src/utils/network.ts +++ b/dlt-connector/src/utils/network.ts @@ -1,16 +1,16 @@ import net from 'node:net' import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../config/const' import { CONFIG } from '../config' +import { LOG4JS_BASE_CATEGORY } from '../config/const' export async function isPortOpen( - url: string, + url: string, timeoutMs: number = CONFIG.CONNECT_TIMEOUT_MS, ): Promise { return new Promise((resolve) => { const socket = new net.Socket() const { hostname, port } = new URL(url) - + // auto-destroy socket after timeout const timer = setTimeout(() => { socket.destroy() @@ -35,17 +35,19 @@ export async function isPortOpen( }) } -const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) +const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) export async function isPortOpenRetry( - url: string, + url: string, timeoutMs: number = CONFIG.CONNECT_TIMEOUT_MS, delayMs: number = CONFIG.CONNECT_RETRY_DELAY_MS, retries: number = CONFIG.CONNECT_RETRY_COUNT, ): Promise { for (let i = 0; i < retries; i++) { - if (await isPortOpen(url, timeoutMs)) return true + if (await isPortOpen(url, timeoutMs)) { + return true + } await wait(delayMs) } throw new Error(`${url} port is not open after ${retries} retries`) -} \ No newline at end of file +} diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index a1f912581..6ab72b069 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -1,17 +1,17 @@ -import { - ConfirmedTransaction, - MemoryBlock, - InteractionDeserialize, - DeserializeType_CONFIRMED_TRANSACTION, +import { + AddressType, AddressType_COMMUNITY_AUF, AddressType_COMMUNITY_GMW, AddressType_COMMUNITY_HUMAN, AddressType_COMMUNITY_PROJECT, AddressType_CRYPTO_ACCOUNT, - AddressType_SUBACCOUNT, AddressType_DEFERRED_TRANSFER, AddressType_NONE, - AddressType, + AddressType_SUBACCOUNT, + ConfirmedTransaction, + DeserializeType_CONFIRMED_TRANSACTION, + InteractionDeserialize, + MemoryBlock, } from 'gradido-blockchain-js' import { AccountType } from '../enum/AccountType' @@ -44,17 +44,22 @@ const accountToAddressMap: Record = { [AccountType.NONE]: AddressType_NONE, } -const addressToAccountMap: Record = Object.entries(accountToAddressMap).reduce((acc, [accKey, addrVal]) => { - acc[addrVal] = String(accKey) as AccountType - return acc; -}, {} as Record) +const addressToAccountMap: Record = Object.entries( + accountToAddressMap, +).reduce( + (acc, [accKey, addrVal]) => { + acc[addrVal] = String(accKey) as AccountType + return acc + }, + {} as Record, +) export function isAddressType(val: unknown): val is AddressType { return typeof val === 'number' && Object.keys(addressToAccountMap).includes(val.toString()) } export function isAccountType(val: unknown): val is AccountType { - return Object.values(AccountType).includes(val as AccountType); + return Object.values(AccountType).includes(val as AccountType) } export function toAddressType(input: AccountType | AddressType): AddressType { From e772bfa631f7893a3401f428e667c754a995df99 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 16 Aug 2025 17:51:43 +0200 Subject: [PATCH 27/72] fix tests usw. --- dlt-connector/bun.lock | 242 +-- dlt-connector/package.json | 16 +- .../src/client/backend/BackendClient.ts | 13 +- .../client/backend/community.schema.test.ts | 3 + dlt-connector/src/errors.ts | 2 +- .../UserKeyPairRole.test.ts | 1 - .../sendToIota/SendToIota.context.ts | 1 - .../src/schemas/transaction.schema.test.ts | 1 - dlt-connector/src/server/index.ts | 16 +- dlt-connector/src/server/input.schema.ts | 2 +- dlt-connector/yarn.lock | 1629 +++++++++++++++++ 11 files changed, 1671 insertions(+), 255 deletions(-) create mode 100644 dlt-connector/yarn.lock diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 5795142a4..85f80c6f2 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -4,17 +4,13 @@ "": { "name": "dlt-connector", "dependencies": { - "@iota/client": "^2.2.4", - "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#9a5f392", + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js", }, "devDependencies": { "@biomejs/biome": "2.0.0", - "@elysiajs/trpc": "^1.1.0", - "@elysiajs/websocket": "^0.2.8", "@hashgraph/sdk": "^2.70.0", "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", - "@trpc/server": "^11.4.3", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", "elysia": "1.3.8", @@ -25,13 +21,9 @@ "typescript": "^5.8.3", "uuid": "^8.3.2", "valibot": "^1.1.0", - "zod": "^3.25.61", }, }, }, - "trustedDependencies": [ - "@iota/client", - ], "packages": { "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], @@ -223,10 +215,6 @@ "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], - "@elysiajs/trpc": ["@elysiajs/trpc@1.1.0", "", { "peerDependencies": { "elysia": ">= 1.1.0" } }, "sha512-M8QWC+Wa5Z5MWY/+uMQuwZ+JoQkp4jOc1ra4SncFy1zSjFGin59LO1AT0pE+DRJaFV17gha9y7cB6Q7GnaJEAw=="], - - "@elysiajs/websocket": ["@elysiajs/websocket@0.2.8", "", { "dependencies": { "nanoid": "^4.0.0", "raikiri": "^0.0.0-beta.3" }, "peerDependencies": { "elysia": ">= 0.2.2" } }, "sha512-K9KLmYL1SYuAV353GvmK0V9DG5w7XTOGsa1H1dGB5BUTzvBaMvnwNeqnJQ3cjf9V1c0EjQds0Ty4LfUFvV45jw=="], - "@ethersproject/abi": ["@ethersproject/abi@5.8.0", "", { "dependencies": { "@ethersproject/address": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/constants": "^5.8.0", "@ethersproject/hash": "^5.8.0", "@ethersproject/keccak256": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/strings": "^5.8.0" } }, "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q=="], "@ethersproject/abstract-provider": ["@ethersproject/abstract-provider@5.8.0", "", { "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", "@ethersproject/networks": "^5.8.0", "@ethersproject/properties": "^5.8.0", "@ethersproject/transactions": "^5.8.0", "@ethersproject/web": "^5.8.0" } }, "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg=="], @@ -275,8 +263,6 @@ "@hashgraph/sdk": ["@hashgraph/sdk@2.70.0", "", { "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@grpc/grpc-js": "^1.12.6", "@hashgraph/cryptography": "1.9.0", "@hashgraph/proto": "2.20.0", "bignumber.js": "^9.1.1", "bn.js": "^5.1.1", "crypto-js": "^4.2.0", "js-base64": "^3.7.4", "long": "^5.3.1", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "protobufjs": "7.2.5", "rfc4648": "^1.5.3", "utf8": "^3.0.0" } }, "sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ=="], - "@iota/client": ["@iota/client@2.2.4", "", { "dependencies": { "neon-cli": "^0.8", "prebuild-install": "^6.1.2" } }, "sha512-6zjtqJgkSgrMUFLbxr9k+zXGnEVw6gjTFn5emN2nKpR78+mwW4jUXuNcy/M194bK4sLHjj0T0L4pRWJ6XTGaew=="], - "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], @@ -307,7 +293,7 @@ "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], - "@noble/curves": ["@noble/curves@1.9.6", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA=="], + "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -369,8 +355,6 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@trpc/server": ["@trpc/server@11.4.4", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-VkJb2xnb4rCynuwlCvgPBh5aM+Dco6fBBIo6lWAdJJRYVwtyE5bxNZBgUvRRz/cFSEAy0vmzLxF7aABDJfK5Rg=="], - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], @@ -409,22 +393,18 @@ "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], - "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], + "aproba": ["aproba@2.1.0", "", {}, "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew=="], - "are-we-there-yet": ["are-we-there-yet@1.1.7", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" } }, "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g=="], + "are-we-there-yet": ["are-we-there-yet@3.0.1", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg=="], "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "array-back": ["array-back@3.1.0", "", {}, "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="], - "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="], "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="], @@ -483,8 +463,6 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "builtins": ["builtins@1.0.3", "", {}, "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="], - "bun-types": ["bun-types@1.2.20", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], @@ -501,8 +479,6 @@ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="], - "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], "chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], @@ -511,16 +487,10 @@ "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], - "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], - - "cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "cmake-js": ["cmake-js@7.3.1", "", { "dependencies": { "axios": "^1.6.5", "debug": "^4", "fs-extra": "^11.2.0", "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" }, "bin": { "cmake-js": "bin/cmake-js" } }, "sha512-aJtHDrTFl8qovjSSqXT9aC2jdGfmP8JQsPtjdLAXFfH1BF4/ImZ27Jx0R61TFg8Apc3pl6e2yBKMveAeRXx2Rw=="], - "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -531,12 +501,6 @@ "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "command-line-args": ["command-line-args@5.2.1", "", { "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", "lodash.camelcase": "^4.3.0", "typical": "^4.0.0" } }, "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg=="], - - "command-line-commands": ["command-line-commands@3.0.2", "", { "dependencies": { "array-back": "^4.0.1" } }, "sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw=="], - - "command-line-usage": ["command-line-usage@6.1.3", "", { "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", "table-layout": "^1.0.2", "typical": "^5.2.0" } }, "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw=="], - "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], @@ -551,8 +515,6 @@ "core-js-compat": ["core-js-compat@3.45.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA=="], - "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], - "cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], @@ -565,8 +527,6 @@ "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "decompress-response": ["decompress-response@4.2.1", "", { "dependencies": { "mimic-response": "^2.0.0" } }, "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw=="], - "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], @@ -577,15 +537,13 @@ "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], - "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], - "dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "electron-to-chromium": ["electron-to-chromium@1.5.202", "", {}, "sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.203", "", {}, "sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g=="], "elliptic": ["elliptic@6.6.1", "", { "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" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], @@ -613,7 +571,7 @@ "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], @@ -625,12 +583,8 @@ "execspawn": ["execspawn@1.0.1", "", { "dependencies": { "util-extend": "^1.0.1" } }, "sha512-s2k06Jy9i8CUkYe0+DxRlvtkZoOkwwfhB+Xxo5HGUtrISVW2m98jO2tr67DGRFxZwkjQqloA3v/tNtjhBRBieg=="], - "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], - "exponential-backoff": ["exponential-backoff@3.1.2", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="], - "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="], - "fast-base64-decode": ["fast-base64-decode@1.0.0", "", {}, "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q=="], "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], @@ -647,8 +601,6 @@ "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], - "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], - "file-type": ["file-type@21.0.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.7", "strtok3": "^10.2.2", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg=="], "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], @@ -657,8 +609,6 @@ "finalhandler": ["finalhandler@1.1.2", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" } }, "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA=="], - "find-replace": ["find-replace@3.0.0", "", { "dependencies": { "array-back": "^3.0.1" } }, "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ=="], - "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], @@ -685,7 +635,7 @@ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "gauge": ["gauge@2.7.4", "", { "dependencies": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", "has-unicode": "^2.0.0", "object-assign": "^4.1.0", "signal-exit": "^3.0.0", "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wide-align": "^1.1.0" } }, "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg=="], + "gauge": ["gauge@4.0.4", "", { "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" } }, "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg=="], "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], @@ -697,10 +647,6 @@ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], - "git-config": ["git-config@0.0.7", "", { "dependencies": { "iniparser": "~1.0.5" } }, "sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA=="], - - "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], - "glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], @@ -713,8 +659,6 @@ "graphql-request": ["graphql-request@7.2.0", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0" }, "peerDependencies": { "graphql": "14 - 16" } }, "sha512-0GR7eQHBFYz372u9lxS16cOtEekFlZYB2qOyq8wDvzRmdRSJ0mgUVX1tzNcIzk3G+4NY+mGtSz411wZdeDF/+A=="], - "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], @@ -739,8 +683,6 @@ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], - "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], "image-size": ["image-size@1.2.1", "", { "dependencies": { "queue": "6.0.2" }, "bin": { "image-size": "bin/image-size.js" } }, "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw=="], @@ -755,10 +697,6 @@ "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - "iniparser": ["iniparser@1.0.5", "", {}, "sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw=="], - - "inquirer": ["inquirer@7.3.3", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.19", "mute-stream": "0.0.8", "run-async": "^2.4.0", "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" } }, "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA=="], - "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], @@ -775,8 +713,6 @@ "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], @@ -831,8 +767,6 @@ "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], @@ -847,8 +781,6 @@ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "make-promises-safe": ["make-promises-safe@5.1.0", "", {}, "sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g=="], - "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="], "marky": ["marky@1.3.0", "", {}, "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ=="], @@ -897,10 +829,6 @@ "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - - "mimic-response": ["mimic-response@2.1.0", "", {}, "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="], - "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], @@ -919,21 +847,11 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], - "nan": ["nan@2.23.0", "", {}, "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ=="], - "nanoid": ["nanoid@4.0.2", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw=="], - - "napi-build-utils": ["napi-build-utils@1.0.2", "", {}, "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="], - "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], - - "neon-cli": ["neon-cli@0.8.3", "", { "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-commands": "^3.0.1", "command-line-usage": "^6.1.0", "git-config": "0.0.7", "handlebars": "^4.7.6", "inquirer": "^7.3.3", "make-promises-safe": "^5.1.0", "rimraf": "^3.0.2", "semver": "^7.3.2", "toml": "^3.0.0", "ts-typed-json": "^0.3.2", "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" }, "bin": { "neon": "bin/cli.js" } }, "sha512-I44MB8PD0AEyFr/b5icR4sX1tsjdkb2T2uWEStG4Uf5C/jzalZPn7eazbQrW6KDyXNd8bc+LVuOr1v6CGTa1KQ=="], - - "node-abi": ["node-abi@2.30.1", "", { "dependencies": { "semver": "^5.4.1" } }, "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w=="], + "node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], @@ -953,30 +871,22 @@ "npm-which": ["npm-which@3.0.1", "", { "dependencies": { "commander": "^2.9.0", "npm-path": "^2.0.2", "which": "^1.2.10" }, "bin": { "npm-which": "bin/npm-which.js" } }, "sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A=="], - "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], + "npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], "nullthrows": ["nullthrows@1.1.1", "", {}, "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="], - "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="], - "ob1": ["ob1@0.83.1", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-ngwqewtdUzFyycomdbdIhFLjePPSOt1awKMUXQ0L7iLHgWEPF3DsCerblzjzfAUHaXuvE9ccJymWQ/4PNNqvnQ=="], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], "on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], - "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], - "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], @@ -1009,14 +919,10 @@ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - "prebuild-install": ["prebuild-install@6.1.4", "", { "dependencies": { "detect-libc": "^1.0.3", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^1.0.1", "node-abi": "^2.21.0", "npmlog": "^4.0.1", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^3.0.3", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ=="], - "prebuildify": ["prebuildify@github:einhornimmond/prebuildify#65d9445", { "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" }, "bin": { "prebuildify": "./bin.js" } }, "einhornimmond-prebuildify-65d9445"], "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="], - "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], @@ -1035,8 +941,6 @@ "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], - "raikiri": ["raikiri@0.0.0-beta.8", "", {}, "sha512-cH/yfvkiGkN8IBB2MkRHikpPurTnd2sMkQ/xtGpXrp3O76P4ppcWPb+86mJaBDzKaclLnSX+9NnT79D7ifH4/w=="], - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], @@ -1053,12 +957,10 @@ "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], - "readable-stream": ["readable-stream@2.3.8", "", { "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" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], - "reduce-flatten": ["reduce-flatten@2.0.0", "", {}, "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="], - "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], @@ -1077,24 +979,16 @@ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], - "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="], - - "rxjs": ["rxjs@6.6.7", "", { "dependencies": { "tslib": "^1.9.0" } }, "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], - "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], - "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], "secure-json-parse": ["secure-json-parse@4.0.0", "", {}, "sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA=="], @@ -1115,28 +1009,16 @@ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], - - "simple-get": ["simple-get@3.1.1", "", { "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA=="], - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], "spark-md5": ["spark-md5@3.0.2", "", {}, "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="], - "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], - - "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], - - "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], - - "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="], - "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], @@ -1153,7 +1035,7 @@ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1165,8 +1047,6 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "table-layout": ["table-layout@1.0.2", "", { "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", "typical": "^5.2.0", "wordwrapjs": "^4.0.0" } }, "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A=="], - "tar": ["tar@6.2.1", "", { "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" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], @@ -1181,10 +1061,6 @@ "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], - "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], - - "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="], - "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], @@ -1193,26 +1069,16 @@ "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="], - "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], - - "ts-typed-json": ["ts-typed-json@0.3.2", "", {}, "sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], - "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], - "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + "type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], - "typical": ["typical@4.0.0", "", {}, "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="], - - "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], - "uint8array-extras": ["uint8array-extras@1.4.1", "", {}, "sha512-+NWHrac9dvilNgme+gP4YrBSumsaMZP0fNBtXXFIf33RLLKEcBUKaQZ7ULUbS0sBfcjxIZ4V96OTRkCbM7hxpw=="], "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], @@ -1245,10 +1111,6 @@ "valibot": ["valibot@1.1.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw=="], - "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], - - "validate-npm-package-name": ["validate-npm-package-name@3.0.0", "", { "dependencies": { "builtins": "^1.0.3" } }, "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="], - "vlq": ["vlq@1.0.1", "", {}, "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w=="], "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], @@ -1259,10 +1121,6 @@ "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], - - "wordwrapjs": ["wordwrapjs@4.0.1", "", { "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" } }, "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], @@ -1299,26 +1157,12 @@ "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], - "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "chrome-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - - "chromium-edge-launcher/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "cmake-js/axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], "cmake-js/fs-extra": ["fs-extra@11.3.1", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g=="], - "cmake-js/npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], - - "command-line-commands/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], - - "command-line-usage/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], - - "command-line-usage/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], - - "command-line-usage/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], - "connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "elliptic/bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], @@ -1329,10 +1173,6 @@ "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "gauge/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="], - - "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], - "http-errors/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], "import-fresh/resolve-from": ["resolve-from@3.0.0", "", {}, "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw=="], @@ -1347,40 +1187,22 @@ "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "memory-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "metro/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], - "metro-source-map/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - - "metro-symbolicate/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], - "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "node-abi/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], - "npm-path/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], "npm-which/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], - "prebuildify/node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], - - "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], - "rxjs/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], @@ -1389,52 +1211,24 @@ "send/statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="], + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], - "stacktrace-parser/type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], - - "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - - "table-layout/array-back": ["array-back@4.0.2", "", {}, "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="], - - "table-layout/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], - "tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], - "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "wordwrapjs/typical": ["typical@5.2.0", "", {}, "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="], + "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "cmake-js/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "cmake-js/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], - "cmake-js/npmlog/are-we-there-yet": ["are-we-there-yet@3.0.1", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg=="], - - "cmake-js/npmlog/gauge": ["gauge@4.0.4", "", { "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" } }, "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg=="], - - "command-line-usage/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], - - "command-line-usage/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], - "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="], - - "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - "lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - - "cmake-js/npmlog/are-we-there-yet/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - - "command-line-usage/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], - - "command-line-usage/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - - "command-line-usage/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], } } diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 5bb4f4f08..450e13f42 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -8,7 +8,7 @@ "private": true, "scripts": { "start": "bun run src/index.ts", - "build": "bun build src/index.ts --outdir=build --target=bun --external=gradido-blockchain-js --external=@iota/client", + "build": "bun build src/index.ts --outdir=build --target=bun --external=gradido-blockchain-js --minify", "dev": "bun run --watch src/index.ts", "test": "bun test", "test:debug": "bun test --inspect-brk", @@ -17,17 +17,13 @@ "lint:fix": "biome check --error-on-warnings . --write" }, "dependencies": { - "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js#9a5f392", - "@iota/client": "^2.2.4" + "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js" }, "devDependencies": { "@biomejs/biome": "2.0.0", - "@elysiajs/trpc": "^1.1.0", - "@elysiajs/websocket": "^0.2.8", "@hashgraph/sdk": "^2.70.0", "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", - "@trpc/server": "^11.4.3", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", "elysia": "1.3.8", @@ -37,14 +33,10 @@ "log4js": "^6.9.1", "typescript": "^5.8.3", "uuid": "^8.3.2", - "valibot": "^1.1.0", - "zod": "^3.25.61" + "valibot": "^1.1.0" }, "engines": { "node": ">=18" }, - "module": "src/index.js", - "trustedDependencies": [ - "@iota/client" - ] + "module": "src/index.js" } diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index 7e98f82f9..ea076d9f0 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -1,10 +1,11 @@ -import { GraphQLClient, gql } from 'graphql-request' +import { GraphQLClient } from 'graphql-request' import { SignJWT } from 'jose' -import { getLogger, Logger } from 'log4js' -import * as v from 'valibot' + import { CONFIG } from '../../config' +import { communitySchema, type Community, homeCommunityGraphqlQuery } from './community.schema' +import { getLogger, Logger } from 'log4js' import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { type Community, communitySchema, homeCommunityGraphqlQuery } from './community.schema' +import * as v from 'valibot' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -15,7 +16,7 @@ import { type Community, communitySchema, homeCommunityGraphqlQuery } from './co export class BackendClient { private static instance: BackendClient client: GraphQLClient - logger: Logger + logger: Logger /** * The Singleton's constructor should always be private to prevent direct @@ -45,7 +46,7 @@ export class BackendClient { public static getInstance(): BackendClient | undefined { if (!BackendClient.instance) { BackendClient.instance = new BackendClient() - } + } return BackendClient.instance } diff --git a/dlt-connector/src/client/backend/community.schema.test.ts b/dlt-connector/src/client/backend/community.schema.test.ts index 4d2931ed0..d39c376ba 100644 --- a/dlt-connector/src/client/backend/community.schema.test.ts +++ b/dlt-connector/src/client/backend/community.schema.test.ts @@ -3,16 +3,19 @@ import { describe, expect, it } from 'bun:test' import * as v from 'valibot' import { uuidv4Schema } from '../../schemas/typeGuard.schema' import { communitySchema } from './community.schema' +import { hieroIdSchema } from '../../schemas/typeGuard.schema' describe('community.schema', () => { it('community', () => { expect( v.parse(communitySchema, { uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', + topicId: '0.0.4', foreign: false, createdAt: '2021-01-01', }), ).toEqual({ + topicId: v.parse(hieroIdSchema, '0.0.4'), uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), foreign: false, createdAt: new Date('2021-01-01'), diff --git a/dlt-connector/src/errors.ts b/dlt-connector/src/errors.ts index c9be7c2a2..e9cbaee98 100644 --- a/dlt-connector/src/errors.ts +++ b/dlt-connector/src/errors.ts @@ -1,5 +1,5 @@ +import { TransactionIdentifier } from './client/GradidoNode/input.schema' import { IdentifierAccount } from './schemas/account.schema' -import { TransactionIdentifier } from './schemas/transaction.schema' export class GradidoNodeError extends Error { constructor(message: string) { diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts index bf05b584c..fa12cdc48 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts @@ -1,6 +1,5 @@ import { beforeAll, describe, expect, it } from 'bun:test' import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' -import { v4 as uuidv4 } from 'uuid' import { UserKeyPairRole } from './UserKeyPair.role' let communityKeyPair: KeyPairEd25519 diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index 288ccfc77..8371153c2 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -1,4 +1,3 @@ -/* eslint-disable camelcase */ import { GradidoTransaction, InteractionValidate, diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index 2c4da487a..e8d8326c6 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -1,6 +1,5 @@ import { describe, expect, it, beforeAll } from 'bun:test' import { randomBytes } from 'crypto' -import { DurationSeconds, GradidoUnit } from 'gradido-blockchain-js' import { v4 as uuidv4 } from 'uuid' import { parse } from 'valibot' import { InputTransactionType } from '../enum/InputTransactionType' diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index 1a6ac945b..7bf2a85c6 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,18 +1,21 @@ import { Elysia, status } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' import { getLogger } from 'log4js' -import * as v from 'valibot' +import { parse } from 'valibot' import { getAddressType } from '../client/GradidoNode/api' import { LOG4JS_BASE_CATEGORY } from '../config/const' import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' import { SendToIotaContext } from '../interactions/sendToIota/SendToIota.context' import { IdentifierAccount, identifierAccountSchema } from '../schemas/account.schema' +import { hieroTransactionIdSchema } from '../schemas/typeGuard.schema' import { accountIdentifierSeedSchema, accountIdentifierUserSchema, existSchema, } from './input.schema' +import { TypeBoxFromValibot } from '@sinclair/typemap' +import { transactionSchema } from '../schemas/transaction.schema' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) @@ -43,7 +46,7 @@ export const appRoutes = new Elysia() .get( '/isAccountExist/:communityTopicId/:userUuid/:accountNr', async ({ params: { communityTopicId, userUuid, accountNr } }) => { - const accountIdentifier = v.parse(identifierAccountSchema, { + const accountIdentifier = parse(identifierAccountSchema, { communityTopicId, account: { userUuid, accountNr }, }) @@ -55,7 +58,7 @@ export const appRoutes = new Elysia() .get( '/isAccountExist/:communityTopicId/:seed', async ({ params: { communityTopicId, seed } }) => { - const accountIdentifier = v.parse(identifierAccountSchema, { + const accountIdentifier = parse(identifierAccountSchema, { communityTopicId, seed: { seed }, }) @@ -66,10 +69,7 @@ export const appRoutes = new Elysia() ) .post( '/sendTransaction', - async ({ body }) => { - const transactionDraft = v.parse(transactionDraftSchema, body) - return await SendToIotaContext(transactionDraft) - }, + async ({ body }) => await SendToIotaContext(parse(transactionSchema, body)), // validation schemas - { body: transactionDraftSchema, response: v.instanceof(TransactionResult) }, + { body: TypeBoxFromValibot(transactionSchema), response: TypeBoxFromValibot(hieroTransactionIdSchema) }, ) diff --git a/dlt-connector/src/server/input.schema.ts b/dlt-connector/src/server/input.schema.ts index c6aa463e5..336ade786 100644 --- a/dlt-connector/src/server/input.schema.ts +++ b/dlt-connector/src/server/input.schema.ts @@ -5,7 +5,7 @@ import { hieroIdSchema, uuidv4Schema } from '../schemas/typeGuard.schema' export const accountIdentifierUserSchema = t.Object({ communityTopicId: TypeBoxFromValibot(hieroIdSchema), userUuid: TypeBoxFromValibot(uuidv4Schema), - accountNr: t.Number().positive(), + accountNr: t.Number({ min: 0 }), }) // identifier for a gradido account created by transaction link / deferred transfer diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock new file mode 100644 index 000000000..f8d88875c --- /dev/null +++ b/dlt-connector/yarn.lock @@ -0,0 +1,1629 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@biomejs/biome@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.0.0.tgz#dc770781565640b9f884ad3d6d6383f64ca257c2" + integrity sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "2.0.0" + "@biomejs/cli-darwin-x64" "2.0.0" + "@biomejs/cli-linux-arm64" "2.0.0" + "@biomejs/cli-linux-arm64-musl" "2.0.0" + "@biomejs/cli-linux-x64" "2.0.0" + "@biomejs/cli-linux-x64-musl" "2.0.0" + "@biomejs/cli-win32-arm64" "2.0.0" + "@biomejs/cli-win32-x64" "2.0.0" + +"@biomejs/cli-darwin-arm64@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz#67135faa8bd52933fdaad09a160f9fc3a9defef3" + integrity sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw== + +"@biomejs/cli-darwin-x64@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz#49a7e064bad53e095d8a152b072adffcdeb4fb8e" + integrity sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw== + +"@biomejs/cli-linux-arm64-musl@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz#bfde27de8262a20e57e153f3807f47a01ccaeab3" + integrity sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA== + +"@biomejs/cli-linux-arm64@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz#c2404b3869c03a6fa5a8b979755bc6dfd5a5ec47" + integrity sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw== + +"@biomejs/cli-linux-x64-musl@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz#8ab214ac7e21a2af29435439145888c50f2bdd2f" + integrity sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA== + +"@biomejs/cli-linux-x64@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz#cbd172ead9e5bba8cd590d06e6e548445cf7ab2a" + integrity sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg== + +"@biomejs/cli-win32-arm64@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz#4677f4e034b3f4906e448b704f3314b38062a111" + integrity sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw== + +"@biomejs/cli-win32-x64@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz#f460a6950235c8f4bbd4cc405b210fec5cdb8ac9" + integrity sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg== + +"@ethersproject/abi@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + +"@ethersproject/abstract-signer@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + +"@ethersproject/address@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + +"@ethersproject/base64@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== + dependencies: + "@ethersproject/bytes" "^5.8.0" + +"@ethersproject/bignumber@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/constants@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + +"@ethersproject/hash@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/keccak256@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== + dependencies: + "@ethersproject/bytes" "^5.8.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== + +"@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/properties@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/rlp@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/signing-key@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + bn.js "^5.2.1" + elliptic "6.6.1" + hash.js "1.1.7" + +"@ethersproject/strings@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/transactions@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + +"@ethersproject/web@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== + dependencies: + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + +"@grpc/grpc-js@^1.12.6": + version "1.13.4" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.4.tgz#922fbc496e229c5fa66802d2369bf181c1df1c5a" + integrity sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.15" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60" + integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + +"@hashgraph/cryptography@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@hashgraph/cryptography/-/cryptography-1.9.0.tgz#eda84887e5909a850b013575d87f8bdb9e9393f9" + integrity sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg== + dependencies: + "@noble/curves" "^1.8.1" + asn1js "^3.0.6" + bignumber.js "^9.1.1" + bn.js "^5.2.1" + buffer "^6.0.3" + crypto-js "^4.2.0" + forge-light "1.1.4" + js-base64 "^3.7.7" + react-native-get-random-values "^1.11.0" + spark-md5 "^3.0.2" + tweetnacl "^1.0.3" + utf8 "^3.0.0" + +"@hashgraph/proto@2.20.0": + version "2.20.0" + resolved "https://registry.yarnpkg.com/@hashgraph/proto/-/proto-2.20.0.tgz#4d1ef2c46b7cea8d0426163d5b145d20f7a627a8" + integrity sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA== + dependencies: + long "^5.2.3" + protobufjs "7.2.5" + +"@hashgraph/sdk@^2.70.0": + version "2.70.0" + resolved "https://registry.yarnpkg.com/@hashgraph/sdk/-/sdk-2.70.0.tgz#2dd8457e220f1babba0ccf91dc4085f275a2a7b6" + integrity sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ== + dependencies: + "@ethersproject/abi" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@grpc/grpc-js" "^1.12.6" + "@hashgraph/cryptography" "1.9.0" + "@hashgraph/proto" "2.20.0" + bignumber.js "^9.1.1" + bn.js "^5.1.1" + crypto-js "^4.2.0" + js-base64 "^3.7.4" + long "^5.3.1" + pino "^9.6.0" + pino-pretty "^13.0.0" + protobufjs "7.2.5" + rfc4648 "^1.5.3" + utf8 "^3.0.0" + +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + +"@noble/curves@^1.8.1": + version "1.9.7" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" + integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== + dependencies: + "@noble/hashes" "1.8.0" + +"@noble/hashes@1.8.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== + +"@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" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@sinclair/typebox@^0.34.33": + version "0.34.39" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.39.tgz#41db8ed5ff33fdd47cb34dab250c0eaea7a1a5be" + integrity sha512-keEoFsevmLwAedzacnTVmra66GViRH3fhWO1M+nZ8rUgpPJyN4mcvqlGr3QMrQXx4L8KNwW0q9/BeHSEoO4teg== + +"@sinclair/typemap@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@sinclair/typemap/-/typemap-0.10.1.tgz#5d1e5267ec535275c8adce21ace364f5d9c86ff7" + integrity sha512-UXR0fhu/n3c9B6lB+SLI5t1eVpt9i9CdDrp2TajRe3LbKiUhCTZN2kSfJhjPnpc3I59jMRIhgew7+0HlMi08mg== + +"@types/bun@^1.2.17": + version "1.2.20" + resolved "https://registry.yarnpkg.com/@types/bun/-/bun-1.2.20.tgz#2b7339f063a5a27a4ef10fd7d0f21095b578eee5" + integrity sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA== + dependencies: + bun-types "1.2.20" + +"@types/node@*", "@types/node@>=13.7.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.0.tgz#89b09f45cb9a8ee69466f18ee5864e4c3eb84dec" + integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow== + dependencies: + undici-types "~7.10.0" + +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-styles@^4.0.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" + +"aproba@^1.0.3 || ^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1" + integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew== + +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" + +asn1js@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.6.tgz#53e002ebe00c5f7fd77c1c047c3557d7c04dce25" + integrity sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +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.11.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6" + integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.4" + proxy-from-env "^1.1.0" + +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.1.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== + +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: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bn.js@^4.11.9: + version "4.12.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== + +bn.js@^5.1.1, bn.js@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" + integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== + +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== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + 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" + +bun-types@1.2.20: + version "1.2.20" + resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.2.20.tgz#7ff3a05b2183fbe33d51c76ac99ae83aaf882988" + integrity sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA== + dependencies: + "@types/node" "*" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +chownr@^1.1.1: + version "1.1.4" + 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== + +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" + +cmake-js@^7.2.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-7.3.1.tgz#ed661eebd22a56d4743d7d2106a56fe50aa4355c" + integrity sha512-aJtHDrTFl8qovjSSqXT9aC2jdGfmP8JQsPtjdLAXFfH1BF4/ImZ27Jx0R61TFg8Apc3pl6e2yBKMveAeRXx2Rw== + dependencies: + axios "^1.6.5" + debug "^4" + fs-extra "^11.2.0" + 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" + +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== + +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== + +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.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== + +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== + +cookie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + +crypto-js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + +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== + +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + +debug@^4, debug@^4.3.3, debug@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +elliptic@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + 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" + +elysia@1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/elysia/-/elysia-1.3.8.tgz#66bd20f578ce936b0b29180cdb6afc2ef186ad3d" + integrity sha512-kxYFhegJbUEf5otzmisEvGt3R7d/dPBNVERO2nHo0kFqKBHyj5slArc90mSRKLfi1vamMtPcz67rL6Zeg5F2yg== + dependencies: + cookie "^1.0.2" + exact-mirror "0.1.3" + fast-decode-uri-component "^1.0.1" + optionalDependencies: + "@sinclair/typebox" "^0.34.33" + openapi-types "^12.1.3" + +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== + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +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, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.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== + +exact-mirror@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/exact-mirror/-/exact-mirror-0.1.3.tgz#62fef6056a9bd808bca01ecd38f342f92ea9bb08" + integrity sha512-yI62LpSby0ItzPJF05C4DRycVAoknRiCIDOLOCCs9zaEKylOXQtOFM3flX54S44swpRz584vk3P70yWQodsLlg== + +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" + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +fast-copy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" + integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== + +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +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== + +flatted@^3.2.7: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +follow-redirects@^1.14.4, follow-redirects@^1.15.6: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +forge-light@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/forge-light/-/forge-light-1.1.4.tgz#765da0d54e19c6644f37e7e5b873e1305ce78d1e" + integrity sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g== + +form-data@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + +fs-constants@^1.0.0: + version "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.3.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.1.tgz#ba7a1f97a85f94c6db2e52ff69570db3671d5a74" + integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g== + 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" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.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" + +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== + +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" + +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.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + 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== + +"gradido-blockchain-js@git+https://github.com/gradido/gradido-blockchain-js": + version "0.0.1" + resolved "git+https://github.com/gradido/gradido-blockchain-js#9a5f392267bd313399b851e4dc6b5af7b959be3e" + 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#65d94455fab86b902c0d59bb9c06ac70470e56b2" + +graphql-request@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-7.2.0.tgz#af4aa25f27a087dd4fc93a4ff54a0f59c4487269" + integrity sha512-0GR7eQHBFYz372u9lxS16cOtEekFlZYB2qOyq8wDvzRmdRSJ0mgUVX1tzNcIzk3G+4NY+mGtSz411wZdeDF/+A== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +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" + +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== + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + 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" + +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" + +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== + +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" + +ieee754@^1.1.13, 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== + +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +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== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jose@^5.2.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.10.0.tgz#c37346a099d6467c401351a9a0c2161e0f52c4be" + integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg== + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + +js-base64@^3.7.4, js-base64@^3.7.7: + version "3.7.8" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.8.tgz#af44496bc09fa178ed9c4adf67eb2b46f5c6d2a4" + integrity sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + dependencies: + universalify "^2.0.0" + 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" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +log4js@^6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" + integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + flatted "^3.2.7" + rfdc "^1.3.0" + streamroller "^3.1.5" + +long@^5.0.0, long@^5.2.3, long@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +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" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +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== + +minimist@^1.2.0, minimist@^1.2.5, 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@^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== + +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== + +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== + +nan@^2.20.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.23.0.tgz#24aa4ddffcc37613a2d2935b97683c1ec96093c6" + integrity sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ== + +node-abi@^3.3.0: + version "3.75.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.75.0.tgz#2f929a91a90a0d02b325c43731314802357ed764" + integrity sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg== + dependencies: + semver "^7.3.5" + +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.5.0" + resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.5.0.tgz#73a0bab642c77e39b815b6d24ad4c6b56f695912" + integrity sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ== + +node-gyp-build@^4.8.1: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +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-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@^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" + +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +once@^1.3.1, once@^1.4.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" + +openapi-types@^12.1.3: + version "12.1.3" + resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" + integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== + +path-key@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +pino-abstract-transport@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60" + integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw== + dependencies: + split2 "^4.0.0" + +pino-pretty@^13.0.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-13.1.1.tgz#70130b9ff3737c8757f53e42d69e9f96835142b8" + integrity sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.2" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^2.0.0" + pump "^3.0.0" + secure-json-parse "^4.0.0" + sonic-boom "^4.0.1" + strip-json-comments "^5.0.2" + +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + +pino@^9.6.0: + version "9.9.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-9.9.0.tgz#0d2667ab4a54b561a4434a321ec595f305ab9cd1" + integrity sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^2.0.0" + pino-std-serializers "^7.0.0" + process-warning "^5.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + +"prebuildify@git+https://github.com/einhornimmond/prebuildify#65d94455fab86b902c0d59bb9c06ac70470e56b2": + version "6.0.1" + resolved "git+https://github.com/einhornimmond/prebuildify#65d94455fab86b902c0d59bb9c06ac70470e56b2" + 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" + +process-warning@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-5.0.0.tgz#566e0bf79d1dff30a72d8bbbe9e8ecefe8d378d7" + integrity sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA== + +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" + +protobufjs@^7.2.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" + integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg== + 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-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== + +pump@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" + integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-native-get-random-values@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.11.0.tgz#1ca70d1271f4b08af92958803b89dccbda78728d" + integrity sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ== + dependencies: + fast-base64-decode "^1.0.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== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + +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== + +rfc4648@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.5.4.tgz#1174c0afba72423a0b70c386ecfeb80aa61b05ca" + integrity sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg== + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +safe-buffer@~5.2.0: + 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-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +secure-json-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-4.0.0.tgz#2ee1b7581be38ab348bab5a3e49280ba80a89c85" + integrity sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA== + +semver@^7.3.5, semver@^7.5.4: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +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== + +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== + +sonic-boom@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" + integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww== + dependencies: + atomic-sleep "^1.0.0" + +spark-md5@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" + integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +streamroller@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" + integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== + dependencies: + date-format "^4.0.14" + debug "^4.3.4" + fs-extra "^8.1.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_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.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-json-comments@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.3.tgz#b7304249dd402ee67fd518ada993ab3593458bcf" + integrity sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +tar-fs@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.3.tgz#fb3b8843a26b6f13a08e606f7922875eb1fbbf92" + integrity sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + 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" + +thread-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" + integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== + dependencies: + real-require "^0.2.0" + +tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +typescript@^5.8.3: + version "5.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" + integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== + +undici-types@~7.10.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" + integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +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== + +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== + +utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +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== + +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== + +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== + +valibot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/valibot/-/valibot-1.1.0.tgz#873bb1af9e1577391690307bfe0520bd1360ec2d" + integrity sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw== + +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.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.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" + +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" + +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@^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@^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== + 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" From 5770feb11301bec14673bb21de790f857d18c033 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 3 Sep 2025 14:39:18 +0200 Subject: [PATCH 28/72] first adaptions to hiero --- .../src/graphql/input/EditCommunityInput.ts | 6 + backend/src/graphql/validator/HieroId.ts | 23 + dlt-connector/bun.lock | 202 +- .../src/client/GradidoNode/output.schema.ts | 0 dlt-connector/src/client/HieroClient.ts | 74 - .../src/client/backend/BackendClient.ts | 4 + .../src/client/backend/community.schema.ts | 2 +- dlt-connector/src/client/hiero/HieroClient.ts | 120 ++ .../src/client/hiero/output.schema.ts | 37 + dlt-connector/src/index.ts | 6 + .../sendToIota/SendToIota.context.ts | 2 +- dlt-connector/yarn.lock | 1629 ----------------- 12 files changed, 221 insertions(+), 1884 deletions(-) create mode 100644 backend/src/graphql/validator/HieroId.ts delete mode 100644 dlt-connector/src/client/GradidoNode/output.schema.ts delete mode 100644 dlt-connector/src/client/HieroClient.ts create mode 100644 dlt-connector/src/client/hiero/HieroClient.ts create mode 100644 dlt-connector/src/client/hiero/output.schema.ts delete mode 100644 dlt-connector/yarn.lock diff --git a/backend/src/graphql/input/EditCommunityInput.ts b/backend/src/graphql/input/EditCommunityInput.ts index 487221920..6607472bf 100644 --- a/backend/src/graphql/input/EditCommunityInput.ts +++ b/backend/src/graphql/input/EditCommunityInput.ts @@ -3,6 +3,7 @@ import { ArgsType, Field, InputType } from 'type-graphql' import { Location } from '@/graphql/model/Location' import { isValidLocation } from '@/graphql/validator/Location' +import { isValidHieroId } from '@/graphql/validator/HieroId' @ArgsType() @InputType() @@ -18,4 +19,9 @@ export class EditCommunityInput { @Field(() => Location, { nullable: true }) @isValidLocation() location?: Location | null + + @Field(() => String, { nullable: true }) + @isValidHieroId() + topicId?: string | null + } diff --git a/backend/src/graphql/validator/HieroId.ts b/backend/src/graphql/validator/HieroId.ts new file mode 100644 index 000000000..a7627ec78 --- /dev/null +++ b/backend/src/graphql/validator/HieroId.ts @@ -0,0 +1,23 @@ +import { ValidationArguments, ValidationOptions, registerDecorator } from 'class-validator' + +export function isValidHieroId(validationOptions?: ValidationOptions) { + return function (object: Object, propertyName: string) { + registerDecorator({ + name: 'isValidHieroId', + target: object.constructor, + propertyName, + options: validationOptions, + validator: { + validate(value: string) { + if (value.match(/[0-9]*\.[0-9]*\.[0-9]*/)) { + return true + } + return false + }, + defaultMessage(args: ValidationArguments) { + return `${propertyName} must be a valid HieroId (0.0.2121), ${args.property}` + }, + }, + }) + } +} diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 85f80c6f2..b300ad89a 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -35,48 +35,26 @@ "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], - "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], - "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg=="], - - "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], - - "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], - "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], - "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], - "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], - "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], - - "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], - - "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.2" } }, "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g=="], - "@babel/helpers": ["@babel/helpers@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw=="], "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], - "@babel/plugin-proposal-export-default-from": ["@babel/plugin-proposal-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw=="], - "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], @@ -85,20 +63,12 @@ "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], - "@babel/plugin-syntax-dynamic-import": ["@babel/plugin-syntax-dynamic-import@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ=="], - - "@babel/plugin-syntax-export-default-from": ["@babel/plugin-syntax-export-default-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg=="], - - "@babel/plugin-syntax-flow": ["@babel/plugin-syntax-flow@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA=="], - "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], - "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], - "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], @@ -115,76 +85,6 @@ "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], - "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], - - "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], - - "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], - - "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], - - "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], - - "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], - - "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.3", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg=="], - - "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], - - "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="], - - "@babel/plugin-transform-flow-strip-types": ["@babel/plugin-transform-flow-strip-types@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-flow": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg=="], - - "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], - - "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], - - "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], - - "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], - - "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], - - "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], - - "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], - - "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], - - "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA=="], - - "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], - - "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], - - "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], - - "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], - - "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], - - "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], - - "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], - - "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], - - "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], - - "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A=="], - - "@babel/plugin-transform-runtime": ["@babel/plugin-transform-runtime@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg=="], - - "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], - - "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], - - "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], - - "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], - - "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], - "@babel/runtime": ["@babel/runtime@7.28.3", "", {}, "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA=="], "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], @@ -259,9 +159,9 @@ "@hashgraph/cryptography": ["@hashgraph/cryptography@1.9.0", "", { "dependencies": { "@noble/curves": "^1.8.1", "asn1js": "^3.0.6", "bignumber.js": "^9.1.1", "bn.js": "^5.2.1", "buffer": "^6.0.3", "crypto-js": "^4.2.0", "forge-light": "1.1.4", "js-base64": "^3.7.7", "react-native-get-random-values": "^1.11.0", "spark-md5": "^3.0.2", "tweetnacl": "^1.0.3", "utf8": "^3.0.0" } }, "sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg=="], - "@hashgraph/proto": ["@hashgraph/proto@2.20.0", "", { "dependencies": { "long": "^5.2.3", "protobufjs": "7.2.5" } }, "sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA=="], + "@hashgraph/proto": ["@hashgraph/proto@2.22.0", "", { "dependencies": { "long": "^5.2.3", "protobufjs": "7.2.5" } }, "sha512-+h2qqk+KwpV+rr1AN4ip1Gel3X4v0DvFO9WH7o0ZR3gQX9pfzurptKGs30DlBnH21xPqDH61v90bZvVknE27NA=="], - "@hashgraph/sdk": ["@hashgraph/sdk@2.70.0", "", { "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@grpc/grpc-js": "^1.12.6", "@hashgraph/cryptography": "1.9.0", "@hashgraph/proto": "2.20.0", "bignumber.js": "^9.1.1", "bn.js": "^5.1.1", "crypto-js": "^4.2.0", "js-base64": "^3.7.4", "long": "^5.3.1", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "protobufjs": "7.2.5", "rfc4648": "^1.5.3", "utf8": "^3.0.0" } }, "sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ=="], + "@hashgraph/sdk": ["@hashgraph/sdk@2.72.0", "", { "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", "@ethersproject/rlp": "^5.8.0", "@grpc/grpc-js": "^1.12.6", "@hashgraph/cryptography": "1.9.0", "@hashgraph/proto": "2.22.0", "bignumber.js": "^9.1.1", "bn.js": "^5.1.1", "crypto-js": "^4.2.0", "js-base64": "^3.7.4", "long": "^5.3.1", "pino": "^9.6.0", "pino-pretty": "^13.0.0", "protobufjs": "7.2.5", "rfc4648": "^1.5.3", "utf8": "^3.0.0" } }, "sha512-w35M77OAkJutENG4CldUGzfT+qubDjEYCQR5Ran75uHB+SLeCodR87AXWJ3ocr5vPaZ7lsflBXEYZLhgCi1G2g=="], "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], @@ -317,33 +217,25 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - "@react-native/assets-registry": ["@react-native/assets-registry@0.81.0", "", {}, "sha512-rZs8ziQ1YRV3Z5Mw5AR7YcgI3q1Ya9NIx6nyuZAT9wDSSjspSi+bww+Hargh/a4JfV2Ajcxpn9X9UiFJr1ddPw=="], + "@react-native/assets-registry": ["@react-native/assets-registry@0.81.1", "", {}, "sha512-o/AeHeoiPW8x9MzxE1RSnKYc+KZMW9b7uaojobEz0G8fKgGD1R8n5CJSOiQ/0yO2fJdC5wFxMMOgy2IKwRrVgw=="], - "@react-native/babel-plugin-codegen": ["@react-native/babel-plugin-codegen@0.81.0", "", { "dependencies": { "@babel/traverse": "^7.25.3", "@react-native/codegen": "0.81.0" } }, "sha512-MEMlW91+2Kk9GiObRP1Nc6oTdiyvmSEbPMSC6kzUzDyouxnh5/x28uyNySmB2nb6ivcbmQ0lxaU059+CZSkKXQ=="], + "@react-native/codegen": ["@react-native/codegen@0.81.1", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", "hermes-parser": "0.29.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" } }, "sha512-8KoUE1j65fF1PPHlAhSeUHmcyqpE+Z7Qv27A89vSZkz3s8eqWSRu2hZtCl0D3nSgS0WW0fyrIsFaRFj7azIiPw=="], - "@react-native/babel-preset": ["@react-native/babel-preset@0.81.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-proposal-export-default-from": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-transform-arrow-functions": "^7.24.7", "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-for-of": "^7.24.7", "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", "@babel/plugin-transform-numeric-separator": "^7.24.7", "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-react-display-name": "^7.24.7", "@babel/plugin-transform-react-jsx": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", "@babel/plugin-transform-runtime": "^7.24.7", "@babel/plugin-transform-shorthand-properties": "^7.24.7", "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", "@react-native/babel-plugin-codegen": "0.81.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" } }, "sha512-RKMgCUGsso/2b32kgg24lB68LJ6qr2geLoSQTbisY6Usye0uXeXCgbZZDbILIX9upL4uzU4staMldRZ0v08F1g=="], + "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.81.1", "", { "dependencies": { "@react-native/dev-middleware": "0.81.1", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.1", "metro-config": "^0.83.1", "metro-core": "^0.83.1", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-FuIpZcjBiiYcVMNx+1JBqTPLs2bUIm6X4F5enYGYcetNE2nfSMUVO8SGUtTkBdbUTfKesXYSYN8wungyro28Ag=="], - "@react-native/codegen": ["@react-native/codegen@0.81.0", "", { "dependencies": { "glob": "^7.1.1", "hermes-parser": "0.29.1", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" }, "peerDependencies": { "@babel/core": "*" } }, "sha512-gPFutgtj8YqbwKKt3YpZKamUBGd9YZJV51Jq2aiDZ9oThkg1frUBa20E+Jdi7jKn982wjBMxAklAR85QGQ4xMA=="], + "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.81.1", "", {}, "sha512-dwKv1EqKD+vONN4xsfyTXxn291CNl1LeBpaHhNGWASK1GO4qlyExMs4TtTjN57BnYHikR9PzqPWcUcfzpVRaLg=="], - "@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.81.0", "", { "dependencies": { "@react-native/dev-middleware": "0.81.0", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.1", "metro-config": "^0.83.1", "metro-core": "^0.83.1", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli"] }, "sha512-n04ACkCaLR54NmA/eWiDpjC16pHr7+yrbjQ6OEdRoXbm5EfL8FEre2kDAci7pfFdiSMpxdRULDlKpfQ+EV/GAQ=="], + "@react-native/dev-middleware": ["@react-native/dev-middleware@0.81.1", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.1", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-hy3KlxNOfev3O5/IuyZSstixWo7E9FhljxKGHdvVtZVNjQdM+kPMh66mxeJbB2TjdJGAyBT4DjIwBaZnIFOGHQ=="], - "@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.81.0", "", {}, "sha512-N/8uL2CGQfwiQRYFUNfmaYxRDSoSeOmFb56rb0PDnP3XbS5+X9ee7X4bdnukNHLGfkRdH7sVjlB8M5zE8XJOhw=="], + "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.81.1", "", {}, "sha512-RpRxs/LbWVM9Zi5jH1qBLgTX746Ei+Ui4vj3FmUCd9EXUSECM5bJpphcsvqjxM5Vfl/o2wDLSqIoFkVP/6Te7g=="], - "@react-native/dev-middleware": ["@react-native/dev-middleware@0.81.0", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.0", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-J/HeC/+VgRyGECPPr9rAbe5S0OL6MCIrvrC/kgNKSME5+ZQLCiTpt3pdAoAMXwXiF9a02Nmido0DnyM1acXTIA=="], + "@react-native/js-polyfills": ["@react-native/js-polyfills@0.81.1", "", {}, "sha512-w093OkHFfCnJKnkiFizwwjgrjh5ra53BU0ebPM3uBLkIQ6ZMNSCTZhG8ZHIlAYeIGtEinvmnSUi3JySoxuDCAQ=="], - "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.81.0", "", {}, "sha512-LGNtPXO1RKLws5ORRb4Q4YULi2qxM4qZRuARtwqM/1f2wyZVggqapoV0OXlaXaz+GiEd2ll3ROE4CcLN6J93jg=="], + "@react-native/normalize-colors": ["@react-native/normalize-colors@0.81.1", "", {}, "sha512-TsaeZlE8OYFy3PSWc+1VBmAzI2T3kInzqxmwXoGU4w1d4XFkQFg271Ja9GmDi9cqV3CnBfqoF9VPwRxVlc/l5g=="], - "@react-native/js-polyfills": ["@react-native/js-polyfills@0.81.0", "", {}, "sha512-whXZWIogzoGpqdyTjqT89M6DXmlOkWqNpWoVOAwVi8XFCMO+L7WTk604okIgO6gdGZcP1YtFpQf9JusbKrv/XA=="], + "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.81.1", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-yG+zcMtyApW1yRwkNFvlXzEg3RIFdItuwr/zEvPCSdjaL+paX4rounpL0YX5kS9MsDIE5FXfcqINXg7L0xuwPg=="], - "@react-native/metro-babel-transformer": ["@react-native/metro-babel-transformer@0.81.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@react-native/babel-preset": "0.81.0", "hermes-parser": "0.29.1", "nullthrows": "^1.1.1" } }, "sha512-Mwovr4jJ3JTnbHEQLhdcMvS82LjijpqCydXl1aH2N16WVCrE5oSNFiqTt6NpZBw9zkJX7nijsY+xeCy6m+KK3Q=="], - - "@react-native/metro-config": ["@react-native/metro-config@0.81.0", "", { "dependencies": { "@react-native/js-polyfills": "0.81.0", "@react-native/metro-babel-transformer": "0.81.0", "metro-config": "^0.83.1", "metro-runtime": "^0.83.1" } }, "sha512-5eqLP4TCERHGRYDJSZa//O98CGDFNNEwHVvhs65Msfy6hAoSdw5pAAuTrsQwmbTBp0Fkvu7Bx8BZDhiferZsHg=="], - - "@react-native/normalize-colors": ["@react-native/normalize-colors@0.81.0", "", {}, "sha512-3gEu/29uFgz+81hpUgdlOojM4rjHTIPwxpfygFNY60V6ywZih3eLDTS8kAjNZfPFHQbcYrNorJzwnL5yFF/uLw=="], - - "@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.81.0", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-p14QC5INHkbMZ96158sUxkSwN6zp138W11G+CRGoLJY4Q9WRJBCe7wHR5Owyy3XczQXrIih/vxAXwgYeZ2XByg=="], - - "@sinclair/typebox": ["@sinclair/typebox@0.34.39", "", {}, "sha512-keEoFsevmLwAedzacnTVmra66GViRH3fhWO1M+nZ8rUgpPJyN4mcvqlGr3QMrQXx4L8KNwW0q9/BeHSEoO4teg=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.41", "", {}, "sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g=="], "@sinclair/typemap": ["@sinclair/typemap@0.10.1", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.30", "valibot": "^1.0.0", "zod": "^3.24.1" } }, "sha512-UXR0fhu/n3c9B6lB+SLI5t1eVpt9i9CdDrp2TajRe3LbKiUhCTZN2kSfJhjPnpc3I59jMRIhgew7+0HlMi08mg=="], @@ -363,7 +255,7 @@ "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - "@types/bun": ["@types/bun@1.2.20", "", { "dependencies": { "bun-types": "1.2.20" } }, "sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA=="], + "@types/bun": ["@types/bun@1.2.21", "", { "dependencies": { "bun-types": "1.2.21" } }, "sha512-NiDnvEqmbfQ6dmZ3EeUO577s4P5bf4HCTXtI6trMc6f6RzirY5IrF3aIookuSpyslFzrnvv2lmEWv5HyC1X79A=="], "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="], @@ -375,7 +267,7 @@ "@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], - "@types/react": ["@types/react@19.1.10", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-EhBeSYX0Y6ye8pNebpKrwFJq7BoQ8J5SO6NlvNwwHjSj6adXJViPQrKlsyPw7hLBLvckEMO1yxeGdR82YBBlDg=="], + "@types/react": ["@types/react@19.1.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w=="], "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], @@ -423,16 +315,8 @@ "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="], - "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], - - "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], - - "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], - "babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.29.1", "", { "dependencies": { "hermes-parser": "0.29.1" } }, "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA=="], - "babel-plugin-transform-flow-enums": ["babel-plugin-transform-flow-enums@0.0.2", "", { "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" } }, "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ=="], - "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^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.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^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-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="], @@ -455,7 +339,7 @@ "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], - "browserslist": ["browserslist@4.25.2", "", { "dependencies": { "caniuse-lite": "^1.0.30001733", "electron-to-chromium": "^1.5.199", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA=="], + "browserslist": ["browserslist@4.25.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg=="], "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], @@ -463,7 +347,7 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bun-types": ["bun-types@1.2.20", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA=="], + "bun-types": ["bun-types@1.2.21", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-sa2Tj77Ijc/NTLS0/Odjq/qngmEPZfbfnOERi0KRUYhT9R8M4VBioWVmMWE5GrYbKMc+5lVybXygLdibHaqVqw=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], @@ -475,7 +359,7 @@ "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001735", "", {}, "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w=="], + "caniuse-lite": ["caniuse-lite@1.0.30001739", "", {}, "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -513,8 +397,6 @@ "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], - "core-js-compat": ["core-js-compat@3.45.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA=="], - "cosmiconfig": ["cosmiconfig@5.2.1", "", { "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA=="], "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], @@ -543,7 +425,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "electron-to-chromium": ["electron-to-chromium@1.5.203", "", {}, "sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g=="], + "electron-to-chromium": ["electron-to-chromium@1.5.213", "", {}, "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q=="], "elliptic": ["elliptic@6.6.1", "", { "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" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], @@ -653,7 +535,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#9a5f392", { "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#65d94455fab86b902c0d59bb9c06ac70470e56b2" } }, "gradido-gradido-blockchain-js-9a5f392"], + "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#eccade8", { "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#65d94455fab86b902c0d59bb9c06ac70470e56b2" } }, "gradido-gradido-blockchain-js-eccade8"], "graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], @@ -701,8 +583,6 @@ "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], - "is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="], "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], @@ -769,8 +649,6 @@ "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], - "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], - "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], "log4js": ["log4js@6.9.1", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "flatted": "^3.2.7", "rfdc": "^1.3.0", "streamroller": "^3.1.5" } }, "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g=="], @@ -903,13 +781,11 @@ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "pino": ["pino@9.9.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ=="], + "pino": ["pino@9.9.1", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-40SszWPOPwGhUIJ3zj0PsbMNV1bfg8nw5Qp/tP2FE2p3EuycmhDeYimKOMBAu6rtxcSw2QpjJsuK5A6v+en8Yw=="], "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], @@ -951,7 +827,7 @@ "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - "react-native": ["react-native@0.81.0", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.0", "@react-native/codegen": "0.81.0", "@react-native/community-cli-plugin": "0.81.0", "@react-native/gradle-plugin": "0.81.0", "@react-native/js-polyfills": "0.81.0", "@react-native/normalize-colors": "0.81.0", "@react-native/virtualized-lists": "0.81.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.83.1", "metro-source-map": "^0.83.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.26.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "^19.1.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-RDWhewHGsAa5uZpwIxnJNiv5tW2y6/DrQUjEBdAHPzGMwuMTshern2s4gZaWYeRU3SQguExVddCjiss9IBhxqA=="], + "react-native": ["react-native@0.81.1", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.81.1", "@react-native/codegen": "0.81.1", "@react-native/community-cli-plugin": "0.81.1", "@react-native/gradle-plugin": "0.81.1", "@react-native/js-polyfills": "0.81.1", "@react-native/normalize-colors": "0.81.1", "@react-native/virtualized-lists": "0.81.1", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.29.1", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.83.1", "metro-source-map": "^0.83.1", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.26.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^6.2.3", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.0", "react": "^19.1.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-k2QJzWc/CUOwaakmD1SXa4uJaLcwB2g2V9BauNIjgtXYYAeyFjx9jlNz/+wAEcHLg9bH5mgMdeAwzvXqjjh9Hg=="], "react-native-get-random-values": ["react-native-get-random-values@1.11.0", "", { "dependencies": { "fast-base64-decode": "^1.0.0" }, "peerDependencies": { "react-native": ">=0.56" } }, "sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ=="], @@ -961,22 +837,10 @@ "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], - "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], - - "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], - "regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="], - "regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], - - "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], - - "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], - "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], @@ -1045,15 +909,13 @@ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "tar": ["tar@6.2.1", "", { "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" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], "tar-fs": ["tar-fs@2.1.3", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg=="], "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - "terser": ["terser@5.43.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg=="], + "terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], @@ -1079,18 +941,10 @@ "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], - "uint8array-extras": ["uint8array-extras@1.4.1", "", {}, "sha512-+NWHrac9dvilNgme+gP4YrBSumsaMZP0fNBtXXFIf33RLLKEcBUKaQZ7ULUbS0sBfcjxIZ4V96OTRkCbM7hxpw=="], + "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], "undici-types": ["undici-types@7.10.0", "", {}, "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag=="], - "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], - - "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], - - "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.0", "", {}, "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg=="], - - "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.1.0", "", {}, "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="], - "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -1143,18 +997,10 @@ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "@babel/plugin-transform-runtime/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], "@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], - "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -1201,8 +1047,6 @@ "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], - "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], diff --git a/dlt-connector/src/client/GradidoNode/output.schema.ts b/dlt-connector/src/client/GradidoNode/output.schema.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/dlt-connector/src/client/HieroClient.ts b/dlt-connector/src/client/HieroClient.ts deleted file mode 100644 index d7be17eb3..000000000 --- a/dlt-connector/src/client/HieroClient.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - AccountBalance, - AccountBalanceQuery, - Client, - LocalProvider, - PrivateKey, - TopicMessageSubmitTransaction, - TransactionReceipt, - TransactionResponse, - Wallet, -} from '@hashgraph/sdk' -import { GradidoTransaction } from 'gradido-blockchain-js' -import { getLogger, Logger } from 'log4js' -import { CONFIG } from '../config' -import { LOG4JS_BASE_CATEGORY } from '../config/const' -import { HieroId } from '../schemas/typeGuard.schema' - -export class HieroClient { - private static instance: HieroClient - wallet: Wallet - logger: Logger - - private constructor() { - this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.HieroClient`) - const provider = LocalProvider.fromClient(Client.forName(CONFIG.HIERO_HEDERA_NETWORK)) - let operatorKey: PrivateKey - if (CONFIG.HIERO_OPERATOR_KEY.length === 64) { - operatorKey = PrivateKey.fromStringED25519(CONFIG.HIERO_OPERATOR_KEY) - } else { - operatorKey = PrivateKey.fromStringECDSA(CONFIG.HIERO_OPERATOR_KEY) - } - this.wallet = new Wallet(CONFIG.HIERO_OPERATOR_ID, operatorKey, provider) - } - - public static getInstance(): HieroClient { - if (!CONFIG.HIERO_ACTIVE) { - throw new Error('hiero is disabled via config...') - } - if (!HieroClient.instance) { - HieroClient.instance = new HieroClient() - } - - return HieroClient.instance - } - - public async sendMessage( - topicId: HieroId, - transaction: GradidoTransaction, - ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { - const serializedTransaction = transaction.getSerializedTransaction() - if (!serializedTransaction) { - throw new Error('cannot serialize transaction') - } - // send one message - const hieroTransaction = await new TopicMessageSubmitTransaction({ - topicId, - message: serializedTransaction.data(), - }).freezeWithSigner(this.wallet) - const signedHieroTransaction = await hieroTransaction.signWithSigner(this.wallet) - const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) - const sendReceipt = await sendResponse.getReceiptWithSigner(this.wallet) - this.logger.info( - `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, - ) - return { receipt: sendReceipt, response: sendResponse } - } - - public async getBalance(): Promise { - const balance = await new AccountBalanceQuery() - .setAccountId(this.wallet.getAccountId()) - .executeWithSigner(this.wallet) - return balance - } -} diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index ea076d9f0..5e2bec24f 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -63,6 +63,10 @@ export class BackendClient { return v.parse(communitySchema, data.homeCommunity) } + public async setHomeCommunityTopicId(topicId: HieroId) { + + } + private async getRequestHeader(): Promise<{ authorization: string }> { diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts index 182a41368..4c99f10b4 100644 --- a/dlt-connector/src/client/backend/community.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -12,7 +12,7 @@ import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' */ export const communitySchema = v.object({ uuid: uuidv4Schema, - topicId: hieroIdSchema, + topicId: v.optional(hieroIdSchema, ''), foreign: v.boolean('expect boolean type'), createdAt: dateSchema, }) diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts new file mode 100644 index 000000000..10fa23592 --- /dev/null +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -0,0 +1,120 @@ +import { + AccountBalance, + AccountBalanceQuery, + Client, + LocalProvider, + PrivateKey, + Timestamp, + TopicCreateTransaction, + TopicId, + TopicInfoQuery, + TopicMessageSubmitTransaction, + TopicUpdateTransaction, + TransactionReceipt, + TransactionResponse, + Wallet, +} from '@hashgraph/sdk' +import { parse } from 'valibot' +import { GradidoTransaction, HieroTopicId } from 'gradido-blockchain-js' +import { getLogger, Logger } from 'log4js' +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' +import { topicInfoSchema, type TopicInfoOutput } from './output.schema' + +// https://docs.hedera.com/hedera/sdks-and-apis/hedera-api/consensus/consensusupdatetopic +export const MIN_AUTORENEW_PERIOD = 6999999 //seconds +export const MAX_AUTORENEW_PERIOD = 8000001 // seconds + +export class HieroClient { + private static instance: HieroClient + wallet: Wallet + client: Client + logger: Logger + + private constructor() { + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.HieroClient`) + this.client = Client.forName(CONFIG.HIERO_HEDERA_NETWORK) + const provider = LocalProvider.fromClient(this.client) + let operatorKey: PrivateKey + if (CONFIG.HIERO_OPERATOR_KEY.length === 64) { + operatorKey = PrivateKey.fromStringED25519(CONFIG.HIERO_OPERATOR_KEY) + } else { + operatorKey = PrivateKey.fromStringECDSA(CONFIG.HIERO_OPERATOR_KEY) + } + this.wallet = new Wallet(CONFIG.HIERO_OPERATOR_ID, operatorKey, provider) + } + + public static getInstance(): HieroClient { + if (!CONFIG.HIERO_ACTIVE) { + throw new Error('hiero is disabled via config...') + } + if (!HieroClient.instance) { + HieroClient.instance = new HieroClient() + } + + return HieroClient.instance + } + + public async sendMessage( + topicId: HieroId, + transaction: GradidoTransaction, + ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { + const serializedTransaction = transaction.getSerializedTransaction() + if (!serializedTransaction) { + throw new Error('cannot serialize transaction') + } + // send one message + const hieroTransaction = await new TopicMessageSubmitTransaction({ + topicId, + message: serializedTransaction.data(), + }).freezeWithSigner(this.wallet) + const signedHieroTransaction = await hieroTransaction.signWithSigner(this.wallet) + const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) + const sendReceipt = await sendResponse.getReceiptWithSigner(this.wallet) + this.logger.info( + `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, + ) + return { receipt: sendReceipt, response: sendResponse } + } + + public async getBalance(): Promise { + const balance = await new AccountBalanceQuery() + .setAccountId(this.wallet.getAccountId()) + .executeWithSigner(this.wallet) + return balance + } + + public async getTopicInfo(topicId: HieroTopicId): Promise { + const info = await new TopicInfoQuery() + .setTopicId(new TopicId(topicId.getShardNum(), topicId.getRealmNum(), topicId.getTopicNum())) + .execute(this.client) + this.logger.debug(JSON.stringify(info, null, 2)) + return parse(topicInfoSchema, { + topicId: topicId.toString(), + sequenceNumber: info.sequenceNumber.toNumber(), + expirationTime: info.expirationTime?.toString(), + autoRenewPeriod: info.autoRenewPeriod?.seconds, + autoRenewAccountId: info.autoRenewAccountId?.toString(), + }) + } + + public async createTopic(): Promise { + let transaction = await new TopicCreateTransaction().freezeWithSigner(this.wallet) + transaction = await transaction.signWithSigner(this.wallet) + const createResponse = await transaction.executeWithSigner(this.wallet) + const createReceipt = await createResponse.getReceiptWithSigner(this.wallet) + this.logger.debug(createReceipt.toString()) + return parse(hieroIdSchema, createReceipt.topicId?.toString()) + } + + public async updateTopic(): Promise { + let transaction = new TopicUpdateTransaction() + transaction.setExpirationTime(new Date(new Date().getTime() + MIN_AUTORENEW_PERIOD * 1000)) + transaction = await transaction.freezeWithSigner(this.wallet) + transaction = await transaction.signWithSigner(this.wallet) + const updateResponse = await transaction.executeWithSigner(this.wallet) + const updateReceipt = await updateResponse.getReceiptWithSigner(this.wallet) + this.logger.debug(updateReceipt.toString()) + } +} diff --git a/dlt-connector/src/client/hiero/output.schema.ts b/dlt-connector/src/client/hiero/output.schema.ts new file mode 100644 index 000000000..3f0218010 --- /dev/null +++ b/dlt-connector/src/client/hiero/output.schema.ts @@ -0,0 +1,37 @@ +import * as v from 'valibot' +import { hieroIdSchema } from '../../schemas/typeGuard.schema' + +// schema definitions for exporting data from hiero request as json back to caller +/*export const dateStringSchema = v.pipe( + v.enum([v.string(), v.date()], + v.transform(in: string | Date) + +)*/ +export const dateStringSchema = v.pipe( + v.union([v.string('expect valid date string'), v.instance(Date, 'expect Date object')]), + v.transform((input) => { + let date: Date + if (input instanceof Date) { + date = input + } else { + date = new Date(input) + } + if (isNaN(date.getTime())) { + throw new Error('invalid date') + } + return date.toISOString() + }), +) + +export const positiveNumberSchema = v.pipe(v.number(), v.minValue(0)) + +export const topicInfoSchema = v.object({ + topicId: hieroIdSchema, + sequenceNumber: positiveNumberSchema, + expirationTime: dateStringSchema, + autoRenewPeriod: v.optional(positiveNumberSchema, 0), + autoRenewAccountId: v.optional(hieroIdSchema, '0.0.0'), +}) + +export type TopicInfoOutput = v.InferOutput + diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 68b7f4803..5ea9faa2e 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -4,6 +4,7 @@ import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' import { configure, getLogger } from 'log4js' import * as v from 'valibot' import { BackendClient } from './client/backend/BackendClient' +import { HieroClient } from './client/hiero/HieroClient' import { getTransaction } from './client/GradidoNode/api' import { CONFIG } from './config' import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' @@ -38,6 +39,11 @@ async function main() { // wait for backend server await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) const homeCommunity = await backend.getHomeCommunityDraft() + // on missing topicId, create one + if (!homeCommunity.topicId) { + const topicId = await HieroClient.getInstance().createTopic() + + } KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.topicId) logger.info('home community topic: %s', homeCommunity.topicId) logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts index 8371153c2..4b8b32c34 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts @@ -7,7 +7,7 @@ import { import { getLogger } from 'log4js' import { safeParse, parse } from 'valibot' import { Community, communitySchema } from '../../client/backend/community.schema' -import { HieroClient } from '../../client/HieroClient' +import { HieroClient } from '../../client/hiero/HieroClient' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { Transaction, transactionSchema } from '../../schemas/transaction.schema' import { HieroId, HieroTransactionId, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' diff --git a/dlt-connector/yarn.lock b/dlt-connector/yarn.lock deleted file mode 100644 index f8d88875c..000000000 --- a/dlt-connector/yarn.lock +++ /dev/null @@ -1,1629 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@biomejs/biome@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.0.0.tgz#dc770781565640b9f884ad3d6d6383f64ca257c2" - integrity sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ== - optionalDependencies: - "@biomejs/cli-darwin-arm64" "2.0.0" - "@biomejs/cli-darwin-x64" "2.0.0" - "@biomejs/cli-linux-arm64" "2.0.0" - "@biomejs/cli-linux-arm64-musl" "2.0.0" - "@biomejs/cli-linux-x64" "2.0.0" - "@biomejs/cli-linux-x64-musl" "2.0.0" - "@biomejs/cli-win32-arm64" "2.0.0" - "@biomejs/cli-win32-x64" "2.0.0" - -"@biomejs/cli-darwin-arm64@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz#67135faa8bd52933fdaad09a160f9fc3a9defef3" - integrity sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw== - -"@biomejs/cli-darwin-x64@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz#49a7e064bad53e095d8a152b072adffcdeb4fb8e" - integrity sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw== - -"@biomejs/cli-linux-arm64-musl@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz#bfde27de8262a20e57e153f3807f47a01ccaeab3" - integrity sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA== - -"@biomejs/cli-linux-arm64@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz#c2404b3869c03a6fa5a8b979755bc6dfd5a5ec47" - integrity sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw== - -"@biomejs/cli-linux-x64-musl@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz#8ab214ac7e21a2af29435439145888c50f2bdd2f" - integrity sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA== - -"@biomejs/cli-linux-x64@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz#cbd172ead9e5bba8cd590d06e6e548445cf7ab2a" - integrity sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg== - -"@biomejs/cli-win32-arm64@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz#4677f4e034b3f4906e448b704f3314b38062a111" - integrity sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw== - -"@biomejs/cli-win32-x64@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz#f460a6950235c8f4bbd4cc405b210fec5cdb8ac9" - integrity sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg== - -"@ethersproject/abi@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" - integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== - dependencies: - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/hash" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/abstract-provider@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" - integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/networks" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/transactions" "^5.8.0" - "@ethersproject/web" "^5.8.0" - -"@ethersproject/abstract-signer@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" - integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== - dependencies: - "@ethersproject/abstract-provider" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - -"@ethersproject/address@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" - integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - -"@ethersproject/base64@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" - integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== - dependencies: - "@ethersproject/bytes" "^5.8.0" - -"@ethersproject/bignumber@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" - integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" - integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/constants@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" - integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== - dependencies: - "@ethersproject/bignumber" "^5.8.0" - -"@ethersproject/hash@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" - integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== - dependencies: - "@ethersproject/abstract-signer" "^5.8.0" - "@ethersproject/address" "^5.8.0" - "@ethersproject/base64" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@ethersproject/keccak256@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" - integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== - dependencies: - "@ethersproject/bytes" "^5.8.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" - integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== - -"@ethersproject/networks@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" - integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/properties@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" - integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== - dependencies: - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/rlp@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" - integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/signing-key@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" - integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - bn.js "^5.2.1" - elliptic "6.6.1" - hash.js "1.1.7" - -"@ethersproject/strings@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" - integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== - dependencies: - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - -"@ethersproject/transactions@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" - integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== - dependencies: - "@ethersproject/address" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/constants" "^5.8.0" - "@ethersproject/keccak256" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - "@ethersproject/signing-key" "^5.8.0" - -"@ethersproject/web@^5.8.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" - integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== - dependencies: - "@ethersproject/base64" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/logger" "^5.8.0" - "@ethersproject/properties" "^5.8.0" - "@ethersproject/strings" "^5.8.0" - -"@graphql-typed-document-node/core@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" - integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== - -"@grpc/grpc-js@^1.12.6": - version "1.13.4" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.4.tgz#922fbc496e229c5fa66802d2369bf181c1df1c5a" - integrity sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg== - dependencies: - "@grpc/proto-loader" "^0.7.13" - "@js-sdsl/ordered-map" "^4.4.2" - -"@grpc/proto-loader@^0.7.13": - version "0.7.15" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60" - integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== - dependencies: - lodash.camelcase "^4.3.0" - long "^5.0.0" - protobufjs "^7.2.5" - yargs "^17.7.2" - -"@hashgraph/cryptography@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@hashgraph/cryptography/-/cryptography-1.9.0.tgz#eda84887e5909a850b013575d87f8bdb9e9393f9" - integrity sha512-0UItolO1W/f8YIsGBrIxvjY+cSdvs4sEdzXOL49ThYEfPskJUprG3vhMhosRFoA4d0hxdJ7/glB7f7He8RW9xg== - dependencies: - "@noble/curves" "^1.8.1" - asn1js "^3.0.6" - bignumber.js "^9.1.1" - bn.js "^5.2.1" - buffer "^6.0.3" - crypto-js "^4.2.0" - forge-light "1.1.4" - js-base64 "^3.7.7" - react-native-get-random-values "^1.11.0" - spark-md5 "^3.0.2" - tweetnacl "^1.0.3" - utf8 "^3.0.0" - -"@hashgraph/proto@2.20.0": - version "2.20.0" - resolved "https://registry.yarnpkg.com/@hashgraph/proto/-/proto-2.20.0.tgz#4d1ef2c46b7cea8d0426163d5b145d20f7a627a8" - integrity sha512-XGIHRE9jr4wnnmCG8JeUD/nyeCiiYoUt35oRJz0QdCUwJYtbEsR6tPQxO90PxJJVDI5smT1c5i0f9wRRtFDhIA== - dependencies: - long "^5.2.3" - protobufjs "7.2.5" - -"@hashgraph/sdk@^2.70.0": - version "2.70.0" - resolved "https://registry.yarnpkg.com/@hashgraph/sdk/-/sdk-2.70.0.tgz#2dd8457e220f1babba0ccf91dc4085f275a2a7b6" - integrity sha512-naml5lWgewD3Dh8z0K7NRuKpbOpDaxpxwcLjtB9RFVmATMDU3IShSzxy24k5tUgY/0ZE7XXfCKgIpdT7TxGKqQ== - dependencies: - "@ethersproject/abi" "^5.8.0" - "@ethersproject/bignumber" "^5.8.0" - "@ethersproject/bytes" "^5.8.0" - "@ethersproject/rlp" "^5.8.0" - "@grpc/grpc-js" "^1.12.6" - "@hashgraph/cryptography" "1.9.0" - "@hashgraph/proto" "2.20.0" - bignumber.js "^9.1.1" - bn.js "^5.1.1" - crypto-js "^4.2.0" - js-base64 "^3.7.4" - long "^5.3.1" - pino "^9.6.0" - pino-pretty "^13.0.0" - protobufjs "7.2.5" - rfc4648 "^1.5.3" - utf8 "^3.0.0" - -"@js-sdsl/ordered-map@^4.4.2": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" - integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== - -"@noble/curves@^1.8.1": - version "1.9.7" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" - integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== - dependencies: - "@noble/hashes" "1.8.0" - -"@noble/hashes@1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" - integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== - -"@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" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== - -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== - dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" - -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== - -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== - -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== - -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== - -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== - -"@sinclair/typebox@^0.34.33": - version "0.34.39" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.39.tgz#41db8ed5ff33fdd47cb34dab250c0eaea7a1a5be" - integrity sha512-keEoFsevmLwAedzacnTVmra66GViRH3fhWO1M+nZ8rUgpPJyN4mcvqlGr3QMrQXx4L8KNwW0q9/BeHSEoO4teg== - -"@sinclair/typemap@^0.10.1": - version "0.10.1" - resolved "https://registry.yarnpkg.com/@sinclair/typemap/-/typemap-0.10.1.tgz#5d1e5267ec535275c8adce21ace364f5d9c86ff7" - integrity sha512-UXR0fhu/n3c9B6lB+SLI5t1eVpt9i9CdDrp2TajRe3LbKiUhCTZN2kSfJhjPnpc3I59jMRIhgew7+0HlMi08mg== - -"@types/bun@^1.2.17": - version "1.2.20" - resolved "https://registry.yarnpkg.com/@types/bun/-/bun-1.2.20.tgz#2b7339f063a5a27a4ef10fd7d0f21095b578eee5" - integrity sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA== - dependencies: - bun-types "1.2.20" - -"@types/node@*", "@types/node@>=13.7.0": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.0.tgz#89b09f45cb9a8ee69466f18ee5864e4c3eb84dec" - integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow== - dependencies: - undici-types "~7.10.0" - -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-styles@^4.0.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" - -"aproba@^1.0.3 || ^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.1.0.tgz#75500a190313d95c64e871e7e4284c6ac219f0b1" - integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew== - -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" - -asn1js@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.6.tgz#53e002ebe00c5f7fd77c1c047c3557d7c04dce25" - integrity sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA== - dependencies: - pvtsutils "^1.3.6" - pvutils "^1.1.3" - tslib "^2.8.1" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -atomic-sleep@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" - integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== - -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.11.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6" - integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.4" - proxy-from-env "^1.1.0" - -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.1.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" - integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== - -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: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bn.js@^4.11.9: - version "4.12.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" - integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== - -bn.js@^5.1.1, bn.js@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" - integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== - -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== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - 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" - -bun-types@1.2.20: - version "1.2.20" - resolved "https://registry.yarnpkg.com/bun-types/-/bun-types-1.2.20.tgz#7ff3a05b2183fbe33d51c76ac99ae83aaf882988" - integrity sha512-pxTnQYOrKvdOwyiyd/7sMt9yFOenN004Y6O4lCcCUoKVej48FS5cvTw9geRaEcB9TsDZaJKAxPTVvi8tFsVuXA== - dependencies: - "@types/node" "*" - -call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -chownr@^1.1.1: - version "1.1.4" - 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== - -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" - -cmake-js@^7.2.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/cmake-js/-/cmake-js-7.3.1.tgz#ed661eebd22a56d4743d7d2106a56fe50aa4355c" - integrity sha512-aJtHDrTFl8qovjSSqXT9aC2jdGfmP8JQsPtjdLAXFfH1BF4/ImZ27Jx0R61TFg8Apc3pl6e2yBKMveAeRXx2Rw== - dependencies: - axios "^1.6.5" - debug "^4" - fs-extra "^11.2.0" - 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" - -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== - -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== - -colorette@^2.0.7: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.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== - -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== - -cookie@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" - integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== - -crypto-js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" - integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== - -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== - -dateformat@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" - integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== - -debug@^4, debug@^4.3.3, debug@^4.3.4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -elliptic@6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - 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" - -elysia@1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/elysia/-/elysia-1.3.8.tgz#66bd20f578ce936b0b29180cdb6afc2ef186ad3d" - integrity sha512-kxYFhegJbUEf5otzmisEvGt3R7d/dPBNVERO2nHo0kFqKBHyj5slArc90mSRKLfi1vamMtPcz67rL6Zeg5F2yg== - dependencies: - cookie "^1.0.2" - exact-mirror "0.1.3" - fast-decode-uri-component "^1.0.1" - optionalDependencies: - "@sinclair/typebox" "^0.34.33" - openapi-types "^12.1.3" - -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== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -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, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.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== - -exact-mirror@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/exact-mirror/-/exact-mirror-0.1.3.tgz#62fef6056a9bd808bca01ecd38f342f92ea9bb08" - integrity sha512-yI62LpSby0ItzPJF05C4DRycVAoknRiCIDOLOCCs9zaEKylOXQtOFM3flX54S44swpRz584vk3P70yWQodsLlg== - -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" - -fast-base64-decode@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz#b434a0dd7d92b12b43f26819300d2dafb83ee418" - integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== - -fast-copy@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" - integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== - -fast-decode-uri-component@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" - integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== - -fast-redact@^3.1.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" - integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== - -fast-safe-stringify@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -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== - -flatted@^3.2.7: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -follow-redirects@^1.14.4, follow-redirects@^1.15.6: - version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== - -forge-light@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/forge-light/-/forge-light-1.1.4.tgz#765da0d54e19c6644f37e7e5b873e1305ce78d1e" - integrity sha512-Nr0xdu93LJawgBZVU/tC+A+4pbKqigdY5PRBz8CXNm4e5saAZIqU2Qe9+nVFtVO5TWCHSgvI0LaZZuatgE5J1g== - -form-data@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" - integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" - -fs-constants@^1.0.0: - version "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.3.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.1.tgz#ba7a1f97a85f94c6db2e52ff69570db3671d5a74" - integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g== - 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" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.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" - -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== - -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" - -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.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.6, graceful-fs@^4.2.0: - 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== - -"gradido-blockchain-js@git+https://github.com/gradido/gradido-blockchain-js": - version "0.0.1" - resolved "git+https://github.com/gradido/gradido-blockchain-js#9a5f392267bd313399b851e4dc6b5af7b959be3e" - 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#65d94455fab86b902c0d59bb9c06ac70470e56b2" - -graphql-request@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-7.2.0.tgz#af4aa25f27a087dd4fc93a4ff54a0f59c4487269" - integrity sha512-0GR7eQHBFYz372u9lxS16cOtEekFlZYB2qOyq8wDvzRmdRSJ0mgUVX1tzNcIzk3G+4NY+mGtSz411wZdeDF/+A== - dependencies: - "@graphql-typed-document-node/core" "^3.2.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -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" - -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== - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: - 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" - -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" - -help-me@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" - integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== - -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" - -ieee754@^1.1.13, 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== - -inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -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== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -jose@^5.2.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/jose/-/jose-5.10.0.tgz#c37346a099d6467c401351a9a0c2161e0f52c4be" - integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg== - -joycon@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" - integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== - -js-base64@^3.7.4, js-base64@^3.7.7: - version "3.7.8" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.8.tgz#af44496bc09fa178ed9c4adf67eb2b46f5c6d2a4" - integrity sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow== - -js-sha3@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" - integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== - dependencies: - universalify "^2.0.0" - 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" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -log4js@^6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.9.1.tgz#aba5a3ff4e7872ae34f8b4c533706753709e38b6" - integrity sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - flatted "^3.2.7" - rfdc "^1.3.0" - streamroller "^3.1.5" - -long@^5.0.0, long@^5.2.3, long@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" - integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -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" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -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== - -minimist@^1.2.0, minimist@^1.2.5, 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@^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== - -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== - -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== - -nan@^2.20.0: - version "2.23.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.23.0.tgz#24aa4ddffcc37613a2d2935b97683c1ec96093c6" - integrity sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ== - -node-abi@^3.3.0: - version "3.75.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.75.0.tgz#2f929a91a90a0d02b325c43731314802357ed764" - integrity sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg== - dependencies: - semver "^7.3.5" - -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.5.0" - resolved "https://registry.yarnpkg.com/node-api-headers/-/node-api-headers-1.5.0.tgz#73a0bab642c77e39b815b6d24ad4c6b56f695912" - integrity sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ== - -node-gyp-build@^4.8.1: - version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" - integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== - -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-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@^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" - -on-exit-leak-free@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" - integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== - -once@^1.3.1, once@^1.4.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" - -openapi-types@^12.1.3: - version "12.1.3" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" - integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== - -path-key@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -pino-abstract-transport@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60" - integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw== - dependencies: - split2 "^4.0.0" - -pino-pretty@^13.0.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-13.1.1.tgz#70130b9ff3737c8757f53e42d69e9f96835142b8" - integrity sha512-TNNEOg0eA0u+/WuqH0MH0Xui7uqVk9D74ESOpjtebSQYbNWJk/dIxCXIxFsNfeN53JmtWqYHP2OrIZjT/CBEnA== - dependencies: - colorette "^2.0.7" - dateformat "^4.6.3" - fast-copy "^3.0.2" - fast-safe-stringify "^2.1.1" - help-me "^5.0.0" - joycon "^3.1.1" - minimist "^1.2.6" - on-exit-leak-free "^2.1.0" - pino-abstract-transport "^2.0.0" - pump "^3.0.0" - secure-json-parse "^4.0.0" - sonic-boom "^4.0.1" - strip-json-comments "^5.0.2" - -pino-std-serializers@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" - integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== - -pino@^9.6.0: - version "9.9.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-9.9.0.tgz#0d2667ab4a54b561a4434a321ec595f305ab9cd1" - integrity sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ== - dependencies: - atomic-sleep "^1.0.0" - fast-redact "^3.1.1" - on-exit-leak-free "^2.1.0" - pino-abstract-transport "^2.0.0" - pino-std-serializers "^7.0.0" - process-warning "^5.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.2.0" - safe-stable-stringify "^2.3.1" - sonic-boom "^4.0.1" - thread-stream "^3.0.0" - -"prebuildify@git+https://github.com/einhornimmond/prebuildify#65d94455fab86b902c0d59bb9c06ac70470e56b2": - version "6.0.1" - resolved "git+https://github.com/einhornimmond/prebuildify#65d94455fab86b902c0d59bb9c06ac70470e56b2" - 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" - -process-warning@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-5.0.0.tgz#566e0bf79d1dff30a72d8bbbe9e8ecefe8d378d7" - integrity sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA== - -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" - -protobufjs@^7.2.5: - version "7.5.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" - integrity sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg== - 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-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== - -pump@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" - integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pvtsutils@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" - integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== - dependencies: - tslib "^2.8.1" - -pvutils@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" - integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== - -quick-format-unescaped@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" - integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-native-get-random-values@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/react-native-get-random-values/-/react-native-get-random-values-1.11.0.tgz#1ca70d1271f4b08af92958803b89dccbda78728d" - integrity sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ== - dependencies: - fast-base64-decode "^1.0.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== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -real-require@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" - integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== - -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== - -rfc4648@^1.5.3: - version "1.5.4" - resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.5.4.tgz#1174c0afba72423a0b70c386ecfeb80aa61b05ca" - integrity sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -safe-buffer@~5.2.0: - 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-stable-stringify@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" - integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== - -secure-json-parse@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-4.0.0.tgz#2ee1b7581be38ab348bab5a3e49280ba80a89c85" - integrity sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA== - -semver@^7.3.5, semver@^7.5.4: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -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== - -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== - -sonic-boom@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" - integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww== - dependencies: - atomic-sleep "^1.0.0" - -spark-md5@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc" - integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== - -split2@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -streamroller@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" - integrity sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - fs-extra "^8.1.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_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.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-json-comments@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.3.tgz#b7304249dd402ee67fd518ada993ab3593458bcf" - integrity sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -tar-fs@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.3.tgz#fb3b8843a26b6f13a08e606f7922875eb1fbbf92" - integrity sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - 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" - -thread-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1" - integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A== - dependencies: - real-require "^0.2.0" - -tslib@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -typescript@^5.8.3: - version "5.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== - -undici-types@~7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" - integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -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== - -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== - -utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -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== - -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== - -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== - -valibot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/valibot/-/valibot-1.1.0.tgz#873bb1af9e1577391690307bfe0520bd1360ec2d" - integrity sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw== - -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.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.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" - -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" - -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@^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@^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== - 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" From c06f82bf2947131a73a9caec9a260535fe6074c5 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 3 Sep 2025 15:02:36 +0200 Subject: [PATCH 29/72] auto create and update hiero topic --- .../src/client/backend/BackendClient.ts | 23 ++++++++++++++----- .../src/client/backend/community.schema.ts | 13 ++++++++++- dlt-connector/src/client/hiero/HieroClient.ts | 7 +++--- .../src/client/hiero/output.schema.ts | 19 ++------------- dlt-connector/src/config/const.ts | 2 ++ dlt-connector/src/index.ts | 22 +++++++++++++++--- 6 files changed, 56 insertions(+), 30 deletions(-) diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index 5e2bec24f..8545ec1f4 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -2,10 +2,16 @@ import { GraphQLClient } from 'graphql-request' import { SignJWT } from 'jose' import { CONFIG } from '../../config' -import { communitySchema, type Community, homeCommunityGraphqlQuery } from './community.schema' +import { + communitySchema, + type Community, + homeCommunityGraphqlQuery, + setHomeCommunityTopicId +} from './community.schema' import { getLogger, Logger } from 'log4js' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' +import { HieroId, Uuidv4 } from '../../schemas/typeGuard.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -53,9 +59,7 @@ export class BackendClient { public async getHomeCommunityDraft(): Promise { this.logger.info('check home community on backend') const { data, errors } = await this.client.rawRequest<{ homeCommunity: Community }>( - homeCommunityGraphqlQuery, - {}, // empty variables - await this.getRequestHeader(), + homeCommunityGraphqlQuery, {}, await this.getRequestHeader(), ) if (errors) { throw errors[0] @@ -63,8 +67,15 @@ export class BackendClient { return v.parse(communitySchema, data.homeCommunity) } - public async setHomeCommunityTopicId(topicId: HieroId) { - + public async setHomeCommunityTopicId(uuid: Uuidv4, hieroTopicId: HieroId): Promise { + this.logger.info('update home community on backend') + const { data, errors } = await this.client.rawRequest<{ updateHomeCommunity: Community }>( + setHomeCommunityTopicId, { uuid, hieroTopicId }, await this.getRequestHeader(), + ) + if (errors) { + throw errors[0] + } + return v.parse(communitySchema, data.updateHomeCommunity) } private async getRequestHeader(): Promise<{ diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts index 4c99f10b4..0222322a4 100644 --- a/dlt-connector/src/client/backend/community.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -12,7 +12,7 @@ import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' */ export const communitySchema = v.object({ uuid: uuidv4Schema, - topicId: v.optional(hieroIdSchema, ''), + topicId: v.nullish(hieroIdSchema), foreign: v.boolean('expect boolean type'), createdAt: dateSchema, }) @@ -31,3 +31,14 @@ export const homeCommunityGraphqlQuery = gql` } } ` + +export const setHomeCommunityTopicId = gql` + mutation ($uuid: string, $hieroTopicId: string){ + updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { + uuid + topicId + foreign + creationDate + } + } +` diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index 10fa23592..a058f1c72 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -85,9 +85,9 @@ export class HieroClient { return balance } - public async getTopicInfo(topicId: HieroTopicId): Promise { + public async getTopicInfo(topicId: HieroId): Promise { const info = await new TopicInfoQuery() - .setTopicId(new TopicId(topicId.getShardNum(), topicId.getRealmNum(), topicId.getTopicNum())) + .setTopicId(TopicId.fromString(topicId)) .execute(this.client) this.logger.debug(JSON.stringify(info, null, 2)) return parse(topicInfoSchema, { @@ -108,9 +108,10 @@ export class HieroClient { return parse(hieroIdSchema, createReceipt.topicId?.toString()) } - public async updateTopic(): Promise { + public async updateTopic(topicId: HieroId): Promise { let transaction = new TopicUpdateTransaction() transaction.setExpirationTime(new Date(new Date().getTime() + MIN_AUTORENEW_PERIOD * 1000)) + transaction.setTopicId(TopicId.fromString(topicId)) transaction = await transaction.freezeWithSigner(this.wallet) transaction = await transaction.signWithSigner(this.wallet) const updateResponse = await transaction.executeWithSigner(this.wallet) diff --git a/dlt-connector/src/client/hiero/output.schema.ts b/dlt-connector/src/client/hiero/output.schema.ts index 3f0218010..da1864aae 100644 --- a/dlt-connector/src/client/hiero/output.schema.ts +++ b/dlt-connector/src/client/hiero/output.schema.ts @@ -1,5 +1,6 @@ import * as v from 'valibot' import { hieroIdSchema } from '../../schemas/typeGuard.schema' +import { dateSchema } from '../../schemas/typeConverter.schema' // schema definitions for exporting data from hiero request as json back to caller /*export const dateStringSchema = v.pipe( @@ -7,28 +8,12 @@ import { hieroIdSchema } from '../../schemas/typeGuard.schema' v.transform(in: string | Date) )*/ -export const dateStringSchema = v.pipe( - v.union([v.string('expect valid date string'), v.instance(Date, 'expect Date object')]), - v.transform((input) => { - let date: Date - if (input instanceof Date) { - date = input - } else { - date = new Date(input) - } - if (isNaN(date.getTime())) { - throw new Error('invalid date') - } - return date.toISOString() - }), -) - export const positiveNumberSchema = v.pipe(v.number(), v.minValue(0)) export const topicInfoSchema = v.object({ topicId: hieroIdSchema, sequenceNumber: positiveNumberSchema, - expirationTime: dateStringSchema, + expirationTime: dateSchema, autoRenewPeriod: v.optional(positiveNumberSchema, 0), autoRenewAccountId: v.optional(hieroIdSchema, '0.0.0'), }) diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index 14b5cf215..91dd84707 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -1 +1,3 @@ export const LOG4JS_BASE_CATEGORY = 'dlt' +// 7 days +export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 \ No newline at end of file diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 5ea9faa2e..de0b07729 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -12,6 +12,7 @@ import { KeyPairCacheManager } from './KeyPairCacheManager' import { keyGenerationSeedSchema } from './schemas/base.schema' import { isPortOpenRetry } from './utils/network' import { appRoutes } from './server' +import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from './config/const' async function main() { // configure log4js @@ -36,13 +37,28 @@ async function main() { if (!backend) { throw new Error('cannot create backend client') } + const hieroClient = HieroClient.getInstance() + if (!hieroClient) { + throw new Error('cannot create hiero client') + } // wait for backend server await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) - const homeCommunity = await backend.getHomeCommunityDraft() + let homeCommunity = await backend.getHomeCommunityDraft() // on missing topicId, create one if (!homeCommunity.topicId) { - const topicId = await HieroClient.getInstance().createTopic() - + const topicId = await hieroClient.createTopic() + homeCommunity = await backend.setHomeCommunityTopicId(homeCommunity.uuid, topicId) + } else { + // if topic exist, check if we need to update it + let topicInfo = await hieroClient.getTopicInfo(homeCommunity.topicId) + if (topicInfo.expirationTime.getTime() - new Date().getTime() < MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE) { + await hieroClient.updateTopic(homeCommunity.topicId) + topicInfo = await hieroClient.getTopicInfo(homeCommunity.topicId) + logger.info('updated topic info, new expiration time: %s', topicInfo.expirationTime.toLocaleDateString()) + } + } + if (!homeCommunity.topicId) { + throw new Error('still no topic id, after creating topic and update community in backend.') } KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.topicId) logger.info('home community topic: %s', homeCommunity.topicId) From 18879cf207937feb346daacde958ab1929165928 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 6 Sep 2025 12:53:51 +0200 Subject: [PATCH 30/72] change for hiero --- .../apis/dltConnector/DltConnectorClient.ts | 4 +- .../AbstractTransactionToDlt.role.ts | 15 +- .../TransactionLinkDeleteToDlt.role.ts | 3 +- .../transactionToDlt/TransactionToDlt.role.ts | 3 +- .../transactionToDlt/UserToDlt.role.ts | 3 +- .../transactionToDlt.context.ts | 16 +- .../sendTransactionsToDltConnector.ts | 11 +- backend/src/auth/DLT_CONNECTOR_RIGHTS.ts | 2 +- dlt-connector/bun.lock | 34 +- dlt-connector/log4js-config.json | 2 +- .../client/GradidoNode/GradidoNodeClient.ts | 251 +++++++++++++ dlt-connector/src/client/GradidoNode/api.ts | 182 ---------- .../client/GradidoNode/input.schema.test.ts | 60 ++++ .../src/client/GradidoNode/input.schema.ts | 4 +- .../src/client/GradidoNode/jsonrpc.ts | 60 ---- .../src/client/backend/BackendClient.ts | 33 +- .../client/backend/community.schema.test.ts | 11 +- .../src/client/backend/community.schema.ts | 16 +- dlt-connector/src/client/hiero/HieroClient.ts | 20 +- .../src/client/hiero/output.schema.ts | 15 +- dlt-connector/src/config/const.ts | 2 +- dlt-connector/src/config/index.ts | 71 +--- dlt-connector/src/config/schema.ts | 91 ++++- .../src/data/KeyPairIdentifier.logic.ts | 4 +- dlt-connector/src/errors.ts | 14 + dlt-connector/src/index.ts | 122 ++++--- .../keyPairCalculation/AccountKeyPair.role.ts | 10 +- .../ForeignCommunityKeyPair.role.ts | 13 +- .../HomeCommunityKeyPair.role.ts | 13 +- .../RemoteAccountKeyPair.role.ts | 5 +- .../keyPairCalculation/UserKeyPair.role.ts | 15 +- .../AbstractTransaction.role.ts | 0 .../CommunityRootTransaction.role.ts | 23 +- .../CreationTransaction.role.ts | 0 .../DeferredTransferTransaction.role.ts | 0 .../RedeemDeferredTransferTransaction.role.ts | 4 +- .../RegisterAddressTransaction.role.ts | 4 +- .../SendToHiero.context.ts} | 39 +- .../TransferTransaction.role.ts | 12 +- .../src/schemas/transaction.schema.test.ts | 333 ++++++++---------- .../src/schemas/transaction.schema.ts | 14 + .../src/schemas/typeConverter.schema.test.ts | 4 +- .../src/schemas/typeConverter.schema.ts | 3 +- dlt-connector/src/server/index.ts | 65 ++-- dlt-connector/src/utils/typeConverter.ts | 28 +- 45 files changed, 865 insertions(+), 769 deletions(-) create mode 100644 dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts delete mode 100644 dlt-connector/src/client/GradidoNode/api.ts create mode 100644 dlt-connector/src/client/GradidoNode/input.schema.test.ts delete mode 100644 dlt-connector/src/client/GradidoNode/jsonrpc.ts rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/AbstractTransaction.role.ts (100%) rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/CommunityRootTransaction.role.ts (68%) rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/CreationTransaction.role.ts (100%) rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/DeferredTransferTransaction.role.ts (100%) rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/RedeemDeferredTransferTransaction.role.ts (95%) rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/RegisterAddressTransaction.role.ts (94%) rename dlt-connector/src/interactions/{sendToIota/SendToIota.context.ts => sendToHiero/SendToHiero.context.ts} (83%) rename dlt-connector/src/interactions/{sendToIota => sendToHiero}/TransferTransaction.role.ts (90%) diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 2533e7509..4fef742ed 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -1,11 +1,11 @@ -import { GraphQLClient, gql } from 'graphql-request' - import { CONFIG } from '@/config' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' import { getLogger } from 'log4js' import { TransactionDraft } from './model/TransactionDraft' import { TransactionResult } from './model/TransactionResult' +import { GraphQLClient } from 'graphql-request' +import { gql } from 'graphql-request' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector`) diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts index ac77f4195..5e756fb7d 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts @@ -1,10 +1,10 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from '@dbTools/typeorm' -import { DltTransaction } from '@entity/DltTransaction' +import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from 'typeorm' +import { DltTransaction } from 'database' import { TransactionDraft } from '@dltConnector/model/TransactionDraft' - -import { backendLogger as logger } from '@/server/logger' +import { getLogger, Logger } from 'log4js' +import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' export abstract class AbstractTransactionToDltRole { protected self: T | null @@ -14,6 +14,9 @@ export abstract class AbstractTransactionToDltRole { public abstract getTimestamp(): number public abstract convertToGraphqlInput(): TransactionDraft + + public constructor(protected logger: Logger) {} + public getEntity(): T | null { return this.self } @@ -25,11 +28,11 @@ export abstract class AbstractTransactionToDltRole { this.setJoinIdAndType(dltTransaction) await DltTransaction.save(dltTransaction) if (dltTransaction.error) { - logger.error( + this.logger.error( `Store dltTransaction with error: id=${dltTransaction.id}, error=${dltTransaction.error}`, ) } else { - logger.info( + this.logger.info( `Store dltTransaction: messageId=${dltTransaction.messageId}, id=${dltTransaction.id}`, ) } diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts index b761b71c6..b8eaa633a 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts @@ -1,5 +1,4 @@ -import { DltTransaction } from '@entity/DltTransaction' -import { TransactionLink } from '@entity/TransactionLink' +import { DltTransaction, TransactionLink } from 'database' import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' import { TransactionType } from '@dltConnector/enum/TransactionType' diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts index de96d38cc..9e078e874 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts @@ -1,5 +1,4 @@ -import { DltTransaction } from '@entity/DltTransaction' -import { Transaction } from '@entity/Transaction' +import { DltTransaction, Transaction } from 'database' import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' import { TransactionType } from '@dltConnector/enum/TransactionType' diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts index 6319880fe..94b95ccdd 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts @@ -1,5 +1,4 @@ -import { DltTransaction } from '@entity/DltTransaction' -import { User } from '@entity/User' +import { DltTransaction, User } from 'database' import { AccountType } from '@dltConnector/enum/AccountType' import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts index febb3b5ae..b03bd5300 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts @@ -1,16 +1,15 @@ -import { Transaction } from '@entity/Transaction' -import { TransactionLink } from '@entity/TransactionLink' -import { User } from '@entity/User' +import { Transaction, TransactionLink, User } from 'database' 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 { TransactionLinkDeleteToDltRole } from './TransactionLinkDeleteToDlt.role' import { TransactionLinkToDltRole } from './TransactionLinkToDlt.role' import { TransactionToDltRole } from './TransactionToDlt.role' import { UserToDltRole } from './UserToDlt.role' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' /** * @DCI-Context @@ -20,12 +19,13 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis async function findNextPendingTransaction(): Promise< AbstractTransactionToDltRole > { + const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}/apis/dltConnector/interaction/transactionToDlt`) // 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(), - new TransactionLinkDeleteToDltRole().initWithLast(), + new TransactionToDltRole(logger).initWithLast(), + new UserToDltRole(logger).initWithLast(), + new TransactionLinkToDltRole(logger).initWithLast(), + new TransactionLinkDeleteToDltRole(logger).initWithLast(), ]) // sort array to get oldest at first place diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts index 73dd6cbab..3b0bfbc27 100644 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts @@ -1,7 +1,6 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { CONFIG } from '@/config' -import { backendLogger as logger } from '@/server/logger' -import { TypeORMError } from '@dbTools/typeorm' +import { TypeORMError } from 'typeorm' // eslint-disable-next-line import/named, n/no-extraneous-import import { FetchError } from 'node-fetch' @@ -14,6 +13,10 @@ import { } from '@/util/InterruptiveSleepManager' import { transactionToDlt } from './interaction/transactionToDlt/transactionToDlt.context' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}/apis/dltConnector/sendTransactionsToDltConnector`) let isLoopRunning = true @@ -25,11 +28,11 @@ export async function sendTransactionsToDltConnector(): Promise { const dltConnector = DltConnectorClient.getInstance() if (!dltConnector) { - logger.info('Sending to DltConnector currently not configured...') + logger.info('currently not configured...') isLoopRunning = false return } - logger.info('Starting sendTransactionsToDltConnector task') + logger.info('task started') // define outside of loop for reuse and reducing gb collection // const queries = getFindNextPendingTransactionQueries() diff --git a/backend/src/auth/DLT_CONNECTOR_RIGHTS.ts b/backend/src/auth/DLT_CONNECTOR_RIGHTS.ts index 399b7c2d4..e7cdc3806 100644 --- a/backend/src/auth/DLT_CONNECTOR_RIGHTS.ts +++ b/backend/src/auth/DLT_CONNECTOR_RIGHTS.ts @@ -1,3 +1,3 @@ import { RIGHTS } from './RIGHTS' -export const DLT_CONNECTOR_RIGHTS = [RIGHTS.COMMUNITY_BY_IDENTIFIER, RIGHTS.HOME_COMMUNITY] +export const DLT_CONNECTOR_RIGHTS = [RIGHTS.COMMUNITY_BY_IDENTIFIER, RIGHTS.HOME_COMMUNITY, RIGHTS.COMMUNITY_UPDATE] diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index b300ad89a..05852adda 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -25,13 +25,11 @@ }, }, "packages": { - "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], - "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + "@babel/compat-data": ["@babel/compat-data@7.28.4", "", {}, "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw=="], - "@babel/core": ["@babel/core@7.28.3", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.3", "@babel/types": "^7.28.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" } }, "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ=="], + "@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], @@ -51,9 +49,9 @@ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.28.3", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.2" } }, "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw=="], + "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], - "@babel/parser": ["@babel/parser@7.28.3", "", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], @@ -85,15 +83,15 @@ "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], - "@babel/runtime": ["@babel/runtime@7.28.3", "", {}, "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA=="], + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + "@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], - "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.28.3", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", "@babel/types": "^7.28.2", "debug": "^4.3.1" } }, "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ=="], + "@babel/traverse--for-generate-function-map": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], - "@babel/types": ["@babel/types@7.28.2", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" }, "bin": { "biome": "bin/biome" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], @@ -183,6 +181,8 @@ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], @@ -265,7 +265,7 @@ "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], - "@types/node": ["@types/node@24.3.0", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow=="], + "@types/node": ["@types/node@24.3.1", "", { "dependencies": { "undici-types": "~7.10.0" } }, "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g=="], "@types/react": ["@types/react@19.1.12", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w=="], @@ -359,7 +359,7 @@ "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001739", "", {}, "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001741", "", {}, "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -425,7 +425,7 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "electron-to-chromium": ["electron-to-chromium@1.5.213", "", {}, "sha512-xr9eRzSLNa4neDO0xVFrkXu3vyIzG4Ay08dApecw42Z1NbmCt+keEpXdvlYGVe0wtvY5dhW0Ay0lY0IOfsCg0Q=="], + "electron-to-chromium": ["electron-to-chromium@1.5.214", "", {}, "sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q=="], "elliptic": ["elliptic@6.6.1", "", { "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" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], @@ -535,7 +535,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#eccade8", { "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#65d94455fab86b902c0d59bb9c06ac70470e56b2" } }, "gradido-gradido-blockchain-js-eccade8"], + "gradido-blockchain-js": ["gradido-blockchain-js@github:gradido/gradido-blockchain-js#f1c4bbc", { "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#65d94455fab86b902c0d59bb9c06ac70470e56b2" } }, "gradido-gradido-blockchain-js-f1c4bbc"], "graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], @@ -729,7 +729,7 @@ "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "node-abi": ["node-abi@3.75.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg=="], + "node-abi": ["node-abi@3.77.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ=="], "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], @@ -739,7 +739,7 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + "node-releases": ["node-releases@2.0.20", "", {}, "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -785,7 +785,7 @@ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "pino": ["pino@9.9.1", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-40SszWPOPwGhUIJ3zj0PsbMNV1bfg8nw5Qp/tP2FE2p3EuycmhDeYimKOMBAu6rtxcSw2QpjJsuK5A6v+en8Yw=="], + "pino": ["pino@9.9.4", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-d1XorUQ7sSKqVcYdXuEYs2h1LKxejSorMEJ76XoZ0pPDf8VzJMe7GlPXpMBZeQ9gE4ZPIp5uGD+5Nw7scxiigg=="], "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], diff --git a/dlt-connector/log4js-config.json b/dlt-connector/log4js-config.json index 6d96cd326..a6a33686b 100644 --- a/dlt-connector/log4js-config.json +++ b/dlt-connector/log4js-config.json @@ -8,7 +8,7 @@ "pattern": "yyyy-MM-dd", "layout": { - "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{url}] [%f : %l] - %m" + "type": "pattern", "pattern": "%d{ISO8601} %p %c [%f : %l] - %m" }, "compress": true, "keepFileExt" : true, diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts new file mode 100644 index 000000000..69609657e --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -0,0 +1,251 @@ +import { ConfirmedTransaction } from 'gradido-blockchain-js' +import JsonRpcClient from 'jsonrpc-ts-client' +import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' +import { getLogger, Logger } from 'log4js' +import { parse } from 'valibot' +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { Uuidv4Hash } from '../../data/Uuidv4Hash' +import { AddressType } from '../../enum/AddressType' +import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' +import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' +import { Hex32, Hex32Input, HieroId, hex32Schema } from '../../schemas/typeGuard.schema' +import { isPortOpenRetry } from '../../utils/network' +import { + TransactionIdentifierInput, + TransactionsRangeInput, + transactionIdentifierSchema, + transactionsRangeSchema, +} from './input.schema' + +export class GradidoNodeRequestError extends Error { + private response?: JsonRpcEitherResponse + constructor(message: string, response?: JsonRpcEitherResponse) { + super(message) + this.name = 'GradidoNodeRequestError' + this.response = response + } + getResponse(): JsonRpcEitherResponse | undefined { + return this.response + } +} + +type WithTimeUsed = T & { timeUsed?: string } + +export class GradidoNodeClient { + private static instance: GradidoNodeClient + client: JsonRpcClient + logger: Logger + + private constructor() { + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNodeClient`) + this.client = new JsonRpcClient({ + url: CONFIG.NODE_SERVER_URL, + }) + } + public static getInstance(): GradidoNodeClient { + if (!GradidoNodeClient.instance) { + GradidoNodeClient.instance = new GradidoNodeClient() + } + return GradidoNodeClient.instance + } + + /** + * getTransaction + * get a specific confirmed transaction from a specific community + * @param transactionIdentifier + * @returns the confirmed transaction or undefined if transaction is not found + * @throws GradidoNodeRequestError + */ + public async getTransaction( + transactionIdentifier: TransactionIdentifierInput, + ): Promise { + const parameter = { + ...parse(transactionIdentifierSchema, transactionIdentifier), + format: 'base64', + } + const response = await this.rpcCall<{ transaction: string }>('gettransaction', parameter) + if (response.isSuccess()) { + this.logger.debug('result: ', response.result.transaction) + return parse(confirmedTransactionSchema, response.result.transaction) + } + if (response.isError()) { + if (response.error.code === GradidoNodeErrorCodes.TRANSACTION_NOT_FOUND) { + return undefined + } + } + throw new GradidoNodeRequestError(response.error.message, response) + } + + /** + * getLastTransaction + * get the last confirmed transaction from a specific community + * @param hieroTopic the community hiero topic id + * @returns the last confirmed transaction or undefined if blockchain for community is empty or not found + * @throws GradidoNodeRequestError + */ + + public async getLastTransaction(hieroTopic: HieroId): Promise { + const parameter = { + format: 'base64', + topic: hieroTopic, + } + const response = await this.rpcCall<{ transaction: string }>('getlasttransaction', parameter) + if (response.isSuccess()) { + return parse(confirmedTransactionSchema, response.result.transaction) + } + if (response.isError()) { + if (response.error.code === GradidoNodeErrorCodes.GRADIDO_NODE_ERROR) { + return undefined + } + } + throw new GradidoNodeRequestError(response.error.message, response) + } + + /** + * getTransactions + * get list of confirmed transactions from a specific community + * @param input fromTransactionId is the id of the first transaction to return + * @param input maxResultCount is the max number of transactions to return + * @param input topic is the community hiero topic id + * @returns list of confirmed transactions + * @throws GradidoNodeRequestError + * @example + * ``` + * const transactions = await getTransactions({ + * fromTransactionId: 1, + * maxResultCount: 100, + * topic: communityUuid, + * }) + * ``` + */ + public async getTransactions(input: TransactionsRangeInput): Promise { + const parameter = { + ...parse(transactionsRangeSchema, input), + format: 'base64', + } + const result = await this.rpcCallResolved<{ transactions: string[] }>( + 'getTransactions', + parameter, + ) + return result.transactions.map((transactionBase64) => + parse(confirmedTransactionSchema, transactionBase64), + ) + } + + /** + * getTransactionsForAccount + * get list of confirmed transactions for a specific account + * @param transactionRange the range of transactions to return + * @param pubkey the public key of the account + * @returns list of confirmed transactions + * @throws GradidoNodeRequestError + */ + public async getTransactionsForAccount( + transactionRange: TransactionsRangeInput, + pubkey: Hex32Input, + ): Promise { + const parameter = { + ...parse(transactionsRangeSchema, transactionRange), + pubkey: parse(hex32Schema, pubkey), + format: 'base64', + } + const response = await this.rpcCallResolved<{ transactions: string[] }>( + 'listtransactionsforaddress', + parameter, + ) + return response.transactions.map((transactionBase64) => + parse(confirmedTransactionSchema, transactionBase64), + ) + } + + /** + * getAddressType + * get the address type of a specific user + * can be used to check if user/account exists on blockchain + * look also for gmw, auf and deferred transfer accounts + * @param pubkey the public key of the user or account + * @param hieroTopic the community hiero topic id + * @returns the address type of the user/account, AddressType.NONE if not found + * @throws GradidoNodeRequestError + */ + + public async getAddressType(pubkey: Hex32Input, hieroTopic: HieroId): Promise { + const parameter = { + pubkey: parse(hex32Schema, pubkey), + topic: hieroTopic, + } + const response = await this.rpcCallResolved<{ addressType: string }>( + 'getaddresstype', + parameter, + ) + return parse(addressTypeSchema, response.addressType) + } + + /** + * findUserByNameHash + * find a user by name hash + * @param nameHash the name hash of the user + * @param hieroTopic the community hiero topic id + * @returns the public key of the user as hex32 string or undefined if user is not found + * @throws GradidoNodeRequestError + */ + public async findUserByNameHash( + nameHash: Uuidv4Hash, + hieroTopic: HieroId, + ): Promise { + const parameter = { + nameHash: nameHash.getAsHexString(), + topic: hieroTopic, + } + const response = await this.rpcCall<{ pubkey: string; timeUsed: string }>( + 'findUserByNameHash', + parameter, + ) + if (response.isSuccess()) { + this.logger.info(`call findUserByNameHash, used ${response.result.timeUsed}`) + return parse(hex32Schema, response.result.pubkey) + } + if ( + response.isError() && + response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND + ) { + this.logger.debug(`call findUserByNameHash, return with error: ${response.error.message}`) + } + return undefined + } + + // ---------------- intern helper functions ----------------------------------- + + // return result on success or throw error + protected resolveResponse( + response: JsonRpcEitherResponse, + onSuccess: (result: T) => R, + ): R { + if (response.isSuccess()) { + return onSuccess(response.result) + } else if (response.isError()) { + throw new GradidoNodeRequestError(response.error.message, response) + } + throw new GradidoNodeRequestError('no success and no error') + } + + // template rpcCall, check first if port is open before executing json rpc 2.0 request + protected async rpcCall(method: string, parameter: any): Promise> { + this.logger.debug('call %s with %s', method, parameter) + await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + return this.client.exec(method, parameter) + } + + // template rpcCall, check first if port is open before executing json rpc 2.0 request, + // throw error on failure, return result on success + protected async rpcCallResolved(method: string, parameter: any): Promise { + const response = await this.rpcCall>(method, parameter) + return this.resolveResponse(response, (result: WithTimeUsed) => { + if (result.timeUsed) { + this.logger.info(`call %s, used ${result.timeUsed}`, method) + } + return result as T + }) + } +} diff --git a/dlt-connector/src/client/GradidoNode/api.ts b/dlt-connector/src/client/GradidoNode/api.ts deleted file mode 100644 index 383f1c3f4..000000000 --- a/dlt-connector/src/client/GradidoNode/api.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' -import { getLogger } from 'log4js' -import * as v from 'valibot' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { Uuidv4Hash } from '../../data/Uuidv4Hash' -import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' -import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' -import { Hex32, Hex32Input, HieroId, hex32Schema } from '../../schemas/typeGuard.schema' -import { - TransactionIdentifierInput, - TransactionsRangeInput, - transactionIdentifierSchema, - transactionsRangeSchema, -} from './input.schema' -import { GradidoNodeRequestError, rpcCall, rpcCallResolved } from './jsonrpc' - -const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) - -/** - * getTransactions - * get list of confirmed transactions from a specific community - * @param input fromTransactionId is the id of the first transaction to return - * @param input maxResultCount is the max number of transactions to return - * @param input topic is the community hiero topic id - * @returns list of confirmed transactions - * @throws GradidoNodeRequestError - * @example - * ``` - * const transactions = await getTransactions({ - * fromTransactionId: 1, - * maxResultCount: 100, - * topic: communityUuid, - * }) - * ``` - */ -async function getTransactions(input: TransactionsRangeInput): Promise { - const parameter = { ...v.parse(transactionsRangeSchema, input), format: 'base64' } - const result = await rpcCallResolved<{ transactions: string[] }>('getTransactions', parameter) - return result.transactions.map((transactionBase64) => - v.parse(confirmedTransactionSchema, transactionBase64), - ) -} - -/** - * getTransaction - * get a specific confirmed transaction from a specific community - * @param transactionIdentifier - * @returns the confirmed transaction or undefined if transaction is not found - * @throws GradidoNodeRequestError - */ -async function getTransaction( - transactionIdentifier: TransactionIdentifierInput, -): Promise { - const parameter = { - ...v.parse(transactionIdentifierSchema, transactionIdentifier), - format: 'base64', - } - const response = await rpcCall<{ transaction: string }>('gettransaction', parameter) - if (response.isSuccess()) { - return v.parse(confirmedTransactionSchema, response.result.transaction) - } - if (response.isError()) { - if (response.error.code === GradidoNodeErrorCodes.TRANSACTION_NOT_FOUND) { - return undefined - } - } - throw new GradidoNodeRequestError(response.error.message, response) -} - -/** - * getLastTransaction - * get the last confirmed transaction from a specific community - * @param iotaTopic the community topic - * @returns the last confirmed transaction or undefined if blockchain for community is empty or not found - * @throws GradidoNodeRequestError - */ - -async function getLastTransaction( - iotaTopic: Uuidv4Hash, -): Promise { - const response = await rpcCall<{ transaction: string }>('getlasttransaction', { - format: 'base64', - topic: iotaTopic.getAsHexString(), - }) - if (response.isSuccess()) { - return v.parse(confirmedTransactionSchema, response.result.transaction) - } - if (response.isError()) { - if (response.error.code === GradidoNodeErrorCodes.GRADIDO_NODE_ERROR) { - return undefined - } - throw new GradidoNodeRequestError(response.error.message, response) - } -} - -/** - * getAddressType - * get the address type of a specific user - * can be used to check if user/account exists on blockchain - * look also for gmw, auf and deferred transfer accounts - * @param pubkey the public key of the user or account - * @param iotaTopic the community topic - * @returns the address type of the user/account or undefined - * @throws GradidoNodeRequestError - */ - -async function getAddressType(pubkey: Hex32Input, hieroTopic: HieroId): Promise { - const parameter = { - pubkey: v.parse(hex32Schema, pubkey), - communityId: hieroTopic, - } - const response = await rpcCallResolved<{ addressType: string }>('getaddresstype', parameter) - return v.parse(addressTypeSchema, response.addressType) -} - -/** - * findUserByNameHash - * find a user by name hash - * @param nameHash the name hash of the user - * @param iotaTopic the community topic - * @returns the public key of the user as hex32 string or undefined if user is not found - * @throws GradidoNodeRequestError - */ -async function findUserByNameHash( - nameHash: Uuidv4Hash, - hieroTopic: HieroId, -): Promise { - const parameter = { - nameHash: nameHash.getAsHexString(), - communityId: hieroTopic, - } - const response = await rpcCall<{ pubkey: string; timeUsed: string }>( - 'findUserByNameHash', - parameter, - ) - if (response.isSuccess()) { - logger.info(`call findUserByNameHash, used ${response.result.timeUsed}`) - return v.parse(hex32Schema, response.result.pubkey) - } - if ( - response.isError() && - response.error.code === GradidoNodeErrorCodes.JSON_RPC_ERROR_ADDRESS_NOT_FOUND - ) { - logger.debug(`call findUserByNameHash, return with error: ${response.error.message}`) - } - return undefined -} - -/** - * getTransactionsForAccount - * get list of confirmed transactions for a specific account - * @param transactionRange the range of transactions to return - * @param pubkey the public key of the account - * @returns list of confirmed transactions - * @throws GradidoNodeRequestError - */ -async function getTransactionsForAccount( - transactionRange: TransactionsRangeInput, - pubkey: Hex32Input, -): Promise { - const parameter = { - ...v.parse(transactionsRangeSchema, transactionRange), - pubkey: v.parse(hex32Schema, pubkey), - format: 'base64', - } - const response = await rpcCallResolved<{ transactions: string[] }>( - 'listtransactionsforaddress', - parameter, - ) - return response.transactions.map((transactionBase64) => - v.parse(confirmedTransactionSchema, transactionBase64), - ) -} - -export { - getTransaction, - getLastTransaction, - getTransactions, - getAddressType, - getTransactionsForAccount, - findUserByNameHash, -} diff --git a/dlt-connector/src/client/GradidoNode/input.schema.test.ts b/dlt-connector/src/client/GradidoNode/input.schema.test.ts new file mode 100644 index 000000000..1268290fc --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/input.schema.test.ts @@ -0,0 +1,60 @@ +import { beforeAll, describe, expect, it } from 'bun:test' +import { parse } from 'valibot' +import { + HieroId, + HieroTransactionId, + hieroIdSchema, + hieroTransactionIdSchema, +} from '../../schemas/typeGuard.schema' +import { transactionIdentifierSchema } from './input.schema' + +let topic: HieroId +const topicString = '0.0.261' +let hieroTransactionId: HieroTransactionId +beforeAll(() => { + topic = parse(hieroIdSchema, topicString) + hieroTransactionId = parse(hieroTransactionIdSchema, '0.0.261-1755348116-1281621') +}) + +describe('transactionIdentifierSchema ', () => { + it('valid, transaction identified by transactionNr and topic', () => { + expect( + parse(transactionIdentifierSchema, { + transactionId: 1, + topic: topicString, + }), + ).toEqual({ + transactionId: 1, + hieroTransactionId: undefined, + topic, + }) + }) + it('valid, transaction identified by hieroTransactionId and topic', () => { + expect( + parse(transactionIdentifierSchema, { + hieroTransactionId: '0.0.261-1755348116-1281621', + topic: topicString, + }), + ).toEqual({ + hieroTransactionId, + topic, + }) + }) + it('invalid, missing topic', () => { + expect(() => + parse(transactionIdentifierSchema, { + transactionId: 1, + hieroTransactionId: '0.0.261-1755348116-1281621', + }), + ).toThrowError(new Error('Invalid key: Expected "topic" but received undefined')) + }) + it('invalid, transactionNr and iotaMessageId set', () => { + expect(() => + parse(transactionIdentifierSchema, { + transactionId: 1, + hieroTransactionId: '0.0.261-1755348116-1281621', + topic, + }), + ).toThrowError(new Error('expect transactionNr or hieroTransactionId not both')) + }) +}) diff --git a/dlt-connector/src/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts index 218805c3f..baa075baf 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -14,7 +14,7 @@ export type TransactionsRangeInput = v.InferInput= 1')), undefined, ), @@ -23,7 +23,7 @@ export const transactionIdentifierSchema = v.pipe( }), v.custom((value: any) => { const setFieldsCount = - Number(value.transactionNr !== undefined) + Number(value.hieroTransactionId !== undefined) + Number(value.transactionId !== undefined) + Number(value.hieroTransactionId !== undefined) if (setFieldsCount !== 1) { return false } diff --git a/dlt-connector/src/client/GradidoNode/jsonrpc.ts b/dlt-connector/src/client/GradidoNode/jsonrpc.ts deleted file mode 100644 index b93ff65f0..000000000 --- a/dlt-connector/src/client/GradidoNode/jsonrpc.ts +++ /dev/null @@ -1,60 +0,0 @@ -import JsonRpcClient from 'jsonrpc-ts-client' -import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' -import { getLogger } from 'log4js' -import { CONFIG } from '../../config' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { isPortOpenRetry } from '../../utils/network' - -const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode`) - -export const client = new JsonRpcClient({ - url: CONFIG.NODE_SERVER_URL, -}) - -export class GradidoNodeRequestError extends Error { - private response?: JsonRpcEitherResponse - constructor(message: string, response?: JsonRpcEitherResponse) { - super(message) - this.name = 'GradidoNodeRequestError' - this.response = response - } - getResponse(): JsonRpcEitherResponse | undefined { - return this.response - } -} - -// return result on success or throw error -export function resolveResponse( - response: JsonRpcEitherResponse, - onSuccess: (result: T) => R, -): R { - if (response.isSuccess()) { - return onSuccess(response.result) - } else if (response.isError()) { - throw new GradidoNodeRequestError(response.error.message, response) - } - throw new GradidoNodeRequestError('no success and no error') -} - -type WithTimeUsed = T & { timeUsed?: string } - -// template rpcCall, check first if port is open before executing json rpc 2.0 request -export async function rpcCall( - method: string, - parameter: any, -): Promise> { - logger.debug('call %s with %s', method, parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) - return client.exec(method, parameter) -} - -// template rpcCall, check first if port is open before executing json rpc 2.0 request, throw error on failure, return result on success -export async function rpcCallResolved(method: string, parameter: any): Promise { - const response = await rpcCall>(method, parameter) - return resolveResponse(response, (result: WithTimeUsed) => { - if (result.timeUsed) { - logger.info(`call %s, used ${result.timeUsed}`, method) - } - return result as T - }) -} diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index 8545ec1f4..2d587a4d8 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -1,17 +1,16 @@ import { GraphQLClient } from 'graphql-request' import { SignJWT } from 'jose' - -import { CONFIG } from '../../config' -import { - communitySchema, - type Community, - homeCommunityGraphqlQuery, - setHomeCommunityTopicId -} from './community.schema' import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from '../../config/const' import * as v from 'valibot' +import { CONFIG } from '../../config' +import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId, Uuidv4 } from '../../schemas/typeGuard.schema' +import { + type Community, + communitySchema, + homeCommunityGraphqlQuery, + setHomeCommunityTopicId, +} from './community.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts @@ -22,7 +21,7 @@ import { HieroId, Uuidv4 } from '../../schemas/typeGuard.schema' export class BackendClient { private static instance: BackendClient client: GraphQLClient - logger: Logger + logger: Logger /** * The Singleton's constructor should always be private to prevent direct @@ -49,17 +48,19 @@ export class BackendClient { * This implementation let you subclass the Singleton class while keeping * just one instance of each subclass around. */ - public static getInstance(): BackendClient | undefined { + public static getInstance(): BackendClient { if (!BackendClient.instance) { BackendClient.instance = new BackendClient() - } + } return BackendClient.instance } public async getHomeCommunityDraft(): Promise { this.logger.info('check home community on backend') const { data, errors } = await this.client.rawRequest<{ homeCommunity: Community }>( - homeCommunityGraphqlQuery, {}, await this.getRequestHeader(), + homeCommunityGraphqlQuery, + {}, + await this.getRequestHeader(), ) if (errors) { throw errors[0] @@ -70,11 +71,13 @@ export class BackendClient { public async setHomeCommunityTopicId(uuid: Uuidv4, hieroTopicId: HieroId): Promise { this.logger.info('update home community on backend') const { data, errors } = await this.client.rawRequest<{ updateHomeCommunity: Community }>( - setHomeCommunityTopicId, { uuid, hieroTopicId }, await this.getRequestHeader(), + setHomeCommunityTopicId, + { uuid, hieroTopicId }, + await this.getRequestHeader(), ) if (errors) { throw errors[0] - } + } return v.parse(communitySchema, data.updateHomeCommunity) } diff --git a/dlt-connector/src/client/backend/community.schema.test.ts b/dlt-connector/src/client/backend/community.schema.test.ts index d39c376ba..e56056377 100644 --- a/dlt-connector/src/client/backend/community.schema.test.ts +++ b/dlt-connector/src/client/backend/community.schema.test.ts @@ -1,24 +1,23 @@ // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' import * as v from 'valibot' -import { uuidv4Schema } from '../../schemas/typeGuard.schema' +import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' import { communitySchema } from './community.schema' -import { hieroIdSchema } from '../../schemas/typeGuard.schema' describe('community.schema', () => { it('community', () => { expect( v.parse(communitySchema, { uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', - topicId: '0.0.4', + hieroTopicId: '0.0.4', foreign: false, - createdAt: '2021-01-01', + creationDate: '2021-01-01', }), ).toEqual({ - topicId: v.parse(hieroIdSchema, '0.0.4'), + hieroTopicId: v.parse(hieroIdSchema, '0.0.4'), uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), foreign: false, - createdAt: new Date('2021-01-01'), + creationDate: new Date('2021-01-01'), }) }) }) diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts index 0222322a4..b74ac49cf 100644 --- a/dlt-connector/src/client/backend/community.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -4,17 +4,13 @@ import { dateSchema } from '../../schemas/typeConverter.schema' import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' /** - * Schema Definitions for rpc call parameter, when dlt-connector is called from backend - */ - -/** - * Schema for community, for creating new CommunityRoot Transaction on gradido blockchain + * Schema Definitions for graphql response */ export const communitySchema = v.object({ uuid: uuidv4Schema, - topicId: v.nullish(hieroIdSchema), + hieroTopicId: v.nullish(hieroIdSchema), foreign: v.boolean('expect boolean type'), - createdAt: dateSchema, + creationDate: dateSchema, }) export type CommunityInput = v.InferInput @@ -25,7 +21,7 @@ export const homeCommunityGraphqlQuery = gql` query { homeCommunity { uuid - topicId + hieroTopicId foreign creationDate } @@ -33,10 +29,10 @@ export const homeCommunityGraphqlQuery = gql` ` export const setHomeCommunityTopicId = gql` - mutation ($uuid: string, $hieroTopicId: string){ + mutation ($uuid: String!, $hieroTopicId: String){ updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { uuid - topicId + hieroTopicId foreign creationDate } diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index a058f1c72..f63ac650a 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -6,7 +6,7 @@ import { PrivateKey, Timestamp, TopicCreateTransaction, - TopicId, + TopicId, TopicInfoQuery, TopicMessageSubmitTransaction, TopicUpdateTransaction, @@ -14,13 +14,13 @@ import { TransactionResponse, Wallet, } from '@hashgraph/sdk' -import { parse } from 'valibot' import { GradidoTransaction, HieroTopicId } from 'gradido-blockchain-js' import { getLogger, Logger } from 'log4js' +import { parse } from 'valibot' import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' -import { topicInfoSchema, type TopicInfoOutput } from './output.schema' +import { type TopicInfoOutput, topicInfoSchema } from './output.schema' // https://docs.hedera.com/hedera/sdks-and-apis/hedera-api/consensus/consensusupdatetopic export const MIN_AUTORENEW_PERIOD = 6999999 //seconds @@ -29,7 +29,7 @@ export const MAX_AUTORENEW_PERIOD = 8000001 // seconds export class HieroClient { private static instance: HieroClient wallet: Wallet - client: Client + client: Client logger: Logger private constructor() { @@ -43,12 +43,10 @@ export class HieroClient { operatorKey = PrivateKey.fromStringECDSA(CONFIG.HIERO_OPERATOR_KEY) } this.wallet = new Wallet(CONFIG.HIERO_OPERATOR_ID, operatorKey, provider) + this.client.setOperator(CONFIG.HIERO_OPERATOR_ID, operatorKey) } public static getInstance(): HieroClient { - if (!CONFIG.HIERO_ACTIVE) { - throw new Error('hiero is disabled via config...') - } if (!HieroClient.instance) { HieroClient.instance = new HieroClient() } @@ -87,14 +85,14 @@ export class HieroClient { public async getTopicInfo(topicId: HieroId): Promise { const info = await new TopicInfoQuery() - .setTopicId(TopicId.fromString(topicId)) - .execute(this.client) + .setTopicId(TopicId.fromString(topicId)) + .execute(this.client) this.logger.debug(JSON.stringify(info, null, 2)) return parse(topicInfoSchema, { topicId: topicId.toString(), sequenceNumber: info.sequenceNumber.toNumber(), - expirationTime: info.expirationTime?.toString(), - autoRenewPeriod: info.autoRenewPeriod?.seconds, + expirationTime: info.expirationTime?.toDate(), + autoRenewPeriod: info.autoRenewPeriod?.seconds.toNumber(), autoRenewAccountId: info.autoRenewAccountId?.toString(), }) } diff --git a/dlt-connector/src/client/hiero/output.schema.ts b/dlt-connector/src/client/hiero/output.schema.ts index da1864aae..ea99f677a 100644 --- a/dlt-connector/src/client/hiero/output.schema.ts +++ b/dlt-connector/src/client/hiero/output.schema.ts @@ -1,8 +1,8 @@ import * as v from 'valibot' -import { hieroIdSchema } from '../../schemas/typeGuard.schema' import { dateSchema } from '../../schemas/typeConverter.schema' +import { hieroIdSchema } from '../../schemas/typeGuard.schema' -// schema definitions for exporting data from hiero request as json back to caller +// schema definitions for exporting data from hiero request as json back to caller /*export const dateStringSchema = v.pipe( v.enum([v.string(), v.date()], v.transform(in: string | Date) @@ -11,12 +11,11 @@ import { dateSchema } from '../../schemas/typeConverter.schema' export const positiveNumberSchema = v.pipe(v.number(), v.minValue(0)) export const topicInfoSchema = v.object({ - topicId: hieroIdSchema, - sequenceNumber: positiveNumberSchema, - expirationTime: dateSchema, - autoRenewPeriod: v.optional(positiveNumberSchema, 0), - autoRenewAccountId: v.optional(hieroIdSchema, '0.0.0'), + topicId: hieroIdSchema, + sequenceNumber: positiveNumberSchema, + expirationTime: dateSchema, + autoRenewPeriod: v.optional(positiveNumberSchema, 0), + autoRenewAccountId: v.optional(hieroIdSchema, '0.0.0'), }) export type TopicInfoOutput = v.InferOutput - diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index 91dd84707..e0dfc82a3 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -1,3 +1,3 @@ export const LOG4JS_BASE_CATEGORY = 'dlt' // 7 days -export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 \ No newline at end of file +export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 9a9889cda..d4184d9d6 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -1,60 +1,23 @@ -/* eslint-disable n/no-process-env */ import dotenv from 'dotenv' +import { parse, InferOutput, ValiError } from 'valibot' +import { configSchema } from './schema' dotenv.config() -const logging = { - LOG4JS_CONFIG: 'log4js-config.json', - // default log level on production should be info - LOG_LEVEL: process.env.LOG_LEVEL ?? 'info', +type ConfigOutput = InferOutput + +let config: ConfigOutput +console.info('Config loading...') +try { + config = parse(configSchema, process.env) +} catch (error: Error | unknown) { + if (error instanceof ValiError) { + console.error(`${error.issues[0].path[0].key}: ${error.message} received: ${error.issues[0].received}`) + } else { + console.error(error) + } + // console.error('Config error:', JSON.stringify(error, null, 2)) + process.exit(1) } -const server = { - PRODUCTION: process.env.NODE_ENV === 'production', - DLT_CONNECTOR_PORT: process.env.DLT_CONNECTOR_PORT ?? 6010, -} - -const secrets = { - JWT_SECRET: process.env.JWT_SECRET ?? 'secret123', - 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', -} - -const iota = { - IOTA_HOME_COMMUNITY_SEED: process.env.IOTA_HOME_COMMUNITY_SEED ?? null, -} - -const hiero = { - HIERO_ACTIVE: process.env.HIERO_ACTIVE === 'true' || false, - HIERO_HEDERA_NETWORK: process.env.HIERO_HEDERA_NETWORK ?? 'testnet', - HIERO_OPERATOR_ID: process.env.HIERO_OPERATOR_ID ?? '0.0.2', - HIERO_OPERATOR_KEY: - process.env.HIERO_OPERATOR_KEY ?? - '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137', -} - -const apis = { - CONNECT_TIMEOUT_MS: process.env.CONNECT_TIMEOUT_MS - ? Number.parseInt(process.env.CONNECT_TIMEOUT_MS) - : 1000, - CONNECT_RETRY_COUNT: process.env.CONNECT_RETRY_COUNT - ? Number.parseInt(process.env.CONNECT_RETRY_COUNT) - : 15, - CONNECT_RETRY_DELAY_MS: process.env.CONNECT_RETRY_DELAY_MS - ? Number.parseInt(process.env.CONNECT_RETRY_DELAY_MS) - : 500, - IOTA_API_URL: process.env.IOTA_API_URL ?? 'https://chrysalis-nodes.iota.org', - NODE_SERVER_URL: process.env.NODE_SERVER_URL ?? 'http://127.0.0.1:8340', - BACKEND_SERVER_URL: process.env.BACKEND_SERVER_URL ?? 'http://127.0.0.1:4000', -} - -export const CONFIG = { - ...logging, - ...server, - ...secrets, - ...iota, - ...hiero, - ...apis, -} +export const CONFIG = config diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index b9a170e43..3dfe3cbe9 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -1,24 +1,77 @@ +import { MemoryBlock } from 'gradido-blockchain-js' import * as v from 'valibot' -export const HIERO_ACTIVE = v.nullish( - v.boolean('Flag to indicate if the Hiero (Hedera Hashgraph Ledger) service is used.'), - false, -) +const hexSchema = v.pipe(v.string('expect string type'), v.hexadecimal('expect hexadecimal string')) -export const HIERO_HEDERA_NETWORK = v.nullish( - v.union([v.literal('mainnet'), v.literal('testnet'), v.literal('previewnet')]), - 'testnet', -) +const hex16Schema = v.pipe(hexSchema, v.length(32, 'expect string length = 32')) -export const HIERO_OPERATOR_ID = v.nullish( - v.pipe(v.string('The operator ID for Hiero integration'), v.regex(/^[0-9]+\.[0-9]+\.[0-9]+$/)), - '0.0.2', -) - -export const HIERO_OPERATOR_KEY = v.nullish( - v.pipe( - v.string('The operator key for Hiero integration, default is for local default node'), - v.regex(/^[0-9a-fA-F]{64,96}$/), +export const configSchema = v.object({ + LOG4JS_CONFIG: v.optional( + v.string('The path to the log4js configuration file'), + './log4js-config.json', ), - '302e020100300506032b65700422042091132178e72057a1d7528025956fe39b0b847f200ab59b2fdd367017f3087137', -) + LOG_LEVEL: v.optional(v.string('The log level'), 'info'), + DLT_CONNECTOR_PORT: v.optional( + v.pipe( + v.string('A valid port on which the DLT connector is running'), + v.transform((input: string) => Number(input)), + v.minValue(1), + v.maxValue(65535), + ), + '6010', + ), + JWT_SECRET: v.pipe( + v.string('The JWT secret for connecting to the backend'), + v.custom((input: unknown): boolean => { + if (process.env.NODE_ENV === 'production' && input === 'secret123') { + return false + } + return true + }, "Shouldn't use default value in production"), + ), + GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET: hexSchema, + GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY: hex16Schema, + HOME_COMMUNITY_SEED: v.pipe( + hexSchema, + v.length(64, 'expect seed length minimum 64 characters (32 Bytes)'), + v.transform((input: string) => MemoryBlock.fromHex(input)), + ), + HIERO_HEDERA_NETWORK: v.optional( + v.union([v.literal('mainnet'), v.literal('testnet'), v.literal('previewnet')]), + 'testnet', + ), + HIERO_OPERATOR_ID: v.pipe( + v.string('The operator ID (Account id) for Hiero integration'), + v.regex(/^[0-9]+\.[0-9]+\.[0-9]+$/), + ), + HIERO_OPERATOR_KEY: v.pipe( + v.string('The operator key (Private key) for Hiero integration'), + v.hexadecimal(), + v.minLength(64), + v.maxLength(96), + ), + CONNECT_TIMEOUT_MS: v.optional( + v.pipe(v.number('The connection timeout in milliseconds'), v.minValue(200), v.maxValue(120000)), + 1000, + ), + CONNECT_RETRY_COUNT: v.optional( + v.pipe(v.number('The connection retry count'), v.minValue(1), v.maxValue(50)), + 15, + ), + CONNECT_RETRY_DELAY_MS: v.optional( + v.pipe( + v.number('The connection retry delay in milliseconds'), + v.minValue(100), + v.maxValue(10000), + ), + 500, + ), + NODE_SERVER_URL: v.optional( + v.string('The URL of the gradido node server'), + 'http://localhost:6010', + ), + BACKEND_SERVER_URL: v.optional( + v.string('The URL of the gradido backend server'), + 'http://localhost:6010', + ), +}) diff --git a/dlt-connector/src/data/KeyPairIdentifier.logic.ts b/dlt-connector/src/data/KeyPairIdentifier.logic.ts index 437d9a458..1563d4b53 100644 --- a/dlt-connector/src/data/KeyPairIdentifier.logic.ts +++ b/dlt-connector/src/data/KeyPairIdentifier.logic.ts @@ -17,7 +17,7 @@ export class KeyPairIdentifierLogic { isUserKeyPair(): boolean { return ( this.identifier.seed === undefined && - this.identifier.account != undefined && + this.identifier.account != null && this.identifier.account.accountNr === 0 ) } @@ -25,7 +25,7 @@ export class KeyPairIdentifierLogic { isAccountKeyPair(): boolean { return ( this.identifier.seed === undefined && - this.identifier.account != undefined && + this.identifier.account != null && this.identifier.account.accountNr > 0 ) } diff --git a/dlt-connector/src/errors.ts b/dlt-connector/src/errors.ts index e9cbaee98..3bedb023a 100644 --- a/dlt-connector/src/errors.ts +++ b/dlt-connector/src/errors.ts @@ -35,6 +35,20 @@ export class GradidoNodeInvalidTransactionError extends GradidoNodeError { } } +export class GradidoBlockchainError extends Error { + constructor(message: string) { + super(message) + this.name = 'GradidoBlockchainError' + } +} + +export class GradidoBlockchainCryptoError extends GradidoBlockchainError { + constructor(message: string) { + super(message) + this.name = 'GradidoBlockchainCryptoError' + } +} + export class ParameterError extends Error { constructor(message: string) { super(message) diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index de0b07729..733bbcfc0 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,83 +1,111 @@ import { readFileSync } from 'node:fs' import { Elysia } from 'elysia' import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' -import { configure, getLogger } from 'log4js' -import * as v from 'valibot' +import { configure, getLogger, Logger } from 'log4js' +import { parse } from 'valibot' import { BackendClient } from './client/backend/BackendClient' +import { GradidoNodeClient } from './client/GradidoNode/GradidoNodeClient' import { HieroClient } from './client/hiero/HieroClient' -import { getTransaction } from './client/GradidoNode/api' import { CONFIG } from './config' -import { SendToIotaContext } from './interactions/sendToIota/SendToIota.context' -import { KeyPairCacheManager } from './KeyPairCacheManager' -import { keyGenerationSeedSchema } from './schemas/base.schema' -import { isPortOpenRetry } from './utils/network' -import { appRoutes } from './server' import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from './config/const' +import { SendToHieroContext } from './interactions/sendToHiero/SendToHiero.context' +import { KeyPairCacheManager } from './KeyPairCacheManager' +import { Community, communitySchema } from './schemas/transaction.schema' +import { appRoutes } from './server' +import { isPortOpenRetry } from './utils/network' + +type Clients = { + backend: BackendClient + hiero: HieroClient + gradidoNode: GradidoNodeClient +} async function main() { + // load everything from .env + const logger = loadConfig() + const clients = createClients() + const { hiero, gradidoNode } = clients + + // show hiero account balance, double also as check if valid hiero account was given in config + const balance = await hiero.getBalance() + logger.info(`Hiero Account Balance: ${balance.hbars.toString()}`) + + // get home community, create topic if not exist, or check topic expiration and update it if needed + const homeCommunity = await homeCommunitySetup(clients, logger) + + // ask gradido node if community blockchain was created + try { + if ( + !(await gradidoNode.getTransaction({ transactionId: 1, topic: homeCommunity.hieroTopicId })) + ) { + // if not exist, create community root transaction + await SendToHieroContext(homeCommunity) + } + } catch (e) { + logger.error(`error requesting gradido node: ${e}`) + } + // listen for rpc request from backend (graphql replaced with elysiaJS) + new Elysia().use(appRoutes).listen(CONFIG.DLT_CONNECTOR_PORT, () => { + logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) + }) +} + +function loadConfig(): Logger { // configure log4js // TODO: replace late by loader from config-schema const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8')) configure(options) const logger = getLogger('dlt') - // check if valid seed for root key pair generation is present - if (!v.safeParse(keyGenerationSeedSchema, CONFIG.IOTA_HOME_COMMUNITY_SEED).success) { - logger.error('IOTA_HOME_COMMUNITY_SEED must be a valid hex string, at least 64 characters long') - process.exit(1) - } // load crypto keys for gradido blockchain lib loadCryptoKeys( MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY), ) + return logger +} - // ask backend for home community if we haven't one - const backend = BackendClient.getInstance() - if (!backend) { - throw new Error('cannot create backend client') - } - const hieroClient = HieroClient.getInstance() - if (!hieroClient) { - throw new Error('cannot create hiero client') +// needed to be called after loading config +function createClients(): Clients { + return { + backend: BackendClient.getInstance(), + hiero: HieroClient.getInstance(), + gradidoNode: GradidoNodeClient.getInstance(), } +} + +async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): Promise { // wait for backend server await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) + // ask backend for home community let homeCommunity = await backend.getHomeCommunityDraft() // on missing topicId, create one - if (!homeCommunity.topicId) { - const topicId = await hieroClient.createTopic() + if (!homeCommunity.hieroTopicId) { + const topicId = await hiero.createTopic() + // update topic on backend server homeCommunity = await backend.setHomeCommunityTopicId(homeCommunity.uuid, topicId) } else { // if topic exist, check if we need to update it - let topicInfo = await hieroClient.getTopicInfo(homeCommunity.topicId) - if (topicInfo.expirationTime.getTime() - new Date().getTime() < MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE) { - await hieroClient.updateTopic(homeCommunity.topicId) - topicInfo = await hieroClient.getTopicInfo(homeCommunity.topicId) - logger.info('updated topic info, new expiration time: %s', topicInfo.expirationTime.toLocaleDateString()) + let topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) + if ( + topicInfo.expirationTime.getTime() - new Date().getTime() < + MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE + ) { + await hiero.updateTopic(homeCommunity.hieroTopicId) + topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) + logger.info( + `updated topic info, new expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, + ) } } - if (!homeCommunity.topicId) { + if (!homeCommunity.hieroTopicId) { throw new Error('still no topic id, after creating topic and update community in backend.') } - KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.topicId) - logger.info('home community topic: %s', homeCommunity.topicId) - logger.info('gradido node server: %s', CONFIG.NODE_SERVER_URL) - // ask gradido node if community blockchain was created - try { - if (!(await getTransaction({ transactionNr: 1, topic: homeCommunity.topicId }))) { - // if not exist, create community root transaction - await SendToIotaContext(homeCommunity) - } - } catch (e) { - logger.error('error requesting gradido node: ', e) - } - // listen for rpc request from backend (graphql replaced with trpc and elysia) - new Elysia() - .use(appRoutes) - .listen(CONFIG.DLT_CONNECTOR_PORT, () => { - logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) - }) + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.hieroTopicId) + logger.info(`home community topic: ${homeCommunity.hieroTopicId}`) + logger.info(`gradido node server: ${CONFIG.NODE_SERVER_URL}`) + logger.info(`gradido backend server: ${CONFIG.BACKEND_SERVER_URL}`) + return parse(communitySchema, homeCommunity) } main().catch((e) => { diff --git a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts index 62ce06ecf..4296c1fcf 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts @@ -1,5 +1,5 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' - +import { GradidoBlockchainCryptoError } from '../../errors' import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class AccountKeyPairRole extends AbstractKeyPairRole { @@ -11,6 +11,12 @@ export class AccountKeyPairRole extends AbstractKeyPairRole { } public generateKeyPair(): KeyPairEd25519 { - return this.userKeyPair.deriveChild(this.accountNr) + const keyPair = this.userKeyPair.deriveChild(this.accountNr) + if (!keyPair) { + throw new GradidoBlockchainCryptoError( + `KeyPairEd25519 child derivation failed, has private key: ${this.userKeyPair.hasPrivateKey()}, accountNr: ${this.accountNr}`, + ) + } + return keyPair } } diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts index 0d73d891d..8911b8851 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts @@ -1,24 +1,19 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' - -import { getTransaction } from '../../client/GradidoNode/api' +import { GradidoNodeClient } from '../../client/GradidoNode/GradidoNodeClient' import { GradidoNodeInvalidTransactionError, GradidoNodeMissingTransactionError, } from '../../errors' -import { HieroId } from '../../schemas/typeGuard.schema' import { AbstractRemoteKeyPairRole } from './AbstractRemoteKeyPair.role' export class ForeignCommunityKeyPairRole extends AbstractRemoteKeyPairRole { - public constructor(communityTopicId: HieroId) { - super(communityTopicId) - } - public async retrieveKeyPair(): Promise { const transactionIdentifier = { - transactionNr: 1, + transactionId: 1, topic: this.topic, } - const firstTransaction = await getTransaction(transactionIdentifier) + const firstTransaction = + await GradidoNodeClient.getInstance().getTransaction(transactionIdentifier) if (!firstTransaction) { throw new GradidoNodeMissingTransactionError('Cannot find transaction', transactionIdentifier) } diff --git a/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts index 81b9a016c..20d1ec2a1 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts @@ -1,4 +1,4 @@ -import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' +import { KeyPairEd25519 } from 'gradido-blockchain-js' import { CONFIG } from '../../config' import { ParameterError } from '../../errors' @@ -6,16 +6,9 @@ import { AbstractKeyPairRole } from './AbstractKeyPair.role' export class HomeCommunityKeyPairRole extends AbstractKeyPairRole { public generateKeyPair(): KeyPairEd25519 { - // TODO: prevent this check with valibot test on config - if (!CONFIG.IOTA_HOME_COMMUNITY_SEED) { - throw new Error( - '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) + const keyPair = KeyPairEd25519.create(CONFIG.HOME_COMMUNITY_SEED) if (!keyPair) { - throw new ParameterError("couldn't create keyPair from IOTA_HOME_COMMUNITY_SEED") + throw new ParameterError("couldn't create keyPair from HOME_COMMUNITY_SEED") } return keyPair } diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts index d1658d608..524c3dc1a 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts @@ -1,6 +1,5 @@ import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' - -import { findUserByNameHash } from '../../client/GradidoNode/api' +import { GradidoNodeClient } from '../../client/GradidoNode/GradidoNodeClient' import { Uuidv4Hash } from '../../data/Uuidv4Hash' import { GradidoNodeMissingUserError, ParameterError } from '../../errors' import { IdentifierAccount } from '../../schemas/account.schema' @@ -16,7 +15,7 @@ export class RemoteAccountKeyPairRole extends AbstractRemoteKeyPairRole { throw new ParameterError('missing account') } - const accountPublicKey = await findUserByNameHash( + const accountPublicKey = await GradidoNodeClient.getInstance().findUserByNameHash( new Uuidv4Hash(this.identifier.account.userUuid), this.topic, ) diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts index a2f57898c..01120eceb 100644 --- a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts +++ b/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts @@ -1,5 +1,5 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' - +import { GradidoBlockchainCryptoError } from '../../errors' import { hardenDerivationIndex } from '../../utils/derivationHelper' import { AbstractKeyPairRole } from './AbstractKeyPair.role' @@ -21,9 +21,14 @@ export class UserKeyPairRole extends AbstractKeyPairRole { 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, - ) + return parts.reduce((keyPair: KeyPairEd25519, node: number) => { + const localKeyPair = keyPair.deriveChild(node) + if (!localKeyPair) { + throw new GradidoBlockchainCryptoError( + `KeyPairEd25519 child derivation failed, has private key: ${keyPair.hasPrivateKey()} for user: ${this.userUuid}`, + ) + } + return localKeyPair + }, this.communityKeys) } } diff --git a/dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/AbstractTransaction.role.ts similarity index 100% rename from dlt-connector/src/interactions/sendToIota/AbstractTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/AbstractTransaction.role.ts diff --git a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts similarity index 68% rename from dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts index c59939ccb..34299683a 100644 --- a/dlt-connector/src/interactions/sendToIota/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts @@ -1,6 +1,7 @@ import { GradidoTransactionBuilder } from 'gradido-blockchain-js' -import { Community } from '../../client/backend/community.schema' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { GradidoBlockchainCryptoError } from '../../errors' +import { Community } from '../../schemas/transaction.schema' import { HieroId } from '../../schemas/typeGuard.schema' import { AUF_ACCOUNT_DERIVATION_INDEX, @@ -16,7 +17,7 @@ export class CommunityRootTransactionRole extends AbstractTransactionRole { } getSenderCommunityTopicId(): HieroId { - return this.community.topicId + return this.community.hieroTopicId } getRecipientCommunityTopicId(): HieroId { @@ -26,16 +27,26 @@ export class CommunityRootTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const communityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ communityTopicId: this.community.topicId }), + new KeyPairIdentifierLogic({ communityTopicId: this.community.hieroTopicId }), ) const gmwKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(GMW_ACCOUNT_DERIVATION_INDEX), - ) // as unknown as KeyPairEd25519 + ) + if (!gmwKeyPair) { + throw new GradidoBlockchainCryptoError( + `KeyPairEd25519 child derivation failed, has private key: ${communityKeyPair.hasPrivateKey()} for community: ${this.community.uuid}`, + ) + } const aufKeyPair = communityKeyPair.deriveChild( hardenDerivationIndex(AUF_ACCOUNT_DERIVATION_INDEX), - ) // as unknown as KeyPairEd25519 + ) + if (!aufKeyPair) { + throw new GradidoBlockchainCryptoError( + `KeyPairEd25519 child derivation failed, has private key: ${communityKeyPair.hasPrivateKey()} for community: ${this.community.uuid}`, + ) + } builder - .setCreatedAt(this.community.createdAt) + .setCreatedAt(this.community.creationDate) .setCommunityRoot( communityKeyPair.getPublicKey(), gmwKeyPair.getPublicKey(), diff --git a/dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts similarity index 100% rename from dlt-connector/src/interactions/sendToIota/CreationTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts diff --git a/dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts similarity index 100% rename from dlt-connector/src/interactions/sendToIota/DeferredTransferTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts diff --git a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts similarity index 95% rename from dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts index 3d2574681..a91990360 100644 --- a/dlt-connector/src/interactions/sendToIota/RedeemDeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts @@ -1,6 +1,6 @@ import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' import { parse } from 'valibot' -import { getTransactionsForAccount } from '../../client/GradidoNode/api' +import { GradidoNodeClient } from '../../client/GradidoNode/GradidoNodeClient' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { RedeemDeferredTransferTransaction, @@ -42,7 +42,7 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo throw new Error("redeem deferred transfer: couldn't calculate sender public key") } // load deferred transfer transaction from gradido node - const transactions = await getTransactionsForAccount( + const transactions = await GradidoNodeClient.getInstance().getTransactionsForAccount( { maxResultCount: 2, topic: this.getSenderCommunityTopicId() }, senderPublicKey.convertToHex(), ) diff --git a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts similarity index 94% rename from dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts index 5eee0f164..64076b920 100644 --- a/dlt-connector/src/interactions/sendToIota/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts @@ -1,4 +1,4 @@ -import { GradidoTransactionBuilder } from 'gradido-blockchain-js' +import { AddressType, GradidoTransactionBuilder } from 'gradido-blockchain-js' import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { Uuidv4Hash } from '../../data/Uuidv4Hash' @@ -53,7 +53,7 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { .setCreatedAt(this.registerAddressTransaction.createdAt) .setRegisterAddress( userKeyPair.getPublicKey(), - this.registerAddressTransaction.accountType, + this.registerAddressTransaction.accountType as AddressType, new Uuidv4Hash(this.account.userUuid).getAsMemoryBlock(), accountKeyPair.getPublicKey(), ) diff --git a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts similarity index 83% rename from dlt-connector/src/interactions/sendToIota/SendToIota.context.ts rename to dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index 4b8b32c34..c363ad263 100644 --- a/dlt-connector/src/interactions/sendToIota/SendToIota.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -1,16 +1,25 @@ import { GradidoTransaction, - InteractionValidate, - MemoryBlock, + InteractionValidate, + MemoryBlock, ValidateType_SINGLE, } from 'gradido-blockchain-js' import { getLogger } from 'log4js' -import { safeParse, parse } from 'valibot' -import { Community, communitySchema } from '../../client/backend/community.schema' +import { parse, safeParse } from 'valibot' import { HieroClient } from '../../client/hiero/HieroClient' import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { Transaction, transactionSchema } from '../../schemas/transaction.schema' -import { HieroId, HieroTransactionId, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' +import { InputTransactionType } from '../../enum/InputTransactionType' +import { + Community, + communitySchema, + Transaction, + transactionSchema, +} from '../../schemas/transaction.schema' +import { + HieroId, + HieroTransactionId, + hieroTransactionIdSchema, +} from '../../schemas/typeGuard.schema' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' @@ -18,16 +27,15 @@ import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.r import { RedeemDeferredTransferTransactionRole } from './RedeemDeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' -import { InputTransactionType } from '../../enum/InputTransactionType' -const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToIota.SendToIotaContext`) +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToHiero.SendToHieroContext`) /** * @DCI-Context - * Context for sending transaction to iota - * send every transaction only once to iota! + * Context for sending transaction to hiero + * send every transaction only once to hiero! */ -export async function SendToIotaContext( +export async function SendToHieroContext( input: Transaction | Community, ): Promise { // let gradido blockchain validator run, it will throw an exception when something is wrong @@ -44,7 +52,7 @@ export async function SendToIotaContext( const client = HieroClient.getInstance() const resultMessage = await client.sendMessage(topic, gradidoTransaction) const transactionId = resultMessage.response.transactionId.toString() - logger.info('transmitted Gradido Transaction to Iota', { transactionId }) + logger.info('transmitted Gradido Transaction to Hiero', { transactionId }) return transactionId } @@ -75,7 +83,7 @@ export async function SendToIotaContext( } } - const role = chooseCorrectRole(input) + const role = chooseCorrectRole(input) const builder = await role.getGradidoTransactionBuilder() if (builder.isCrossCommunityTransaction()) { const outboundTransaction = builder.buildOutbound() @@ -92,10 +100,7 @@ export async function SendToIotaContext( } else { const transaction = builder.build() validate(transaction) - const iotaMessageId = await sendViaHiero( - transaction, - role.getSenderCommunityTopicId(), - ) + const iotaMessageId = await sendViaHiero(transaction, role.getSenderCommunityTopicId()) return parse(hieroTransactionIdSchema, iotaMessageId) } } diff --git a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts similarity index 90% rename from dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts rename to dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts index f244bf472..473bfbc1e 100644 --- a/dlt-connector/src/interactions/sendToIota/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts @@ -7,13 +7,13 @@ import { import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { + Transaction, TransferTransaction, transferTransactionSchema, - Transaction, } from '../../schemas/transaction.schema' +import { HieroId } from '../../schemas/typeGuard.schema' import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' import { AbstractTransactionRole } from './AbstractTransaction.role' -import { HieroId } from '../../schemas/typeGuard.schema' export class TransferTransactionRole extends AbstractTransactionRole { private transferTransaction: TransferTransaction @@ -33,7 +33,9 @@ export class TransferTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // sender + signer - const senderKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(this.transferTransaction.user)) + const senderKeyPair = await KeyPairCalculation( + new KeyPairIdentifierLogic(this.transferTransaction.user), + ) // recipient const recipientKeyPair = await KeyPairCalculation( new KeyPairIdentifierLogic(this.transferTransaction.linkedUser), @@ -56,9 +58,7 @@ export class TransferTransactionRole extends AbstractTransactionRole { const recipientCommunity = this.transferTransaction.linkedUser.communityTopicId if (senderCommunity !== recipientCommunity) { // we have a cross group transaction - builder - .setSenderCommunity(senderCommunity) - .setRecipientCommunity(recipientCommunity) + builder.setSenderCommunity(senderCommunity).setRecipientCommunity(recipientCommunity) } builder.sign(senderKeyPair) return builder diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index e8d8326c6..61f485db6 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -1,25 +1,19 @@ -import { describe, expect, it, beforeAll } from 'bun:test' +import { beforeAll, describe, expect, it } from 'bun:test' import { randomBytes } from 'crypto' import { v4 as uuidv4 } from 'uuid' import { parse } from 'valibot' import { InputTransactionType } from '../enum/InputTransactionType' import { - TransactionInput, - transactionSchema, -} from './transaction.schema' -import { transactionIdentifierSchema } from '../client/GradidoNode/input.schema' -import { - gradidoAmountSchema, - HieroId, - hieroIdSchema, - HieroTransactionId, - hieroTransactionIdSchema, - Memo, - memoSchema, - timeoutDurationSchema, - Uuidv4, - uuidv4Schema + gradidoAmountSchema, + HieroId, + hieroIdSchema, + Memo, + memoSchema, + timeoutDurationSchema, + Uuidv4, + uuidv4Schema, } from '../schemas/typeGuard.schema' +import { TransactionInput, transactionSchema } from './transaction.schema' const transactionLinkCode = (date: Date): string => { const time = date.getTime().toString(16) @@ -31,197 +25,150 @@ const transactionLinkCode = (date: Date): string => { } let topic: HieroId const topicString = '0.0.261' -let hieroTransactionId: HieroTransactionId beforeAll(() => { topic = parse(hieroIdSchema, topicString) - hieroTransactionId = parse(hieroTransactionIdSchema, '0.0.261-1755348116-1281621') }) describe('transaction schemas', () => { - describe('transactionIdentifierSchema ', () => { - it('valid, transaction identified by transactionNr and topic', () => { - expect( - parse(transactionIdentifierSchema, { - transactionNr: 1, - topic: topicString, - }), - ).toEqual({ - transactionNr: 1, - hieroTransactionId: undefined, - topic, - }) + let userUuid: Uuidv4 + let userUuidString: string + let memoString: string + let memo: Memo + beforeAll(() => { + userUuidString = uuidv4() + userUuid = parse(uuidv4Schema, userUuidString) + memoString = 'TestMemo' + memo = parse(memoSchema, memoString) + }) + it('valid, register new user address', () => { + const registerAddress: TransactionInput = { + user: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + type: InputTransactionType.REGISTER_ADDRESS, + createdAt: '2022-01-01T00:00:00.000Z', + } + expect(parse(transactionSchema, registerAddress)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + type: registerAddress.type, + createdAt: new Date(registerAddress.createdAt), }) - it('valid, transaction identified by hieroTransactionId and topic', () => { - expect( - parse(transactionIdentifierSchema, { - hieroTransactionId: '0.0.261-1755348116-1281621', - topic: topicString, - }), - ).toEqual({ - hieroTransactionId, - topic - }) - }) - it('invalid, missing topic', () => { - expect(() => - parse(transactionIdentifierSchema, { - transactionNr: 1, - hieroTransactionId: '0.0.261-1755348116-1281621', - }), - ).toThrowError(new Error('Invalid key: Expected "topic" but received undefined')) - }) - it('invalid, transactionNr and iotaMessageId set', () => { - expect(() => - parse(transactionIdentifierSchema, { - transactionNr: 1, - hieroTransactionId: '0.0.261-1755348116-1281621', - topic - }), - ).toThrowError(new Error('expect transactionNr or hieroTransactionId not both')) + }) + it('valid, gradido transfer', () => { + const gradidoTransfer: TransactionInput = { + user: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + linkedUser: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + amount: '100', + memo: memoString, + type: InputTransactionType.GRADIDO_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + } + expect(parse(transactionSchema, gradidoTransfer)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + linkedUser: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + amount: parse(gradidoAmountSchema, gradidoTransfer.amount!), + memo, + type: gradidoTransfer.type, + createdAt: new Date(gradidoTransfer.createdAt), }) }) - describe('transactionSchema', () => { - let userUuid: Uuidv4 - let userUuidString: string - let memoString: string - let memo: Memo - beforeAll(() => { - userUuidString = uuidv4() - userUuid = parse(uuidv4Schema, userUuidString) - memoString = 'TestMemo' - memo = parse(memoSchema, memoString) + it('valid, gradido creation', () => { + const gradidoCreation: TransactionInput = { + user: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + linkedUser: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, + }, + amount: '1000', + memo: memoString, + type: InputTransactionType.GRADIDO_CREATION, + createdAt: '2022-01-01T00:00:00.000Z', + targetDate: '2021-11-01T10:00', + } + expect(parse(transactionSchema, gradidoCreation)).toEqual({ + user: { + communityTopicId: topic, + account: { userUuid, accountNr: 0 }, + }, + linkedUser: { + communityTopicId: topic, + account: { userUuid, accountNr: 0 }, + }, + amount: parse(gradidoAmountSchema, gradidoCreation.amount!), + memo, + type: gradidoCreation.type, + createdAt: new Date(gradidoCreation.createdAt), + targetDate: new Date(gradidoCreation.targetDate!), }) - it('valid, register new user address', () => { - const registerAddress: TransactionInput = { - user: { - communityTopicId: topicString, - account: { userUuid: userUuidString }, + }) + it('valid, gradido transaction link / deferred transfer', () => { + const gradidoTransactionLink: TransactionInput = { + user: { + communityTopicId: topicString, + account: { + userUuid: userUuidString, }, - type: InputTransactionType.REGISTER_ADDRESS, - createdAt: '2022-01-01T00:00:00.000Z', - } - expect(parse(transactionSchema, registerAddress)).toEqual({ - user: { - communityTopicId: topic, - account: { - userUuid, - accountNr: 0, - }, + }, + linkedUser: { + communityTopicId: topicString, + seed: { + seed: transactionLinkCode(new Date()), }, - type: registerAddress.type, - createdAt: new Date(registerAddress.createdAt), - }) - }) - it('valid, gradido transfer', () => { - const gradidoTransfer: TransactionInput = { - user: { - communityTopicId: topicString, - account: { userUuid: userUuidString }, + }, + amount: '100', + memo: memoString, + type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, + createdAt: '2022-01-01T00:00:00.000Z', + timeoutDuration: 60 * 60 * 24 * 30, + } + expect(parse(transactionSchema, gradidoTransactionLink)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, }, - linkedUser: { - communityTopicId: topicString, - account: { userUuid: userUuidString }, + }, + linkedUser: { + communityTopicId: topic, + seed: { + seed: gradidoTransactionLink.linkedUser!.seed!.seed, }, - amount: '100', - memo: memoString, - type: InputTransactionType.GRADIDO_TRANSFER, - createdAt: '2022-01-01T00:00:00.000Z', - } - expect(parse(transactionSchema, gradidoTransfer)).toEqual({ - user: { - communityTopicId: topic, - account: { - userUuid, - accountNr: 0, - }, - }, - linkedUser: { - communityTopicId: topic, - account: { - userUuid, - accountNr: 0, - }, - }, - amount: parse(gradidoAmountSchema, gradidoTransfer.amount!), - memo, - type: gradidoTransfer.type, - createdAt: new Date(gradidoTransfer.createdAt), - }) - }) - - it('valid, gradido creation', () => { - const gradidoCreation: TransactionInput = { - user: { - communityTopicId: topicString, - account: { userUuid: userUuidString }, - }, - linkedUser: { - communityTopicId: topicString, - account: { userUuid: userUuidString }, - }, - amount: '1000', - memo: memoString, - type: InputTransactionType.GRADIDO_CREATION, - createdAt: '2022-01-01T00:00:00.000Z', - targetDate: '2021-11-01T10:00', - } - expect(parse(transactionSchema, gradidoCreation)).toEqual({ - user: { - communityTopicId: topic, - account: { userUuid, accountNr: 0 }, - }, - linkedUser: { - communityTopicId: topic, - account: { userUuid, accountNr: 0 }, - }, - amount: parse(gradidoAmountSchema, gradidoCreation.amount!), - memo, - type: gradidoCreation.type, - createdAt: new Date(gradidoCreation.createdAt), - targetDate: new Date(gradidoCreation.targetDate!), - }) - }) - it('valid, gradido transaction link / deferred transfer', () => { - const gradidoTransactionLink: TransactionInput = { - user: { - communityTopicId: topicString, - account: { - userUuid: userUuidString, - }, - }, - linkedUser: { - communityTopicId: topicString, - seed: { - seed: transactionLinkCode(new Date()), - }, - }, - amount: '100', - memo: memoString, - type: InputTransactionType.GRADIDO_DEFERRED_TRANSFER, - createdAt: '2022-01-01T00:00:00.000Z', - timeoutDuration: 60 * 60 * 24 * 30, - } - expect(parse(transactionSchema, gradidoTransactionLink)).toEqual({ - user: { - communityTopicId: topic, - account: { - userUuid, - accountNr: 0, - }, - }, - linkedUser: { - communityTopicId: topic, - seed: { - seed: gradidoTransactionLink.linkedUser!.seed!.seed, - }, - }, - amount: parse(gradidoAmountSchema, gradidoTransactionLink.amount!), - memo, - type: gradidoTransactionLink.type, - createdAt: new Date(gradidoTransactionLink.createdAt), - timeoutDuration: parse(timeoutDurationSchema, gradidoTransactionLink.timeoutDuration!), - }) + }, + amount: parse(gradidoAmountSchema, gradidoTransactionLink.amount!), + memo, + type: gradidoTransactionLink.type, + createdAt: new Date(gradidoTransactionLink.createdAt), + timeoutDuration: parse(timeoutDurationSchema, gradidoTransactionLink.timeoutDuration!), }) }) }) diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index de75bda89..4345ec901 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -11,8 +11,22 @@ import { hieroIdSchema, memoSchema, timeoutDurationSchema, + uuidv4Schema, } from './typeGuard.schema' +/** + * Schema for community, for creating new CommunityRoot Transaction on gradido blockchain + */ +export const communitySchema = v.object({ + uuid: uuidv4Schema, + hieroTopicId: hieroIdSchema, + foreign: v.boolean('expect boolean type'), + creationDate: dateSchema, +}) + +export type CommunityInput = v.InferInput +export type Community = v.InferOutput + export const transactionSchema = v.object({ user: identifierAccountSchema, linkedUser: v.nullish(identifierAccountSchema, undefined), diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index 2ec02d12e..71cae3619 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -51,10 +51,10 @@ describe('basic.schema', () => { it('confirmedTransactionSchema', () => { const confirmedTransaction = v.parse( confirmedTransactionSchema, - 'CAcSAgoAGgYIwvK5/wUiAzMuNCogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + 'CAcS5AEKZgpkCiCBZwMplGmI7fRR9MQkaR2Dz1qQQ5BCiC1btyJD71Ue9BJABODQ9sS70th9yHn8X3K+SNv2gsiIdX/V09baCvQCb+yEj2Dd/fzShIYqf3pooIMwJ01BkDJdNGBZs5MDzEAkChJ6ChkIAhIVRGFua2UgZnVlciBkZWluIFNlaW4hEggIgMy5/wUQABoDMy41IAAyTAooCiDbDtYSWhTwMKvtG/yDHgohjPn6v87n7NWBwMDniPAXxxCUmD0aABIgJE0o18xb6P6PsNjh0bkN52AzhggteTzoh09jV+blMq0aCAjC8rn/BRAAIgMzLjUqICiljeEjGHifWe4VNzoe+DN9oOLNZvJmv3VlkP+1RH7MMiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADomCiDbDtYSWhTwMKvtG/yDHgohjPn6v87n7NWBwMDniPAXxxDAhD06JwogJE0o18xb6P6PsNjh0bkN52AzhggteTzoh09jV+blMq0Q65SlBA==', ) expect(confirmedTransaction.getId()).toBe(7) expect(confirmedTransaction.getConfirmedAt().getSeconds()).toBe(1609464130) - expect(confirmedTransaction.getVersionNumber()).toBe('3.4') + expect(confirmedTransaction.getVersionNumber()).toBe('3.5') }) }) diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts index 3fb6e55ba..4410b54be 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -1,6 +1,7 @@ -import { AddressType, ConfirmedTransaction } from 'gradido-blockchain-js' +import { ConfirmedTransaction } from 'gradido-blockchain-js' import * as v from 'valibot' import { AccountType } from '../enum/AccountType' +import { AddressType } from '../enum/AddressType' import { confirmedTransactionFromBase64, isAddressType, diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index 7bf2a85c6..c3a00d4e3 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,50 +1,27 @@ +import { TypeBoxFromValibot } from '@sinclair/typemap' import { Elysia, status } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' import { getLogger } from 'log4js' import { parse } from 'valibot' -import { getAddressType } from '../client/GradidoNode/api' +import { GradidoNodeClient } from '../client/GradidoNode/GradidoNodeClient' import { LOG4JS_BASE_CATEGORY } from '../config/const' import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' -import { SendToIotaContext } from '../interactions/sendToIota/SendToIota.context' +import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.context' import { IdentifierAccount, identifierAccountSchema } from '../schemas/account.schema' +import { transactionSchema } from '../schemas/transaction.schema' import { hieroTransactionIdSchema } from '../schemas/typeGuard.schema' import { accountIdentifierSeedSchema, accountIdentifierUserSchema, existSchema, } from './input.schema' -import { TypeBoxFromValibot } from '@sinclair/typemap' -import { transactionSchema } from '../schemas/transaction.schema' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) -async function isAccountExist(identifierAccount: IdentifierAccount): Promise { - const startTime = Date.now() - const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(identifierAccount)) - const publicKey = accountKeyPair.getPublicKey() - if (!publicKey) { - throw status(404, "couldn't calculate account key pair") - } - - // ask gradido node server for account type, if type !== NONE account exist - const addressType = await getAddressType( - publicKey.convertToHex(), - identifierAccount.communityTopicId, - ) - const endTime = Date.now() - logger.info( - `isAccountExist: ${addressType !== AddressType_NONE}, time used: ${endTime - startTime}ms`, - ) - if (logger.isDebugEnabled()) { - logger.debug('params', identifierAccount) - } - return addressType !== AddressType_NONE -} - export const appRoutes = new Elysia() .get( - '/isAccountExist/:communityTopicId/:userUuid/:accountNr', + '/isAccountExist/by-user/:communityTopicId/:userUuid/:accountNr', async ({ params: { communityTopicId, userUuid, accountNr } }) => { const accountIdentifier = parse(identifierAccountSchema, { communityTopicId, @@ -56,7 +33,7 @@ export const appRoutes = new Elysia() { params: accountIdentifierUserSchema, response: existSchema }, ) .get( - '/isAccountExist/:communityTopicId/:seed', + '/isAccountExist/by-seed/:communityTopicId/:seed', async ({ params: { communityTopicId, seed } }) => { const accountIdentifier = parse(identifierAccountSchema, { communityTopicId, @@ -69,7 +46,33 @@ export const appRoutes = new Elysia() ) .post( '/sendTransaction', - async ({ body }) => await SendToIotaContext(parse(transactionSchema, body)), + async ({ body }) => await SendToHieroContext(parse(transactionSchema, body)), // validation schemas - { body: TypeBoxFromValibot(transactionSchema), response: TypeBoxFromValibot(hieroTransactionIdSchema) }, + { + body: TypeBoxFromValibot(transactionSchema), + response: TypeBoxFromValibot(hieroTransactionIdSchema), + }, ) + +async function isAccountExist(identifierAccount: IdentifierAccount): Promise { + const startTime = Date.now() + const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(identifierAccount)) + const publicKey = accountKeyPair.getPublicKey() + if (!publicKey) { + throw status(404, "couldn't calculate account key pair") + } + + // ask gradido node server for account type, if type !== NONE account exist + const addressType = await GradidoNodeClient.getInstance().getAddressType( + publicKey.convertToHex(), + identifierAccount.communityTopicId, + ) + const endTime = Date.now() + logger.info( + `isAccountExist: ${addressType !== AddressType_NONE}, time used: ${endTime - startTime}ms`, + ) + if (logger.isDebugEnabled()) { + logger.debug('params', identifierAccount) + } + return addressType !== AddressType_NONE +} diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index 6ab72b069..5b1279beb 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -1,19 +1,11 @@ import { - AddressType, - AddressType_COMMUNITY_AUF, - AddressType_COMMUNITY_GMW, - AddressType_COMMUNITY_HUMAN, - AddressType_COMMUNITY_PROJECT, - AddressType_CRYPTO_ACCOUNT, - AddressType_DEFERRED_TRANSFER, - AddressType_NONE, - AddressType_SUBACCOUNT, ConfirmedTransaction, DeserializeType_CONFIRMED_TRANSACTION, InteractionDeserialize, MemoryBlock, } from 'gradido-blockchain-js' import { AccountType } from '../enum/AccountType' +import { AddressType } from '../enum/AddressType' export const confirmedTransactionFromBase64 = (base64: string): ConfirmedTransaction => { const confirmedTransactionBinaryPtr = MemoryBlock.createPtr(MemoryBlock.fromBase64(base64)) @@ -34,14 +26,14 @@ export const confirmedTransactionFromBase64 = (base64: string): ConfirmedTransac * AccountType is the enum defined in TypeScript but with the same options */ const accountToAddressMap: Record = { - [AccountType.COMMUNITY_AUF]: AddressType_COMMUNITY_AUF, - [AccountType.COMMUNITY_GMW]: AddressType_COMMUNITY_GMW, - [AccountType.COMMUNITY_HUMAN]: AddressType_COMMUNITY_HUMAN, - [AccountType.COMMUNITY_PROJECT]: AddressType_COMMUNITY_PROJECT, - [AccountType.CRYPTO_ACCOUNT]: AddressType_CRYPTO_ACCOUNT, - [AccountType.SUBACCOUNT]: AddressType_SUBACCOUNT, - [AccountType.DEFERRED_TRANSFER]: AddressType_DEFERRED_TRANSFER, - [AccountType.NONE]: AddressType_NONE, + [AccountType.COMMUNITY_AUF]: AddressType.COMMUNITY_AUF, + [AccountType.COMMUNITY_GMW]: AddressType.COMMUNITY_GMW, + [AccountType.COMMUNITY_HUMAN]: AddressType.COMMUNITY_HUMAN, + [AccountType.COMMUNITY_PROJECT]: AddressType.COMMUNITY_PROJECT, + [AccountType.CRYPTO_ACCOUNT]: AddressType.CRYPTO_ACCOUNT, + [AccountType.SUBACCOUNT]: AddressType.SUBACCOUNT, + [AccountType.DEFERRED_TRANSFER]: AddressType.DEFERRED_TRANSFER, + [AccountType.NONE]: AddressType.NONE, } const addressToAccountMap: Record = Object.entries( @@ -66,7 +58,7 @@ export function toAddressType(input: AccountType | AddressType): AddressType { if (isAddressType(input)) { return input } - return accountToAddressMap[input as AccountType] ?? AddressType_NONE + return accountToAddressMap[input as AccountType] ?? AddressType.NONE } export function toAccountType(input: AccountType | AddressType): AccountType { From 832f2f6ce56b7543593fb3b1d771faad0ebd4b58 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 8 Sep 2025 14:34:00 +0200 Subject: [PATCH 31/72] update for hiero --- dlt-connector/log4js-config.json | 17 +++++++++++-- .../client/GradidoNode/GradidoNodeClient.ts | 2 +- .../src/client/backend/community.schema.ts | 3 +++ dlt-connector/src/client/hiero/HieroClient.ts | 24 ++++++++++++++++--- dlt-connector/src/config/index.ts | 2 +- dlt-connector/src/index.ts | 2 +- dlt-connector/src/schemas/base.schema.ts | 7 ------ dlt-connector/src/schemas/typeGuard.schema.ts | 4 ++-- 8 files changed, 44 insertions(+), 17 deletions(-) diff --git a/dlt-connector/log4js-config.json b/dlt-connector/log4js-config.json index a6a33686b..66127eb80 100644 --- a/dlt-connector/log4js-config.json +++ b/dlt-connector/log4js-config.json @@ -15,6 +15,19 @@ "fileNameSep" : "_", "numBackups" : 30 }, + "dlt.client.HieroClient": { + "type": "dateFile", + "filename": "../logs/dlt-connector/apiversion-%v.log", + "pattern": "yyyy-MM-dd", + "layout": + { + "type": "pattern", "pattern": "%d{ISO8601} %p %c [topicId=%X{topicId}] [%f : %l] - %m" + }, + "compress": true, + "keepFileExt" : true, + "fileNameSep" : "_", + "numBackups" : 30 + }, "errorFile": { "type": "dateFile", @@ -22,7 +35,7 @@ "pattern": "yyyy-MM-dd", "layout": { - "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{url}] [%f : %l] - %m" + "type": "pattern", "pattern": "%d{ISO8601} %p %c [%f : %l] - %m" }, "compress": true, "keepFileExt" : true, @@ -40,7 +53,7 @@ "type": "stdout", "layout": { - "type": "pattern", "pattern": "%d{ISO8601} %p %c [%X{url}] [%f : %l] - %m" + "type": "pattern", "pattern": "%d{ISO8601} %p %c [%f : %l] - %m" } } }, diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts index 69609657e..5b58ad258 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -66,7 +66,7 @@ export class GradidoNodeClient { } const response = await this.rpcCall<{ transaction: string }>('gettransaction', parameter) if (response.isSuccess()) { - this.logger.debug('result: ', response.result.transaction) + // this.logger.debug('result: ', response.result.transaction) return parse(confirmedTransactionSchema, response.result.transaction) } if (response.isError()) { diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts index b74ac49cf..a37159bc5 100644 --- a/dlt-connector/src/client/backend/community.schema.ts +++ b/dlt-connector/src/client/backend/community.schema.ts @@ -8,6 +8,7 @@ import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' */ export const communitySchema = v.object({ uuid: uuidv4Schema, + name: v.string('expect string type'), hieroTopicId: v.nullish(hieroIdSchema), foreign: v.boolean('expect boolean type'), creationDate: dateSchema, @@ -21,6 +22,7 @@ export const homeCommunityGraphqlQuery = gql` query { homeCommunity { uuid + name hieroTopicId foreign creationDate @@ -32,6 +34,7 @@ export const setHomeCommunityTopicId = gql` mutation ($uuid: String!, $hieroTopicId: String){ updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { uuid + name hieroTopicId foreign creationDate diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index f63ac650a..c06eedf8b 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -2,6 +2,7 @@ import { AccountBalance, AccountBalanceQuery, Client, + Key, LocalProvider, PrivateKey, Timestamp, @@ -58,6 +59,7 @@ export class HieroClient { topicId: HieroId, transaction: GradidoTransaction, ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { + this.logger.addContext('topicId', topicId.toString()) const serializedTransaction = transaction.getSerializedTransaction() if (!serializedTransaction) { throw new Error('cannot serialize transaction') @@ -84,10 +86,16 @@ export class HieroClient { } public async getTopicInfo(topicId: HieroId): Promise { + this.logger.addContext('topicId', topicId.toString()) const info = await new TopicInfoQuery() .setTopicId(TopicId.fromString(topicId)) .execute(this.client) - this.logger.debug(JSON.stringify(info, null, 2)) + this.logger.info(`topic is valid until ${info.expirationTime?.toDate()?.toLocaleString()}`) + if (info.topicMemo) { + this.logger.info(`topic memo: ${info.topicMemo}`) + } + this.logger.debug(`topic sequence number: ${info.sequenceNumber.toNumber()}`) + // this.logger.debug(JSON.stringify(info, null, 2)) return parse(topicInfoSchema, { topicId: topicId.toString(), sequenceNumber: info.sequenceNumber.toNumber(), @@ -97,16 +105,26 @@ export class HieroClient { }) } - public async createTopic(): Promise { - let transaction = await new TopicCreateTransaction().freezeWithSigner(this.wallet) + public async createTopic(topicMemo?: string): Promise { + let transaction = new TopicCreateTransaction({ + topicMemo, + adminKey: undefined, + submitKey: undefined, + autoRenewPeriod: undefined, + autoRenewAccountId: undefined, + }) + + transaction = await transaction.freezeWithSigner(this.wallet) transaction = await transaction.signWithSigner(this.wallet) const createResponse = await transaction.executeWithSigner(this.wallet) const createReceipt = await createResponse.getReceiptWithSigner(this.wallet) this.logger.debug(createReceipt.toString()) + this.logger.addContext('topicId', createReceipt.topicId?.toString()) return parse(hieroIdSchema, createReceipt.topicId?.toString()) } public async updateTopic(topicId: HieroId): Promise { + this.logger.addContext('topicId', topicId.toString()) let transaction = new TopicUpdateTransaction() transaction.setExpirationTime(new Date(new Date().getTime() + MIN_AUTORENEW_PERIOD * 1000)) transaction.setTopicId(TopicId.fromString(topicId)) diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index d4184d9d6..164b78601 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -7,8 +7,8 @@ dotenv.config() type ConfigOutput = InferOutput let config: ConfigOutput -console.info('Config loading...') try { + console.info('Config loading...') config = parse(configSchema, process.env) } catch (error: Error | unknown) { if (error instanceof ValiError) { diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 733bbcfc0..cafd1a006 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -81,7 +81,7 @@ async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): let homeCommunity = await backend.getHomeCommunityDraft() // on missing topicId, create one if (!homeCommunity.hieroTopicId) { - const topicId = await hiero.createTopic() + const topicId = await hiero.createTopic(homeCommunity.name) // update topic on backend server homeCommunity = await backend.setHomeCommunityTopicId(homeCommunity.uuid, topicId) } else { diff --git a/dlt-connector/src/schemas/base.schema.ts b/dlt-connector/src/schemas/base.schema.ts index 2e065f55d..da3dbfdfa 100644 --- a/dlt-connector/src/schemas/base.schema.ts +++ b/dlt-connector/src/schemas/base.schema.ts @@ -1,9 +1,2 @@ import { MemoryBlock } from 'gradido-blockchain-js' import * as v from 'valibot' - -export const keyGenerationSeedSchema = v.pipe( - v.string('expect string type'), - v.hexadecimal('expect hexadecimal string'), - v.length(64, 'expect seed length minimum 64 characters (32 Bytes)'), - v.transform((input: string) => MemoryBlock.fromHex(input)), -) diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts index bddb7048f..b084e8531 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -128,8 +128,8 @@ declare const validHieroTransactionId: unique symbol export type HieroTransactionId = string & { [validHieroTransactionId]: true } export const hieroTransactionIdSchema = v.pipe( - v.string('expect hiero transaction id type, for example 0.0.141760-1755138896-607329203'), - v.regex(/^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-[0-9]+$/), + v.string('expect hiero transaction id type, for example 0.0.141760-1755138896-607329203 or 0.0.141760@1755138896.607329203'), + v.regex(/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+-[0-9]+|@[0-9]+\.[0-9]+)$/), v.transform((input: string) => input as HieroTransactionId), ) From eb3bf5e9049bd65c11773b82324d500def3d15cb Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 16 Sep 2025 07:13:02 +0200 Subject: [PATCH 32/72] update with hiero changes and other changes --- .../dltConnector/DltConnectorClient.test.ts | 125 ------------ .../apis/dltConnector/DltConnectorClient.ts | 52 ++--- .../__mocks__/DltConnectorClient.ts | 55 ++++++ .../AbstractTransactionToDlt.role.ts | 3 +- .../TransactionLinkDeleteToDlt.role.ts | 20 +- .../TransactionLinkToDlt.role.ts | 20 +- .../transactionToDlt/TransactionToDlt.role.ts | 2 +- .../transactionToDlt/UserToDlt.role.ts | 15 +- .../transactionToDlt.context.ts | 29 +-- .../dltConnector/model/AccountIdentifier.ts | 17 ++ .../model/CommunityAccountIdentifier.ts | 10 + .../apis/dltConnector/model/CommunityUser.ts | 10 - .../dltConnector/model/TransactionDraft.ts | 6 +- .../dltConnector/model/TransactionError.ts | 7 - .../dltConnector/model/TransactionRecipe.ts | 7 - .../dltConnector/model/TransactionResult.ts | 8 - .../apis/dltConnector/model/UserIdentifier.ts | 17 -- .../sendTransactionsToDltConnector.test.ts | 81 +------- .../sendTransactionsToDltConnector.ts | 2 +- bun.lock | 8 +- .../DltTransaction.ts | 36 ---- .../0088-add_dlt_users_table/DltUser.ts | 37 ---- .../entity/0088-add_dlt_users_table/User.ts | 182 ----------------- .../0089-merge_dlt_tables/DltTransaction.ts | 55 ------ .../0089-merge_dlt_tables/Transaction.ts | 176 ----------------- .../0089-merge_dlt_tables/TransactionLink.ts | 85 -------- database/entity/0089-merge_dlt_tables/User.ts | 186 ------------------ database/entity/DltTransaction.ts | 1 - database/entity/Transaction.ts | 1 - database/entity/TransactionLink.ts | 1 - database/entity/User.ts | 1 - dlt-connector/src/client/hiero/HieroClient.ts | 6 + dlt-connector/src/index.ts | 5 +- .../sendToHiero/SendToHiero.context.ts | 10 +- dlt-connector/src/server/index.ts | 27 ++- yarn.lock | 5 + 36 files changed, 208 insertions(+), 1100 deletions(-) create mode 100644 backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts create mode 100644 backend/src/apis/dltConnector/model/AccountIdentifier.ts create mode 100644 backend/src/apis/dltConnector/model/CommunityAccountIdentifier.ts delete mode 100644 backend/src/apis/dltConnector/model/CommunityUser.ts delete mode 100644 backend/src/apis/dltConnector/model/TransactionError.ts delete mode 100644 backend/src/apis/dltConnector/model/TransactionRecipe.ts delete mode 100644 backend/src/apis/dltConnector/model/TransactionResult.ts delete mode 100644 backend/src/apis/dltConnector/model/UserIdentifier.ts delete mode 100644 database/entity/0088-add_dlt_users_table/DltTransaction.ts delete mode 100644 database/entity/0088-add_dlt_users_table/DltUser.ts delete mode 100644 database/entity/0088-add_dlt_users_table/User.ts delete mode 100644 database/entity/0089-merge_dlt_tables/DltTransaction.ts delete mode 100644 database/entity/0089-merge_dlt_tables/Transaction.ts delete mode 100644 database/entity/0089-merge_dlt_tables/TransactionLink.ts delete mode 100644 database/entity/0089-merge_dlt_tables/User.ts delete mode 100644 database/entity/DltTransaction.ts delete mode 100644 database/entity/Transaction.ts delete mode 100644 database/entity/TransactionLink.ts delete mode 100644 database/entity/User.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.test.ts b/backend/src/apis/dltConnector/DltConnectorClient.test.ts index 00b15348d..0e2043a09 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.test.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.test.ts @@ -1,46 +1,7 @@ -import { Transaction as DbTransaction } from 'database' -import { Decimal } from 'decimal.js-light' -import { DataSource } from 'typeorm' - -import { cleanDB, testEnvironment } from '@test/helpers' - import { CONFIG } from '@/config' -import { LogError } from '@/server/LogError' import { DltConnectorClient } from './DltConnectorClient' -let con: DataSource - -let testEnv: { - con: DataSource -} - -// Mock the GraphQLClient -jest.mock('graphql-request', () => { - const originalModule = jest.requireActual('graphql-request') - - return { - __esModule: true, - ...originalModule, - GraphQLClient: jest.fn().mockImplementation((url: string) => { - if (url === 'invalid') { - throw new Error('invalid url') - } - return { - // why not using mockResolvedValueOnce or mockReturnValueOnce? - // I have tried, but it didn't work and return every time the first value - request: jest.fn().mockImplementation(() => { - return Promise.resolve({ - transmitTransaction: { - succeed: true, - }, - }) - }), - } - }), - } -}) - describe('undefined DltConnectorClient', () => { it('invalid url', () => { CONFIG.DLT_CONNECTOR_URL = 'invalid' @@ -58,90 +19,4 @@ describe('undefined DltConnectorClient', () => { }) }) -/* -describe.skip('transmitTransaction, without db connection', () => { - const transaction = new DbTransaction() - transaction.typeId = 2 // Example transaction type ID - transaction.amount = new Decimal('10.00') // Example amount - transaction.balanceDate = new Date() // Example creation date - transaction.id = 1 // Example transaction ID - it('cannot query for transaction id', async () => { - const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) - expect(result).toBe(false) - }) -}) -*/ - -describe('transmitTransaction', () => { - beforeAll(async () => { - testEnv = await testEnvironment() - con = testEnv.con - await cleanDB() - }) - - afterAll(async () => { - await cleanDB() - await con.destroy() - }) - - const transaction = new DbTransaction() - transaction.typeId = 2 // Example transaction type ID - transaction.amount = new Decimal('10.00') // Example amount - transaction.balanceDate = new Date() // Example creation date - transaction.id = 1 // Example transaction ID - - // data needed to let save succeed - transaction.memo = "I'm a dummy memo" - transaction.userId = 1 - transaction.userGradidoID = 'dummy gradido id' - - /* - it.skip('cannot find transaction in db', async () => { - const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) - expect(result).toBe(false) - }) - */ - - it('invalid transaction type', async () => { - const localTransaction = new DbTransaction() - localTransaction.typeId = 12 - try { - await DltConnectorClient.getInstance()?.transmitTransaction(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() - - const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) - expect(result).toBe(true) - }) - - it.skip('invalid dltTransactionId (maximal 32 Bytes in Binary)', async () => { - await transaction.save() - - const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) - expect(result).toBe(false) - }) - */ -}) - -/* -describe.skip('try transmitTransaction but graphql request failed', () => { - it('graphql request should throw', async () => { - const transaction = new DbTransaction() - transaction.typeId = 2 // Example transaction type ID - transaction.amount = new Decimal('10.00') // Example amount - transaction.balanceDate = new Date() // Example creation date - transaction.id = 1 // Example transaction ID - const result = await DltConnectorClient.getInstance()?.transmitTransaction(transaction) - expect(result).toBe(false) - }) -}) -*/ diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 4fef742ed..16c74ab0c 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -3,29 +3,10 @@ import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' import { getLogger } from 'log4js' import { TransactionDraft } from './model/TransactionDraft' -import { TransactionResult } from './model/TransactionResult' -import { GraphQLClient } from 'graphql-request' -import { gql } from 'graphql-request' +import { IRestResponse, RestClient } from 'typed-rest-client' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector`) -const sendTransaction = gql` - mutation ($input: TransactionDraft!) { - sendTransaction(data: $input) { - error { - message - name - } - succeed - recipe { - createdAt - type - messageIdHex - } - } - } -` - // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts /** @@ -35,7 +16,7 @@ const sendTransaction = gql` export class DltConnectorClient { private static instance: DltConnectorClient - client: GraphQLClient + client: RestClient /** * The Singleton's constructor should always be private to prevent direct * construction calls with the `new` operator. @@ -59,16 +40,12 @@ export class DltConnectorClient { } if (!DltConnectorClient.instance.client) { try { - DltConnectorClient.instance.client = new GraphQLClient(CONFIG.DLT_CONNECTOR_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - jsonSerializer: { - parse: JSON.parse, - stringify: JSON.stringify, - }, - }) + DltConnectorClient.instance.client = new RestClient( + 'gradido-backend', + CONFIG.DLT_CONNECTOR_URL, + undefined, + { keepAlive: true } + ) } catch (e) { logger.error("couldn't connect to dlt-connector: ", e) return @@ -78,16 +55,11 @@ export class DltConnectorClient { } /** - * transmit transaction via dlt-connector to iota - * and update dltTransactionId of transaction in db with iota message id + * transmit transaction via dlt-connector to hiero + * and update dltTransactionId of transaction in db with hiero transaction id */ - public async sendTransaction(input: TransactionDraft): Promise { + 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 result + return await this.client.create('/sendTransaction', input) } } diff --git a/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts b/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts new file mode 100644 index 000000000..81a7c5398 --- /dev/null +++ b/backend/src/apis/dltConnector/__mocks__/DltConnectorClient.ts @@ -0,0 +1,55 @@ +import { CONFIG } from '@/config' +import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' +import { getLogger } from 'log4js' + +import { TransactionDraft } from '@/apis/dltConnector/model/TransactionDraft' +import { IRestResponse } from 'typed-rest-client' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector`) + +// 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. + */ + +export class DltConnectorClient { + private static instance: DltConnectorClient + /** + * The Singleton's constructor should always be private to prevent direct + * construction calls with the `new` operator. + */ + + 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(): DltConnectorClient | undefined { + if (!CONFIG.DLT_CONNECTOR || !CONFIG.DLT_CONNECTOR_URL) { + logger.info(`dlt-connector are disabled via config...`) + return + } + if (!DltConnectorClient.instance) { + DltConnectorClient.instance = new DltConnectorClient() + } + return DltConnectorClient.instance + } + + /** + * transmit transaction via dlt-connector to hiero + * and update dltTransactionId of transaction in db with hiero transaction id + */ + public async sendTransaction(input: TransactionDraft): Promise> { + logger.debug('transmit transaction or user to dlt connector', input) + return Promise.resolve({ + statusCode: 200, + result: 'test', + headers: {}, + }) + } +} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts index 5e756fb7d..22f7104b2 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts @@ -3,8 +3,7 @@ import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from 'typeorm' import { DltTransaction } from 'database' import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' +import { Logger } from 'log4js' export abstract class AbstractTransactionToDltRole { protected self: T | null diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts index b8eaa633a..d4964a9f8 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts @@ -2,14 +2,14 @@ import { DltTransaction, TransactionLink } from 'database' 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 { AccountIdentifier } from '@dltConnector/model/AccountIdentifier' import { LogError } from '@/server/LogError' import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' +import { CommunityAccountIdentifier } from '@dltConnector/model/CommunityAccountIdentifier' /** * redeem deferred transfer transaction by creator, so "deleting" it @@ -17,7 +17,10 @@ import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' export class TransactionLinkDeleteToDltRole extends AbstractTransactionToDltRole { async initWithLast(): Promise { const queryBuilder = this.createQueryForPendingItems( - TransactionLink.createQueryBuilder().leftJoinAndSelect('TransactionLink.user', 'user'), + TransactionLink + .createQueryBuilder() + .leftJoinAndSelect('TransactionLink.user', 'user') + .leftJoinAndSelect('user.community', 'community'), 'TransactionLink.id = dltTransaction.transactionLinkId and dltTransaction.type_id <> 4', // eslint-disable-next-line camelcase { TransactionLink_deletedAt: 'ASC', User_id: 'ASC' }, @@ -67,8 +70,15 @@ export class TransactionLinkDeleteToDltRole extends AbstractTransactionToDltRole 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, 1)) + if (!user.community) { + throw new LogError(`missing community for user ${user.id}`) + } + const topicId = user.community.hieroTopicId + if (!topicId) { + throw new LogError(`missing topicId for community ${user.community.id}`) + } + draft.user = new AccountIdentifier(topicId, new IdentifierSeed(this.self.code)) + draft.linkedUser = new AccountIdentifier(topicId, new CommunityAccountIdentifier(user.gradidoID)) draft.createdAt = this.self.deletedAt.toISOString() 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 3d2717301..05f9d319e 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts @@ -2,14 +2,14 @@ import { DltTransaction, TransactionLink } from 'database' 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 { AccountIdentifier } from '@dltConnector/model/AccountIdentifier' import { LogError } from '@/server/LogError' import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' +import { CommunityAccountIdentifier } from '../../model/CommunityAccountIdentifier' /** * send transactionLink as Deferred Transfers @@ -17,7 +17,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') + .leftJoinAndSelect('user.community', 'community'), 'TransactionLink.id = dltTransaction.transactionLinkId', // eslint-disable-next-line camelcase { TransactionLink_createdAt: 'ASC', User_id: 'ASC' }, @@ -39,8 +42,15 @@ export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { async initWithLast(): Promise { this.self = await this.createQueryForPendingItems( - User.createQueryBuilder(), + User.createQueryBuilder().leftJoinAndSelect('User.community', 'community'), 'User.id = dltTransaction.userId', // eslint-disable-next-line camelcase { User_created_at: 'ASC', User_id: 'ASC' }, @@ -36,8 +36,15 @@ export class UserToDltRole extends AbstractTransactionToDltRole { if (!this.self) { throw new LogError('try to create dlt entry for empty transaction') } + if (!this.self.community) { + throw new LogError(`missing community for user ${this.self.id}`) + } + const topicId = this.self.community.hieroTopicId + if (!topicId) { + throw new LogError(`missing topicId for community ${this.self.community.id}`) + } const draft = new TransactionDraft() - draft.user = new UserIdentifier(this.self.communityUuid, new CommunityUser(this.self.gradidoID)) + draft.user = new AccountIdentifier(topicId, new CommunityAccountIdentifier(this.self.gradidoID)) draft.createdAt = this.self.createdAt.toISOString() draft.accountType = AccountType.COMMUNITY_HUMAN draft.type = TransactionType.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 b03bd5300..cb1d8cca2 100644 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts +++ b/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts @@ -1,14 +1,13 @@ import { Transaction, TransactionLink, User } from 'database' import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' -import { TransactionResult } from '@/apis/dltConnector/model/TransactionResult' 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' -import { getLogger } from 'log4js' +import { getLogger, Logger } from 'log4js' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' /** @@ -16,10 +15,9 @@ import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' * 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< + async function findNextPendingTransaction(logger: Logger): Promise< AbstractTransactionToDltRole > { - const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}/apis/dltConnector/interaction/transactionToDlt`) // collect each oldest not sended entity from db and choose oldest const results = await Promise.all([ new TransactionToDltRole(logger).initWithLast(), @@ -34,18 +32,28 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis }) return results[0] } + + const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector.interaction.transactionToDlt`) while (true) { - const pendingTransactionRole = await findNextPendingTransaction() + const pendingTransactionRole = await findNextPendingTransaction(logger) const pendingTransaction = pendingTransactionRole.getEntity() if (!pendingTransaction) { break } let messageId = '' let error: string | null = null - let result: TransactionResult | undefined try { - result = await dltConnector.sendTransaction(pendingTransactionRole.convertToGraphqlInput()) + const result = await dltConnector.sendTransaction( + pendingTransactionRole.convertToGraphqlInput() + ) + if (result.statusCode === 200 && result.result) { + messageId = result.result + } else { + error = `empty result with status code ${result.statusCode}` + logger.error('error from dlt-connector', result) + } } catch (e) { + logger.debug(e) if (e instanceof Error) { error = e.message } else if (typeof e === 'string') { @@ -54,13 +62,6 @@ export async function transactionToDlt(dltConnector: DltConnectorClient): Promis throw e } } - 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/AccountIdentifier.ts b/backend/src/apis/dltConnector/model/AccountIdentifier.ts new file mode 100644 index 000000000..ed1d61e51 --- /dev/null +++ b/backend/src/apis/dltConnector/model/AccountIdentifier.ts @@ -0,0 +1,17 @@ +import { CommunityAccountIdentifier } from './CommunityAccountIdentifier' +import { IdentifierSeed } from './IdentifierSeed' + +export class AccountIdentifier { + communityTopicId: string + account?: CommunityAccountIdentifier + seed?: IdentifierSeed // used for deferred transfers + + constructor(communityTopicId: string, input: CommunityAccountIdentifier | IdentifierSeed) { + if (input instanceof CommunityAccountIdentifier) { + this.account = input + } else if (input instanceof IdentifierSeed) { + this.seed = input + } + this.communityTopicId = communityTopicId + } +} diff --git a/backend/src/apis/dltConnector/model/CommunityAccountIdentifier.ts b/backend/src/apis/dltConnector/model/CommunityAccountIdentifier.ts new file mode 100644 index 000000000..1e8b6a64f --- /dev/null +++ b/backend/src/apis/dltConnector/model/CommunityAccountIdentifier.ts @@ -0,0 +1,10 @@ +export class CommunityAccountIdentifier { + // for community user, uuid and communityUuid used + userUuid: string + accountNr?: number + + constructor(userUuid: string, accountNr?: number) { + this.userUuid = userUuid + this.accountNr = accountNr + } +} diff --git a/backend/src/apis/dltConnector/model/CommunityUser.ts b/backend/src/apis/dltConnector/model/CommunityUser.ts deleted file mode 100644 index 0a4eadebf..000000000 --- a/backend/src/apis/dltConnector/model/CommunityUser.ts +++ /dev/null @@ -1,10 +0,0 @@ -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/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts index d197fe629..8dba79bdc 100755 --- a/backend/src/apis/dltConnector/model/TransactionDraft.ts +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -2,12 +2,12 @@ import { AccountType } from '@dltConnector/enum/AccountType' import { TransactionType } from '@dltConnector/enum/TransactionType' -import { UserIdentifier } from './UserIdentifier' +import { AccountIdentifier } from './AccountIdentifier' export class TransactionDraft { - user: UserIdentifier + user: AccountIdentifier // not used for simply register address - linkedUser?: UserIdentifier + linkedUser?: AccountIdentifier // not used for register address amount?: string memo?: string diff --git a/backend/src/apis/dltConnector/model/TransactionError.ts b/backend/src/apis/dltConnector/model/TransactionError.ts deleted file mode 100644 index a2b1348a5..000000000 --- a/backend/src/apis/dltConnector/model/TransactionError.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TransactionErrorType } from '@dltConnector/enum/TransactionErrorType' - -export interface TransactionError { - type: TransactionErrorType - message: string - name: string -} diff --git a/backend/src/apis/dltConnector/model/TransactionRecipe.ts b/backend/src/apis/dltConnector/model/TransactionRecipe.ts deleted file mode 100644 index 504ff2044..000000000 --- a/backend/src/apis/dltConnector/model/TransactionRecipe.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TransactionType } from '@dltConnector/enum/TransactionType' - -export interface TransactionRecipe { - createdAt: string - type: TransactionType - messageIdHex: string -} diff --git a/backend/src/apis/dltConnector/model/TransactionResult.ts b/backend/src/apis/dltConnector/model/TransactionResult.ts deleted file mode 100644 index 510907429..000000000 --- a/backend/src/apis/dltConnector/model/TransactionResult.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TransactionError } from './TransactionError' -import { TransactionRecipe } from './TransactionRecipe' - -export interface TransactionResult { - error?: TransactionError - recipe?: TransactionRecipe - succeed: boolean -} diff --git a/backend/src/apis/dltConnector/model/UserIdentifier.ts b/backend/src/apis/dltConnector/model/UserIdentifier.ts deleted file mode 100644 index 059405bd0..000000000 --- a/backend/src/apis/dltConnector/model/UserIdentifier.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommunityUser } from './CommunityUser' -import { IdentifierSeed } from './IdentifierSeed' - -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 - } -} diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts index b5ec0a08a..50af15e9a 100644 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts @@ -1,9 +1,5 @@ -import { ApolloServerTestClient } from 'apollo-server-testing' import { Community, DltTransaction, Transaction } from 'database' import { Decimal } from 'decimal.js-light' -// import { GraphQLClient } from 'graphql-request' -// import { Response } from 'graphql-request/dist/types' -import { GraphQLClient } from 'graphql-request' import { Response } from 'graphql-request/dist/types' import { DataSource } from 'typeorm' import { v4 as uuidv4 } from 'uuid' @@ -15,11 +11,11 @@ import { CONFIG } from '@/config' import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' import { creations } from '@/seeds/creation' import { creationFactory } from '@/seeds/factory/creation' -import { userFactory } from '@/seeds/factory/user' -import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' -import { bobBaumeister } from '@/seeds/users/bob-baumeister' -import { peterLustig } from '@/seeds/users/peter-lustig' -import { raeuberHotzenplotz } from '@/seeds/users/raeuber-hotzenplotz' +import { userFactory } from 'database/src/seeds/factory/user' +import { bibiBloxberg } from 'database/src/seeds/users/bibi-bloxberg' +import { bobBaumeister } from 'database/src/seeds/users/bob-baumeister' +import { peterLustig } from 'database/src/seeds/users/peter-lustig' +import { raeuberHotzenplotz } from 'database/src/seeds/users/raeuber-hotzenplotz' import { getLogger } from 'config-schema/test/testSetup' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' @@ -31,63 +27,6 @@ const logger = getLogger( `${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.util.sendTransactionsToDltConnector`, ) -/* -// Mock the GraphQLClient -jest.mock('graphql-request', () => { - const originalModule = jest.requireActual('graphql-request') - - let testCursor = 0 - - return { - __esModule: true, - ...originalModule, - GraphQLClient: jest.fn().mockImplementation((url: string) => { - if (url === 'invalid') { - throw new Error('invalid url') - } - return { - // why not using mockResolvedValueOnce or mockReturnValueOnce? - // I have tried, but it didn't work and return every time the first value - request: jest.fn().mockImplementation(() => { - testCursor++ - if (testCursor === 4) { - return Promise.resolve( - // invalid, is 33 Bytes long as binary - { - transmitTransaction: { - dltTransactionIdHex: - '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516212A', - }, - }, - ) - } else if (testCursor === 5) { - throw Error('Connection error') - } else { - return Promise.resolve( - // valid, is 32 Bytes long as binary - { - transmitTransaction: { - dltTransactionIdHex: - '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc51621', - }, - }, - ) - } - }), - } - }), - } -}) -let mutate: ApolloServerTestClient['mutate'], - query: ApolloServerTestClient['query'], - con: Connection -let testEnv: { - mutate: ApolloServerTestClient['mutate'] - query: ApolloServerTestClient['query'] - con: Connection -} -*/ - async function createHomeCommunity(): Promise { const homeCommunity = Community.create() homeCommunity.foreign = false @@ -336,8 +275,6 @@ async function createTxReceive1FromSend3(verified: boolean): Promise { CONFIG.DLT_CONNECTOR = true - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - return { - data: { - sendTransaction: { succeed: true }, - }, - } as Response - }) - await sendTransactionsToDltConnector() expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts index 3b0bfbc27..ef58ed606 100644 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts +++ b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts @@ -16,7 +16,7 @@ import { transactionToDlt } from './interaction/transactionToDlt/transactionToDl import { getLogger } from 'log4js' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' -const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}/apis/dltConnector/sendTransactionsToDltConnector`) +const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector.sendTransactionsToDltConnector`) let isLoopRunning = true diff --git a/bun.lock b/bun.lock index b49609f5c..532b20dc6 100644 --- a/bun.lock +++ b/bun.lock @@ -113,10 +113,10 @@ "await-semaphore": "^0.1.3", "axios": "^0.21.1", "class-validator": "^0.13.1", - "config-schema": "workspace:*", - "core": "workspace:*", + "config-schema": "*", + "core": "*", "cors": "^2.8.5", - "database": "workspace:*", + "database": "*", "decimal.js-light": "^2.5.1", "dotenv": "^10.0.0", "esbuild": "^0.25.2", @@ -146,7 +146,7 @@ "random-bigint": "^0.0.1", "reflect-metadata": "^0.1.13", "regenerator-runtime": "^0.14.1", - "shared": "workspace:*", + "shared": "*", "source-map-support": "^0.5.21", "ts-jest": "29.4.0", "ts-node": "^10.9.2", diff --git a/database/entity/0088-add_dlt_users_table/DltTransaction.ts b/database/entity/0088-add_dlt_users_table/DltTransaction.ts deleted file mode 100644 index 653077bac..000000000 --- a/database/entity/0088-add_dlt_users_table/DltTransaction.ts +++ /dev/null @@ -1,36 +0,0 @@ -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/0088-add_dlt_users_table/DltUser.ts b/database/entity/0088-add_dlt_users_table/DltUser.ts deleted file mode 100644 index 2b9dccb3f..000000000 --- a/database/entity/0088-add_dlt_users_table/DltUser.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' -// 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 { - @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 - - @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/0088-add_dlt_users_table/User.ts b/database/entity/0088-add_dlt_users_table/User.ts deleted file mode 100644 index f9b079a04..000000000 --- a/database/entity/0088-add_dlt_users_table/User.ts +++ /dev/null @@ -1,182 +0,0 @@ -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' -// removed in current version -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/0089-merge_dlt_tables/DltTransaction.ts b/database/entity/0089-merge_dlt_tables/DltTransaction.ts deleted file mode 100644 index 012bddf0b..000000000 --- a/database/entity/0089-merge_dlt_tables/DltTransaction.ts +++ /dev/null @@ -1,55 +0,0 @@ -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: 'type_id', unsigned: true, nullable: false }) - typeId: 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 - - @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/0089-merge_dlt_tables/Transaction.ts b/database/entity/0089-merge_dlt_tables/Transaction.ts deleted file mode 100644 index 8eec4e1a9..000000000 --- a/database/entity/0089-merge_dlt_tables/Transaction.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* 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: 'transaction_link_id' }) - transactionLink?: TransactionLink | null -} diff --git a/database/entity/0089-merge_dlt_tables/TransactionLink.ts b/database/entity/0089-merge_dlt_tables/TransactionLink.ts deleted file mode 100644 index 18bcf9892..000000000 --- a/database/entity/0089-merge_dlt_tables/TransactionLink.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Decimal } from 'decimal.js-light' -import { - BaseEntity, - Entity, - PrimaryGeneratedColumn, - Column, - 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 { - @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 - - @OneToOne(() => User, (user) => user.transactionLink) - @JoinColumn({ name: 'userId' }) - user: User - - @OneToMany(() => Transaction, (transaction) => transaction.transactionLink) - @JoinColumn({ referencedColumnName: 'transaction_link_id' }) - transactions: Transaction[] -} diff --git a/database/entity/0089-merge_dlt_tables/User.ts b/database/entity/0089-merge_dlt_tables/User.ts deleted file mode 100644 index 64a6261ab..000000000 --- a/database/entity/0089-merge_dlt_tables/User.ts +++ /dev/null @@ -1,186 +0,0 @@ -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' -import { TransactionLink } from './TransactionLink' - -@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 - - @OneToOne(() => TransactionLink, (transactionLink) => transactionLink.userId) - @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) - transactionLink?: TransactionLink | null -} diff --git a/database/entity/DltTransaction.ts b/database/entity/DltTransaction.ts deleted file mode 100644 index bc3244dc0..000000000 --- a/database/entity/DltTransaction.ts +++ /dev/null @@ -1 +0,0 @@ -export { DltTransaction } from './0089-merge_dlt_tables/DltTransaction' diff --git a/database/entity/Transaction.ts b/database/entity/Transaction.ts deleted file mode 100644 index 2f4b2ccfc..000000000 --- a/database/entity/Transaction.ts +++ /dev/null @@ -1 +0,0 @@ -export { Transaction } from './0089-merge_dlt_tables/Transaction' diff --git a/database/entity/TransactionLink.ts b/database/entity/TransactionLink.ts deleted file mode 100644 index fa8af166d..000000000 --- a/database/entity/TransactionLink.ts +++ /dev/null @@ -1 +0,0 @@ -export { TransactionLink } from './0089-merge_dlt_tables/TransactionLink' diff --git a/database/entity/User.ts b/database/entity/User.ts deleted file mode 100644 index 92b529cb1..000000000 --- a/database/entity/User.ts +++ /dev/null @@ -1 +0,0 @@ -export { User } from './0089-merge_dlt_tables/User' diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index c06eedf8b..9c48800d8 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -75,6 +75,8 @@ export class HieroClient { this.logger.info( `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, ) + const record = await sendResponse.getRecordWithSigner(this.wallet) + this.logger.info(`message sent, cost: ${record.transactionFee.toString()}`) return { receipt: sendReceipt, response: sendResponse } } @@ -120,6 +122,8 @@ export class HieroClient { const createReceipt = await createResponse.getReceiptWithSigner(this.wallet) this.logger.debug(createReceipt.toString()) this.logger.addContext('topicId', createReceipt.topicId?.toString()) + const record = await createResponse.getRecordWithSigner(this.wallet) + this.logger.info(`topic created, cost: ${record.transactionFee.toString()}`) return parse(hieroIdSchema, createReceipt.topicId?.toString()) } @@ -133,5 +137,7 @@ export class HieroClient { const updateResponse = await transaction.executeWithSigner(this.wallet) const updateReceipt = await updateResponse.getReceiptWithSigner(this.wallet) this.logger.debug(updateReceipt.toString()) + const record = await updateResponse.getRecordWithSigner(this.wallet) + this.logger.info(`topic updated, cost: ${record.transactionFee.toString()}`) } } diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index cafd1a006..e2eb30a8a 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -87,7 +87,8 @@ async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): } else { // if topic exist, check if we need to update it let topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) - if ( + console.log(`topicInfo: ${JSON.stringify(topicInfo, null, 2)}`) + /*if ( topicInfo.expirationTime.getTime() - new Date().getTime() < MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE ) { @@ -96,7 +97,7 @@ async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): logger.info( `updated topic info, new expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, ) - } + }*/ } if (!homeCommunity.hieroTopicId) { throw new Error('still no topic id, after creating topic and update community in backend.') diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index c363ad263..996be0d10 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -88,19 +88,19 @@ export async function SendToHieroContext( if (builder.isCrossCommunityTransaction()) { const outboundTransaction = builder.buildOutbound() validate(outboundTransaction) - const outboundIotaMessageId = await sendViaHiero( + const outboundHieroTransactionId = await sendViaHiero( outboundTransaction, role.getSenderCommunityTopicId(), ) - builder.setParentMessageId(MemoryBlock.createPtr(new MemoryBlock(outboundIotaMessageId))) + builder.setParentMessageId(MemoryBlock.createPtr(new MemoryBlock(outboundHieroTransactionId))) const inboundTransaction = builder.buildInbound() validate(inboundTransaction) await sendViaHiero(inboundTransaction, role.getRecipientCommunityTopicId()) - return parse(hieroTransactionIdSchema, outboundIotaMessageId) + return parse(hieroTransactionIdSchema, outboundHieroTransactionId) } else { const transaction = builder.build() validate(transaction) - const iotaMessageId = await sendViaHiero(transaction, role.getSenderCommunityTopicId()) - return parse(hieroTransactionIdSchema, iotaMessageId) + const hieroTransactionId = await sendViaHiero(transaction, role.getSenderCommunityTopicId()) + return parse(hieroTransactionIdSchema, hieroTransactionId) } } diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index c3a00d4e3..3aa13dcac 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,4 +1,5 @@ import { TypeBoxFromValibot } from '@sinclair/typemap' +import { Type } from '@sinclair/typebox' import { Elysia, status } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' import { getLogger } from 'log4js' @@ -46,11 +47,30 @@ export const appRoutes = new Elysia() ) .post( '/sendTransaction', - async ({ body }) => await SendToHieroContext(parse(transactionSchema, body)), + async ({ body }) => { + console.log("sendTransaction was called") + return "0.0.123" + console.log(body) + console.log(parse(transactionSchema, body)) + const transaction = parse(transactionSchema, body) + return await SendToHieroContext(transaction) + }, // validation schemas { - body: TypeBoxFromValibot(transactionSchema), - response: TypeBoxFromValibot(hieroTransactionIdSchema), + // body: TypeBoxFromValibot(transactionSchema), + body: Type.Object({ + user: Type.Object({ + communityUser: Type.Object({ + uuid: Type.String({ format: 'uuid' }), + accountNr: Type.Optional(Type.String()), // optional/undefined + }), + communityUuid: Type.String({ format: 'uuid' }), + }), + createdAt: Type.String({ format: 'date-time' }), + accountType: Type.Literal('COMMUNITY_HUMAN'), + type: Type.Literal('REGISTER_ADDRESS'), + }) + // response: TypeBoxFromValibot(hieroTransactionIdSchema), }, ) @@ -76,3 +96,4 @@ async function isAccountExist(identifierAccount: IdentifierAccount): Promise Date: Sat, 20 Sep 2025 15:21:55 +0200 Subject: [PATCH 33/72] simplify backend code for dlt connector calling --- .../apis/dltConnector/DltConnectorClient.ts | 7 +- .../dltConnector/enum/TransactionErrorType.ts | 14 - backend/src/apis/dltConnector/index.ts | 107 +++ .../AbstractTransactionToDlt.role.ts | 63 -- .../TransactionLinkDeleteToDlt.role.ts | 94 --- .../TransactionLinkToDlt.role.ts | 68 -- .../transactionToDlt/TransactionToDlt.role.ts | 105 --- .../transactionToDlt/UserToDlt.role.ts | 61 -- .../transactionToDlt.context.ts | 67 -- .../dltConnector/model/TransactionDraft.ts | 59 +- .../sendTransactionsToDltConnector.test.ts | 728 ------------------ .../sendTransactionsToDltConnector.ts | 69 -- .../graphql/resolver/ContributionResolver.ts | 36 +- .../graphql/resolver/TransactionResolver.ts | 21 +- backend/src/graphql/resolver/UserResolver.ts | 26 +- backend/src/index.ts | 2 +- dlt-connector/bun.lock | 2 +- dlt-connector/package.json | 2 +- .../client/backend/community.schema.test.ts | 2 + dlt-connector/src/client/hiero/HieroClient.ts | 17 +- .../src/data/KeyPairIdentifier.logic.ts | 8 +- dlt-connector/src/index.ts | 1 - .../KeyPairCalculation.context.test.ts | 99 +++ .../sendToHiero/CreationTransaction.role.ts | 7 +- .../RegisterAddressTransaction.role.test.ts | 35 + .../RegisterAddressTransaction.role.ts | 18 +- .../sendToHiero/SendToHiero.context.ts | 37 +- dlt-connector/src/schemas/account.schema.ts | 16 +- .../src/schemas/transaction.schema.test.ts | 69 +- .../src/schemas/transaction.schema.ts | 15 +- .../src/schemas/typeConverter.schema.test.ts | 41 +- .../src/schemas/typeConverter.schema.ts | 2 +- dlt-connector/src/schemas/typeGuard.schema.ts | 34 +- dlt-connector/src/server/index.test.ts | 75 ++ dlt-connector/src/server/index.ts | 37 +- 35 files changed, 639 insertions(+), 1405 deletions(-) delete mode 100644 backend/src/apis/dltConnector/enum/TransactionErrorType.ts create mode 100644 backend/src/apis/dltConnector/index.ts delete mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts delete mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts delete mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts delete mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts delete mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts delete mode 100644 backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts delete mode 100644 backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts delete mode 100644 backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts create mode 100644 dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts create mode 100644 dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts create mode 100644 dlt-connector/src/server/index.test.ts diff --git a/backend/src/apis/dltConnector/DltConnectorClient.ts b/backend/src/apis/dltConnector/DltConnectorClient.ts index 16c74ab0c..a5e162ba0 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.ts @@ -58,8 +58,11 @@ export class DltConnectorClient { * transmit transaction via dlt-connector to hiero * and update dltTransactionId of transaction in db with hiero transaction id */ - public async sendTransaction(input: TransactionDraft): Promise> { + public async sendTransaction(input: TransactionDraft): Promise> { logger.debug('transmit transaction or user to dlt connector', input) - return await this.client.create('/sendTransaction', input) + return await this.client.create<{ transactionId: string }>( + '/sendTransaction', + input + ) } } diff --git a/backend/src/apis/dltConnector/enum/TransactionErrorType.ts b/backend/src/apis/dltConnector/enum/TransactionErrorType.ts deleted file mode 100644 index 5a2c5485e..000000000 --- a/backend/src/apis/dltConnector/enum/TransactionErrorType.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Error Types for dlt-connector graphql responses - */ -export enum TransactionErrorType { - NOT_IMPLEMENTED_YET = 'Not Implemented yet', - MISSING_PARAMETER = 'Missing parameter', - ALREADY_EXIST = 'Already exist', - DB_ERROR = 'DB Error', - PROTO_DECODE_ERROR = 'Proto Decode Error', - PROTO_ENCODE_ERROR = 'Proto Encode Error', - INVALID_SIGNATURE = 'Invalid Signature', - LOGIC_ERROR = 'Logic Error', - NOT_FOUND = 'Not found', -} diff --git a/backend/src/apis/dltConnector/index.ts b/backend/src/apis/dltConnector/index.ts new file mode 100644 index 000000000..7780006e9 --- /dev/null +++ b/backend/src/apis/dltConnector/index.ts @@ -0,0 +1,107 @@ +import { IRestResponse } from 'typed-rest-client' +import { DltTransactionType } from './enum/DltTransactionType' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' +import { DltConnectorClient } from './DltConnectorClient' +import { + Community as DbCommunity, + Contribution as DbContribution, + DltTransaction as DbDltTransaction, + User as DbUser, + getHomeCommunity, +} from 'database' +import { TransactionDraft } from './model/TransactionDraft' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.dltConnector`) +// will be undefined if dlt connect is disabled +const dltConnectorClient = DltConnectorClient.getInstance() + +async function checkDltConnectorResult(dltTransaction: DbDltTransaction, clientResponse: Promise>) + : Promise { + // check result from dlt connector + try { + const response = await clientResponse + if (response.statusCode === 200 && response.result) { + dltTransaction.messageId = response.result.transactionId + } else { + dltTransaction.error = `empty result with status code ${response.statusCode}` + logger.error('error from dlt-connector', response) + } + } catch (e) { + logger.debug(e) + if (e instanceof Error) { + dltTransaction.error = e.message + } else if (typeof e === 'string') { + dltTransaction.error = e + } else { + throw e + } + } + return dltTransaction +} + +/** + * send register address transaction via dlt-connector to hiero + * and update dltTransactionId of transaction in db with hiero transaction id + */ +export async function registerAddressTransaction(user: DbUser, community: DbCommunity): Promise { + if (!user.id) { + logger.error(`missing id for user: ${user.gradidoID}, please call registerAddressTransaction after user.save()`) + return null + } + // return null if some data where missing and log error + const draft = TransactionDraft.createRegisterAddress(user, community) + if (draft && dltConnectorClient) { + const clientResponse = dltConnectorClient.sendTransaction(draft) + let dltTransaction = new DbDltTransaction() + dltTransaction.typeId = DltTransactionType.REGISTER_ADDRESS + if (user.id) { + dltTransaction.userId = user.id + } + dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) + return await dltTransaction.save() + } + return null +} + +export async function contributionTransaction( + contribution: DbContribution, + signingUser: DbUser, + createdAt: Date, +): Promise { + const homeCommunity = await getHomeCommunity() + if (!homeCommunity) { + logger.error('home community not found') + return null + } + const draft = TransactionDraft.createContribution(contribution, createdAt, signingUser, homeCommunity) + if (draft && dltConnectorClient) { + const clientResponse = dltConnectorClient.sendTransaction(draft) + let dltTransaction = new DbDltTransaction() + dltTransaction.typeId = DltTransactionType.CREATION + dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) + return await dltTransaction.save() + } + return null +} + +export async function transferTransaction( + senderUser: DbUser, + recipientUser: DbUser, + amount: string, + memo: string, + createdAt: Date +): Promise { + + const draft = TransactionDraft.createTransfer(senderUser, recipientUser, amount, memo, createdAt) + if (draft && dltConnectorClient) { + const clientResponse = dltConnectorClient.sendTransaction(draft) + let dltTransaction = new DbDltTransaction() + dltTransaction.typeId = DltTransactionType.TRANSFER + dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) + return await dltTransaction.save() + } + return null +} + + diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts deleted file mode 100644 index 22f7104b2..000000000 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/AbstractTransactionToDlt.role.ts +++ /dev/null @@ -1,63 +0,0 @@ -// eslint-disable-next-line import/no-extraneous-dependencies -import { ObjectLiteral, OrderByCondition, SelectQueryBuilder } from 'typeorm' -import { DltTransaction } from 'database' - -import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { Logger } from 'log4js' - -export abstract class AbstractTransactionToDltRole { - protected self: T | null - - // public interface - public abstract initWithLast(): Promise - public abstract getTimestamp(): number - public abstract convertToGraphqlInput(): TransactionDraft - - - public constructor(protected logger: Logger) {} - - 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.setJoinIdAndType(dltTransaction) - await DltTransaction.save(dltTransaction) - if (dltTransaction.error) { - this.logger.error( - `Store dltTransaction with error: id=${dltTransaction.id}, error=${dltTransaction.error}`, - ) - } else { - this.logger.info( - `Store dltTransaction: messageId=${dltTransaction.messageId}, id=${dltTransaction.id}`, - ) - } - } - - // intern - protected abstract setJoinIdAndType(dltTransaction: DltTransaction): void - - // helper - protected createQueryForPendingItems( - qb: SelectQueryBuilder, - joinCondition: string, - orderBy: OrderByCondition, - ): SelectQueryBuilder { - 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) - } - - 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/TransactionLinkDeleteToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts deleted file mode 100644 index d4964a9f8..000000000 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkDeleteToDlt.role.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { DltTransaction, TransactionLink } from 'database' - -import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' -import { TransactionType } from '@dltConnector/enum/TransactionType' -import { IdentifierSeed } from '@dltConnector/model/IdentifierSeed' -import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { AccountIdentifier } from '@dltConnector/model/AccountIdentifier' - -import { LogError } from '@/server/LogError' - -import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' -import { CommunityAccountIdentifier } from '@dltConnector/model/CommunityAccountIdentifier' - -/** - * 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') - .leftJoinAndSelect('user.community', 'community'), - '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 - if (!user.community) { - throw new LogError(`missing community for user ${user.id}`) - } - const topicId = user.community.hieroTopicId - if (!topicId) { - throw new LogError(`missing topicId for community ${user.community.id}`) - } - draft.user = new AccountIdentifier(topicId, new IdentifierSeed(this.self.code)) - draft.linkedUser = new AccountIdentifier(topicId, new CommunityAccountIdentifier(user.gradidoID)) - draft.createdAt = this.self.deletedAt.toISOString() - draft.type = TransactionType.GRADIDO_REDEEM_DEFERRED_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 deleted file mode 100644 index 05f9d319e..000000000 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionLinkToDlt.role.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { DltTransaction, TransactionLink } from 'database' - -import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' -import { TransactionType } from '@dltConnector/enum/TransactionType' -import { IdentifierSeed } from '@dltConnector/model/IdentifierSeed' -import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { AccountIdentifier } from '@dltConnector/model/AccountIdentifier' - -import { LogError } from '@/server/LogError' - -import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' -import { CommunityAccountIdentifier } from '../../model/CommunityAccountIdentifier' - -/** - * send transactionLink as Deferred Transfers - */ -export class TransactionLinkToDltRole extends AbstractTransactionToDltRole { - async initWithLast(): Promise { - this.self = await this.createQueryForPendingItems( - TransactionLink - .createQueryBuilder() - .leftJoinAndSelect('TransactionLink.user', 'user') - .leftJoinAndSelect('user.community', 'community'), - 'TransactionLink.id = dltTransaction.transactionLinkId', - // eslint-disable-next-line camelcase - { TransactionLink_createdAt: 'ASC', User_id: 'ASC' }, - ).getOne() - return this - } - - public getTimestamp(): number { - if (!this.self) { - return Infinity - } - return this.self.createdAt.getTime() - } - - public convertToGraphqlInput(): TransactionDraft { - if (!this.self) { - throw new LogError('try to create dlt entry for empty transaction link') - } - const draft = new TransactionDraft() - draft.amount = this.self.amount.abs().toString() - const user = this.self.user - if (!user.community) { - throw new LogError(`missing community for user ${user.id}`) - } - const topicId = user.community.hieroTopicId - if (!topicId) { - throw new LogError(`missing topicId for community ${user.community.id}`) - } - draft.user = new AccountIdentifier(topicId, new CommunityAccountIdentifier(user.gradidoID, 1)) - draft.linkedUser = new AccountIdentifier(topicId, new IdentifierSeed(this.self.code)) - draft.createdAt = this.self.createdAt.toISOString() - draft.timeoutDuration = (this.self.validUntil.getTime() - this.self.createdAt.getTime()) / 1000 - draft.memo = this.self.memo - draft.type = TransactionType.GRADIDO_DEFERRED_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.DEFERRED_TRANSFER - } -} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts deleted file mode 100644 index 63f25d22d..000000000 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/TransactionToDlt.role.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { DltTransaction, Transaction } from 'database' - -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 '@/apis/dltConnector/model/AccountIdentifier' - -import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' -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 { - private type: DltTransactionType - async initWithLast(): Promise { - this.self = await this.createQueryForPendingItems( - 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.type_id <> :typeId', { typeId: TransactionTypeId.RECEIVE }) - .getOne() - return this - } - - public getTimestamp(): number { - if (!this.self) { - return Infinity - } - return this.self.balanceDate.getTime() - } - - public convertToGraphqlInput(): TransactionDraft { - if (!this.self) { - throw new LogError('try to create dlt entry for empty transaction') - } - const draft = new TransactionDraft() - draft.amount = this.self.amount.abs().toString() - - switch (this.self.typeId as TransactionTypeId) { - case TransactionTypeId.CREATION: - draft.type = TransactionType.GRADIDO_CREATION - this.type = DltTransactionType.CREATION - break - case TransactionTypeId.SEND: - case TransactionTypeId.RECEIVE: - draft.type = TransactionType.GRADIDO_TRANSFER - this.type = DltTransactionType.TRANSFER - break - default: - this.type = DltTransactionType.UNKNOWN - throw new LogError('wrong role for type', this.self.typeId as TransactionTypeId) - } - if ( - !this.self.linkedUserGradidoID || - !this.self.linkedUserCommunityUuid || - !this.self.userCommunityUuid - ) { - throw new LogError( - `missing necessary field in transaction: ${this.self.id}, need linkedUserGradidoID, linkedUserCommunityUuid and userCommunityUuid`, - ) - } - // it is a redeem of a transaction link? - const transactionLink = this.self.transactionLink - if (transactionLink) { - draft.user = new UserIdentifier( - this.self.userCommunityUuid, - new IdentifierSeed(transactionLink.code), - ) - draft.type = TransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER - this.type = DltTransactionType.REDEEM_DEFERRED_TRANSFER - } else { - draft.user = new UserIdentifier( - this.self.userCommunityUuid, - new CommunityUser(this.self.userGradidoID, 1), - ) - } - draft.linkedUser = new UserIdentifier( - this.self.linkedUserCommunityUuid, - new CommunityUser(this.self.linkedUserGradidoID, 1), - ) - draft.memo = this.self.memo - draft.createdAt = this.self.balanceDate.toISOString() - draft.targetDate = this.self.creationDate?.toISOString() - return draft - } - - protected setJoinIdAndType(dltTransaction: DltTransaction): void { - if (!this.self) { - throw new LogError('try to create dlt entry for empty transaction') - } - dltTransaction.transactionId = this.self.id - dltTransaction.typeId = this.type - } -} diff --git a/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts b/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts deleted file mode 100644 index d302a36b3..000000000 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/UserToDlt.role.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DltTransaction, User } from 'database' - -import { AccountType } from '@dltConnector/enum/AccountType' -import { DltTransactionType } from '@dltConnector/enum/DltTransactionType' -import { TransactionType } from '@dltConnector/enum/TransactionType' -import { TransactionDraft } from '@dltConnector/model/TransactionDraft' -import { AccountIdentifier } from '@/apis/dltConnector/model/AccountIdentifier' - -import { LogError } from '@/server/LogError' - -import { AbstractTransactionToDltRole } from './AbstractTransactionToDlt.role' -import { CommunityAccountIdentifier } from '../../model/CommunityAccountIdentifier' - -/** - * 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().leftJoinAndSelect('User.community', 'community'), - 'User.id = dltTransaction.userId', - // eslint-disable-next-line camelcase - { User_created_at: 'ASC', User_id: 'ASC' }, - ).getOne() - return this - } - - public getTimestamp(): number { - if (!this.self) { - return Infinity - } - return this.self.createdAt.getTime() - } - - public convertToGraphqlInput(): TransactionDraft { - if (!this.self) { - throw new LogError('try to create dlt entry for empty transaction') - } - if (!this.self.community) { - throw new LogError(`missing community for user ${this.self.id}`) - } - const topicId = this.self.community.hieroTopicId - if (!topicId) { - throw new LogError(`missing topicId for community ${this.self.community.id}`) - } - const draft = new TransactionDraft() - draft.user = new AccountIdentifier(topicId, new CommunityAccountIdentifier(this.self.gradidoID)) - draft.createdAt = this.self.createdAt.toISOString() - draft.accountType = AccountType.COMMUNITY_HUMAN - draft.type = TransactionType.REGISTER_ADDRESS - return draft - } - - 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 deleted file mode 100644 index cb1d8cca2..000000000 --- a/backend/src/apis/dltConnector/interaction/transactionToDlt/transactionToDlt.context.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Transaction, TransactionLink, User } from 'database' - -import { DltConnectorClient } from '@/apis/dltConnector/DltConnectorClient' - -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' -import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' - -/** - * @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(logger: Logger): Promise< - AbstractTransactionToDltRole - > { - // collect each oldest not sended entity from db and choose oldest - const results = await Promise.all([ - new TransactionToDltRole(logger).initWithLast(), - new UserToDltRole(logger).initWithLast(), - new TransactionLinkToDltRole(logger).initWithLast(), - new TransactionLinkDeleteToDltRole(logger).initWithLast(), - ]) - - // sort array to get oldest at first place - results.sort((a, b) => { - return a.getTimestamp() - b.getTimestamp() - }) - return results[0] - } - - const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector.interaction.transactionToDlt`) - while (true) { - const pendingTransactionRole = await findNextPendingTransaction(logger) - const pendingTransaction = pendingTransactionRole.getEntity() - if (!pendingTransaction) { - break - } - let messageId = '' - let error: string | null = null - try { - const result = await dltConnector.sendTransaction( - pendingTransactionRole.convertToGraphqlInput() - ) - if (result.statusCode === 200 && result.result) { - messageId = result.result - } else { - error = `empty result with status code ${result.statusCode}` - logger.error('error from dlt-connector', result) - } - } catch (e) { - logger.debug(e) - if (e instanceof Error) { - error = e.message - } else if (typeof e === 'string') { - error = e - } else { - throw e - } - } - await pendingTransactionRole.saveTransactionResult(messageId, error) - } -} diff --git a/backend/src/apis/dltConnector/model/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts index 8dba79bdc..1342a3f8f 100755 --- a/backend/src/apis/dltConnector/model/TransactionDraft.ts +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -3,6 +3,12 @@ import { AccountType } from '@dltConnector/enum/AccountType' import { TransactionType } from '@dltConnector/enum/TransactionType' import { AccountIdentifier } from './AccountIdentifier' +import { Community as DbCommunity, Contribution as DbContribution, User as DbUser } from 'database' +import { CommunityAccountIdentifier } from './CommunityAccountIdentifier' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.dltConnector.model.TransactionDraft`) export class TransactionDraft { user: AccountIdentifier @@ -19,4 +25,55 @@ export class TransactionDraft { timeoutDuration?: number // only for register address accountType?: AccountType -} + + static createRegisterAddress(user: DbUser, community: DbCommunity): TransactionDraft | null { + if (community.hieroTopicId) { + const draft = new TransactionDraft() + draft.user = new AccountIdentifier(community.hieroTopicId, new CommunityAccountIdentifier(user.gradidoID)) + draft.type = TransactionType.REGISTER_ADDRESS + draft.createdAt = user.createdAt.toISOString() + draft.accountType = AccountType.COMMUNITY_HUMAN + return draft + } else { + logger.warn(`missing topicId for community ${community.id}`) + } + return null + } + + static createContribution(contribution: DbContribution, createdAt: Date, signingUser: DbUser, community: DbCommunity): TransactionDraft | null { + if (community.hieroTopicId) { + const draft = new TransactionDraft() + draft.user = new AccountIdentifier(community.hieroTopicId, new CommunityAccountIdentifier(contribution.user.gradidoID)) + draft.linkedUser = new AccountIdentifier(community.hieroTopicId, new CommunityAccountIdentifier(signingUser.gradidoID)) + draft.type = TransactionType.GRADIDO_CREATION + draft.createdAt = createdAt.toISOString() + draft.amount = contribution.amount.toString() + draft.memo = contribution.memo + draft.targetDate = contribution.contributionDate.toISOString() + return draft + } else { + logger.warn(`missing topicId for community ${community.id}`) + } + return null + } + + static createTransfer(sendingUser: DbUser, receivingUser: DbUser, amount: string, memo: string, createdAt: Date): TransactionDraft | null { + if (!sendingUser.community || !receivingUser.community) { + logger.warn(`missing community for user ${sendingUser.id} and/or ${receivingUser.id}`) + return null + } + if (sendingUser.community.hieroTopicId && receivingUser.community.hieroTopicId) { + const draft = new TransactionDraft() + draft.user = new AccountIdentifier(sendingUser.community.hieroTopicId, new CommunityAccountIdentifier(sendingUser.gradidoID)) + draft.linkedUser = new AccountIdentifier(receivingUser.community.hieroTopicId, new CommunityAccountIdentifier(receivingUser.gradidoID)) + draft.type = TransactionType.GRADIDO_TRANSFER + draft.createdAt = createdAt.toISOString() + draft.amount = amount + draft.memo = memo + return draft + } else { + logger.warn(`missing topicId for community ${community.id}`) + } + return null + } +} \ No newline at end of file diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts deleted file mode 100644 index 50af15e9a..000000000 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.test.ts +++ /dev/null @@ -1,728 +0,0 @@ -import { Community, DltTransaction, Transaction } from 'database' -import { Decimal } from 'decimal.js-light' -import { Response } from 'graphql-request/dist/types' -import { DataSource } from 'typeorm' -import { v4 as uuidv4 } from 'uuid' - -import { cleanDB, testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' - -import { CONFIG } from '@/config' -import { TransactionTypeId } from '@/graphql/enum/TransactionTypeId' -import { creations } from '@/seeds/creation' -import { creationFactory } from '@/seeds/factory/creation' -import { userFactory } from 'database/src/seeds/factory/user' -import { bibiBloxberg } from 'database/src/seeds/users/bibi-bloxberg' -import { bobBaumeister } from 'database/src/seeds/users/bob-baumeister' -import { peterLustig } from 'database/src/seeds/users/peter-lustig' -import { raeuberHotzenplotz } from 'database/src/seeds/users/raeuber-hotzenplotz' -import { getLogger } from 'config-schema/test/testSetup' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' - -import { sendTransactionsToDltConnector } from './sendTransactionsToDltConnector' - -jest.mock('@/password/EncryptorUtils') - -const logger = getLogger( - `${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.util.sendTransactionsToDltConnector`, -) - -async function createHomeCommunity(): Promise { - const homeCommunity = Community.create() - homeCommunity.foreign = false - homeCommunity.communityUuid = uuidv4() - homeCommunity.url = 'localhost' - homeCommunity.publicKey = Buffer.from('0x6e6a6c6d6feffe', 'hex') - await Community.save(homeCommunity) - return homeCommunity -} - -async function createTxCREATION1(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(1000) - tx.balance = new Decimal(100) - tx.balanceDate = new Date('01.01.2023 00:00:00') - tx.memo = 'txCREATION1' - tx.typeId = TransactionTypeId.CREATION - tx.userGradidoID = 'txCREATION1.userGradidoID' - tx.userId = 1 - tx.userName = 'txCREATION 1' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('01.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c1' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('01.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxCREATION2(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(1000) - tx.balance = new Decimal(200) - tx.balanceDate = new Date('02.01.2023 00:00:00') - tx.memo = 'txCREATION2' - tx.typeId = TransactionTypeId.CREATION - tx.userGradidoID = 'txCREATION2.userGradidoID' - tx.userId = 2 - tx.userName = 'txCREATION 2' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('02.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c2' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('02.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxCREATION3(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(1000) - tx.balance = new Decimal(300) - tx.balanceDate = new Date('03.01.2023 00:00:00') - tx.memo = 'txCREATION3' - tx.typeId = TransactionTypeId.CREATION - tx.userGradidoID = 'txCREATION3.userGradidoID' - tx.userId = 3 - tx.userName = 'txCREATION 3' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('03.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c3' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('03.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxSend1ToReceive2(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(100) - tx.balance = new Decimal(1000) - tx.balanceDate = new Date('11.01.2023 00:00:00') - tx.memo = 'txSEND1 to txRECEIVE2' - tx.typeId = TransactionTypeId.SEND - tx.userGradidoID = 'txSEND1.userGradidoID' - tx.userId = 1 - tx.userName = 'txSEND 1' - tx.linkedUserGradidoID = 'txRECEIVE2.linkedUserGradidoID' - tx.linkedUserId = 2 - tx.linkedUserName = 'txRECEIVE 2' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('11.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516a1' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('11.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxReceive2FromSend1(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(100) - tx.balance = new Decimal(1300) - tx.balanceDate = new Date('11.01.2023 00:00:00') - tx.memo = 'txSEND1 to txRECEIVE2' - tx.typeId = TransactionTypeId.RECEIVE - tx.userGradidoID = 'txRECEIVE2.linkedUserGradidoID' - tx.userId = 2 - tx.userName = 'txRECEIVE 2' - tx.linkedUserGradidoID = 'txSEND1.userGradidoID' - tx.linkedUserId = 1 - tx.linkedUserName = 'txSEND 1' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('11.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516b2' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('11.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -/* -async function createTxSend2ToReceive3(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(200) - tx.balance = new Decimal(1100) - tx.balanceDate = new Date('23.01.2023 00:00:00') - tx.memo = 'txSEND2 to txRECEIVE3' - tx.typeId = TransactionTypeId.SEND - tx.userGradidoID = 'txSEND2.userGradidoID' - tx.userId = 2 - tx.userName = 'txSEND 2' - tx.linkedUserGradidoID = 'txRECEIVE3.linkedUserGradidoID' - tx.linkedUserId = 3 - tx.linkedUserName = 'txRECEIVE 3' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('23.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516a2' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('23.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxReceive3FromSend2(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(200) - tx.balance = new Decimal(1500) - tx.balanceDate = new Date('23.01.2023 00:00:00') - tx.memo = 'txSEND2 to txRECEIVE3' - tx.typeId = TransactionTypeId.RECEIVE - tx.userGradidoID = 'txRECEIVE3.linkedUserGradidoID' - tx.userId = 3 - tx.userName = 'txRECEIVE 3' - tx.linkedUserGradidoID = 'txSEND2.userGradidoID' - tx.linkedUserId = 2 - tx.linkedUserName = 'txSEND 2' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('23.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516b3' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('23.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxSend3ToReceive1(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(300) - tx.balance = new Decimal(1200) - tx.balanceDate = new Date('31.01.2023 00:00:00') - tx.memo = 'txSEND3 to txRECEIVE1' - tx.typeId = TransactionTypeId.SEND - tx.userGradidoID = 'txSEND3.userGradidoID' - tx.userId = 3 - tx.userName = 'txSEND 3' - tx.linkedUserGradidoID = 'txRECEIVE1.linkedUserGradidoID' - tx.linkedUserId = 1 - tx.linkedUserName = 'txRECEIVE 1' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('31.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516a3' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('31.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxReceive1FromSend3(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(300) - tx.balance = new Decimal(1300) - tx.balanceDate = new Date('31.01.2023 00:00:00') - tx.memo = 'txSEND3 to txRECEIVE1' - tx.typeId = TransactionTypeId.RECEIVE - tx.userGradidoID = 'txRECEIVE1.linkedUserGradidoID' - tx.userId = 1 - tx.userName = 'txRECEIVE 1' - tx.linkedUserGradidoID = 'txSEND3.userGradidoID' - tx.linkedUserId = 3 - tx.linkedUserName = 'txSEND 3' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('31.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516b1' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('31.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} -*/ - -let con: DataSource -let testEnv: { - con: DataSource -} - -beforeAll(async () => { - testEnv = await testEnvironment(logger, localization) - con = testEnv.con - await cleanDB() -}) - -afterAll(async () => { - await cleanDB() - await con.destroy() -}) - -describe('create and send Transactions to DltConnector', () => { - let txCREATION1: Transaction - let txCREATION2: Transaction - let txCREATION3: Transaction - let txSEND1to2: Transaction - let txRECEIVE2From1: Transaction - // let txSEND2To3: Transaction - // let txRECEIVE3From2: Transaction - // let txSEND3To1: Transaction - // let txRECEIVE1From3: Transaction - - beforeEach(() => { - jest.clearAllMocks() - }) - - afterEach(async () => { - await cleanDB() - }) - - describe('with 3 creations but inactive dlt-connector', () => { - it('found 3 dlt-transactions', async () => { - txCREATION1 = await createTxCREATION1(false) - txCREATION2 = await createTxCREATION2(false) - txCREATION3 = await createTxCREATION3(false) - await createHomeCommunity() - - CONFIG.DLT_CONNECTOR = false - await sendTransactionsToDltConnector() - expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') - - // Find the previous created transactions of sendCoin mutation - const transactions = await Transaction.find({ - // where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - - const dltTransactions = await DltTransaction.find({ - // where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[0].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[1].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[2].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - - expect(logger.info).nthCalledWith(2, 'sending to DltConnector currently not configured...') - }) - }) - - describe('with 3 creations and active dlt-connector', () => { - it('found 3 dlt-transactions', async () => { - await userFactory(testEnv, bibiBloxberg) - await userFactory(testEnv, peterLustig) - await userFactory(testEnv, raeuberHotzenplotz) - await userFactory(testEnv, bobBaumeister) - let count = 0 - for (const creation of creations) { - await creationFactory(testEnv, creation) - count++ - // we need only 3 for testing - if (count >= 3) { - break - } - } - await createHomeCommunity() - - CONFIG.DLT_CONNECTOR = true - - await sendTransactionsToDltConnector() - - expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') - - // Find the previous created transactions of sendCoin mutation - const transactions = await Transaction.find({ - // where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - - const dltTransactions = await DltTransaction.find({ - // where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[0].id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[1].id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[2].id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - }) - }) - - describe('with 3 verified creations, 1 sendCoins and active dlt-connector', () => { - it('found 3 dlt-transactions', async () => { - txCREATION1 = await createTxCREATION1(true) - txCREATION2 = await createTxCREATION2(true) - txCREATION3 = await createTxCREATION3(true) - await createHomeCommunity() - - txSEND1to2 = await createTxSend1ToReceive2(false) - txRECEIVE2From1 = await createTxReceive2FromSend1(false) - - /* - txSEND2To3 = await createTxSend2ToReceive3() - txRECEIVE3From2 = await createTxReceive3FromSend2() - txSEND3To1 = await createTxSend3ToReceive1() - txRECEIVE1From3 = await createTxReceive1FromSend3() - */ - - CONFIG.DLT_CONNECTOR = true - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - return { - data: { - sendTransaction: { succeed: true }, - }, - } as Response - }) - - await sendTransactionsToDltConnector() - - expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') - - // Find the previous created transactions of sendCoin mutation - /* - const transactions = await Transaction.find({ - // where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - */ - - const dltTransactions = await DltTransaction.find({ - // where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: txCREATION1.id, - messageId: '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c1', - verified: true, - createdAt: new Date('01.01.2023 00:00:10'), - verifiedAt: new Date('01.01.2023 00:01:10'), - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txCREATION2.id, - messageId: '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c2', - verified: true, - createdAt: new Date('02.01.2023 00:00:10'), - verifiedAt: new Date('02.01.2023 00:01:10'), - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txCREATION3.id, - messageId: '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c3', - verified: true, - createdAt: new Date('03.01.2023 00:00:10'), - verifiedAt: new Date('03.01.2023 00:01:10'), - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txSEND1to2.id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txRECEIVE2From1.id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - }) - /* - describe('with one Community of api 1_0 and not matching pubKey', () => { - beforeEach(async () => { - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - - return { - data: { - getPublicKey: { - publicKey: 'somePubKey', - }, - }, - } as Response - }) - const variables1 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '1_0', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables1) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - - jest.clearAllMocks() - // await validateCommunities() - }) - - it('logs one community found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 1 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs not matching publicKeys', () => { - expect(logger.warn).toBeCalledWith( - 'Federation: received not matching publicKey:', - 'somePubKey', - expect.stringMatching('11111111111111111111111111111111'), - ) - }) - }) - describe('with one Community of api 1_0 and matching pubKey', () => { - beforeEach(async () => { - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - - return { - data: { - getPublicKey: { - publicKey: '11111111111111111111111111111111', - }, - }, - } as Response - }) - const variables1 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '1_0', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables1) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - await DbFederatedCommunity.update({}, { verifiedAt: null }) - jest.clearAllMocks() - // await validateCommunities() - }) - - it('logs one community found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 1 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs community pubKey verified', () => { - expect(logger.info).toHaveBeenNthCalledWith( - 3, - 'Federation: verified community with', - 'http//localhost:5001/api/', - ) - }) - }) - describe('with two Communities of api 1_0 and 1_1', () => { - beforeEach(async () => { - jest.clearAllMocks() - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - - return { - data: { - getPublicKey: { - publicKey: '11111111111111111111111111111111', - }, - }, - } as Response - }) - const variables2 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '1_1', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables2) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - - await DbFederatedCommunity.update({}, { verifiedAt: null }) - jest.clearAllMocks() - // await validateCommunities() - }) - it('logs two communities found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 2 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs requestGetPublicKey for community api 1_1 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_1/', - ) - }) - }) - describe('with three Communities of api 1_0, 1_1 and 2_0', () => { - let dbCom: DbFederatedCommunity - beforeEach(async () => { - const variables3 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '2_0', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables3) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - dbCom = await DbFederatedCommunity.findOneOrFail({ - where: { publicKey: variables3.publicKey, apiVersion: variables3.apiVersion }, - }) - await DbFederatedCommunity.update({}, { verifiedAt: null }) - jest.clearAllMocks() - // await validateCommunities() - }) - it('logs three community found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 3 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs requestGetPublicKey for community api 1_1 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_1/', - ) - }) - it('logs unsupported api for community with api 2_0 ', () => { - expect(logger.warn).toBeCalledWith( - 'Federation: dbCom with unsupported apiVersion', - dbCom.endPoint, - '2_0', - ) - }) - }) - */ - }) -}) diff --git a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts b/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts deleted file mode 100644 index ef58ed606..000000000 --- a/backend/src/apis/dltConnector/sendTransactionsToDltConnector.ts +++ /dev/null @@ -1,69 +0,0 @@ -// eslint-disable-next-line import/no-extraneous-dependencies -import { CONFIG } from '@/config' -import { TypeORMError } from 'typeorm' -// eslint-disable-next-line import/named, n/no-extraneous-import -import { FetchError } from 'node-fetch' - -import { DltConnectorClient } from '@dltConnector/DltConnectorClient' - -import { LogError } from '@/server/LogError' -import { - InterruptiveSleepManager, - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, -} from '@/util/InterruptiveSleepManager' - -import { transactionToDlt } from './interaction/transactionToDlt/transactionToDlt.context' -import { getLogger } from 'log4js' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' - -const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.apis.dltConnector.sendTransactionsToDltConnector`) - -let isLoopRunning = true - -export const stopSendTransactionsToDltConnector = (): void => { - isLoopRunning = false -} - -export async function sendTransactionsToDltConnector(): Promise { - const dltConnector = DltConnectorClient.getInstance() - - if (!dltConnector) { - logger.info('currently not configured...') - isLoopRunning = false - return - } - logger.info('task started') - - // define outside of loop for reuse and reducing gb collection - // const queries = getFindNextPendingTransactionQueries() - - // eslint-disable-next-line no-unmodified-loop-condition - while (isLoopRunning) { - try { - // return after no pending transactions are left - await transactionToDlt(dltConnector) - await InterruptiveSleepManager.getInstance().sleep( - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, - // 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 - 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 { - 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) - } - } - } - } -} diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index f5ed2f1d2..34ea8b1da 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -2,6 +2,7 @@ import { Contribution as DbContribution, Transaction as DbTransaction, User as DbUser, + DltTransaction as DbDltTransaction, UserContact, } from 'database' import { Decimal } from 'decimal.js-light' @@ -60,6 +61,7 @@ import { extractGraphQLFields } from './util/extractGraphQLFields' import { findContributions } from './util/findContributions' import { getLastTransaction } from './util/getLastTransaction' import { InterruptiveSleepManager, TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY } from '@/util/InterruptiveSleepManager' +import { contributionTransaction } from '@/apis/dltConnector' const db = AppDatabase.getInstance() const createLogger = () => getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.ContributionResolver`) @@ -436,11 +438,13 @@ export class ContributionResolver { const logger = createLogger() logger.addContext('contribution', id) + let transaction: DbTransaction + let dltTransactionPromise: Promise // acquire lock const releaseLock = await TRANSACTIONS_LOCK.acquire() try { const clientTimezoneOffset = getClientTimezoneOffset(context) - const contribution = await DbContribution.findOne({ where: { id } }) + const contribution = await DbContribution.findOne({ where: { id }, relations: {user: {emailContact: true}} }) if (!contribution) { throw new LogError('Contribution not found', id) } @@ -450,18 +454,18 @@ export class ContributionResolver { if (contribution.contributionStatus === 'DENIED') { throw new LogError('Contribution already denied', id) } + const moderatorUser = getUser(context) if (moderatorUser.id === contribution.userId) { throw new LogError('Moderator can not confirm own contribution') } - const user = await DbUser.findOneOrFail({ - where: { id: contribution.userId }, - withDeleted: true, - relations: ['emailContact'], - }) + const user = contribution.user if (user.deletedAt) { throw new LogError('Can not confirm contribution since the user was deleted') } + const receivedCallDate = new Date() + dltTransactionPromise = contributionTransaction(contribution, moderatorUser, receivedCallDate) + const creations = await getUserCreation(contribution.userId, clientTimezoneOffset, false) validateContribution( creations, @@ -469,8 +473,7 @@ export class ContributionResolver { contribution.contributionDate, clientTimezoneOffset, ) - - const receivedCallDate = new Date() + const queryRunner = db.getDataSource().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('REPEATABLE READ') // 'READ COMMITTED') @@ -491,7 +494,7 @@ export class ContributionResolver { } newBalance = newBalance.add(contribution.amount.toString()) - const transaction = new DbTransaction() + transaction = new DbTransaction() transaction.typeId = TransactionTypeId.CREATION transaction.memo = contribution.memo transaction.userId = contribution.userId @@ -509,7 +512,7 @@ export class ContributionResolver { transaction.balanceDate = receivedCallDate transaction.decay = decay ? decay.decay : new Decimal(0) transaction.decayStart = decay ? decay.start : null - await queryRunner.manager.insert(DbTransaction, transaction) + transaction = await queryRunner.manager.save(DbTransaction, transaction) contribution.confirmedAt = receivedCallDate contribution.confirmedBy = moderatorUser.id @@ -519,9 +522,6 @@ export class ContributionResolver { await queryRunner.commitTransaction() - // notify dlt-connector loop for new work - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) - logger.info('creation commited successfuly.') await sendContributionConfirmedEmail({ firstName: user.firstName, @@ -547,6 +547,16 @@ export class ContributionResolver { } finally { releaseLock() } + // update transaction id in dlt transaction tables + // wait for finishing transaction by dlt-connector/hiero + const startTime = new Date() + const dltTransaction = await dltTransactionPromise + if(dltTransaction) { + dltTransaction.transactionId = transaction.id + await dltTransaction.save() + } + const endTime = new Date() + logger.debug(`dlt-connector contribution finished in ${endTime.getTime() - startTime.getTime()} ms`) return true } diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index b14ef2a4e..33d34d928 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -2,6 +2,7 @@ import { AppDatabase, countOpenPendingTransactions, Community as DbCommunity, + DltTransaction as DbDltTransaction, PendingTransaction as DbPendingTransaction, Transaction as dbTransaction, TransactionLink as dbTransactionLink, @@ -54,6 +55,7 @@ import { } from './util/processXComSendCoins' import { storeForeignUser } from './util/storeForeignUser' import { transactionLinkSummary } from './util/transactionLinkSummary' +import { transferTransaction } from '@/apis/dltConnector' const db = AppDatabase.getInstance() const createLogger = () => getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.TransactionResolver`) @@ -66,6 +68,12 @@ export const executeTransaction = async ( logger: Logger, transactionLink?: dbTransactionLink | null, ): Promise => { + const receivedCallDate = new Date() + let dltTransactionPromise: Promise = Promise.resolve(null) + if (!transactionLink) { + dltTransactionPromise = transferTransaction(sender, recipient, amount.toString(), memo, receivedCallDate) + } + // acquire lock const releaseLock = await TRANSACTIONS_LOCK.acquire() @@ -82,8 +90,7 @@ export const executeTransaction = async ( throw new LogError('Sender and Recipient are the same', sender.id) } - // validate amount - const receivedCallDate = new Date() + // validate amount const sendBalance = await calculateBalance( sender.id, amount.mul(-1), @@ -163,7 +170,12 @@ export const executeTransaction = async ( } await queryRunner.commitTransaction() - logger.info(`commit Transaction successful...`) + // update dltTransaction with transactionId + const dltTransaction = await dltTransactionPromise + if (dltTransaction) { + dltTransaction.transactionId = transactionSend.id + await dltTransaction.save() + } await EVENT_TRANSACTION_SEND(sender, recipient, transactionSend, transactionSend.amount) @@ -179,8 +191,9 @@ export const executeTransaction = async ( } finally { await queryRunner.release() } + // notify dlt-connector loop for new work - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) + // InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) await sendTransactionReceivedEmail({ firstName: recipient.firstName, lastName: recipient.lastName, diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 2e6667802..385811dba 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -1,6 +1,7 @@ import { AppDatabase, ContributionLink as DbContributionLink, + DltTransaction as DbDltTransaction, TransactionLink as DbTransactionLink, User as DbUser, UserContact as DbUserContact, @@ -85,10 +86,6 @@ import { Context, getClientTimezoneOffset, getUser } from '@/server/context' import { communityDbUser } from '@/util/communityUser' import { hasElopageBuys } from '@/util/hasElopageBuys' import { durationInMinutesFromDates, getTimeDurationObject, printTimeDuration } from '@/util/time' -import { - InterruptiveSleepManager, - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, -} from '@/util/InterruptiveSleepManager' import { delay } from '@/util/utilities' import random from 'random-bigint' @@ -108,6 +105,7 @@ import { deleteUserRole, setUserRole } from './util/modifyUserRole' import { sendUserToGms } from './util/sendUserToGms' import { syncHumhub } from './util/syncHumhub' import { validateAlias } from 'core' +import { registerAddressTransaction } from '@/apis/dltConnector' const LANGUAGES = ['de', 'en', 'es', 'fr', 'nl'] const DEFAULT_LANGUAGE = 'de' @@ -391,6 +389,7 @@ export class UserResolver { if (homeCom.communityUuid) { dbUser.communityUuid = homeCom.communityUuid } + dbUser.gradidoID = gradidoID dbUser.firstName = firstName dbUser.lastName = lastName @@ -401,8 +400,11 @@ export class UserResolver { dbUser.alias = alias } dbUser.publisherId = publisherId ?? 0 - dbUser.passwordEncryptionType = PasswordEncryptionType.NO_PASSWORD - logger.debug('new dbUser', new UserLoggingView(dbUser)) + dbUser.passwordEncryptionType = PasswordEncryptionType.NO_PASSWORD + + if(logger.isDebugEnabled()) { + logger.debug('new dbUser', new UserLoggingView(dbUser)) + } if (redeemCode) { if (redeemCode.match(/^CL-/)) { const contributionLink = await DbContributionLink.findOne({ @@ -438,7 +440,7 @@ export class UserResolver { dbUser.emailContact = emailContact dbUser.emailId = emailContact.id - await queryRunner.manager.save(dbUser).catch((error) => { + dbUser = await queryRunner.manager.save(dbUser).catch((error) => { throw new LogError('Error while updating dbUser', error) }) @@ -470,6 +472,8 @@ export class UserResolver { } finally { await queryRunner.release() } + // register user into blockchain + const dltTransactionPromise = registerAddressTransaction(dbUser, homeCom) logger.info('createUser() successful...') if (CONFIG.HUMHUB_ACTIVE) { let spaceId: number | null = null @@ -483,9 +487,6 @@ export class UserResolver { } } - // notify dlt-connector loop for new work - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) - if (redeemCode) { eventRegisterRedeem.affectedUser = dbUser eventRegisterRedeem.actingUser = dbUser @@ -509,6 +510,11 @@ export class UserResolver { } } } + // wait for finishing dlt transaction + const startTime = new Date() + await dltTransactionPromise + const endTime = new Date() + logger.info(`dlt-connector register address finished in ${endTime.getTime() - startTime.getTime()} ms`) return new User(dbUser) } diff --git a/backend/src/index.ts b/backend/src/index.ts index a810b64a9..8a46cbb35 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -24,7 +24,7 @@ async function main() { // 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 sendTransactionsToDltConnector() void startValidateCommunities(Number(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER)) } diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 05852adda..93b3943c1 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -20,7 +20,7 @@ "log4js": "^6.9.1", "typescript": "^5.8.3", "uuid": "^8.3.2", - "valibot": "^1.1.0", + "valibot": "1.1.0", }, }, }, diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 26762c39e..bb7269703 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -33,7 +33,7 @@ "log4js": "^6.9.1", "typescript": "^5.8.3", "uuid": "^8.3.2", - "valibot": "^1.1.0" + "valibot": "1.1.0" }, "engines": { "node": ">=18" diff --git a/dlt-connector/src/client/backend/community.schema.test.ts b/dlt-connector/src/client/backend/community.schema.test.ts index e56056377..180ab9d5a 100644 --- a/dlt-connector/src/client/backend/community.schema.test.ts +++ b/dlt-connector/src/client/backend/community.schema.test.ts @@ -11,12 +11,14 @@ describe('community.schema', () => { uuid: '4f28e081-5c39-4dde-b6a4-3bde71de8d65', hieroTopicId: '0.0.4', foreign: false, + name: 'Test', creationDate: '2021-01-01', }), ).toEqual({ hieroTopicId: v.parse(hieroIdSchema, '0.0.4'), uuid: v.parse(uuidv4Schema, '4f28e081-5c39-4dde-b6a4-3bde71de8d65'), foreign: false, + name: 'Test', creationDate: new Date('2021-01-01'), }) }) diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index 9c48800d8..0815437ef 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -2,10 +2,8 @@ import { AccountBalance, AccountBalanceQuery, Client, - Key, LocalProvider, PrivateKey, - Timestamp, TopicCreateTransaction, TopicId, TopicInfoQuery, @@ -59,6 +57,7 @@ export class HieroClient { topicId: HieroId, transaction: GradidoTransaction, ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { + let startTime = new Date() this.logger.addContext('topicId', topicId.toString()) const serializedTransaction = transaction.getSerializedTransaction() if (!serializedTransaction) { @@ -69,13 +68,27 @@ export class HieroClient { topicId, message: serializedTransaction.data(), }).freezeWithSigner(this.wallet) + let endTime = new Date() + this.logger.info(`prepare message, until freeze, cost: ${endTime.getTime() - startTime.getTime()}ms`) + startTime = new Date() const signedHieroTransaction = await hieroTransaction.signWithSigner(this.wallet) + endTime = new Date() + this.logger.info(`sign message, cost: ${endTime.getTime() - startTime.getTime()}ms`) + startTime = new Date() const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) + endTime = new Date() + this.logger.info(`send message, cost: ${endTime.getTime() - startTime.getTime()}ms`) + startTime = new Date() const sendReceipt = await sendResponse.getReceiptWithSigner(this.wallet) + endTime = new Date() + this.logger.info(`get receipt, cost: ${endTime.getTime() - startTime.getTime()}ms`) this.logger.info( `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, ) + startTime = new Date() const record = await sendResponse.getRecordWithSigner(this.wallet) + endTime = new Date() + this.logger.info(`get record, cost: ${endTime.getTime() - startTime.getTime()}ms`) this.logger.info(`message sent, cost: ${record.transactionFee.toString()}`) return { receipt: sendReceipt, response: sendResponse } } diff --git a/dlt-connector/src/data/KeyPairIdentifier.logic.ts b/dlt-connector/src/data/KeyPairIdentifier.logic.ts index 1563d4b53..c64dda299 100644 --- a/dlt-connector/src/data/KeyPairIdentifier.logic.ts +++ b/dlt-connector/src/data/KeyPairIdentifier.logic.ts @@ -1,10 +1,10 @@ import { MemoryBlock } from 'gradido-blockchain-js' import { ParameterError } from '../errors' -import { IdentifierAccount } from '../schemas/account.schema' +import { IdentifierKeyPair } from '../schemas/account.schema' import { HieroId } from '../schemas/typeGuard.schema' export class KeyPairIdentifierLogic { - public constructor(public identifier: IdentifierAccount) {} + public constructor(public identifier: IdentifierKeyPair) {} isCommunityKeyPair(): boolean { return !this.identifier.seed && !this.identifier.account @@ -91,8 +91,8 @@ export class KeyPairIdentifierLogic { if (!this.identifier.account?.userUuid || !this.identifier.communityTopicId) { throw new ParameterError('userUuid and/or communityTopicId is undefined') } - const resultHexString = + const resultString = this.identifier.communityTopicId + this.identifier.account.userUuid.replace(/-/g, '') - return MemoryBlock.fromHex(resultHexString).calculateHash().convertToHex() + return new MemoryBlock(resultString).calculateHash().convertToHex() } } diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index e2eb30a8a..afd517069 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -7,7 +7,6 @@ import { BackendClient } from './client/backend/BackendClient' import { GradidoNodeClient } from './client/GradidoNode/GradidoNodeClient' import { HieroClient } from './client/hiero/HieroClient' import { CONFIG } from './config' -import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from './config/const' import { SendToHieroContext } from './interactions/sendToHiero/SendToHiero.context' import { KeyPairCacheManager } from './KeyPairCacheManager' import { Community, communitySchema } from './schemas/transaction.schema' diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts new file mode 100644 index 000000000..7c7103d94 --- /dev/null +++ b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts @@ -0,0 +1,99 @@ +import { describe, it, expect, mock, beforeAll, afterAll } from 'bun:test' +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { KeyPairCalculation } from './KeyPairCalculation.context' +import { parse } from 'valibot' +import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' +import { KeyPairCacheManager } from '../../KeyPairCacheManager' +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' +import { identifierKeyPairSchema } from '../../schemas/account.schema' +/* +// Mock JsonRpcClient +const mockRpcCall = mock((params) => { + console.log('mockRpcCall', params) + return { + isSuccess: () => false, + isError: () => true, + error: { + code: GradidoNodeErrorCodes.TRANSACTION_NOT_FOUND + } + } +}) +const mockRpcCallResolved = mock() + +mock.module('../../utils/network', () => ({ + isPortOpenRetry: async () => true, +})) + +mock.module('jsonrpc-ts-client', () => { + return { + default: class MockJsonRpcClient { + constructor() {} + exec = mockRpcCall + }, + } +}) +*/ + +mock.module('../../KeyPairCacheManager', () => { + let homeCommunityTopicId: HieroId | undefined + return { + KeyPairCacheManager: { + getInstance: () => ({ + setHomeCommunityTopicId: (topicId: HieroId) => { + homeCommunityTopicId = topicId + }, + getHomeCommunityTopicId: () => homeCommunityTopicId, + getKeyPair: (key: string, create: () => KeyPairEd25519) => { + return create() + }, + }), + }, + } +}) + +mock.module('../../config', () => ({ + CONFIG: { + HOME_COMMUNITY_SEED: MemoryBlock.fromHex('0102030401060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fe7'), + }, +})) + +const topicId = '0.0.21732' +const userUuid = 'aa25cf6f-2879-4745-b2ea-6d3c37fb44b0' + +console.log('userUuid', userUuid) + +afterAll(() => { + mock.restore() +}) + +describe('KeyPairCalculation', () => { + beforeAll(() => { + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(parse(hieroIdSchema, '0.0.21732')) + }) + it('community key pair', async () => { + const identifier = new KeyPairIdentifierLogic(parse(identifierKeyPairSchema, { communityTopicId: topicId })) + const keyPair = await KeyPairCalculation(identifier) + expect(keyPair.getPublicKey()?.convertToHex()).toBe('7bcb0d0ad26d3f7ba597716c38a570220cece49b959e57927ee0c39a5a9c3adf') + }) + it('user key pair', async () => { + const identifier = new KeyPairIdentifierLogic(parse(identifierKeyPairSchema, { + communityTopicId: topicId, + account: { userUuid } + })) + expect(identifier.isAccountKeyPair()).toBe(false) + expect(identifier.isUserKeyPair()).toBe(true) + const keyPair = await KeyPairCalculation(identifier) + expect(keyPair.getPublicKey()?.convertToHex()).toBe('d61ae86c262fc0b5d763a8f41a03098fae73a7649a62aac844378a0eb0055921') + }) + + it('account key pair', async () => { + const identifier = new KeyPairIdentifierLogic(parse(identifierKeyPairSchema, { + communityTopicId: topicId, + account: { userUuid, accountNr: 1 } + })) + expect(identifier.isAccountKeyPair()).toBe(true) + expect(identifier.isUserKeyPair()).toBe(false) + const keyPair = await KeyPairCalculation(identifier) + expect(keyPair.getPublicKey()?.convertToHex()).toBe('6cffb0ee0b20dae828e46f2e003f78ac57b85e7268e587703932f06e1b2daee4') + }) +}) diff --git a/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts index 834f813c2..fd70682ea 100644 --- a/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts @@ -21,7 +21,12 @@ export class CreationTransactionRole extends AbstractTransactionRole { private readonly creationTransaction: CreationTransaction constructor(transaction: Transaction) { super() - this.creationTransaction = parse(creationTransactionSchema, transaction) + try { + this.creationTransaction = parse(creationTransactionSchema, transaction) + } catch (error) { + console.error('creation: invalid transaction', JSON.stringify(error, null, 2)) + throw new Error('creation: invalid transaction') + } this.homeCommunityTopicId = KeyPairCacheManager.getInstance().getHomeCommunityTopicId() if ( this.homeCommunityTopicId !== this.creationTransaction.user.communityTopicId || diff --git a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts new file mode 100644 index 000000000..032ec5eec --- /dev/null +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts @@ -0,0 +1,35 @@ +import { describe, it, expect } from 'bun:test' +import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' +import { parse } from 'valibot' +import { + transactionSchema, +} from '../../schemas/transaction.schema' +import { hieroIdSchema } from '../../schemas/typeGuard.schema' +import { InteractionToJson, InteractionValidate, ValidateType_SINGLE } from 'gradido-blockchain-js' + +const userUuid = '408780b2-59b3-402a-94be-56a4f4f4e8ec' +const transaction = { + user: { + communityTopicId: '0.0.21732', + account: { + userUuid, + accountNr: 0, + }, + }, + type: 'REGISTER_ADDRESS', + accountType: 'COMMUNITY_HUMAN', + createdAt: '2022-01-01T00:00:00.000Z', +} + +describe('RegisterAddressTransaction.role', () => { + it('get correct prepared builder', async () => { + const registerAddressTransactionRole = new RegisterAddressTransactionRole(parse(transactionSchema, transaction)) + expect(registerAddressTransactionRole.getSenderCommunityTopicId()).toBe(parse(hieroIdSchema, '0.0.21732')) + expect(() => registerAddressTransactionRole.getRecipientCommunityTopicId()).toThrow() + const builder = await registerAddressTransactionRole.getGradidoTransactionBuilder() + const gradidoTransaction = builder.build() + expect(() => new InteractionValidate(gradidoTransaction).run(ValidateType_SINGLE)).not.toThrow() + const json = JSON.parse(new InteractionToJson(gradidoTransaction).run()) + expect(json.bodyBytes.json.registerAddress.nameHash).toBe('bac2c06682808947f140d6766d02943761d4129ec055bb1f84dc3a4201a94c08') + }) +}) \ No newline at end of file diff --git a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts index 64076b920..32f78bac1 100644 --- a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts @@ -34,19 +34,15 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() - const communityKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic({ - communityTopicId: this.registerAddressTransaction.user.communityTopicId, - }), - ) - const accountKeyPairIdentifier = this.registerAddressTransaction.user + const communityTopicId = this.registerAddressTransaction.user.communityTopicId + const communityKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic({ communityTopicId })) + const keyPairIdentifier = this.registerAddressTransaction.user // when accountNr is 0 it is the user account - const userKeyPairIdentifier = accountKeyPairIdentifier - userKeyPairIdentifier.account.accountNr = 0 - - const userKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(userKeyPairIdentifier)) + keyPairIdentifier.account.accountNr = 0 + const userKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(keyPairIdentifier)) + keyPairIdentifier.account.accountNr = 1 const accountKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(accountKeyPairIdentifier), + new KeyPairIdentifierLogic(keyPairIdentifier), ) builder diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index 996be0d10..8fde79267 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -58,28 +58,25 @@ export async function SendToHieroContext( // choose correct role based on transaction type and input type const chooseCorrectRole = (input: Transaction | Community): AbstractTransactionRole => { - const transactionParsingResult = safeParse(transactionSchema, input) const communityParsingResult = safeParse(communitySchema, input) - if (transactionParsingResult.success) { - const transaction = transactionParsingResult.output - switch (transaction.type) { - case InputTransactionType.GRADIDO_CREATION: - return new CreationTransactionRole(transaction) - case InputTransactionType.GRADIDO_TRANSFER: - return new TransferTransactionRole(transaction) - case InputTransactionType.REGISTER_ADDRESS: - return new RegisterAddressTransactionRole(transaction) - case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: - return new DeferredTransferTransactionRole(transaction) - case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: - return new RedeemDeferredTransferTransactionRole(transaction) - default: - throw new Error('not supported transaction type: ' + transaction.type) - } - } else if (communityParsingResult.success) { + if (communityParsingResult.success) { return new CommunityRootTransactionRole(communityParsingResult.output) - } else { - throw new Error('not expected input') + } + + const transaction = input as Transaction + switch (transaction.type) { + case InputTransactionType.GRADIDO_CREATION: + return new CreationTransactionRole(transaction) + case InputTransactionType.GRADIDO_TRANSFER: + return new TransferTransactionRole(transaction) + case InputTransactionType.REGISTER_ADDRESS: + return new RegisterAddressTransactionRole(transaction) + case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: + return new DeferredTransferTransactionRole(transaction) + case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: + return new RedeemDeferredTransferTransactionRole(transaction) + default: + throw new Error('not supported transaction type: ' + transaction.type) } } diff --git a/dlt-connector/src/schemas/account.schema.ts b/dlt-connector/src/schemas/account.schema.ts index 7be2cd4f2..d1dbb4802 100644 --- a/dlt-connector/src/schemas/account.schema.ts +++ b/dlt-connector/src/schemas/account.schema.ts @@ -11,18 +11,22 @@ export type IdentifierSeed = v.InferOutput // identifier for gradido community accounts, inside a community export const identifierCommunityAccountSchema = v.object({ userUuid: uuidv4Schema, - accountNr: v.nullish(v.number('expect number type'), 0), + accountNr: v.optional(v.number('expect number type'), 0), }) export type IdentifierCommunityAccount = v.InferOutput +export const identifierKeyPairSchema = v.object({ + communityTopicId: hieroIdSchema, + account: v.optional(identifierCommunityAccountSchema), + seed: v.optional(identifierSeedSchema), +}) +export type IdentifierKeyPairInput = v.InferInput +export type IdentifierKeyPair = v.InferOutput + // identifier for gradido account, including the community uuid export const identifierAccountSchema = v.pipe( - v.object({ - communityTopicId: hieroIdSchema, - account: v.nullish(identifierCommunityAccountSchema, undefined), - seed: v.nullish(identifierSeedSchema, undefined), - }), + identifierKeyPairSchema, v.custom((value: any) => { const setFieldsCount = Number(value.seed !== undefined) + Number(value.account !== undefined) if (setFieldsCount !== 1) { diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index 61f485db6..7d204dba5 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -1,4 +1,6 @@ import { beforeAll, describe, expect, it } from 'bun:test' +import { TypeBoxFromValibot } from '@sinclair/typemap' +import { TypeCompiler } from '@sinclair/typebox/compiler' import { randomBytes } from 'crypto' import { v4 as uuidv4 } from 'uuid' import { parse } from 'valibot' @@ -13,7 +15,9 @@ import { Uuidv4, uuidv4Schema, } from '../schemas/typeGuard.schema' -import { TransactionInput, transactionSchema } from './transaction.schema' +import { registerAddressTransactionSchema, TransactionInput, transactionSchema } from './transaction.schema' +import { AccountType } from '../enum/AccountType' +import { AddressType_COMMUNITY_HUMAN } from 'gradido-blockchain-js' const transactionLinkCode = (date: Date): string => { const time = date.getTime().toString(16) @@ -40,27 +44,54 @@ describe('transaction schemas', () => { memoString = 'TestMemo' memo = parse(memoSchema, memoString) }) - it('valid, register new user address', () => { - const registerAddress: TransactionInput = { - user: { - communityTopicId: topicString, - account: { userUuid: userUuidString }, - }, - type: InputTransactionType.REGISTER_ADDRESS, - createdAt: '2022-01-01T00:00:00.000Z', - } - expect(parse(transactionSchema, registerAddress)).toEqual({ - user: { - communityTopicId: topic, - account: { - userUuid, - accountNr: 0, + describe('register address', () => { + let registerAddress: TransactionInput + beforeAll(() => { + registerAddress = { + user: { + communityTopicId: topicString, + account: { userUuid: userUuidString }, }, - }, - type: registerAddress.type, - createdAt: new Date(registerAddress.createdAt), + type: InputTransactionType.REGISTER_ADDRESS, + accountType: AccountType.COMMUNITY_HUMAN, + createdAt: new Date().toISOString(), + } + }) + it('valid transaction schema', () => { + expect(parse(transactionSchema, registerAddress)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + type: registerAddress.type, + accountType: AccountType.COMMUNITY_HUMAN, + createdAt: new Date(registerAddress.createdAt), + }) + }) + it('valid register address schema', () => { + expect(parse(registerAddressTransactionSchema, registerAddress)).toEqual({ + user: { + communityTopicId: topic, + account: { + userUuid, + accountNr: 0, + }, + }, + accountType: AddressType_COMMUNITY_HUMAN, + createdAt: new Date(registerAddress.createdAt), + }) + }) + it('valid, transaction schema with typebox', () => { + // console.log(JSON.stringify(TypeBoxFromValibot(transactionSchema), null, 2)) + const TTransactionSchema = TypeBoxFromValibot(transactionSchema) + const check = TypeCompiler.Compile(TTransactionSchema) + expect(check.Check(registerAddress)).toBe(true) }) }) + it('valid, gradido transfer', () => { const gradidoTransfer: TransactionInput = { user: { diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index 4345ec901..7c1855ec8 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -5,7 +5,7 @@ import { identifierCommunityAccountSchema, identifierSeedSchema, } from './account.schema' -import { accountTypeSchema, addressTypeSchema, dateSchema } from './typeConverter.schema' +import { addressTypeSchema, dateSchema } from './typeConverter.schema' import { gradidoAmountSchema, hieroIdSchema, @@ -13,6 +13,7 @@ import { timeoutDurationSchema, uuidv4Schema, } from './typeGuard.schema' +import { AccountType } from '../enum/AccountType' /** * Schema for community, for creating new CommunityRoot Transaction on gradido blockchain @@ -29,14 +30,14 @@ export type Community = v.InferOutput export const transactionSchema = v.object({ user: identifierAccountSchema, - linkedUser: v.nullish(identifierAccountSchema, undefined), - amount: v.nullish(gradidoAmountSchema, undefined), - memo: v.nullish(memoSchema, undefined), + linkedUser: v.optional(identifierAccountSchema), + amount: v.optional(gradidoAmountSchema), + memo: v.optional(memoSchema), type: v.enum(InputTransactionType), createdAt: dateSchema, - targetDate: v.nullish(dateSchema, undefined), - timeoutDuration: v.nullish(timeoutDurationSchema, undefined), - accountType: v.nullish(accountTypeSchema, undefined), + targetDate: v.optional(dateSchema), + timeoutDuration: v.optional(timeoutDurationSchema), + accountType: v.optional(v.enum(AccountType)), }) export type TransactionInput = v.InferInput diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index 71cae3619..dd8944247 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -1,6 +1,8 @@ +import { Static, TypeBoxFromValibot } from '@sinclair/typemap' +import { TypeCompiler } from '@sinclair/typebox/compiler' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' -import { AddressType_COMMUNITY_AUF, AddressType_COMMUNITY_PROJECT } from 'gradido-blockchain-js' +import { AddressType_COMMUNITY_AUF } from 'gradido-blockchain-js' import * as v from 'valibot' import { AccountType } from '../enum/AccountType' import { @@ -23,6 +25,27 @@ describe('basic.schema', () => { it('invalid date', () => { expect(() => v.parse(dateSchema, 'invalid date')).toThrow(new Error('invalid date')) }) + it('with type box', () => { + // Derive TypeBox Schema from the Valibot Schema + const DateSchema = TypeBoxFromValibot(dateSchema) + + // Build the compiler + const check = TypeCompiler.Compile(DateSchema) + + // Valid value (String) + expect(check.Check('2021-01-01T10:10:00.000Z')).toBe(true) + + // typebox cannot use valibot custom validation and transformations, it will check only the input types + expect(check.Check('invalid date')).toBe(true) + + // Type inference (TypeScript) + type DateType = Static + const validDate: DateType = '2021-01-01T10:10:00.000Z' + const validDate2: DateType = new Date('2021-01-01') + + // @ts-expect-error + const invalidDate: DateType = 123 // should fail in TS + }) }) describe('AddressType and AccountType', () => { @@ -46,6 +69,22 @@ describe('basic.schema', () => { const accountType = v.parse(accountTypeSchema, AddressType_COMMUNITY_AUF) expect(accountType).toBe(AccountType.COMMUNITY_AUF) }) + it('addressType with type box', () => { + const AddressTypeSchema = TypeBoxFromValibot(addressTypeSchema) + const check = TypeCompiler.Compile(AddressTypeSchema) + expect(check.Check(AccountType.COMMUNITY_AUF)).toBe(true) + // type box will throw an error, because it cannot handle valibots custom validation + expect(() => check.Check(AddressType_COMMUNITY_AUF)).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) + expect(() => check.Check('invalid')).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) + }) + it('accountType with type box', () => { + const AccountTypeSchema = TypeBoxFromValibot(accountTypeSchema) + const check = TypeCompiler.Compile(AccountTypeSchema) + expect(check.Check(AccountType.COMMUNITY_AUF)).toBe(true) + // type box will throw an error, because it cannot handle valibots custom validation + expect(() => check.Check(AddressType_COMMUNITY_AUF)).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) + expect(() => check.Check('invalid')).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) + }) }) it('confirmedTransactionSchema', () => { diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts index 4410b54be..2e4811c11 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -47,8 +47,8 @@ export const addressTypeSchema = v.pipe( */ export const accountTypeSchema = v.pipe( v.union([ - v.custom(isAddressType, 'expect AddressType'), v.enum(AccountType, 'expect AccountType'), + v.custom(isAddressType, 'expect AddressType'), ]), v.transform((value) => toAccountType(value)), ) diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts index b084e8531..d580abe3a 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -168,11 +168,21 @@ declare const validTimeoutDuration: unique symbol export type TimeoutDuration = DurationSeconds & { [validTimeoutDuration]: true } export const timeoutDurationSchema = v.pipe( - v.number('expect number type'), - v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), - v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), - v.transform( - (input: number) => new DurationSeconds(input) as TimeoutDuration, + v.union([ + v.pipe( + v.number('expect number type'), + v.minValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MIN, 'expect number >= 1 hour'), + v.maxValue(LINKED_TRANSACTION_TIMEOUT_DURATION_MAX, 'expect number <= 3 months'), + ), + v.instance(DurationSeconds, 'expect DurationSeconds type'), + ]), + v.transform( + (input: number | DurationSeconds) => { + if (input instanceof DurationSeconds) { + return input as TimeoutDuration + } + return new DurationSeconds(input) as TimeoutDuration + }, ), ) @@ -200,8 +210,16 @@ declare const validGradidoAmount: unique symbol export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true } export const gradidoAmountSchema = v.pipe( - amountSchema, - v.transform( - (input: Amount) => GradidoUnit.fromString(input) as GradidoAmount, + v.union([ + amountSchema, + v.instance(GradidoUnit, 'expect GradidoUnit type'), + ]), + v.transform( + (input: Amount | GradidoUnit) => { + if (input instanceof GradidoUnit) { + return input as GradidoAmount + } + return GradidoUnit.fromString(input) as GradidoAmount + }, ), ) diff --git a/dlt-connector/src/server/index.test.ts b/dlt-connector/src/server/index.test.ts new file mode 100644 index 000000000..f3a9aed7d --- /dev/null +++ b/dlt-connector/src/server/index.test.ts @@ -0,0 +1,75 @@ +import { appRoutes } from '.' +import { describe, it, expect, beforeAll, mock } from 'bun:test' +import { KeyPairCacheManager } from '../KeyPairCacheManager' +import { hieroIdSchema } from '../schemas/typeGuard.schema' +import { parse } from 'valibot' +import { HieroId } from '../schemas/typeGuard.schema' +import { GradidoTransaction, KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' + +const userUuid = '408780b2-59b3-402a-94be-56a4f4f4e8ec' + +mock.module('../KeyPairCacheManager', () => { + let homeCommunityTopicId: HieroId | undefined + return { + KeyPairCacheManager: { + getInstance: () => ({ + setHomeCommunityTopicId: (topicId: HieroId) => { + homeCommunityTopicId = topicId + }, + getHomeCommunityTopicId: () => homeCommunityTopicId, + getKeyPair: (key: string, create: () => KeyPairEd25519) => { + return create() + }, + }), + }, + } +}) + +mock.module('../client/hiero/HieroClient', () => ({ + HieroClient: { + getInstance: () => ({ + sendMessage: (topicId: HieroId, transaction: GradidoTransaction) => { + return { receipt: { status: '0.0.21732' }, response: { transactionId: '0.0.6566984@1758029639.561157605' } } + }, + }), + }, +})) + +mock.module('../config', () => ({ + CONFIG: { + HOME_COMMUNITY_SEED: MemoryBlock.fromHex('0102030401060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fe7'), + }, +})) + +beforeAll(() => { + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(parse(hieroIdSchema, '0.0.21732')) +}) + +describe('Server', () => { + it('send register address transaction', async () => { + const transaction = { + user: { + communityTopicId: '0.0.21732', + account: { + userUuid, + accountNr: 0, + }, + }, + type: 'REGISTER_ADDRESS', + accountType: 'COMMUNITY_HUMAN', + createdAt: '2022-01-01T00:00:00.000Z', + } + const response = await appRoutes.handle(new Request('http://localhost/sendTransaction', { + method: 'POST', + body: JSON.stringify(transaction), + headers: { + 'Content-Type': 'application/json', + }, + })) + if (response.status !== 200) { + console.log(await response.text()) + } + expect(response.status).toBe(200) + expect(await response.text()).toBe('0.0.6566984@1758029639.561157605') + }) +}) diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index 3aa13dcac..b8aa44fd3 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,6 +1,6 @@ import { TypeBoxFromValibot } from '@sinclair/typemap' import { Type } from '@sinclair/typebox' -import { Elysia, status } from 'elysia' +import { Elysia, status, t } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' import { getLogger } from 'log4js' import { parse } from 'valibot' @@ -11,7 +11,7 @@ import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCa import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.context' import { IdentifierAccount, identifierAccountSchema } from '../schemas/account.schema' import { transactionSchema } from '../schemas/transaction.schema' -import { hieroTransactionIdSchema } from '../schemas/typeGuard.schema' +import { hieroIdSchema, hieroTransactionIdSchema } from '../schemas/typeGuard.schema' import { accountIdentifierSeedSchema, accountIdentifierUserSchema, @@ -48,29 +48,22 @@ export const appRoutes = new Elysia() .post( '/sendTransaction', async ({ body }) => { - console.log("sendTransaction was called") - return "0.0.123" - console.log(body) - console.log(parse(transactionSchema, body)) - const transaction = parse(transactionSchema, body) - return await SendToHieroContext(transaction) + try { + const hieroTransactionId = await SendToHieroContext(parse(transactionSchema, body)) + console.log('server will return:', hieroTransactionId) + return { transactionId: hieroTransactionId } + } catch (e) { + if (e instanceof TypeError) { + console.log(`message: ${e.message}, stack: ${e.stack}`) + } + console.log(e) + throw status(500, e) + } }, // validation schemas { - // body: TypeBoxFromValibot(transactionSchema), - body: Type.Object({ - user: Type.Object({ - communityUser: Type.Object({ - uuid: Type.String({ format: 'uuid' }), - accountNr: Type.Optional(Type.String()), // optional/undefined - }), - communityUuid: Type.String({ format: 'uuid' }), - }), - createdAt: Type.String({ format: 'date-time' }), - accountType: Type.Literal('COMMUNITY_HUMAN'), - type: Type.Literal('REGISTER_ADDRESS'), - }) - // response: TypeBoxFromValibot(hieroTransactionIdSchema), + body: TypeBoxFromValibot(transactionSchema), + response: t.Object({ transactionId: TypeBoxFromValibot(hieroTransactionIdSchema) }), }, ) From 4e3d119f1249d6f95060856ad224feb612af9124 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 24 Sep 2025 16:25:43 +0200 Subject: [PATCH 34/72] direct sending transaction types to dlt --- backend/src/apis/dltConnector/index.ts | 62 +++++++++++++++- .../dltConnector/model/TransactionDraft.ts | 55 ++++++++++++++- .../graphql/resolver/ContributionResolver.ts | 32 ++++----- .../resolver/TransactionLinkResolver.ts | 67 +++++++++++++----- .../graphql/resolver/TransactionResolver.ts | 30 ++++---- backend/src/graphql/resolver/const/const.ts | 1 + backend/src/util/InterruptiveSleep.ts | 2 +- .../src/logging/UserContactLogging.view.ts | 4 +- database/src/logging/UserLogging.view.ts | 11 +-- database/src/logging/UserRoleLogging.view.ts | 4 +- database/src/queries/events.ts | 19 +++++ database/src/queries/index.ts | 1 + database/src/queries/user.ts | 7 ++ dlt-connector/bun.lock | 6 ++ dlt-connector/src/client/hiero/HieroClient.ts | 70 ++++++++++++------- dlt-connector/src/index.ts | 31 ++++++++ .../sendToHiero/SendToHiero.context.ts | 10 +-- 17 files changed, 323 insertions(+), 89 deletions(-) create mode 100644 database/src/queries/events.ts diff --git a/backend/src/apis/dltConnector/index.ts b/backend/src/apis/dltConnector/index.ts index 7780006e9..671c88297 100644 --- a/backend/src/apis/dltConnector/index.ts +++ b/backend/src/apis/dltConnector/index.ts @@ -7,8 +7,12 @@ import { Community as DbCommunity, Contribution as DbContribution, DltTransaction as DbDltTransaction, + TransactionLink as DbTransactionLink, User as DbUser, - getHomeCommunity, + getCommunityByUuid, + getHomeCommunity, + getUserById, + UserLoggingView, } from 'database' import { TransactionDraft } from './model/TransactionDraft' @@ -92,7 +96,15 @@ export async function transferTransaction( memo: string, createdAt: Date ): Promise { - + // load community if not already loaded, maybe they are remote communities + if (!senderUser.community) { + senderUser.community = await getCommunityByUuid(senderUser.communityUuid) + } + if (!recipientUser.community) { + recipientUser.community = await getCommunityByUuid(recipientUser.communityUuid) + } + logger.info(`sender user: ${new UserLoggingView(senderUser)}`) + logger.info(`recipient user: ${new UserLoggingView(recipientUser)}`) const draft = TransactionDraft.createTransfer(senderUser, recipientUser, amount, memo, createdAt) if (draft && dltConnectorClient) { const clientResponse = dltConnectorClient.sendTransaction(draft) @@ -104,4 +116,50 @@ export async function transferTransaction( return null } +export async function deferredTransferTransaction(senderUser: DbUser, transactionLink: DbTransactionLink) +: Promise { + // load community if not already loaded + if (!senderUser.community) { + senderUser.community = await getCommunityByUuid(senderUser.communityUuid) + } + const draft = TransactionDraft.createDeferredTransfer(senderUser, transactionLink) + if (draft && dltConnectorClient) { + const clientResponse = dltConnectorClient.sendTransaction(draft) + let dltTransaction = new DbDltTransaction() + dltTransaction.typeId = DltTransactionType.DEFERRED_TRANSFER + dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) + return await dltTransaction.save() + } + return null +} + +export async function redeemDeferredTransferTransaction(transactionLink: DbTransactionLink, amount: string, createdAt: Date, recipientUser: DbUser) +: Promise { + // load user and communities if not already loaded + if (!transactionLink.user) { + logger.debug('load sender user') + transactionLink.user = await getUserById(transactionLink.userId, true, false) + } + if (!transactionLink.user.community) { + logger.debug('load sender community') + transactionLink.user.community = await getCommunityByUuid(transactionLink.user.communityUuid) + } + if (!recipientUser.community) { + logger.debug('load recipient community') + recipientUser.community = await getCommunityByUuid(recipientUser.communityUuid) + } + logger.debug(`sender: ${new UserLoggingView(transactionLink.user)}`) + logger.debug(`recipient: ${new UserLoggingView(recipientUser)}`) + const draft = TransactionDraft.redeemDeferredTransfer(transactionLink, amount, createdAt, recipientUser) + if (draft && dltConnectorClient) { + const clientResponse = dltConnectorClient.sendTransaction(draft) + let dltTransaction = new DbDltTransaction() + dltTransaction.typeId = DltTransactionType.REDEEM_DEFERRED_TRANSFER + dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) + return await dltTransaction.save() + } + return null +} + + diff --git a/backend/src/apis/dltConnector/model/TransactionDraft.ts b/backend/src/apis/dltConnector/model/TransactionDraft.ts index 86f46a43b..5c40da289 100755 --- a/backend/src/apis/dltConnector/model/TransactionDraft.ts +++ b/backend/src/apis/dltConnector/model/TransactionDraft.ts @@ -3,10 +3,17 @@ import { AccountType } from '@dltConnector/enum/AccountType' import { TransactionType } from '@dltConnector/enum/TransactionType' import { AccountIdentifier } from './AccountIdentifier' -import { Community as DbCommunity, Contribution as DbContribution, User as DbUser } from 'database' +import { + Community as DbCommunity, + Contribution as DbContribution, + TransactionLink as DbTransactionLink, + User as DbUser +} from 'database' import { CommunityAccountIdentifier } from './CommunityAccountIdentifier' import { getLogger } from 'log4js' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' +import { IdentifierSeed } from './IdentifierSeed' +import { CODE_VALID_DAYS_DURATION } from '@/graphql/resolver/const/const' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.dltConnector.model.TransactionDraft`) @@ -21,7 +28,7 @@ export class TransactionDraft { createdAt: string // only for creation transaction targetDate?: string - // only for deferred transaction + // only for deferred transaction, duration in seconds timeoutDuration?: number // only for register address accountType?: AccountType @@ -75,4 +82,48 @@ export class TransactionDraft { draft.memo = memo return draft } + + static createDeferredTransfer(sendingUser: DbUser, transactionLink: DbTransactionLink) + : TransactionDraft | null { + if (!sendingUser.community) { + throw new Error(`missing community for user ${sendingUser.id}`) + } + const senderUserTopic = sendingUser.community.hieroTopicId + if (!senderUserTopic) { + throw new Error(`missing topicId for community ${sendingUser.community.id}`) + } + const draft = new TransactionDraft() + draft.user = new AccountIdentifier(senderUserTopic, new CommunityAccountIdentifier(sendingUser.gradidoID)) + draft.linkedUser = new AccountIdentifier(senderUserTopic, new IdentifierSeed(transactionLink.code)) + draft.type = TransactionType.GRADIDO_DEFERRED_TRANSFER + draft.createdAt = transactionLink.createdAt.toISOString() + draft.amount = transactionLink.amount.toString() + draft.memo = transactionLink.memo + draft.timeoutDuration = CODE_VALID_DAYS_DURATION * 24 * 60 * 60 + return draft + } + + static redeemDeferredTransfer(transactionLink: DbTransactionLink, amount: string, createdAt: Date, recipientUser: DbUser): TransactionDraft | null { + if (!transactionLink.user.community) { + throw new Error(`missing community for user ${transactionLink.user.id}`) + } + if (!recipientUser.community) { + throw new Error(`missing community for user ${recipientUser.id}`) + } + const senderUserTopic = transactionLink.user.community.hieroTopicId + if (!senderUserTopic) { + throw new Error(`missing topicId for community ${transactionLink.user.community.id}`) + } + const recipientUserTopic = recipientUser.community.hieroTopicId + if (!recipientUserTopic) { + throw new Error(`missing topicId for community ${recipientUser.community.id}`) + } + const draft = new TransactionDraft() + draft.user = new AccountIdentifier(senderUserTopic, new IdentifierSeed(transactionLink.code)) + draft.linkedUser = new AccountIdentifier(recipientUserTopic, new CommunityAccountIdentifier(recipientUser.gradidoID)) + draft.type = TransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER + draft.createdAt = createdAt.toISOString() + draft.amount = amount + return draft + } } \ No newline at end of file diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 7c31209e0..ac06f012e 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -436,9 +436,6 @@ export class ContributionResolver { ): Promise { const logger = createLogger() logger.addContext('contribution', id) - - let transaction: DbTransaction - let dltTransactionPromise: Promise // acquire lock const releaseLock = await TRANSACTIONS_LOCK.acquire() try { @@ -463,8 +460,7 @@ export class ContributionResolver { throw new LogError('Can not confirm contribution since the user was deleted') } const receivedCallDate = new Date() - dltTransactionPromise = contributionTransaction(contribution, moderatorUser, receivedCallDate) - + const dltTransactionPromise = contributionTransaction(contribution, moderatorUser, receivedCallDate) const creations = await getUserCreation(contribution.userId, clientTimezoneOffset, false) validateContribution( creations, @@ -476,7 +472,6 @@ export class ContributionResolver { const queryRunner = db.getDataSource().createQueryRunner() await queryRunner.connect() await queryRunner.startTransaction('REPEATABLE READ') // 'READ COMMITTED') - const lastTransaction = await getLastTransaction(contribution.userId) logger.info('lastTransaction ID', lastTransaction ? lastTransaction.id : 'undefined') @@ -493,7 +488,7 @@ export class ContributionResolver { } newBalance = newBalance.add(contribution.amount.toString()) - transaction = new DbTransaction() + let transaction = new DbTransaction() transaction.typeId = TransactionTypeId.CREATION transaction.memo = contribution.memo transaction.userId = contribution.userId @@ -520,7 +515,7 @@ export class ContributionResolver { await queryRunner.manager.update(DbContribution, { id: contribution.id }, contribution) await queryRunner.commitTransaction() - + logger.info('creation commited successfuly.') await sendContributionConfirmedEmail({ firstName: user.firstName, @@ -536,6 +531,17 @@ export class ContributionResolver { contribution.createdAt, ), }) + + // update transaction id in dlt transaction tables + // wait for finishing transaction by dlt-connector/hiero + const dltStartTime = new Date() + const dltTransaction = await dltTransactionPromise + if(dltTransaction) { + dltTransaction.transactionId = transaction.id + await dltTransaction.save() + } + const dltEndTime = new Date() + logger.debug(`dlt-connector contribution finished in ${dltEndTime.getTime() - dltStartTime.getTime()} ms`) } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Creation was not successful', e) @@ -546,16 +552,6 @@ export class ContributionResolver { } finally { releaseLock() } - // update transaction id in dlt transaction tables - // wait for finishing transaction by dlt-connector/hiero - const startTime = new Date() - const dltTransaction = await dltTransactionPromise - if(dltTransaction) { - dltTransaction.transactionId = transaction.id - await dltTransaction.save() - } - const endTime = new Date() - logger.debug(`dlt-connector contribution finished in ${endTime.getTime() - startTime.getTime()} ms`) return true } diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 624038c20..4521ce4ae 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -14,10 +14,13 @@ import { User } from '@model/User' import { QueryLinkResult } from '@union/QueryLinkResult' import { Decay, interpretEncryptedTransferArgs, TransactionTypeId } from 'core' import { - AppDatabase, Community as DbCommunity, Contribution as DbContribution, - ContributionLink as DbContributionLink, FederatedCommunity as DbFederatedCommunity, Transaction as DbTransaction, + AppDatabase, Contribution as DbContribution, + ContributionLink as DbContributionLink, FederatedCommunity as DbFederatedCommunity, + DltTransaction as DbDltTransaction, + Transaction as DbTransaction, TransactionLink as DbTransactionLink, User as DbUser, + findModeratorCreatingContributionLink, findTransactionLinkByCode, getHomeCommunity } from 'database' @@ -33,14 +36,10 @@ import { } from '@/event/Events' import { LogError } from '@/server/LogError' import { Context, getClientTimezoneOffset, getUser } from '@/server/context' -import { - InterruptiveSleepManager, - TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY, -} from '@/util/InterruptiveSleepManager' import { calculateBalance } from '@/util/validate' import { fullName } from 'core' import { TRANSACTION_LINK_LOCK, TRANSACTIONS_LOCK } from 'database' -import { calculateDecay, decode, DisburseJwtPayloadType, encode, encryptAndSign, EncryptedJWEJwtPayloadType, RedeemJwtPayloadType, verify } from 'shared' +import { calculateDecay, decode, DisburseJwtPayloadType, encode, encryptAndSign, RedeemJwtPayloadType, verify } from 'shared' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' import { DisbursementClient as V1_0_DisbursementClient } from '@/federation/client/1_0/DisbursementClient' @@ -58,6 +57,8 @@ import { import { getUserCreation, validateContribution } from './util/creations' import { transactionLinkList } from './util/transactionLinkList' import { SignedTransferPayloadType } from 'shared' +import { contributionTransaction, deferredTransferTransaction, redeemDeferredTransferTransaction } from '@/apis/dltConnector' +import { CODE_VALID_DAYS_DURATION } from './const/const' const createLogger = (method: string) => getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.TransactionLinkResolver.${method}`) @@ -71,7 +72,7 @@ export const transactionLinkCode = (date: Date): string => { ) } -const CODE_VALID_DAYS_DURATION = 14 + const db = AppDatabase.getInstance() export const transactionLinkExpireDate = (date: Date): Date => { @@ -109,11 +110,20 @@ export class TransactionLinkResolver { transactionLink.code = transactionLinkCode(createdDate) transactionLink.createdAt = createdDate transactionLink.validUntil = validUntil + const dltTransactionPromise = deferredTransferTransaction(user, transactionLink) await DbTransactionLink.save(transactionLink).catch((e) => { throw new LogError('Unable to save transaction link', e) }) await EVENT_TRANSACTION_LINK_CREATE(user, transactionLink, amount) - + // wait for dlt transaction to be created + const startTime = Date.now() + const dltTransaction = await dltTransactionPromise + const endTime = Date.now() + createLogger('createTransactionLink').debug(`dlt transaction created in ${endTime - startTime} ms`) + if (dltTransaction) { + dltTransaction.transactionLinkId = transactionLink.id + await DbDltTransaction.save(dltTransaction) + } return new TransactionLink(transactionLink, new User(user)) } @@ -137,7 +147,6 @@ export class TransactionLinkResolver { user.id, ) } - if (transactionLink.redeemedBy) { throw new LogError('Transaction link already redeemed', transactionLink.redeemedBy) } @@ -146,7 +155,19 @@ export class TransactionLinkResolver { throw new LogError('Transaction link could not be deleted', e) }) + transactionLink.user = user + const dltTransactionPromise = redeemDeferredTransferTransaction(transactionLink, transactionLink.amount.toString(), transactionLink.deletedAt!, user) + await EVENT_TRANSACTION_LINK_DELETE(user, transactionLink) + // wait for dlt transaction to be created + const startTime = Date.now() + const dltTransaction = await dltTransactionPromise + const endTime = Date.now() + createLogger('deleteTransactionLink').debug(`dlt transaction created in ${endTime - startTime} ms`) + if (dltTransaction) { + dltTransaction.transactionLinkId = transactionLink.id + await DbDltTransaction.save(dltTransaction) + } return true } @@ -279,7 +300,7 @@ export class TransactionLinkResolver { throw new LogError('Contribution link has unknown cycle', contributionLink.cycle) } } - + const moderatorPromise = findModeratorCreatingContributionLink(contributionLink) const creations = await getUserCreation(user.id, clientTimezoneOffset) methodLogger.info('open creations', creations) validateContribution(creations, contributionLink.amount, now, clientTimezoneOffset) @@ -293,6 +314,12 @@ export class TransactionLinkResolver { contribution.contributionType = ContributionType.LINK contribution.contributionStatus = ContributionStatus.CONFIRMED + let dltTransactionPromise: Promise = Promise.resolve(null) + const moderator = await moderatorPromise + if (moderator) { + dltTransactionPromise = contributionTransaction(contribution, moderator, now) + } + await queryRunner.manager.insert(DbContribution, contribution) const lastTransaction = await getLastTransaction(user.id) @@ -338,6 +365,17 @@ export class TransactionLinkResolver { contributionLink, contributionLink.amount, ) + if (dltTransactionPromise) { + const startTime = new Date() + const dltTransaction = await dltTransactionPromise + const endTime = new Date() + methodLogger.info(`dlt-connector transaction finished in ${endTime.getTime() - startTime.getTime()} ms`) + if (dltTransaction) { + dltTransaction.transactionId = transaction.id + await dltTransaction.save() + } + + } } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Creation from contribution link was not successful', e) @@ -346,10 +384,7 @@ export class TransactionLinkResolver { } } finally { releaseLock() - } - // notify dlt-connector loop for new work - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) - + } return true } else { const now = new Date() @@ -399,8 +434,6 @@ export class TransactionLinkResolver { } finally { releaseLinkLock() } - // notify dlt-connector loop for new work - InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) return true } } diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 79b6eff5f..0b1d6d866 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -6,7 +6,9 @@ import { Transaction as dbTransaction, TransactionLink as dbTransactionLink, User as dbUser, - findUserByIdentifier + findUserByIdentifier, + TransactionLoggingView, + UserLoggingView } from 'database' import { Decimal } from 'decimal.js-light' import { Args, Authorized, Ctx, Mutation, Query, Resolver } from 'type-graphql' @@ -43,7 +45,7 @@ import { GdtResolver } from './GdtResolver' import { getCommunityName, isHomeCommunity } from './util/communities' import { getTransactionList } from './util/getTransactionList' import { transactionLinkSummary } from './util/transactionLinkSummary' -import { transferTransaction } from '@/apis/dltConnector' +import { transferTransaction, redeemDeferredTransferTransaction } from '@/apis/dltConnector' const db = AppDatabase.getInstance() const createLogger = () => getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.TransactionResolver`) @@ -60,13 +62,15 @@ export const executeTransaction = async ( let dltTransactionPromise: Promise = Promise.resolve(null) if (!transactionLink) { dltTransactionPromise = transferTransaction(sender, recipient, amount.toString(), memo, receivedCallDate) + } else { + dltTransactionPromise = redeemDeferredTransferTransaction(transactionLink, amount.toString(), receivedCallDate, recipient) } // acquire lock const releaseLock = await TRANSACTIONS_LOCK.acquire() try { - logger.info('executeTransaction', amount, memo, sender, recipient) + logger.info('executeTransaction', memo) if (await countOpenPendingTransactions([sender.gradidoID, recipient.gradidoID]) > 0) { throw new LogError( @@ -85,7 +89,7 @@ export const executeTransaction = async ( receivedCallDate, transactionLink, ) - logger.debug(`calculated Balance=${sendBalance}`) + logger.debug(`calculated balance=${sendBalance?.balance.toString()} decay=${sendBalance?.decay.decay.toString()} lastTransactionId=${sendBalance?.lastTransactionId}`) if (!sendBalance) { throw new LogError('User has not enough GDD or amount is < 0', sendBalance) } @@ -144,7 +148,7 @@ export const executeTransaction = async ( // Save linked transaction id for send transactionSend.linkedTransactionId = transactionReceive.id await queryRunner.manager.update(dbTransaction, { id: transactionSend.id }, transactionSend) - logger.debug('send Transaction updated', transactionSend) + logger.debug('send Transaction updated', new TransactionLoggingView(transactionSend).toJSON()) if (transactionLink) { logger.info('transactionLink', transactionLink) @@ -158,21 +162,23 @@ export const executeTransaction = async ( } await queryRunner.commitTransaction() - // update dltTransaction with transactionId - const dltTransaction = await dltTransactionPromise - if (dltTransaction) { - dltTransaction.transactionId = transactionSend.id - await dltTransaction.save() - } await EVENT_TRANSACTION_SEND(sender, recipient, transactionSend, transactionSend.amount) - await EVENT_TRANSACTION_RECEIVE( recipient, sender, transactionReceive, transactionReceive.amount, ) + // update dltTransaction with transactionId + const startTime = new Date() + const dltTransaction = await dltTransactionPromise + const endTime = new Date() + logger.debug(`dlt-connector transaction finished in ${endTime.getTime() - startTime.getTime()} ms`) + if (dltTransaction) { + dltTransaction.transactionId = transactionSend.id + await dltTransaction.save() + } } catch (e) { await queryRunner.rollbackTransaction() throw new LogError('Transaction was not successful', e) diff --git a/backend/src/graphql/resolver/const/const.ts b/backend/src/graphql/resolver/const/const.ts index 8497ca6d5..8e0a0722e 100644 --- a/backend/src/graphql/resolver/const/const.ts +++ b/backend/src/graphql/resolver/const/const.ts @@ -12,3 +12,4 @@ export const MEMO_MAX_CHARS = 512 export const MEMO_MIN_CHARS = 5 export const DEFAULT_PAGINATION_PAGE_SIZE = 25 export const FRONTEND_CONTRIBUTIONS_ITEM_ANCHOR_PREFIX = 'contributionListItem-' +export const CODE_VALID_DAYS_DURATION = 14 \ No newline at end of file diff --git a/backend/src/util/InterruptiveSleep.ts b/backend/src/util/InterruptiveSleep.ts index dc8ed5ae0..86afcf9b5 100644 --- a/backend/src/util/InterruptiveSleep.ts +++ b/backend/src/util/InterruptiveSleep.ts @@ -1,4 +1,4 @@ -import { delay } from './utilities' +import { delay } from 'core' /** * Sleep, that can be interrupted diff --git a/database/src/logging/UserContactLogging.view.ts b/database/src/logging/UserContactLogging.view.ts index d80b17c67..4bd567cad 100644 --- a/database/src/logging/UserContactLogging.view.ts +++ b/database/src/logging/UserContactLogging.view.ts @@ -8,7 +8,7 @@ enum OptInType { } export class UserContactLoggingView extends AbstractLoggingView { - public constructor(private self: UserContact) { + public constructor(private self: UserContact, private showUser = true) { super() } @@ -16,7 +16,7 @@ export class UserContactLoggingView extends AbstractLoggingView { return { id: this.self.id, type: this.self.type, - user: this.self.user + user: this.showUser && this.self.user ? new UserLoggingView(this.self.user).toJSON() : { id: this.self.userId }, email: this.self.email?.substring(0, 3) + '...', diff --git a/database/src/logging/UserLogging.view.ts b/database/src/logging/UserLogging.view.ts index 1aa5e4407..84db8a6fe 100644 --- a/database/src/logging/UserLogging.view.ts +++ b/database/src/logging/UserLogging.view.ts @@ -4,6 +4,7 @@ import { ContributionLoggingView } from './ContributionLogging.view' import { ContributionMessageLoggingView } from './ContributionMessageLogging.view' import { UserContactLoggingView } from './UserContactLogging.view' import { UserRoleLoggingView } from './UserRoleLogging.view' +import { CommunityLoggingView } from './CommunityLogging.view' enum PasswordEncryptionType { NO_PASSWORD = 0, @@ -21,10 +22,12 @@ export class UserLoggingView extends AbstractLoggingView { id: this.self.id, foreign: this.self.foreign, gradidoID: this.self.gradidoID, - communityUuid: this.self.communityUuid, + community: this.self.community + ? new CommunityLoggingView(this.self.community).toJSON() + : { id: this.self.communityUuid }, alias: this.self.alias?.substring(0, 3) + '...', emailContact: this.self.emailContact - ? new UserContactLoggingView(this.self.emailContact).toJSON() + ? new UserContactLoggingView(this.self.emailContact, false).toJSON() : { id: this.self.emailId }, firstName: this.self.firstName?.substring(0, 3) + '...', lastName: this.self.lastName?.substring(0, 3) + '...', @@ -35,7 +38,7 @@ export class UserLoggingView extends AbstractLoggingView { hideAmountGDD: this.self.hideAmountGDD, hideAmountGDT: this.self.hideAmountGDT, userRoles: this.self.userRoles - ? this.self.userRoles.map((userRole) => new UserRoleLoggingView(userRole).toJSON()) + ? this.self.userRoles.map((userRole) => new UserRoleLoggingView(userRole, false).toJSON()) : undefined, referrerId: this.self.referrerId, contributionLinkId: this.self.contributionLinkId, @@ -50,7 +53,7 @@ export class UserLoggingView extends AbstractLoggingView { : undefined, userContacts: this.self.userContacts ? this.self.userContacts.map((userContact) => - new UserContactLoggingView(userContact).toJSON(), + new UserContactLoggingView(userContact, false).toJSON(), ) : undefined, } diff --git a/database/src/logging/UserRoleLogging.view.ts b/database/src/logging/UserRoleLogging.view.ts index 52684d242..ebfa3aed8 100644 --- a/database/src/logging/UserRoleLogging.view.ts +++ b/database/src/logging/UserRoleLogging.view.ts @@ -3,14 +3,14 @@ import { AbstractLoggingView } from './AbstractLogging.view' import { UserLoggingView } from './UserLogging.view' export class UserRoleLoggingView extends AbstractLoggingView { - public constructor(private self: UserRole) { + public constructor(private self: UserRole, private showUser = true) { super() } public toJSON(): any { return { id: this.self.id, - user: this.self.user + user: this.showUser && this.self.user ? new UserLoggingView(this.self.user).toJSON() : { id: this.self.userId }, role: this.self.role, diff --git a/database/src/queries/events.ts b/database/src/queries/events.ts new file mode 100644 index 000000000..ff0967944 --- /dev/null +++ b/database/src/queries/events.ts @@ -0,0 +1,19 @@ +import { + ContributionLink as DbContributionLink, + Event as DbEvent, + User as DbUser +} from '../entity' + +export async function findModeratorCreatingContributionLink(contributionLink: DbContributionLink): Promise { + const event = await DbEvent.findOne( + { + where: { + involvedContributionLinkId: contributionLink.id, + // todo: move event types into db + type: 'ADMIN_CONTRIBUTION_LINK_CREATE' + }, + relations: { actingUser: true } + } + ) + return event?.actingUser +} \ No newline at end of file diff --git a/database/src/queries/index.ts b/database/src/queries/index.ts index 1fec568bf..54b5c6d4e 100644 --- a/database/src/queries/index.ts +++ b/database/src/queries/index.ts @@ -5,5 +5,6 @@ export * from './communities' export * from './pendingTransactions' export * from './transactions' export * from './transactionLinks' +export * from './events' export const LOG4JS_QUERIES_CATEGORY_NAME = `${LOG4JS_BASE_CATEGORY_NAME}.queries` diff --git a/database/src/queries/user.ts b/database/src/queries/user.ts index 2cb0eaaee..eb3f58d60 100644 --- a/database/src/queries/user.ts +++ b/database/src/queries/user.ts @@ -12,6 +12,13 @@ export async function aliasExists(alias: string): Promise { return user !== null } +export async function getUserById(id: number, withCommunity: boolean = false, withEmailContact: boolean = false): Promise { + return DbUser.findOneOrFail({ + where: { id }, + relations: { community: withCommunity, emailContact: withEmailContact }, + }) +} + /** * * @param identifier could be gradidoID, alias or email of user diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 93b3943c1..c7616863d 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -4,6 +4,7 @@ "": { "name": "dlt-connector", "dependencies": { + "async-exit-hook": "^2.0.1", "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js", }, "devDependencies": { @@ -11,6 +12,7 @@ "@hashgraph/sdk": "^2.70.0", "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", + "@types/async-exit-hook": "^2.0.2", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", "elysia": "1.3.8", @@ -247,6 +249,8 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], + "@types/async-exit-hook": ["@types/async-exit-hook@2.0.2", "", {}, "sha512-RJbTNivnnn+JzNiQTtUgwo/1S6QUHwI5JfXCeUPsqZXB4LuvRwvHhbKFSS5jFDYpk8XoEAYVW2cumBOdGpXL2Q=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], @@ -301,6 +305,8 @@ "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="], + "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], + "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index 0815437ef..92a994345 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -9,6 +9,7 @@ import { TopicInfoQuery, TopicMessageSubmitTransaction, TopicUpdateTransaction, + TransactionId, TransactionReceipt, TransactionResponse, Wallet, @@ -30,6 +31,9 @@ export class HieroClient { wallet: Wallet client: Client logger: Logger + // transaction counter for logging + transactionInternNr: number = 0 + pendingPromises: Promise[] = [] private constructor() { this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.HieroClient`) @@ -53,12 +57,23 @@ export class HieroClient { return HieroClient.instance } + public async waitForPendingPromises() { + const startTime = new Date() + this.logger.info(`waiting for ${this.pendingPromises.length} pending promises`) + await Promise.all(this.pendingPromises) + const endTime = new Date() + this.logger.info(`all pending promises resolved, used time: ${endTime.getTime() - startTime.getTime()}ms`) + } + public async sendMessage( topicId: HieroId, transaction: GradidoTransaction, - ): Promise<{ receipt: TransactionReceipt; response: TransactionResponse }> { - let startTime = new Date() - this.logger.addContext('topicId', topicId.toString()) + ): Promise { + const startTime = new Date() + this.transactionInternNr++ + const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.HieroClient`) + logger.addContext('trNr', this.transactionInternNr) + logger.addContext('topicId', topicId.toString()) const serializedTransaction = transaction.getSerializedTransaction() if (!serializedTransaction) { throw new Error('cannot serialize transaction') @@ -68,29 +83,34 @@ export class HieroClient { topicId, message: serializedTransaction.data(), }).freezeWithSigner(this.wallet) - let endTime = new Date() - this.logger.info(`prepare message, until freeze, cost: ${endTime.getTime() - startTime.getTime()}ms`) - startTime = new Date() - const signedHieroTransaction = await hieroTransaction.signWithSigner(this.wallet) - endTime = new Date() - this.logger.info(`sign message, cost: ${endTime.getTime() - startTime.getTime()}ms`) - startTime = new Date() - const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) - endTime = new Date() - this.logger.info(`send message, cost: ${endTime.getTime() - startTime.getTime()}ms`) - startTime = new Date() - const sendReceipt = await sendResponse.getReceiptWithSigner(this.wallet) - endTime = new Date() - this.logger.info(`get receipt, cost: ${endTime.getTime() - startTime.getTime()}ms`) - this.logger.info( - `message sent to topic ${topicId}, status: ${sendReceipt.status.toString()}, transaction id: ${sendResponse.transactionId.toString()}`, + // sign and execute transaction needs some time, so let it run in background + const pendingPromiseIndex = this.pendingPromises.push( + hieroTransaction.signWithSigner(this.wallet).then(async (signedHieroTransaction) => { + const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) + logger.info(`message sent to topic ${topicId}, transaction id: ${sendResponse.transactionId.toString()}`) + if (logger.isInfoEnabled()) { + // only for logging + sendResponse.getReceiptWithSigner(this.wallet).then((receipt) => { + logger.info( + `message send status: ${receipt.status.toString()}`, + ) + }) + // only for logging + sendResponse.getRecordWithSigner(this.wallet).then((record) => { + logger.info(`message sent, cost: ${record.transactionFee.toString()}`) + const localEndTime = new Date() + logger.info(`HieroClient.sendMessage used time (full process): ${localEndTime.getTime() - startTime.getTime()}ms`) + }) + } + }).catch((e) => { + logger.error(e) + }).finally(() => { + this.pendingPromises.splice(pendingPromiseIndex, 1) + }) ) - startTime = new Date() - const record = await sendResponse.getRecordWithSigner(this.wallet) - endTime = new Date() - this.logger.info(`get record, cost: ${endTime.getTime() - startTime.getTime()}ms`) - this.logger.info(`message sent, cost: ${record.transactionFee.toString()}`) - return { receipt: sendReceipt, response: sendResponse } + const endTime = new Date() + logger.info(`HieroClient.sendMessage used time: ${endTime.getTime() - startTime.getTime()}ms`) + return hieroTransaction.transactionId } public async getBalance(): Promise { diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index afd517069..835a1cef5 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -46,9 +46,36 @@ async function main() { // listen for rpc request from backend (graphql replaced with elysiaJS) new Elysia().use(appRoutes).listen(CONFIG.DLT_CONNECTOR_PORT, () => { logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) + setupGracefulShutdown(logger) }) } +function setupGracefulShutdown(logger: Logger) { + const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'] + signals.forEach(sig => { + process.on(sig, async () => { + logger.info(`[shutdown] Got ${sig}, cleaning up…`) + await gracefulShutdown(logger) + process.exit(0) + }) + }) + + if (process.platform === "win32") { + const rl = require("readline").createInterface({ + input: process.stdin, + output: process.stdout, + }) + rl.on("SIGINT", () => { + process.emit("SIGINT" as any) + }) + } +} + +async function gracefulShutdown(logger: Logger) { + logger.info('graceful shutdown') + await HieroClient.getInstance().waitForPendingPromises() +} + function loadConfig(): Logger { // configure log4js // TODO: replace late by loader from config-schema @@ -113,3 +140,7 @@ main().catch((e) => { console.error(e) process.exit(1) }) +function exitHook(arg0: () => void) { + throw new Error('Function not implemented.') +} + diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index 8fde79267..5061233be 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -50,10 +50,12 @@ export async function SendToHieroContext( topic: HieroId, ): Promise => { const client = HieroClient.getInstance() - const resultMessage = await client.sendMessage(topic, gradidoTransaction) - const transactionId = resultMessage.response.transactionId.toString() - logger.info('transmitted Gradido Transaction to Hiero', { transactionId }) - return transactionId + const transactionId = await client.sendMessage(topic, gradidoTransaction) + if (!transactionId) { + throw new Error('missing transaction id from hiero') + } + logger.info('transmitted Gradido Transaction to Hiero', { transactionId: transactionId.toString() }) + return transactionId.toString() } // choose correct role based on transaction type and input type From cf254c10812b66a7f75bd079de077f176eef9555 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 27 Sep 2025 16:10:33 +0200 Subject: [PATCH 35/72] update gradido node api --- dlt-connector/bun.lock | 6 ------ dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts | 8 ++++---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index c7616863d..93b3943c1 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -4,7 +4,6 @@ "": { "name": "dlt-connector", "dependencies": { - "async-exit-hook": "^2.0.1", "gradido-blockchain-js": "git+https://github.com/gradido/gradido-blockchain-js", }, "devDependencies": { @@ -12,7 +11,6 @@ "@hashgraph/sdk": "^2.70.0", "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", - "@types/async-exit-hook": "^2.0.2", "@types/bun": "^1.2.17", "dotenv": "^10.0.0", "elysia": "1.3.8", @@ -249,8 +247,6 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], - "@types/async-exit-hook": ["@types/async-exit-hook@2.0.2", "", {}, "sha512-RJbTNivnnn+JzNiQTtUgwo/1S6QUHwI5JfXCeUPsqZXB4LuvRwvHhbKFSS5jFDYpk8XoEAYVW2cumBOdGpXL2Q=="], - "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], @@ -305,8 +301,6 @@ "asn1js": ["asn1js@3.0.6", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA=="], - "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], - "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts index 5b58ad258..c7f9d2fb7 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -64,7 +64,7 @@ export class GradidoNodeClient { ...parse(transactionIdentifierSchema, transactionIdentifier), format: 'base64', } - const response = await this.rpcCall<{ transaction: string }>('gettransaction', parameter) + const response = await this.rpcCall<{ transaction: string }>('getTransaction', parameter) if (response.isSuccess()) { // this.logger.debug('result: ', response.result.transaction) return parse(confirmedTransactionSchema, response.result.transaction) @@ -90,7 +90,7 @@ export class GradidoNodeClient { format: 'base64', topic: hieroTopic, } - const response = await this.rpcCall<{ transaction: string }>('getlasttransaction', parameter) + const response = await this.rpcCall<{ transaction: string }>('getLastTransaction', parameter) if (response.isSuccess()) { return parse(confirmedTransactionSchema, response.result.transaction) } @@ -151,7 +151,7 @@ export class GradidoNodeClient { format: 'base64', } const response = await this.rpcCallResolved<{ transactions: string[] }>( - 'listtransactionsforaddress', + 'getTransactionsForAddress', parameter, ) return response.transactions.map((transactionBase64) => @@ -176,7 +176,7 @@ export class GradidoNodeClient { topic: hieroTopic, } const response = await this.rpcCallResolved<{ addressType: string }>( - 'getaddresstype', + 'getAddressType', parameter, ) return parse(addressTypeSchema, response.addressType) From d61ea0de3024db4ebea9130f2311e6b4453057d6 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 30 Sep 2025 08:29:38 +0200 Subject: [PATCH 36/72] update default env --- dlt-connector/.env.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index ba8fe5557..ff40bd5d1 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -13,7 +13,7 @@ IOTA_HOME_COMMUNITY_SEED=aabbccddeeff00112233445566778899aabbccddeeff00112233445 DLT_CONNECTOR_PORT=6010 # Gradido Node Server URL -NODE_SERVER_URL=http://localhost:8340 +NODE_SERVER_URL=http://localhost:8340/api # Gradido Blockchain GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=21ffbbc616fe From 3606f9189e9b73ff4fc8079b33b6f07c1f0d6c3b Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Oct 2025 14:39:22 +0200 Subject: [PATCH 37/72] some fixes --- backend/src/apis/dltConnector/index.ts | 57 +- .../src/graphql/resolver/UserResolver.test.ts | 1 + .../sendTransactionsToDltConnector.test.ts | 799 ------------------ backend/src/index.ts | 1 - 4 files changed, 21 insertions(+), 837 deletions(-) delete mode 100644 backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts diff --git a/backend/src/apis/dltConnector/index.ts b/backend/src/apis/dltConnector/index.ts index 671c88297..275a3d9d0 100644 --- a/backend/src/apis/dltConnector/index.ts +++ b/backend/src/apis/dltConnector/index.ts @@ -44,6 +44,20 @@ async function checkDltConnectorResult(dltTransaction: DbDltTransaction, clientR return dltTransaction } +async function executeDltTransaction(draft: TransactionDraft | null, typeId: DltTransactionType, persist = true): Promise { + if (draft && dltConnectorClient) { + const clientResponse = dltConnectorClient.sendTransaction(draft) + let dltTransaction = new DbDltTransaction() + dltTransaction.typeId = typeId + dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) + if (persist) { + return await dltTransaction.save() + } + return dltTransaction + } + return Promise.resolve(null) +} + /** * send register address transaction via dlt-connector to hiero * and update dltTransactionId of transaction in db with hiero transaction id @@ -55,14 +69,11 @@ export async function registerAddressTransaction(user: DbUser, community: DbComm } // return null if some data where missing and log error const draft = TransactionDraft.createRegisterAddress(user, community) - if (draft && dltConnectorClient) { - const clientResponse = dltConnectorClient.sendTransaction(draft) - let dltTransaction = new DbDltTransaction() - dltTransaction.typeId = DltTransactionType.REGISTER_ADDRESS + const dltTransaction = await executeDltTransaction(draft, DltTransactionType.REGISTER_ADDRESS, false) + if (dltTransaction) { if (user.id) { dltTransaction.userId = user.id } - dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) return await dltTransaction.save() } return null @@ -79,14 +90,7 @@ export async function contributionTransaction( return null } const draft = TransactionDraft.createContribution(contribution, createdAt, signingUser, homeCommunity) - if (draft && dltConnectorClient) { - const clientResponse = dltConnectorClient.sendTransaction(draft) - let dltTransaction = new DbDltTransaction() - dltTransaction.typeId = DltTransactionType.CREATION - dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) - return await dltTransaction.save() - } - return null + return await executeDltTransaction(draft, DltTransactionType.CREATION) } export async function transferTransaction( @@ -106,14 +110,7 @@ export async function transferTransaction( logger.info(`sender user: ${new UserLoggingView(senderUser)}`) logger.info(`recipient user: ${new UserLoggingView(recipientUser)}`) const draft = TransactionDraft.createTransfer(senderUser, recipientUser, amount, memo, createdAt) - if (draft && dltConnectorClient) { - const clientResponse = dltConnectorClient.sendTransaction(draft) - let dltTransaction = new DbDltTransaction() - dltTransaction.typeId = DltTransactionType.TRANSFER - dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) - return await dltTransaction.save() - } - return null + return await executeDltTransaction(draft, DltTransactionType.TRANSFER) } export async function deferredTransferTransaction(senderUser: DbUser, transactionLink: DbTransactionLink) @@ -123,14 +120,7 @@ export async function deferredTransferTransaction(senderUser: DbUser, transactio senderUser.community = await getCommunityByUuid(senderUser.communityUuid) } const draft = TransactionDraft.createDeferredTransfer(senderUser, transactionLink) - if (draft && dltConnectorClient) { - const clientResponse = dltConnectorClient.sendTransaction(draft) - let dltTransaction = new DbDltTransaction() - dltTransaction.typeId = DltTransactionType.DEFERRED_TRANSFER - dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) - return await dltTransaction.save() - } - return null + return await executeDltTransaction(draft, DltTransactionType.DEFERRED_TRANSFER) } export async function redeemDeferredTransferTransaction(transactionLink: DbTransactionLink, amount: string, createdAt: Date, recipientUser: DbUser) @@ -151,14 +141,7 @@ export async function redeemDeferredTransferTransaction(transactionLink: DbTrans logger.debug(`sender: ${new UserLoggingView(transactionLink.user)}`) logger.debug(`recipient: ${new UserLoggingView(recipientUser)}`) const draft = TransactionDraft.redeemDeferredTransfer(transactionLink, amount, createdAt, recipientUser) - if (draft && dltConnectorClient) { - const clientResponse = dltConnectorClient.sendTransaction(draft) - let dltTransaction = new DbDltTransaction() - dltTransaction.typeId = DltTransactionType.REDEEM_DEFERRED_TRANSFER - dltTransaction = await checkDltConnectorResult(dltTransaction, clientResponse) - return await dltTransaction.save() - } - return null + return await executeDltTransaction(draft, DltTransactionType.REDEEM_DEFERRED_TRANSFER) } diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 64817bd3e..cee570c94 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -117,6 +117,7 @@ beforeAll(async () => { query = testEnv.query con = testEnv.con CONFIG.HUMHUB_ACTIVE = false + CONFIG.DLT_CONNECTOR = false await cleanDB() }) diff --git a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts b/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts deleted file mode 100644 index 769730544..000000000 --- a/backend/src/graphql/resolver/util/sendTransactionsToDltConnector.test.ts +++ /dev/null @@ -1,799 +0,0 @@ -import { ApolloServerTestClient } from 'apollo-server-testing' -import { Community, DltTransaction, Transaction } from 'database' -import { Decimal } from 'decimal.js-light' -// import { GraphQLClient } from 'graphql-request' -// import { Response } from 'graphql-request/dist/types' -import { GraphQLClient } from 'graphql-request' -import { Response } from 'graphql-request/dist/types' -import { DataSource } from 'typeorm' -import { v4 as uuidv4 } from 'uuid' - -import { cleanDB, testEnvironment } from '@test/helpers' -import { i18n as localization } from '@test/testSetup' - -import { CONFIG } from '@/config' -import { TransactionTypeId } from 'core' -import { creations } from '@/seeds/creation' -import { creationFactory } from '@/seeds/factory/creation' -import { userFactory } from '@/seeds/factory/user' -import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' -import { bobBaumeister } from '@/seeds/users/bob-baumeister' -import { peterLustig } from '@/seeds/users/peter-lustig' -import { raeuberHotzenplotz } from '@/seeds/users/raeuber-hotzenplotz' -import { getLogger } from 'config-schema/test/testSetup' -import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' - -import { sendTransactionsToDltConnector } from './sendTransactionsToDltConnector' - -jest.mock('@/password/EncryptorUtils') - -const logger = getLogger( - `${LOG4JS_BASE_CATEGORY_NAME}.graphql.resolver.util.sendTransactionsToDltConnector`, -) - -/* -// Mock the GraphQLClient -jest.mock('graphql-request', () => { - const originalModule = jest.requireActual('graphql-request') - - let testCursor = 0 - - return { - __esModule: true, - ...originalModule, - GraphQLClient: jest.fn().mockImplementation((url: string) => { - if (url === 'invalid') { - throw new Error('invalid url') - } - return { - // why not using mockResolvedValueOnce or mockReturnValueOnce? - // I have tried, but it didn't work and return every time the first value - request: jest.fn().mockImplementation(() => { - testCursor++ - if (testCursor === 4) { - return Promise.resolve( - // invalid, is 33 Bytes long as binary - { - transmitTransaction: { - dltTransactionIdHex: - '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516212A', - }, - }, - ) - } else if (testCursor === 5) { - throw Error('Connection error') - } else { - return Promise.resolve( - // valid, is 32 Bytes long as binary - { - transmitTransaction: { - dltTransactionIdHex: - '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc51621', - }, - }, - ) - } - }), - } - }), - } -}) -let mutate: ApolloServerTestClient['mutate'], - query: ApolloServerTestClient['query'], - con: Connection -let testEnv: { - mutate: ApolloServerTestClient['mutate'] - query: ApolloServerTestClient['query'] - con: Connection -} -*/ - -async function createHomeCommunity(): Promise { - const homeCommunity = Community.create() - homeCommunity.foreign = false - homeCommunity.communityUuid = uuidv4() - homeCommunity.url = 'localhost' - homeCommunity.publicKey = Buffer.from('0x6e6a6c6d6feffe', 'hex') - await Community.save(homeCommunity) - return homeCommunity -} - -async function createTxCREATION1(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(1000) - tx.balance = new Decimal(100) - tx.balanceDate = new Date('01.01.2023 00:00:00') - tx.memo = 'txCREATION1' - tx.typeId = TransactionTypeId.CREATION - tx.userGradidoID = 'txCREATION1.userGradidoID' - tx.userId = 1 - tx.userName = 'txCREATION 1' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('01.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c1' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('01.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxCREATION2(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(1000) - tx.balance = new Decimal(200) - tx.balanceDate = new Date('02.01.2023 00:00:00') - tx.memo = 'txCREATION2' - tx.typeId = TransactionTypeId.CREATION - tx.userGradidoID = 'txCREATION2.userGradidoID' - tx.userId = 2 - tx.userName = 'txCREATION 2' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('02.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c2' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('02.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxCREATION3(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(1000) - tx.balance = new Decimal(300) - tx.balanceDate = new Date('03.01.2023 00:00:00') - tx.memo = 'txCREATION3' - tx.typeId = TransactionTypeId.CREATION - tx.userGradidoID = 'txCREATION3.userGradidoID' - tx.userId = 3 - tx.userName = 'txCREATION 3' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('03.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c3' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('03.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxSend1ToReceive2(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(100) - tx.balance = new Decimal(1000) - tx.balanceDate = new Date('11.01.2023 00:00:00') - tx.memo = 'txSEND1 to txRECEIVE2' - tx.typeId = TransactionTypeId.SEND - tx.userGradidoID = 'txSEND1.userGradidoID' - tx.userId = 1 - tx.userName = 'txSEND 1' - tx.linkedUserGradidoID = 'txRECEIVE2.linkedUserGradidoID' - tx.linkedUserId = 2 - tx.linkedUserName = 'txRECEIVE 2' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('11.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516a1' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('11.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxReceive2FromSend1(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(100) - tx.balance = new Decimal(1300) - tx.balanceDate = new Date('11.01.2023 00:00:00') - tx.memo = 'txSEND1 to txRECEIVE2' - tx.typeId = TransactionTypeId.RECEIVE - tx.userGradidoID = 'txRECEIVE2.linkedUserGradidoID' - tx.userId = 2 - tx.userName = 'txRECEIVE 2' - tx.linkedUserGradidoID = 'txSEND1.userGradidoID' - tx.linkedUserId = 1 - tx.linkedUserName = 'txSEND 1' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('11.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516b2' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('11.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -/* -async function createTxSend2ToReceive3(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(200) - tx.balance = new Decimal(1100) - tx.balanceDate = new Date('23.01.2023 00:00:00') - tx.memo = 'txSEND2 to txRECEIVE3' - tx.typeId = TransactionTypeId.SEND - tx.userGradidoID = 'txSEND2.userGradidoID' - tx.userId = 2 - tx.userName = 'txSEND 2' - tx.linkedUserGradidoID = 'txRECEIVE3.linkedUserGradidoID' - tx.linkedUserId = 3 - tx.linkedUserName = 'txRECEIVE 3' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('23.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516a2' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('23.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxReceive3FromSend2(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(200) - tx.balance = new Decimal(1500) - tx.balanceDate = new Date('23.01.2023 00:00:00') - tx.memo = 'txSEND2 to txRECEIVE3' - tx.typeId = TransactionTypeId.RECEIVE - tx.userGradidoID = 'txRECEIVE3.linkedUserGradidoID' - tx.userId = 3 - tx.userName = 'txRECEIVE 3' - tx.linkedUserGradidoID = 'txSEND2.userGradidoID' - tx.linkedUserId = 2 - tx.linkedUserName = 'txSEND 2' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('23.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516b3' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('23.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxSend3ToReceive1(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(300) - tx.balance = new Decimal(1200) - tx.balanceDate = new Date('31.01.2023 00:00:00') - tx.memo = 'txSEND3 to txRECEIVE1' - tx.typeId = TransactionTypeId.SEND - tx.userGradidoID = 'txSEND3.userGradidoID' - tx.userId = 3 - tx.userName = 'txSEND 3' - tx.linkedUserGradidoID = 'txRECEIVE1.linkedUserGradidoID' - tx.linkedUserId = 1 - tx.linkedUserName = 'txRECEIVE 1' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('31.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516a3' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('31.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} - -async function createTxReceive1FromSend3(verified: boolean): Promise { - let tx = Transaction.create() - tx.amount = new Decimal(300) - tx.balance = new Decimal(1300) - tx.balanceDate = new Date('31.01.2023 00:00:00') - tx.memo = 'txSEND3 to txRECEIVE1' - tx.typeId = TransactionTypeId.RECEIVE - tx.userGradidoID = 'txRECEIVE1.linkedUserGradidoID' - tx.userId = 1 - tx.userName = 'txRECEIVE 1' - tx.linkedUserGradidoID = 'txSEND3.userGradidoID' - tx.linkedUserId = 3 - tx.linkedUserName = 'txSEND 3' - tx = await Transaction.save(tx) - - if (verified) { - const dlttx = DltTransaction.create() - dlttx.createdAt = new Date('31.01.2023 00:00:10') - dlttx.messageId = '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516b1' - dlttx.transactionId = tx.id - dlttx.verified = true - dlttx.verifiedAt = new Date('31.01.2023 00:01:10') - await DltTransaction.save(dlttx) - } - return tx -} -*/ - -let con: DataSource -let testEnv: { - mutate: ApolloServerTestClient['mutate'] - query: ApolloServerTestClient['query'] - con: DataSource -} - -beforeAll(async () => { - testEnv = await testEnvironment(logger, localization) - con = testEnv.con - await cleanDB() -}) - -afterAll(async () => { - await cleanDB() - await con.destroy() -}) - -describe('create and send Transactions to DltConnector', () => { - let txCREATION1: Transaction - let txCREATION2: Transaction - let txCREATION3: Transaction - let txSEND1to2: Transaction - let txRECEIVE2From1: Transaction - // let txSEND2To3: Transaction - // let txRECEIVE3From2: Transaction - // let txSEND3To1: Transaction - // let txRECEIVE1From3: Transaction - - beforeEach(() => { - jest.clearAllMocks() - }) - - afterEach(async () => { - await cleanDB() - }) - - describe('with 3 creations but inactive dlt-connector', () => { - it('found 3 dlt-transactions', async () => { - txCREATION1 = await createTxCREATION1(false) - txCREATION2 = await createTxCREATION2(false) - txCREATION3 = await createTxCREATION3(false) - await createHomeCommunity() - - CONFIG.DLT_CONNECTOR = false - await sendTransactionsToDltConnector() - expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') - - // Find the previous created transactions of sendCoin mutation - const transactions = await Transaction.find({ - // where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - - const dltTransactions = await DltTransaction.find({ - // where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[0].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[1].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[2].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - - expect(logger.info).nthCalledWith(2, 'sending to DltConnector currently not configured...') - }) - }) - - describe('with 3 creations and active dlt-connector', () => { - it('found 3 dlt-transactions', async () => { - await userFactory(testEnv, bibiBloxberg) - await userFactory(testEnv, peterLustig) - await userFactory(testEnv, raeuberHotzenplotz) - await userFactory(testEnv, bobBaumeister) - let count = 0 - for (const creation of creations) { - await creationFactory(testEnv, creation) - count++ - // we need only 3 for testing - if (count >= 3) { - break - } - } - await createHomeCommunity() - - CONFIG.DLT_CONNECTOR = true - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - return { - data: { - sendTransaction: { succeed: true }, - }, - } as Response - }) - - await sendTransactionsToDltConnector() - - expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') - - // Find the previous created transactions of sendCoin mutation - const transactions = await Transaction.find({ - // where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - - const dltTransactions = await DltTransaction.find({ - // where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[0].id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[1].id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transactions[2].id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - }) - }) - - describe('with 3 verified creations, 1 sendCoins and active dlt-connector', () => { - it('found 3 dlt-transactions', async () => { - txCREATION1 = await createTxCREATION1(true) - txCREATION2 = await createTxCREATION2(true) - txCREATION3 = await createTxCREATION3(true) - await createHomeCommunity() - - txSEND1to2 = await createTxSend1ToReceive2(false) - txRECEIVE2From1 = await createTxReceive2FromSend1(false) - - /* - txSEND2To3 = await createTxSend2ToReceive3() - txRECEIVE3From2 = await createTxReceive3FromSend2() - txSEND3To1 = await createTxSend3ToReceive1() - txRECEIVE1From3 = await createTxReceive1FromSend3() - */ - - CONFIG.DLT_CONNECTOR = true - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - return { - data: { - sendTransaction: { succeed: true }, - }, - } as Response - }) - - await sendTransactionsToDltConnector() - - expect(logger.info).toBeCalledWith('sendTransactionsToDltConnector...') - - // Find the previous created transactions of sendCoin mutation - /* - const transactions = await Transaction.find({ - // where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - */ - - const dltTransactions = await DltTransaction.find({ - // where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - order: { createdAt: 'ASC', id: 'ASC' }, - }) - - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: txCREATION1.id, - messageId: '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c1', - verified: true, - createdAt: new Date('01.01.2023 00:00:10'), - verifiedAt: new Date('01.01.2023 00:01:10'), - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txCREATION2.id, - messageId: '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c2', - verified: true, - createdAt: new Date('02.01.2023 00:00:10'), - verifiedAt: new Date('02.01.2023 00:01:10'), - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txCREATION3.id, - messageId: '723e3fab62c5d3e2f62fd72ba4e622bcd53eff35262e3f3526327fe41bc516c3', - verified: true, - createdAt: new Date('03.01.2023 00:00:10'), - verifiedAt: new Date('03.01.2023 00:01:10'), - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txSEND1to2.id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: txRECEIVE2From1.id, - messageId: 'sended', - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - }) - /* - describe('with one Community of api 1_0 and not matching pubKey', () => { - beforeEach(async () => { - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - - return { - data: { - getPublicKey: { - publicKey: 'somePubKey', - }, - }, - } as Response - }) - const variables1 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '1_0', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables1) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - - jest.clearAllMocks() - // await validateCommunities() - }) - - it('logs one community found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 1 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs not matching publicKeys', () => { - expect(logger.warn).toBeCalledWith( - 'Federation: received not matching publicKey:', - 'somePubKey', - expect.stringMatching('11111111111111111111111111111111'), - ) - }) - }) - describe('with one Community of api 1_0 and matching pubKey', () => { - beforeEach(async () => { - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - - return { - data: { - getPublicKey: { - publicKey: '11111111111111111111111111111111', - }, - }, - } as Response - }) - const variables1 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '1_0', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables1) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - await DbFederatedCommunity.update({}, { verifiedAt: null }) - jest.clearAllMocks() - // await validateCommunities() - }) - - it('logs one community found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 1 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs community pubKey verified', () => { - expect(logger.info).toHaveBeenNthCalledWith( - 3, - 'Federation: verified community with', - 'http//localhost:5001/api/', - ) - }) - }) - describe('with two Communities of api 1_0 and 1_1', () => { - beforeEach(async () => { - jest.clearAllMocks() - - jest.spyOn(GraphQLClient.prototype, 'rawRequest').mockImplementation(async () => { - - return { - data: { - getPublicKey: { - publicKey: '11111111111111111111111111111111', - }, - }, - } as Response - }) - const variables2 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '1_1', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables2) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - - await DbFederatedCommunity.update({}, { verifiedAt: null }) - jest.clearAllMocks() - // await validateCommunities() - }) - it('logs two communities found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 2 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs requestGetPublicKey for community api 1_1 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_1/', - ) - }) - }) - describe('with three Communities of api 1_0, 1_1 and 2_0', () => { - let dbCom: DbFederatedCommunity - beforeEach(async () => { - const variables3 = { - publicKey: Buffer.from('11111111111111111111111111111111'), - apiVersion: '2_0', - endPoint: 'http//localhost:5001/api/', - lastAnnouncedAt: new Date(), - } - await DbFederatedCommunity.createQueryBuilder() - .insert() - .into(DbFederatedCommunity) - .values(variables3) - .orUpdate({ - - conflict_target: ['id', 'publicKey', 'apiVersion'], - overwrite: ['end_point', 'last_announced_at'], - }) - .execute() - dbCom = await DbFederatedCommunity.findOneOrFail({ - where: { publicKey: variables3.publicKey, apiVersion: variables3.apiVersion }, - }) - await DbFederatedCommunity.update({}, { verifiedAt: null }) - jest.clearAllMocks() - // await validateCommunities() - }) - it('logs three community found', () => { - expect(logger.debug).toBeCalledWith(`Federation: found 3 dbCommunities`) - }) - it('logs requestGetPublicKey for community api 1_0 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_0/', - ) - }) - it('logs requestGetPublicKey for community api 1_1 ', () => { - expect(logger.info).toBeCalledWith( - 'Federation: getPublicKey from endpoint', - 'http//localhost:5001/api/1_1/', - ) - }) - it('logs unsupported api for community with api 2_0 ', () => { - expect(logger.warn).toBeCalledWith( - 'Federation: dbCom with unsupported apiVersion', - dbCom.endPoint, - '2_0', - ) - }) - }) - */ - }) -}) diff --git a/backend/src/index.ts b/backend/src/index.ts index 8a46cbb35..d7e883933 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -1,7 +1,6 @@ import 'reflect-metadata' import 'source-map-support/register' import { getLogger } from 'log4js' -import { sendTransactionsToDltConnector } from './apis/dltConnector/sendTransactionsToDltConnector' import { CONFIG } from './config' import { startValidateCommunities } from './federation/validateCommunities' import { createServer } from './server/createServer' From 9ede9c0e5bc9dabaf76c453d8e478608c30dcd7f Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Oct 2025 15:28:06 +0200 Subject: [PATCH 38/72] fix backend user resolver test --- backend/package.json | 8 +- backend/src/apis/dltConnector/index.ts | 16 + .../src/graphql/resolver/UserResolver.test.ts | 8 +- backend/src/seeds/factory/user.ts | 1 - bun.lock | 2724 +++++++++++++---- 5 files changed, 2203 insertions(+), 554 deletions(-) diff --git a/backend/package.json b/backend/package.json index 659ac59dc..2378eed04 100644 --- a/backend/package.json +++ b/backend/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "cross-env": "^7.0.3", - "email-templates": "^10.0.1", + "email-templates": "10.0.1", "sodium-native": "^3.4.1" }, "devDependencies": { @@ -41,14 +41,14 @@ "@swc/cli": "^0.7.3", "@swc/core": "^1.11.24", "@swc/helpers": "^0.5.17", - "@types/email-templates": "^10.0.4", + "@types/email-templates": "10.0.1", "@types/express": "^4.17.21", "@types/faker": "^5.5.9", "@types/i18n": "^0.13.4", "@types/jest": "27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^17.0.21", - "@types/nodemailer": "^6.4.4", + "@types/nodemailer": "6.4.17", "@types/sodium-native": "^2.3.5", "@types/source-map-support": "^0.5.10", "@types/uuid": "^8.3.4", @@ -82,7 +82,7 @@ "log4js": "^6.7.1", "mkdirp": "^3.0.1", "ncp": "^2.0.0", - "nodemailer": "^6.6.5", + "nodemailer": "6.6.5", "nodemon": "^2.0.7", "openai": "^4.87.3", "prettier": "^3.5.3", diff --git a/backend/src/apis/dltConnector/index.ts b/backend/src/apis/dltConnector/index.ts index 275a3d9d0..bce319674 100644 --- a/backend/src/apis/dltConnector/index.ts +++ b/backend/src/apis/dltConnector/index.ts @@ -15,6 +15,7 @@ import { UserLoggingView, } from 'database' import { TransactionDraft } from './model/TransactionDraft' +import { CONFIG } from '@/config' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.dltConnector`) // will be undefined if dlt connect is disabled @@ -63,6 +64,9 @@ async function executeDltTransaction(draft: TransactionDraft | null, typeId: Dlt * and update dltTransactionId of transaction in db with hiero transaction id */ export async function registerAddressTransaction(user: DbUser, community: DbCommunity): Promise { + if (!CONFIG.DLT_CONNECTOR) { + return Promise.resolve(null) + } if (!user.id) { logger.error(`missing id for user: ${user.gradidoID}, please call registerAddressTransaction after user.save()`) return null @@ -84,6 +88,9 @@ export async function contributionTransaction( signingUser: DbUser, createdAt: Date, ): Promise { + if (!CONFIG.DLT_CONNECTOR) { + return Promise.resolve(null) + } const homeCommunity = await getHomeCommunity() if (!homeCommunity) { logger.error('home community not found') @@ -100,6 +107,9 @@ export async function transferTransaction( memo: string, createdAt: Date ): Promise { + if (!CONFIG.DLT_CONNECTOR) { + return Promise.resolve(null) + } // load community if not already loaded, maybe they are remote communities if (!senderUser.community) { senderUser.community = await getCommunityByUuid(senderUser.communityUuid) @@ -115,6 +125,9 @@ export async function transferTransaction( export async function deferredTransferTransaction(senderUser: DbUser, transactionLink: DbTransactionLink) : Promise { + if (!CONFIG.DLT_CONNECTOR) { + return Promise.resolve(null) + } // load community if not already loaded if (!senderUser.community) { senderUser.community = await getCommunityByUuid(senderUser.communityUuid) @@ -125,6 +138,9 @@ export async function deferredTransferTransaction(senderUser: DbUser, transactio export async function redeemDeferredTransferTransaction(transactionLink: DbTransactionLink, amount: string, createdAt: Date, recipientUser: DbUser) : Promise { + if (!CONFIG.DLT_CONNECTOR) { + return Promise.resolve(null) + } // load user and communities if not already loaded if (!transactionLink.user) { logger.debug('load sender user') diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index cee570c94..35142e890 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -79,11 +79,9 @@ jest.mock('@/emails/sendEmailVariants', () => { return { __esModule: true, ...originalModule, - sendAccountActivationEmail: jest.fn((a) => originalModule.sendAccountActivationEmail(a)), - sendAccountMultiRegistrationEmail: jest.fn((a) => - originalModule.sendAccountMultiRegistrationEmail(a), - ), - sendResetPasswordEmail: jest.fn((a) => originalModule.sendResetPasswordEmail(a)), + sendAccountActivationEmail: jest.fn(), + sendAccountMultiRegistrationEmail: jest.fn(), + sendResetPasswordEmail: jest.fn(), } }) diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 3cae22f71..5da84c3b2 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -13,7 +13,6 @@ export const userFactory = async ( user: UserInterface, ): Promise => { const { mutate } = client - const homeCom = await writeHomeCommunityEntry() // console.log('call createUser with', JSON.stringify(user, null, 2)) const response = await mutate({ mutation: createUser, variables: user }) diff --git a/bun.lock b/bun.lock index 0a55639b6..88deb2864 100644 --- a/bun.lock +++ b/bun.lock @@ -88,7 +88,7 @@ "version": "2.6.1", "dependencies": { "cross-env": "^7.0.3", - "email-templates": "^10.0.1", + "email-templates": "10.0.1", "sodium-native": "^3.4.1", }, "devDependencies": { @@ -97,14 +97,14 @@ "@swc/cli": "^0.7.3", "@swc/core": "^1.11.24", "@swc/helpers": "^0.5.17", - "@types/email-templates": "^10.0.4", + "@types/email-templates": "10.0.1", "@types/express": "^4.17.21", "@types/faker": "^5.5.9", "@types/i18n": "^0.13.4", "@types/jest": "27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^17.0.21", - "@types/nodemailer": "^6.4.4", + "@types/nodemailer": "6.4.17", "@types/sodium-native": "^2.3.5", "@types/source-map-support": "^0.5.10", "@types/uuid": "^8.3.4", @@ -138,7 +138,7 @@ "log4js": "^6.7.1", "mkdirp": "^3.0.1", "ncp": "^2.0.0", - "nodemailer": "^6.6.5", + "nodemailer": "6.6.5", "nodemon": "^2.0.7", "openai": "^4.87.3", "prettier": "^3.5.3", @@ -458,7 +458,7 @@ "@antfu/utils": ["@antfu/utils@0.7.10", "", {}, "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww=="], - "@apollo/client": ["@apollo/client@3.13.8", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.18.0", "prop-types": "^15.7.2", "rehackt": "^0.1.0", "symbol-observable": "^4.0.0", "ts-invariant": "^0.10.3", "tslib": "^2.3.0", "zen-observable-ts": "^1.2.5" }, "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-YM9lQpm0VfVco4DSyKooHS/fDTiKQcCHfxr7i3iL6a0kP/jNO5+4NFK6vtRDxaYisd5BrwOZHLJpPBnvRVpKPg=="], + "@apollo/client": ["@apollo/client@3.14.0", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.18.0", "prop-types": "^15.7.2", "rehackt": "^0.1.0", "symbol-observable": "^4.0.0", "ts-invariant": "^0.10.3", "tslib": "^2.3.0", "zen-observable-ts": "^1.2.5" }, "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ=="], "@apollo/protobufjs": ["@apollo/protobufjs@1.2.2", "", { "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/long": "^4.0.0", "@types/node": "^10.1.0", "long": "^4.0.0" }, "bin": { "apollo-pbjs": "bin/pbjs", "apollo-pbts": "bin/pbts" } }, "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ=="], @@ -468,21 +468,23 @@ "@apollographql/graphql-upload-8-fork": ["@apollographql/graphql-upload-8-fork@8.1.4", "", { "dependencies": { "@types/express": "*", "@types/fs-capacitor": "^2.0.0", "@types/koa": "*", "busboy": "^0.3.1", "fs-capacitor": "^2.0.4", "http-errors": "^1.7.3", "object-path": "^0.11.4" }, "peerDependencies": { "graphql": "0.13.1 - 15" } }, "sha512-lHAj/PUegYu02zza9Pg0bQQYH5I0ah1nyIzu2YIqOv41P0vu3GCBISAmQCfFHThK7N3dy7dLFPhoKcXlXRLPoQ=="], - "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.1.7", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-Ok5fYhtwdyJQmU1PpEv6Si7Y+A4cYb8yNM9oiIJC9TzXPMuN9fvdonKJqcnz9TbFqV6bQ8z0giRq0iaOpGZV2g=="], + "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@babel/compat-data": ["@babel/compat-data@7.27.1", "", {}, "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A=="], + "@babel/compat-data": ["@babel/compat-data@7.28.4", "", {}, "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw=="], - "@babel/core": ["@babel/core@7.27.1", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.1", "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-module-transforms": "^7.27.1", "@babel/helpers": "^7.27.1", "@babel/parser": "^7.27.1", "@babel/template": "^7.27.1", "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ=="], + "@babel/core": ["@babel/core@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA=="], - "@babel/generator": ["@babel/generator@7.27.1", "", { "dependencies": { "@babel/parser": "^7.27.1", "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w=="], + "@babel/generator": ["@babel/generator@7.28.3", "", { "dependencies": { "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.1", "", { "dependencies": { "@babel/compat-data": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.28.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw=="], "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], @@ -492,9 +494,9 @@ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], - "@babel/helpers": ["@babel/helpers@7.27.1", "", { "dependencies": { "@babel/template": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ=="], + "@babel/helpers": ["@babel/helpers@7.28.4", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.28.4" } }, "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w=="], - "@babel/parser": ["@babel/parser@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" }, "bin": "./bin/babel-parser.js" }, "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ=="], + "@babel/parser": ["@babel/parser@7.28.4", "", { "dependencies": { "@babel/types": "^7.28.4" }, "bin": "./bin/babel-parser.js" }, "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg=="], "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], @@ -510,6 +512,8 @@ "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], @@ -528,111 +532,121 @@ "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], - "@babel/runtime": ["@babel/runtime@7.27.1", "", {}, "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog=="], + "@babel/runtime": ["@babel/runtime@7.28.4", "", {}, "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ=="], - "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.27.1", "", { "dependencies": { "core-js-pure": "^3.30.2" } }, "sha512-909rVuj3phpjW6y0MCXAZ5iNeORePa6ldJvp2baWGcTjwqbBDDz6xoS5JHJ7lS88NlwLYj07ImL/8IUMtDZzTA=="], + "@babel/runtime-corejs3": ["@babel/runtime-corejs3@7.28.4", "", { "dependencies": { "core-js-pure": "^3.43.0" } }, "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ=="], - "@babel/template": ["@babel/template@7.27.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg=="], + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.27.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.1", "@babel/parser": "^7.27.1", "@babel/template": "^7.27.1", "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg=="], + "@babel/traverse": ["@babel/traverse@7.28.4", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", "@babel/types": "^7.28.4", "debug": "^4.3.1" } }, "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ=="], - "@babel/types": ["@babel/types@7.27.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q=="], + "@babel/types": ["@babel/types@7.28.4", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q=="], "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" }, "bin": { "biome": "bin/biome" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + + "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], + + "@cacheable/memoize": ["@cacheable/memoize@2.0.3", "", { "dependencies": { "@cacheable/utils": "^2.0.3" } }, "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw=="], + + "@cacheable/memory": ["@cacheable/memory@2.0.3", "", { "dependencies": { "@cacheable/memoize": "^2.0.3", "@cacheable/utils": "^2.0.3", "@keyv/bigmap": "^1.0.2", "hookified": "^1.12.1", "keyv": "^5.5.3" } }, "sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA=="], + + "@cacheable/utils": ["@cacheable/utils@2.1.0", "", { "dependencies": { "keyv": "^5.5.3" } }, "sha512-ZdxfOiaarMqMj+H7qwlt5EBKWaeGihSYVHdQv5lUsbn8MJJOTW82OIwirQ39U5tMZkNvy3bQE+ryzC+xTAb9/g=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - "@csstools/color-helpers": ["@csstools/color-helpers@5.0.2", "", {}, "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA=="], + "@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="], - "@csstools/css-calc": ["@csstools/css-calc@2.1.3", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw=="], + "@csstools/css-calc": ["@csstools/css-calc@2.1.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="], - "@csstools/css-color-parser": ["@csstools/css-color-parser@3.0.9", "", { "dependencies": { "@csstools/color-helpers": "^5.0.2", "@csstools/css-calc": "^2.1.3" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw=="], + "@csstools/css-color-parser": ["@csstools/css-color-parser@3.1.0", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA=="], - "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.4", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A=="], + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.5", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ=="], - "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.3", "", {}, "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw=="], + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], - "@csstools/media-query-list-parser": ["@csstools/media-query-list-parser@4.0.2", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A=="], + "@csstools/media-query-list-parser": ["@csstools/media-query-list-parser@4.0.3", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ=="], "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], - "@dual-bundle/import-meta-resolve": ["@dual-bundle/import-meta-resolve@4.1.0", "", {}, "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg=="], + "@dual-bundle/import-meta-resolve": ["@dual-bundle/import-meta-resolve@4.2.1", "", {}, "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg=="], - "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + "@emnapi/core": ["@emnapi/core@1.4.5", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q=="], - "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + "@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.10", "", { "os": "aix", "cpu": "ppc64" }, "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.10", "", { "os": "android", "cpu": "arm" }, "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.10", "", { "os": "android", "cpu": "arm64" }, "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.10", "", { "os": "android", "cpu": "x64" }, "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.10", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.10", "", { "os": "linux", "cpu": "arm" }, "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.10", "", { "os": "linux", "cpu": "ia32" }, "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.10", "", { "os": "none", "cpu": "x64" }, "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.10", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.10", "", { "os": "openbsd", "cpu": "x64" }, "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.10", "", { "os": "sunos", "cpu": "x64" }, "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], @@ -640,7 +654,7 @@ "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], - "@googlemaps/js-api-loader": ["@googlemaps/js-api-loader@1.16.8", "", {}, "sha512-CROqqwfKotdO6EBjZO/gQGVTbeDps5V7Mt9+8+5Q+jTg5CRMi3Ii/L9PmV3USROrt2uWxtGzJHORmByxyo9pSQ=="], + "@googlemaps/js-api-loader": ["@googlemaps/js-api-loader@1.16.10", "", {}, "sha512-c2erv2k7P2ilYzMmtYcMgAR21AULosQuUHJbStnrvRk2dG93k5cqptDrh9A8p+ZNlyhiqEOgHW7N9PAizdUM7Q=="], "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], @@ -666,19 +680,19 @@ "@hyperswarm/secret-stream": ["@hyperswarm/secret-stream@6.8.1", "", { "dependencies": { "b4a": "^1.1.0", "hypercore-crypto": "^3.3.1", "noise-curve-ed": "^2.0.1", "noise-handshake": "^4.0.0", "sodium-secretstream": "^1.1.0", "sodium-universal": "^5.0.0", "streamx": "^2.14.0", "timeout-refresh": "^2.0.0", "unslab": "^1.3.0" } }, "sha512-F3fr8CKB6za9Ac7ifjgAe07qnnesl5kS0MtLsyKxA1Og8E+FZykdwLpgoLjnEa7G6E1L56lASLr42E4kd20sog=="], - "@iconify-json/arcticons": ["@iconify-json/arcticons@1.2.24", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-l5mQELXr9Sv87DPmEcUJ3Ub1qNbRKpr4ax+0LoBbYmHU+osTdJ3FNgTH04/VKMKp2+95MNbA5Tt6gwgPkj5FNQ=="], + "@iconify-json/arcticons": ["@iconify-json/arcticons@1.2.38", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-AnPvt17WFSGkakgWHRobIrRi1SEPmpzRAoOn6SokwoaItBzjUcgvRNW/GDuh/PWZwI5T4+VRJaBmB4Owa1Cktw=="], - "@iconify-json/bi": ["@iconify-json/bi@1.2.3", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-pDNU9mIKDfvVEGxWsExiuVEqyhyJ5q5bOwBTgtM7I2hGk9ACQaiogMaA6lBRJ82sJPj+Uv21Oi+ujThGnMW2jA=="], + "@iconify-json/bi": ["@iconify-json/bi@1.2.6", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-fWfLr1/+DJDe8+rIUXxMwvmWBZFlxRtM59sYnrezJ2xX87QKyXVw3QuforJ4kF2Orrz85J+JTRG6305vaJ7flA=="], - "@iconify-json/fa": ["@iconify-json/fa@1.2.1", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-aY2+tQNWq5ch+ShtAz3KKbNrFfwf4BPrXvyN7S4/lcf6Wms+kIxsd7C7KortzHZhoBnbhVN+qo+YUWLW7rLs9Q=="], + "@iconify-json/fa": ["@iconify-json/fa@1.2.2", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-Rw0L97uO3W0Gy2rq4cM/TH3QjzuPuRca1F2steumZ57zOeheGQdiqo50O6KHjm+WgImmV92IFPUTU6eiaJsrTw=="], - "@iconify-json/humbleicons": ["@iconify-json/humbleicons@1.2.6", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-B5Ayka2mYbT8BxltoOEebe8XPfq0vpt2vzTGt/WJmapsapaLfAm00KdSEgIJ58VcBPWPtPI94FQ/97Yi/RAtAw=="], + "@iconify-json/humbleicons": ["@iconify-json/humbleicons@1.2.12", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-RPD+hBExPr+r+AcunJH/NYrtFNBm/99HjhGlaMDxIXh5RMqD7HebE5oJS6TgrNoUHHuQZ2u1gHmg4vgjaptB+A=="], - "@iconify-json/ion": ["@iconify-json/ion@1.2.3", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-qV9zsuBFjCgU5WRFO2thhhmaw1wr1wpJMliuuwu7pOtFEEoMOPP45Q7edF+k8uYuouFq+94SlCMIsca+v9kt2g=="], + "@iconify-json/ion": ["@iconify-json/ion@1.2.6", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-JftEXKfjvJNn3SrGeSBrG/waRkjeTpLdMLNLwpAX4NgI14QgJoAeXEh2iZjNPqioAkeIgErX4Bi6mnFwpjk3BQ=="], "@iconify-json/mdi": ["@iconify-json/mdi@1.2.3", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg=="], - "@iconify/json": ["@iconify/json@2.2.335", "", { "dependencies": { "@iconify/types": "*", "pathe": "^1.1.2" } }, "sha512-EOUM9843cxiwA19cORaz6t+fpn1LhZr5la+Oot7gzt8M5SRjOqvXfMZKcc/VkytRHaaNd2y0dKhA8H7/sP1stQ=="], + "@iconify/json": ["@iconify/json@2.2.392", "", { "dependencies": { "@iconify/types": "*", "pathe": "^2.0.0" } }, "sha512-WkkQIDpmgetgvIn1jso6XKY3S5Pf9L6QD1J2RNLeiF+jzdouyayoRm2LLxe4dmnp9i3Cbf8w7oRuaVlhwK8Xtg=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], @@ -686,11 +700,11 @@ "@intlify/bundle-utils": ["@intlify/bundle-utils@10.0.1", "", { "dependencies": { "@intlify/message-compiler": "^11.1.2", "@intlify/shared": "^11.1.2", "acorn": "^8.8.2", "escodegen": "^2.1.0", "estree-walker": "^2.0.2", "jsonc-eslint-parser": "^2.3.0", "mlly": "^1.2.0", "source-map-js": "^1.0.1", "yaml-eslint-parser": "^1.2.2" } }, "sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ=="], - "@intlify/core-base": ["@intlify/core-base@9.13.1", "", { "dependencies": { "@intlify/message-compiler": "9.13.1", "@intlify/shared": "9.13.1" } }, "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w=="], + "@intlify/core-base": ["@intlify/core-base@9.14.5", "", { "dependencies": { "@intlify/message-compiler": "9.14.5", "@intlify/shared": "9.14.5" } }, "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA=="], "@intlify/eslint-plugin-vue-i18n": ["@intlify/eslint-plugin-vue-i18n@1.4.1", "", { "dependencies": { "@eslint/eslintrc": "^1.2.0", "@intlify/core-base": "^9.1.9", "@intlify/message-compiler": "^9.1.9", "debug": "^4.3.1", "glob": "^7.1.3", "ignore": "^5.0.5", "is-language-code": "^3.1.0", "js-yaml": "^4.0.0", "json5": "^2.1.3", "jsonc-eslint-parser": "^2.0.0", "lodash": "^4.17.11", "parse5": "^6.0.0", "semver": "^7.3.4", "vue-eslint-parser": "^8.0.0", "yaml-eslint-parser": "^0.5.0" }, "peerDependencies": { "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-vnhwxcUTYCL/tCeBkXMDz959DVHNaDd3SRt3jdyX5ZwHaSSx93aD7kZV7ZmJpq4lZlq7Q1eVRGhpmpTNGdvU9w=="], - "@intlify/message-compiler": ["@intlify/message-compiler@9.13.1", "", { "dependencies": { "@intlify/shared": "9.13.1", "source-map-js": "^1.0.2" } }, "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w=="], + "@intlify/message-compiler": ["@intlify/message-compiler@9.14.5", "", { "dependencies": { "@intlify/shared": "9.14.5", "source-map-js": "^1.0.2" } }, "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ=="], "@intlify/shared": ["@intlify/shared@9.13.1", "", {}, "sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ=="], @@ -698,7 +712,7 @@ "@intlify/vue-i18n-extensions": ["@intlify/vue-i18n-extensions@8.0.0", "", { "dependencies": { "@babel/parser": "^7.24.6", "@intlify/shared": "^10.0.0", "@vue/compiler-dom": "^3.2.45", "vue-i18n": "^10.0.0" }, "peerDependencies": { "vue": "^3.0.0" }, "optionalPeers": ["vue"] }, "sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ=="], - "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@isaacs/cliui": ["@isaacs/cliui@https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", { "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": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], @@ -708,17 +722,29 @@ "@jest/core": ["@jest/core@27.5.1", "", { "dependencies": { "@jest/console": "^27.5.1", "@jest/reporters": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^27.5.1", "jest-config": "^27.5.1", "jest-haste-map": "^27.5.1", "jest-message-util": "^27.5.1", "jest-regex-util": "^27.5.1", "jest-resolve": "^27.5.1", "jest-resolve-dependencies": "^27.5.1", "jest-runner": "^27.5.1", "jest-runtime": "^27.5.1", "jest-snapshot": "^27.5.1", "jest-util": "^27.5.1", "jest-validate": "^27.5.1", "jest-watcher": "^27.5.1", "micromatch": "^4.0.4", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ=="], - "@jest/create-cache-key-function": ["@jest/create-cache-key-function@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3" } }, "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA=="], + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@30.0.5", "", { "dependencies": { "@jest/types": "30.0.5" } }, "sha512-W1kmkwPq/WTMQWgvbzWSCbXSqvjI6rkqBQCxuvYmd+g6o4b5gHP98ikfh/Ei0SKzHvWdI84TOXp0hRcbpr8Q0w=="], + + "@jest/diff-sequences": ["@jest/diff-sequences@30.0.1", "", {}, "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw=="], "@jest/environment": ["@jest/environment@27.5.1", "", { "dependencies": { "@jest/fake-timers": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "jest-mock": "^27.5.1" } }, "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA=="], + "@jest/expect": ["@jest/expect@30.2.0", "", { "dependencies": { "expect": "30.2.0", "jest-snapshot": "30.2.0" } }, "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA=="], + + "@jest/expect-utils": ["@jest/expect-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA=="], + "@jest/fake-timers": ["@jest/fake-timers@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", "jest-message-util": "^27.5.1", "jest-mock": "^27.5.1", "jest-util": "^27.5.1" } }, "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ=="], + "@jest/get-type": ["@jest/get-type@30.1.0", "", {}, "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA=="], + "@jest/globals": ["@jest/globals@27.5.1", "", { "dependencies": { "@jest/environment": "^27.5.1", "@jest/types": "^27.5.1", "expect": "^27.5.1" } }, "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q=="], + "@jest/pattern": ["@jest/pattern@30.0.1", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" } }, "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA=="], + "@jest/reporters": ["@jest/reporters@27.5.1", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^27.5.1", "@jest/test-result": "^27.5.1", "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-haste-map": "^27.5.1", "jest-resolve": "^27.5.1", "jest-util": "^27.5.1", "jest-worker": "^27.5.1", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", "v8-to-istanbul": "^8.1.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw=="], - "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + "@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], + + "@jest/snapshot-utils": ["@jest/snapshot-utils@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" } }, "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug=="], "@jest/source-map": ["@jest/source-map@27.5.1", "", { "dependencies": { "callsites": "^3.0.0", "graceful-fs": "^4.2.9", "source-map": "^0.6.0" } }, "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg=="], @@ -732,19 +758,21 @@ "@josephg/resolvable": ["@josephg/resolvable@1.0.1", "", {}, "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="], - "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@keyv/bigmap": ["@keyv/bigmap@1.0.2", "", { "dependencies": { "hookified": "^1.12.1" } }, "sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA=="], - "@keyv/serialize": ["@keyv/serialize@1.0.3", "", { "dependencies": { "buffer": "^6.0.3" } }, "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g=="], + "@keyv/serialize": ["@keyv/serialize@1.1.1", "", {}, "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA=="], "@ladjs/country-language": ["@ladjs/country-language@1.0.3", "", {}, "sha512-FJROu9/hh4eqVAGDyfL8vpv6Vb0qKHX1ozYLRZ+beUzD5xFf+3r0J+SVIWKviEa7W524Qvqou+ta1WrsRgzxGw=="], @@ -760,45 +788,47 @@ "@messageformat/runtime": ["@messageformat/runtime@3.0.1", "", { "dependencies": { "make-plural": "^7.0.0" } }, "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg=="], - "@morev/utils": ["@morev/utils@3.12.1", "", { "dependencies": { "fast-copy": "^3.0.2", "fast-equals": "^5.0.1", "ohash": "^1.1.4", "type-fest": "^4.26.1" } }, "sha512-Qkj3ZP6KvEOYEx2GkM7Pffq7uHwgF6kOzVMLb8JTjV4Tb+qTLsZHk/2XF7lrm9VUZIDN17d7pXpZC6BzlR3ryw=="], + "@morev/utils": ["@morev/utils@3.13.1", "", { "dependencies": { "fast-copy": "^3.0.2", "fast-equals": "^5.0.1", "ohash": "^1.1.4", "type-fest": "^4.26.1" } }, "sha512-dNsXp9Ef9cuPIGmL6igYQx0VeHPoZQ9Kp6M7lLnJ2WglMFpoy5gNw2WAldquEsJ0m+sR1DTOLfrSpWvF/wMVDw=="], "@morev/vue-transitions": ["@morev/vue-transitions@3.0.5", "", { "dependencies": { "@morev/utils": "^3.11.1", "@nuxt/kit": "^3.13.2" }, "peerDependencies": { "vue": "^2.6.14 || >=3" }, "bin": { "vue-transitions-version-fix": "bin/fix.js", "vue-transitions-version-switch": "bin/switch.js" } }, "sha512-V+2HGHBb5MSOa0GGZ7V1wb3AExr4XcNLl98txdGNTsnhbqy4JRaFMaIsdo4zdaD9ShRZgBSZyZbujabxS50DSw=="], - "@napi-rs/nice": ["@napi-rs/nice@1.0.1", "", { "optionalDependencies": { "@napi-rs/nice-android-arm-eabi": "1.0.1", "@napi-rs/nice-android-arm64": "1.0.1", "@napi-rs/nice-darwin-arm64": "1.0.1", "@napi-rs/nice-darwin-x64": "1.0.1", "@napi-rs/nice-freebsd-x64": "1.0.1", "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1", "@napi-rs/nice-linux-arm64-gnu": "1.0.1", "@napi-rs/nice-linux-arm64-musl": "1.0.1", "@napi-rs/nice-linux-ppc64-gnu": "1.0.1", "@napi-rs/nice-linux-riscv64-gnu": "1.0.1", "@napi-rs/nice-linux-s390x-gnu": "1.0.1", "@napi-rs/nice-linux-x64-gnu": "1.0.1", "@napi-rs/nice-linux-x64-musl": "1.0.1", "@napi-rs/nice-win32-arm64-msvc": "1.0.1", "@napi-rs/nice-win32-ia32-msvc": "1.0.1", "@napi-rs/nice-win32-x64-msvc": "1.0.1" } }, "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ=="], + "@napi-rs/nice": ["@napi-rs/nice@1.1.1", "", { "optionalDependencies": { "@napi-rs/nice-android-arm-eabi": "1.1.1", "@napi-rs/nice-android-arm64": "1.1.1", "@napi-rs/nice-darwin-arm64": "1.1.1", "@napi-rs/nice-darwin-x64": "1.1.1", "@napi-rs/nice-freebsd-x64": "1.1.1", "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", "@napi-rs/nice-linux-arm64-gnu": "1.1.1", "@napi-rs/nice-linux-arm64-musl": "1.1.1", "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", "@napi-rs/nice-linux-s390x-gnu": "1.1.1", "@napi-rs/nice-linux-x64-gnu": "1.1.1", "@napi-rs/nice-linux-x64-musl": "1.1.1", "@napi-rs/nice-openharmony-arm64": "1.1.1", "@napi-rs/nice-win32-arm64-msvc": "1.1.1", "@napi-rs/nice-win32-ia32-msvc": "1.1.1", "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw=="], - "@napi-rs/nice-android-arm-eabi": ["@napi-rs/nice-android-arm-eabi@1.0.1", "", { "os": "android", "cpu": "arm" }, "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w=="], + "@napi-rs/nice-android-arm-eabi": ["@napi-rs/nice-android-arm-eabi@1.1.1", "", { "os": "android", "cpu": "arm" }, "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw=="], - "@napi-rs/nice-android-arm64": ["@napi-rs/nice-android-arm64@1.0.1", "", { "os": "android", "cpu": "arm64" }, "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA=="], + "@napi-rs/nice-android-arm64": ["@napi-rs/nice-android-arm64@1.1.1", "", { "os": "android", "cpu": "arm64" }, "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw=="], - "@napi-rs/nice-darwin-arm64": ["@napi-rs/nice-darwin-arm64@1.0.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA=="], + "@napi-rs/nice-darwin-arm64": ["@napi-rs/nice-darwin-arm64@1.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A=="], - "@napi-rs/nice-darwin-x64": ["@napi-rs/nice-darwin-x64@1.0.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ=="], + "@napi-rs/nice-darwin-x64": ["@napi-rs/nice-darwin-x64@1.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ=="], - "@napi-rs/nice-freebsd-x64": ["@napi-rs/nice-freebsd-x64@1.0.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw=="], + "@napi-rs/nice-freebsd-x64": ["@napi-rs/nice-freebsd-x64@1.1.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ=="], - "@napi-rs/nice-linux-arm-gnueabihf": ["@napi-rs/nice-linux-arm-gnueabihf@1.0.1", "", { "os": "linux", "cpu": "arm" }, "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q=="], + "@napi-rs/nice-linux-arm-gnueabihf": ["@napi-rs/nice-linux-arm-gnueabihf@1.1.1", "", { "os": "linux", "cpu": "arm" }, "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg=="], - "@napi-rs/nice-linux-arm64-gnu": ["@napi-rs/nice-linux-arm64-gnu@1.0.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA=="], + "@napi-rs/nice-linux-arm64-gnu": ["@napi-rs/nice-linux-arm64-gnu@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ=="], - "@napi-rs/nice-linux-arm64-musl": ["@napi-rs/nice-linux-arm64-musl@1.0.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw=="], + "@napi-rs/nice-linux-arm64-musl": ["@napi-rs/nice-linux-arm64-musl@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg=="], - "@napi-rs/nice-linux-ppc64-gnu": ["@napi-rs/nice-linux-ppc64-gnu@1.0.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q=="], + "@napi-rs/nice-linux-ppc64-gnu": ["@napi-rs/nice-linux-ppc64-gnu@1.1.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg=="], - "@napi-rs/nice-linux-riscv64-gnu": ["@napi-rs/nice-linux-riscv64-gnu@1.0.1", "", { "os": "linux", "cpu": "none" }, "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig=="], + "@napi-rs/nice-linux-riscv64-gnu": ["@napi-rs/nice-linux-riscv64-gnu@1.1.1", "", { "os": "linux", "cpu": "none" }, "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw=="], - "@napi-rs/nice-linux-s390x-gnu": ["@napi-rs/nice-linux-s390x-gnu@1.0.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg=="], + "@napi-rs/nice-linux-s390x-gnu": ["@napi-rs/nice-linux-s390x-gnu@1.1.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ=="], - "@napi-rs/nice-linux-x64-gnu": ["@napi-rs/nice-linux-x64-gnu@1.0.1", "", { "os": "linux", "cpu": "x64" }, "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA=="], + "@napi-rs/nice-linux-x64-gnu": ["@napi-rs/nice-linux-x64-gnu@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg=="], - "@napi-rs/nice-linux-x64-musl": ["@napi-rs/nice-linux-x64-musl@1.0.1", "", { "os": "linux", "cpu": "x64" }, "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ=="], + "@napi-rs/nice-linux-x64-musl": ["@napi-rs/nice-linux-x64-musl@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw=="], - "@napi-rs/nice-win32-arm64-msvc": ["@napi-rs/nice-win32-arm64-msvc@1.0.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg=="], + "@napi-rs/nice-openharmony-arm64": ["@napi-rs/nice-openharmony-arm64@1.1.1", "", { "os": "none", "cpu": "arm64" }, "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ=="], - "@napi-rs/nice-win32-ia32-msvc": ["@napi-rs/nice-win32-ia32-msvc@1.0.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw=="], + "@napi-rs/nice-win32-arm64-msvc": ["@napi-rs/nice-win32-arm64-msvc@1.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA=="], - "@napi-rs/nice-win32-x64-msvc": ["@napi-rs/nice-win32-x64-msvc@1.0.1", "", { "os": "win32", "cpu": "x64" }, "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg=="], + "@napi-rs/nice-win32-ia32-msvc": ["@napi-rs/nice-win32-ia32-msvc@1.1.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + "@napi-rs/nice-win32-x64-msvc": ["@napi-rs/nice-win32-x64-msvc@1.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -806,67 +836,67 @@ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], - "@nuxt/kit": ["@nuxt/kit@3.17.2", "", { "dependencies": { "c12": "^3.0.3", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.5", "ignore": "^7.0.4", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.1.0", "scule": "^1.3.0", "semver": "^7.7.1", "std-env": "^3.9.0", "tinyglobby": "^0.2.13", "ufo": "^1.6.1", "unctx": "^2.4.1", "unimport": "^5.0.1", "untyped": "^2.0.0" } }, "sha512-Mz2Ni8iUwty5LBs3LepUL43rI2xXbuAz3Cqq37L9frOD2QI2tQUtasYaSoKk6U7nvYzuW2z/2b3YOLkMNi/k2w=="], + "@nuxt/kit": ["@nuxt/kit@3.19.3", "", { "dependencies": { "c12": "^3.3.0", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.5", "errx": "^0.1.0", "exsolve": "^1.0.7", "ignore": "^7.0.5", "jiti": "^2.6.1", "klona": "^2.0.6", "knitwork": "^1.2.0", "mlly": "^1.8.0", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "rc9": "^2.1.2", "scule": "^1.3.0", "semver": "^7.7.2", "std-env": "^3.9.0", "tinyglobby": "^0.2.15", "ufo": "^1.6.1", "unctx": "^2.4.1", "unimport": "^5.4.1", "untyped": "^2.0.0" } }, "sha512-ze46EW5xW+UxDvinvPkYt2MzR355Az1lA3bpX8KDialgnCwr+IbkBij/udbUEC6ZFbidPkfK1eKl4ESN7gMY+w=="], "@one-ini/wasm": ["@one-ini/wasm@0.1.1", "", {}, "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw=="], - "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@5.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hXem5ZAguS7IlSiHg/LK0tEfLj4eUo+9U6DaFwwBEGd0L0VIF9LmuiHydRyOrdnnmi9iAAFMAn/wl2cUoiuruA=="], + "@oxc-resolver/binding-darwin-arm64": ["@oxc-resolver/binding-darwin-arm64@5.3.0", "", {}, "sha512-hXem5ZAguS7IlSiHg/LK0tEfLj4eUo+9U6DaFwwBEGd0L0VIF9LmuiHydRyOrdnnmi9iAAFMAn/wl2cUoiuruA=="], - "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@5.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-wgSwfsZkRbuYCIBLxeg1bYrtKnirAy+IJF0lwfz4z08clgdNBDbfGECJe/cd0csIZPpRcvPFe8317yf31sWhtA=="], + "@oxc-resolver/binding-darwin-x64": ["@oxc-resolver/binding-darwin-x64@5.3.0", "", {}, "sha512-wgSwfsZkRbuYCIBLxeg1bYrtKnirAy+IJF0lwfz4z08clgdNBDbfGECJe/cd0csIZPpRcvPFe8317yf31sWhtA=="], - "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@5.3.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kzeE2WHgcRMmWjB071RdwEV5Pwke4o0WWslCKoh8if1puvxIxfzu3o7g6P2+v77BP5qop4cri+uvLABSO0WZjg=="], + "@oxc-resolver/binding-freebsd-x64": ["@oxc-resolver/binding-freebsd-x64@5.3.0", "", {}, "sha512-kzeE2WHgcRMmWjB071RdwEV5Pwke4o0WWslCKoh8if1puvxIxfzu3o7g6P2+v77BP5qop4cri+uvLABSO0WZjg=="], - "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@5.3.0", "", { "os": "linux", "cpu": "arm" }, "sha512-I8np34yZP/XfIkZNDbw3rweqVgfjmHYpNX3xnJZWg+f4mgO9/UNWBwetSaqXeDZqvIch/aHak+q4HVrQhQKCqg=="], + "@oxc-resolver/binding-linux-arm-gnueabihf": ["@oxc-resolver/binding-linux-arm-gnueabihf@5.3.0", "", {}, "sha512-I8np34yZP/XfIkZNDbw3rweqVgfjmHYpNX3xnJZWg+f4mgO9/UNWBwetSaqXeDZqvIch/aHak+q4HVrQhQKCqg=="], - "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@5.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-u2ndfeEUrW898eXM+qPxIN8TvTPjI90NDQBRgaxxkOfNw3xaotloeiZGz5+Yzlfxgvxr9DY9FdYkqhUhSnGhOw=="], + "@oxc-resolver/binding-linux-arm64-gnu": ["@oxc-resolver/binding-linux-arm64-gnu@5.3.0", "", {}, "sha512-u2ndfeEUrW898eXM+qPxIN8TvTPjI90NDQBRgaxxkOfNw3xaotloeiZGz5+Yzlfxgvxr9DY9FdYkqhUhSnGhOw=="], - "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@5.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-TzbjmFkcnESGuVItQ2diKacX8vu5G0bH3BHmIlmY4OSRLyoAlrJFwGKAHmh6C9+Amfcjo2rx8vdm7swzmsGC6Q=="], + "@oxc-resolver/binding-linux-arm64-musl": ["@oxc-resolver/binding-linux-arm64-musl@5.3.0", "", {}, "sha512-TzbjmFkcnESGuVItQ2diKacX8vu5G0bH3BHmIlmY4OSRLyoAlrJFwGKAHmh6C9+Amfcjo2rx8vdm7swzmsGC6Q=="], - "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@5.3.0", "", { "os": "linux", "cpu": "none" }, "sha512-NH3pjAqh8nuN29iRuRfTY42Vn03ctoR9VE8llfoUKUfhHUjFHYOXK5VSkhjj1usG8AeuesvqrQnLptCRQVTi/Q=="], + "@oxc-resolver/binding-linux-riscv64-gnu": ["@oxc-resolver/binding-linux-riscv64-gnu@5.3.0", "", {}, "sha512-NH3pjAqh8nuN29iRuRfTY42Vn03ctoR9VE8llfoUKUfhHUjFHYOXK5VSkhjj1usG8AeuesvqrQnLptCRQVTi/Q=="], - "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@5.3.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-tuZtkK9sJYh2MC2uhol1M/8IMTB6ZQ5jmqP2+k5XNXnOb/im94Y5uV/u2lXwVyIuKHZZHtr+0d1HrOiNahoKpw=="], + "@oxc-resolver/binding-linux-s390x-gnu": ["@oxc-resolver/binding-linux-s390x-gnu@5.3.0", "", {}, "sha512-tuZtkK9sJYh2MC2uhol1M/8IMTB6ZQ5jmqP2+k5XNXnOb/im94Y5uV/u2lXwVyIuKHZZHtr+0d1HrOiNahoKpw=="], - "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@5.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-VzhPYmZCtoES/ThcPdGSmMop7JlwgqtSvlgtKCW15ByV2JKyl8kHAHnPSBfpIooXb0ehFnRdxFtL9qtAEWy01g=="], + "@oxc-resolver/binding-linux-x64-gnu": ["@oxc-resolver/binding-linux-x64-gnu@5.3.0", "", {}, "sha512-VzhPYmZCtoES/ThcPdGSmMop7JlwgqtSvlgtKCW15ByV2JKyl8kHAHnPSBfpIooXb0ehFnRdxFtL9qtAEWy01g=="], - "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@5.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Hi39cWzul24rGljN4Vf1lxjXzQdCrdxO5oCT7KJP4ndSlqIUODJnfnMAP1YhcnIRvNvk+5E6sZtnEmFUd/4d8Q=="], + "@oxc-resolver/binding-linux-x64-musl": ["@oxc-resolver/binding-linux-x64-musl@5.3.0", "", {}, "sha512-Hi39cWzul24rGljN4Vf1lxjXzQdCrdxO5oCT7KJP4ndSlqIUODJnfnMAP1YhcnIRvNvk+5E6sZtnEmFUd/4d8Q=="], - "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@5.3.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" }, "cpu": "none" }, "sha512-ddujvHhP3chmHnSXRlkPVUeYj4/B7eLZwL4yUid+df3WCbVh6DgoT9RmllZn21AhxgKtMdekDdyVJYKFd8tl4A=="], + "@oxc-resolver/binding-wasm32-wasi": ["@oxc-resolver/binding-wasm32-wasi@5.3.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" } }, "sha512-ddujvHhP3chmHnSXRlkPVUeYj4/B7eLZwL4yUid+df3WCbVh6DgoT9RmllZn21AhxgKtMdekDdyVJYKFd8tl4A=="], - "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@5.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-j1YYPLvUkMVNKmIFQZZJ7q6Do4cI3htUnyxNLwDSBVhSohvPIK2VG+IdtOAlWZGa7v+phEZsHfNbXVwB0oPYFQ=="], + "@oxc-resolver/binding-win32-arm64-msvc": ["@oxc-resolver/binding-win32-arm64-msvc@5.3.0", "", {}, "sha512-j1YYPLvUkMVNKmIFQZZJ7q6Do4cI3htUnyxNLwDSBVhSohvPIK2VG+IdtOAlWZGa7v+phEZsHfNbXVwB0oPYFQ=="], - "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@5.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-LT9eOPPUqfZscQRd5mc08RBeDWOQf+dnOrKnanMallTGPe6g7+rcAlFTA8SWoJbcD45PV8yArFtCmSQSpzHZmg=="], + "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@5.3.0", "", {}, "sha512-LT9eOPPUqfZscQRd5mc08RBeDWOQf+dnOrKnanMallTGPe6g7+rcAlFTA8SWoJbcD45PV8yArFtCmSQSpzHZmg=="], "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", {}, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", {}, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", {}, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", {}, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", {}, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", {}, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", {}, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", {}, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", {}, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", {}, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", {}, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", {}, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], - "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@pkgjs/parseargs": ["@pkgjs/parseargs@https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", {}], - "@pkgr/core": ["@pkgr/core@0.2.4", "", {}, "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw=="], + "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], @@ -890,52 +920,54 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - "@rollup/pluginutils": ["@rollup/pluginutils@5.1.4", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ=="], + "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.40.2", "", { "os": "android", "cpu": "arm" }, "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.4", "", { "os": "android", "cpu": "arm" }, "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.40.2", "", { "os": "android", "cpu": "arm64" }, "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.4", "", { "os": "android", "cpu": "arm64" }, "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.40.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.40.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.40.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.40.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.40.2", "", { "os": "linux", "cpu": "arm" }, "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.40.2", "", { "os": "linux", "cpu": "arm" }, "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.40.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.40.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.40.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.40.2", "", { "os": "linux", "cpu": "none" }, "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.40.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.40.2", "", { "os": "linux", "cpu": "x64" }, "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.40.2", "", { "os": "linux", "cpu": "x64" }, "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.40.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.4", "", { "os": "none", "cpu": "arm64" }, "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.40.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.40.2", "", { "os": "win32", "cpu": "x64" }, "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], - "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.6.0", "", { "dependencies": { "domhandler": "^4.2.0", "selderee": "^0.6.0" } }, "sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA=="], "@sideway/address": ["@sideway/address@4.1.5", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q=="], @@ -944,7 +976,7 @@ "@sideway/pinpoint": ["@sideway/pinpoint@2.0.0", "", {}, "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="], - "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.38", "", {}, "sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA=="], "@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="], @@ -952,48 +984,50 @@ "@sinonjs/fake-timers": ["@sinonjs/fake-timers@8.1.0", "", { "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg=="], - "@sqltools/formatter": ["@sqltools/formatter@1.2.5", "", {}, "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw=="], + "@sqltools/formatter": ["@sqltools/formatter@https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", {}], - "@swc-node/core": ["@swc-node/core@1.13.3", "", { "peerDependencies": { "@swc/core": ">= 1.4.13", "@swc/types": ">= 0.1" } }, "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA=="], + "@swc-node/core": ["@swc-node/core@1.13.3", "", {}, "sha512-OGsvXIid2Go21kiNqeTIn79jcaX4l0G93X2rAnas4LFoDyA9wAwVK7xZdm+QsKoMn5Mus2yFLCc4OtX2dD/PWA=="], - "@swc-node/register": ["@swc-node/register@1.10.10", "", { "dependencies": { "@swc-node/core": "^1.13.3", "@swc-node/sourcemap-support": "^0.5.1", "colorette": "^2.0.20", "debug": "^4.3.5", "oxc-resolver": "^5.0.0", "pirates": "^4.0.6", "tslib": "^2.6.3" }, "peerDependencies": { "@swc/core": ">= 1.4.13", "typescript": ">= 4.3" } }, "sha512-jYWaI2WNEKz8KZL3sExd2KVL1JMma1/J7z+9iTpv0+fRN7LGMF8VTGGuHI2bug/ztpdZU1G44FG/Kk6ElXL9CQ=="], + "@swc-node/register": ["@swc-node/register@1.10.10", "", { "dependencies": { "@swc-node/core": "^1.13.3", "@swc-node/sourcemap-support": "^0.5.1", "colorette": "^2.0.20", "debug": "^4.3.5", "oxc-resolver": "^5.0.0", "pirates": "^4.0.6", "tslib": "^2.6.3" } }, "sha512-jYWaI2WNEKz8KZL3sExd2KVL1JMma1/J7z+9iTpv0+fRN7LGMF8VTGGuHI2bug/ztpdZU1G44FG/Kk6ElXL9CQ=="], "@swc-node/sourcemap-support": ["@swc-node/sourcemap-support@0.5.1", "", { "dependencies": { "source-map-support": "^0.5.21", "tslib": "^2.6.3" } }, "sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg=="], - "@swc/cli": ["@swc/cli@0.7.7", "", { "dependencies": { "@swc/counter": "^0.1.3", "@xhmikosr/bin-wrapper": "^13.0.5", "commander": "^8.3.0", "fast-glob": "^3.2.5", "minimatch": "^9.0.3", "piscina": "^4.3.1", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3" }, "peerDependencies": { "@swc/core": "^1.2.66", "chokidar": "^4.0.1" }, "optionalPeers": ["chokidar"], "bin": { "swc": "bin/swc.js", "swcx": "bin/swcx.js", "spack": "bin/spack.js" } }, "sha512-j4yYm9bx3pxWofaJKX1BFwj/3ngUDynN4UIQ2Xd2h0h/7Gt7zkReBTpDN7g5S13mgAYxacaTHTOUsz18097E8w=="], + "@swc/cli": ["@swc/cli@0.7.8", "", { "dependencies": { "@swc/counter": "^0.1.3", "@xhmikosr/bin-wrapper": "^13.0.5", "commander": "^8.3.0", "minimatch": "^9.0.3", "piscina": "^4.3.1", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3", "tinyglobby": "^0.2.13" }, "peerDependencies": { "@swc/core": "^1.2.66", "chokidar": "^4.0.1" }, "optionalPeers": ["chokidar"], "bin": { "swc": "bin/swc.js", "swcx": "bin/swcx.js", "spack": "bin/spack.js" } }, "sha512-27Ov4rm0s2C6LLX+NDXfDVB69LGs8K94sXtFhgeUyQ4DBywZuCgTBu2loCNHRr8JhT9DeQvJM5j9FAu/THbo4w=="], - "@swc/core": ["@swc/core@1.12.4", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.23" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.12.4", "@swc/core-darwin-x64": "1.12.4", "@swc/core-linux-arm-gnueabihf": "1.12.4", "@swc/core-linux-arm64-gnu": "1.12.4", "@swc/core-linux-arm64-musl": "1.12.4", "@swc/core-linux-x64-gnu": "1.12.4", "@swc/core-linux-x64-musl": "1.12.4", "@swc/core-win32-arm64-msvc": "1.12.4", "@swc/core-win32-ia32-msvc": "1.12.4", "@swc/core-win32-x64-msvc": "1.12.4" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-hn30ebV4njAn0NAUM+3a0qCF+MJgqTNSrfA/hUAbC6TVjOQy2OYGQwkUvCu/V7S2+rZxrUsTpKOnZ7qqECZV9Q=="], + "@swc/core": ["@swc/core@1.13.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.24" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.13.5", "@swc/core-darwin-x64": "1.13.5", "@swc/core-linux-arm-gnueabihf": "1.13.5", "@swc/core-linux-arm64-gnu": "1.13.5", "@swc/core-linux-arm64-musl": "1.13.5", "@swc/core-linux-x64-gnu": "1.13.5", "@swc/core-linux-x64-musl": "1.13.5", "@swc/core-win32-arm64-msvc": "1.13.5", "@swc/core-win32-ia32-msvc": "1.13.5", "@swc/core-win32-x64-msvc": "1.13.5" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-WezcBo8a0Dg2rnR82zhwoR6aRNxeTGfK5QCD6TQ+kg3xx/zNT02s/0o+81h/3zhvFSB24NtqEr8FTw88O5W/JQ=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.12.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HihKfeitjZU2ab94Zf893sxzFryLKX0TweGsNXXOLNtkSMLw50auuYfpRM0BOL9/uXXtuCWgRIF6P030SAX5xQ=="], + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.13.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ=="], - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.12.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-meYCXHyYb6RDdu2N5PNAf0EelyxPBFhRcVo4kBFLuvuNb0m6EUg///VWy8MUMXq9/s9uzGS9kJVXXdRdr/d6FA=="], + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.13.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng=="], - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.12.4", "", { "os": "linux", "cpu": "arm" }, "sha512-szfDbf7mE8V64of0q/LSqbk+em+T+TD3uqnH40Z7Qu/aL8vi5CHgyLjWG2SLkLLpyjgkAUF6AKrupgnBYcC2NA=="], + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.13.5", "", { "os": "linux", "cpu": "arm" }, "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ=="], - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.12.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-n0IY76w+Scx8m3HIVRvLkoResuwsQgjDfAk9bxn99dq4leQO+mE0fkPl0Yw/1BIsPh+kxGfopIJH9zsZ1Z2YrA=="], + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw=="], - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.12.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-wE5jmFi5cEQyLy8WmCWmNwfKETrnzy2D8YNi/xpYWpLPWqPhcelpa6tswkfYlbsMmmOh7hQNoTba1QdGu0jvHQ=="], + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.13.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ=="], - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.12.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6S50Xd/7ePjEwrXyHMxpKTZ+KBrgUwMA8hQPbArUOwH4S5vHBr51heL0iXbUkppn1bkSr0J0IbOove5hzn+iqQ=="], + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-WD530qvHrki8Ywt/PloKUjaRKgstQqNGvmZl54g06kA+hqtSE2FTG9gngXr3UJxYu/cNAjJYiBifm7+w4nbHbA=="], - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.12.4", "", { "os": "linux", "cpu": "x64" }, "sha512-hbYRyaHhC13vYKuGG5BrAG5fjjWEQFfQetuFp/4QKEoXDzdnabJoixxWTQACDL3m0JW32nJ+gUzsYIPtFYkwXg=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.13.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Luj8y4OFYx4DHNQTWjdIuKTq2f5k6uSXICqx+FSabnXptaOBAbJHNbHT/06JZh6NRUouaf0mYXN0mcsqvkhd7Q=="], - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.12.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-e6EbfjPL8GA/bb1lc9Omtxjlz+1ThTsAuBsy4Q3Kpbuh6B3jclg8KzxU/6t91v23wG593mieTyR5f3Pr7X3AWw=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.13.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw=="], - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.12.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-RG2FzmllBTUf4EksANlIvLckcBrLZEA0t13LIa6L213UZKQfEuDNHezqESgoVhJMg2S/tWauitATOCFgZNSmjg=="], + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.13.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw=="], - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.12.4", "", { "os": "win32", "cpu": "x64" }, "sha512-oRHKnZlR83zaMeVUCmHENa4j5uNRAWbmEpjYbzRcfC45LPFNWKGWGAGERLx0u87XMUtTGqnVYxnBTHN/rzDHOw=="], + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.13.5", "", { "os": "win32", "cpu": "x64" }, "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q=="], "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], - "@swc/jest": ["@swc/jest@0.2.38", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@swc/counter": "^0.1.3", "jsonc-parser": "^3.2.0" }, "peerDependencies": { "@swc/core": "*" } }, "sha512-HMoZgXWMqChJwffdDjvplH53g9G2ALQes3HKXDEdliB/b85OQ0CTSbxG8VSeCwiAn7cOaDVEt4mwmZvbHcS52w=="], + "@swc/jest": ["@swc/jest@0.2.39", "", { "dependencies": { "@jest/create-cache-key-function": "^30.0.0", "@swc/counter": "^0.1.3", "jsonc-parser": "^3.2.0" } }, "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA=="], - "@swc/types": ["@swc/types@0.1.23", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw=="], + "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="], + "@tokenizer/inflate": ["@tokenizer/inflate@0.2.7", "", { "dependencies": { "debug": "^4.4.0", "fflate": "^0.8.2", "token-types": "^6.0.0" } }, "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg=="], + "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], "@tootallnate/once": ["@tootallnate/once@1.1.2", "", {}, "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="], @@ -1006,7 +1040,7 @@ "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], "@types/accepts": ["@types/accepts@1.3.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ=="], @@ -1016,31 +1050,31 @@ "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], - "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], - "@types/body-parser": ["@types/body-parser@1.19.5", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg=="], + "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], - "@types/content-disposition": ["@types/content-disposition@0.5.8", "", {}, "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg=="], + "@types/content-disposition": ["@types/content-disposition@0.5.9", "", {}, "sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ=="], - "@types/cookies": ["@types/cookies@0.9.0", "", { "dependencies": { "@types/connect": "*", "@types/express": "*", "@types/keygrip": "*", "@types/node": "*" } }, "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q=="], + "@types/cookies": ["@types/cookies@0.9.1", "", { "dependencies": { "@types/connect": "*", "@types/express": "*", "@types/keygrip": "*", "@types/node": "*" } }, "sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg=="], "@types/cors": ["@types/cors@2.8.10", "", {}, "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ=="], "@types/dotenv": ["@types/dotenv@8.2.3", "", { "dependencies": { "dotenv": "*" } }, "sha512-g2FXjlDX/cYuc5CiQvyU/6kkbP1JtmGzh0obW50zD7OKeILVL0NSpPWLXVfqoAGQjom2/SLLx9zHq0KXvD6mbw=="], - "@types/email-templates": ["@types/email-templates@10.0.4", "", { "dependencies": { "@types/html-to-text": "*", "@types/nodemailer": "*", "juice": "^8.0.0" } }, "sha512-8O2bdGPO6RYgH2DrnFAcuV++s+8KNA5e2Erjl6UxgKRVsBH9zXu2YLrLyOBRMn2VyEYmzgF+6QQUslpVhj0y/g=="], + "@types/email-templates": ["@types/email-templates@10.0.1", "", { "dependencies": { "@types/html-to-text": "*", "@types/nodemailer": "*", "juice": "^8.0.0" } }, "sha512-IHdgtoOUfMB4t5y5wgm8G0i2/U90GeJPxIEAViMaLlJPCJzaYSlVHXI8bx3qbgbD6gxyOsSRyrFvBSTgNEQc+g=="], "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], - "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/express": ["@types/express@4.17.21", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ=="], + "@types/express": ["@types/express@4.17.23", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ=="], - "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], + "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.7", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg=="], "@types/faker": ["@types/faker@5.5.9", "", {}, "sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA=="], @@ -1060,7 +1094,7 @@ "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], - "@types/http-errors": ["@types/http-errors@2.0.4", "", {}, "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="], + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], "@types/i18n": ["@types/i18n@0.13.12", "", {}, "sha512-iAd2QjKh+0ToBXocmCS3m38GskiaGzmSV1MTQz2GaOraqSqBiLf46J7u3EGINl+st+Uk4lO3OL7QyIjTJlrWIg=="], @@ -1080,13 +1114,13 @@ "@types/keygrip": ["@types/keygrip@1.0.6", "", {}, "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="], - "@types/koa": ["@types/koa@2.15.0", "", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g=="], + "@types/koa": ["@types/koa@3.0.0", "", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "^2", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-MOcVYdVYmkSutVHZZPh8j3+dAjLyR5Tl59CN0eKgpkE1h/LBSmPAsQQuWs+bKu7WtGNn+hKfJH9Gzml+PulmDg=="], "@types/koa-compose": ["@types/koa-compose@3.2.8", "", { "dependencies": { "@types/koa": "*" } }, "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA=="], - "@types/leaflet": ["@types/leaflet@1.9.17", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-IJ4K6t7I3Fh5qXbQ1uwL3CFVbCi6haW9+53oLWgdKlLP7EaS21byWFJxxqOx9y8I0AP0actXSJLVMbyvxhkUTA=="], + "@types/leaflet": ["@types/leaflet@1.9.20", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-rooalPMlk61LCaLOvBF2VIf9M47HgMQqi5xQ9QRi7c8PkdIe0WrIi5IxXUXQjAdL0c+vcQ01mYWbthzmp9GHWw=="], - "@types/lodash": ["@types/lodash@4.17.16", "", {}, "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="], + "@types/lodash": ["@types/lodash@4.17.20", "", {}, "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA=="], "@types/lodash.clonedeep": ["@types/lodash.clonedeep@4.5.9", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q=="], @@ -1094,27 +1128,27 @@ "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="], - "@types/minimatch": ["@types/minimatch@5.1.2", "", {}, "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="], + "@types/minimatch": ["@types/minimatch@6.0.0", "", { "dependencies": { "minimatch": "*" } }, "sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA=="], "@types/mysql": ["@types/mysql@2.15.27", "", { "dependencies": { "@types/node": "*" } }, "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA=="], "@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="], - "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], + "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], "@types/nodemailer": ["@types/nodemailer@6.4.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww=="], "@types/prettier": ["@types/prettier@2.7.3", "", {}, "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA=="], - "@types/qs": ["@types/qs@6.9.18", "", {}, "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA=="], + "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], - "@types/semver": ["@types/semver@7.7.0", "", {}, "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA=="], + "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], - "@types/send": ["@types/send@0.17.4", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA=="], + "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], - "@types/serve-static": ["@types/serve-static@1.15.7", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw=="], + "@types/serve-static": ["@types/serve-static@1.15.9", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA=="], "@types/sodium-native": ["@types/sodium-native@2.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-jZIg5ltGH1okmnH3FrLQsgwjcjOVozMSHwSiEm1/LpMekhOMHbQqp21P4H24mizh1BjwI6Q8qmphmD/HJuAqWg=="], @@ -1132,25 +1166,67 @@ "@types/zen-observable": ["@types/zen-observable@0.8.7", "", {}, "sha512-LKzNTjj+2j09wAo/vvVjzgw5qckJJzhdGgWHW7j69QIGdq/KnZrMAMIHQiWGl3Ccflh5/CudBAntTPYdprPltA=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.0", "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0" } }, "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.46.0", "", {}, "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.0", "@typescript-eslint/tsconfig-utils": "8.46.0", "@typescript-eslint/types": "8.46.0", "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg=="], "@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.0", "", { "dependencies": { "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@vee-validate/i18n": ["@vee-validate/i18n@4.15.0", "", {}, "sha512-XAXoIhcgy4//9WBmxK/6Wnv14Bwkrka/0PMHPOxUhbc8y4QfdIRbyFWvxWZw2nzc6suHrFIePt1mBx91aTqIwg=="], + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], - "@vee-validate/rules": ["@vee-validate/rules@4.15.0", "", { "dependencies": { "vee-validate": "4.15.0" } }, "sha512-Cvll7r98O5tU6ew2AUifVpdhNnTkMTY7+D9N++J7apQXRXWfHMe4tNvjo4TJpKUPCtfLHbdTY/DCquDRc+uH4w=="], + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], - "@vee-validate/yup": ["@vee-validate/yup@4.15.0", "", { "dependencies": { "type-fest": "^4.8.3", "vee-validate": "4.15.0" }, "peerDependencies": { "yup": "^1.3.2" } }, "sha512-paK2ZdxZJRrUGwqaqf7KMNC+n5C7UGs7DofK7wZCza/zKT/QtFSxVYgopGoYYrbAfd6DpVmNpf/ouBuRdPBthA=="], + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], - "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="], + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + + "@vee-validate/i18n": ["@vee-validate/i18n@4.15.1", "", {}, "sha512-6ogEyxkoTr7IZk4EAUT0rD3pr34Nw/YEToez/c0DSlI1/cBeOpunSmGmoYPh32pmd3imxFPEawCB7IyFvRJSAw=="], + + "@vee-validate/rules": ["@vee-validate/rules@4.15.1", "", { "dependencies": { "vee-validate": "4.15.1" } }, "sha512-2TGXq2MYt21nT8ysuxyFY/LBVQDcMPKn1hY0w3uIDmG333vzBkOtXAylmvrS93AsJ7N5coHMJjcCGG4JxCO2hQ=="], + + "@vee-validate/yup": ["@vee-validate/yup@4.15.1", "", { "dependencies": { "type-fest": "^4.8.3", "vee-validate": "4.15.1" }, "peerDependencies": { "yup": "^1.3.2" } }, "sha512-+u6lI1IZftjHphj+mTCPJRruwBBwv1IKKCI1EFm6ipQroAPibkS5M8UNX+yeVYG5++ix6m1rsv4/SJvJJQTWJg=="], + + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], "@vitest/coverage-v8": ["@vitest/coverage-v8@2.1.9", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^0.2.3", "debug": "^4.3.7", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", "magic-string": "^0.30.12", "magicast": "^0.3.5", "std-env": "^3.8.0", "test-exclude": "^7.0.1", "tinyrainbow": "^1.2.0" }, "peerDependencies": { "@vitest/browser": "2.1.9", "vitest": "2.1.9" }, "optionalPeers": ["@vitest/browser"] }, "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ=="], @@ -1176,19 +1252,19 @@ "@vue/compat": ["@vue/compat@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" }, "peerDependencies": { "vue": "3.5.13" } }, "sha512-Q3xRdTPN4l+kddxU98REyUBgvc0meAo9CefCWE2lW8Fg3dyPn3vSCce52b338ihrJAx1RQQhO5wMWhJ/PAKUpA=="], - "@vue/compiler-core": ["@vue/compiler-core@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q=="], + "@vue/compiler-core": ["@vue/compiler-core@3.5.22", "", { "dependencies": { "@babel/parser": "^7.28.4", "@vue/shared": "3.5.22", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ=="], - "@vue/compiler-dom": ["@vue/compiler-dom@3.5.13", "", { "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA=="], + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.22", "", { "dependencies": { "@vue/compiler-core": "3.5.22", "@vue/shared": "3.5.22" } }, "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA=="], - "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", "@vue/compiler-dom": "3.5.13", "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ=="], + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.22", "", { "dependencies": { "@babel/parser": "^7.28.4", "@vue/compiler-core": "3.5.22", "@vue/compiler-dom": "3.5.22", "@vue/compiler-ssr": "3.5.22", "@vue/shared": "3.5.22", "estree-walker": "^2.0.2", "magic-string": "^0.30.19", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ=="], - "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA=="], + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.22", "", { "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/shared": "3.5.22" } }, "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww=="], "@vue/devtools-api": ["@vue/devtools-api@6.6.4", "", {}, "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="], - "@vue/devtools-kit": ["@vue/devtools-kit@7.7.6", "", { "dependencies": { "@vue/devtools-shared": "^7.7.6", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA=="], + "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="], - "@vue/devtools-shared": ["@vue/devtools-shared@7.7.6", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA=="], + "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="], "@vue/eslint-config-prettier": ["@vue/eslint-config-prettier@10.2.0", "", { "dependencies": { "eslint-config-prettier": "^10.0.1", "eslint-plugin-prettier": "^5.2.2" }, "peerDependencies": { "eslint": ">= 8.21.0", "prettier": ">= 3.0.0" } }, "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw=="], @@ -1200,7 +1276,7 @@ "@vue/server-renderer": ["@vue/server-renderer@3.5.13", "", { "dependencies": { "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13" }, "peerDependencies": { "vue": "3.5.13" } }, "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA=="], - "@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], + "@vue/shared": ["@vue/shared@3.5.22", "", {}, "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w=="], "@vue/test-utils": ["@vue/test-utils@2.4.6", "", { "dependencies": { "js-beautify": "^1.14.9", "vue-component-type-helpers": "^2.0.0" } }, "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow=="], @@ -1242,23 +1318,23 @@ "@wry/trie": ["@wry/trie@0.5.0", "", { "dependencies": { "tslib": "^2.3.0" } }, "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA=="], - "@xhmikosr/archive-type": ["@xhmikosr/archive-type@7.0.0", "", { "dependencies": { "file-type": "^19.0.0" } }, "sha512-sIm84ZneCOJuiy3PpWR5bxkx3HaNt1pqaN+vncUBZIlPZCq8ASZH+hBVdu5H8znR7qYC6sKwx+ie2Q7qztJTxA=="], + "@xhmikosr/archive-type": ["@xhmikosr/archive-type@7.1.0", "", { "dependencies": { "file-type": "^20.5.0" } }, "sha512-xZEpnGplg1sNPyEgFh0zbHxqlw5dtYg6viplmWSxUj12+QjU9SKu3U/2G73a15pEjLaOqTefNSZ1fOPUOT4Xgg=="], - "@xhmikosr/bin-check": ["@xhmikosr/bin-check@7.0.3", "", { "dependencies": { "execa": "^5.1.1", "isexe": "^2.0.0" } }, "sha512-4UnCLCs8DB+itHJVkqFp9Zjg+w/205/J2j2wNBsCEAm/BuBmtua2hhUOdAMQE47b1c7P9Xmddj0p+X1XVsfHsA=="], + "@xhmikosr/bin-check": ["@xhmikosr/bin-check@7.1.0", "", { "dependencies": { "execa": "^5.1.1", "isexe": "^2.0.0" } }, "sha512-y1O95J4mnl+6MpVmKfMYXec17hMEwE/yeCglFNdx+QvLLtP0yN4rSYcbkXnth+lElBuKKek2NbvOfOGPpUXCvw=="], - "@xhmikosr/bin-wrapper": ["@xhmikosr/bin-wrapper@13.0.5", "", { "dependencies": { "@xhmikosr/bin-check": "^7.0.3", "@xhmikosr/downloader": "^15.0.1", "@xhmikosr/os-filter-obj": "^3.0.0", "bin-version-check": "^5.1.0" } }, "sha512-DT2SAuHDeOw0G5bs7wZbQTbf4hd8pJ14tO0i4cWhRkIJfgRdKmMfkDilpaJ8uZyPA0NVRwasCNAmMJcWA67osw=="], + "@xhmikosr/bin-wrapper": ["@xhmikosr/bin-wrapper@13.2.0", "", { "dependencies": { "@xhmikosr/bin-check": "^7.1.0", "@xhmikosr/downloader": "^15.2.0", "@xhmikosr/os-filter-obj": "^3.0.0", "bin-version-check": "^5.1.0" } }, "sha512-t9U9X0sDPRGDk5TGx4dv5xiOvniVJpXnfTuynVKwHgtib95NYEw4MkZdJqhoSiz820D9m0o6PCqOPMXz0N9fIw=="], - "@xhmikosr/decompress": ["@xhmikosr/decompress@10.0.1", "", { "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", "@xhmikosr/decompress-tarbz2": "^8.0.1", "@xhmikosr/decompress-targz": "^8.0.1", "@xhmikosr/decompress-unzip": "^7.0.0", "graceful-fs": "^4.2.11", "make-dir": "^4.0.0", "strip-dirs": "^3.0.0" } }, "sha512-6uHnEEt5jv9ro0CDzqWlFgPycdE+H+kbJnwyxgZregIMLQ7unQSCNVsYG255FoqU8cP46DyggI7F7LohzEl8Ag=="], + "@xhmikosr/decompress": ["@xhmikosr/decompress@10.2.0", "", { "dependencies": { "@xhmikosr/decompress-tar": "^8.1.0", "@xhmikosr/decompress-tarbz2": "^8.1.0", "@xhmikosr/decompress-targz": "^8.1.0", "@xhmikosr/decompress-unzip": "^7.1.0", "graceful-fs": "^4.2.11", "strip-dirs": "^3.0.0" } }, "sha512-MmDBvu0+GmADyQWHolcZuIWffgfnuTo4xpr2I/Qw5Ox0gt+e1Be7oYqJM4te5ylL6mzlcoicnHVDvP27zft8tg=="], - "@xhmikosr/decompress-tar": ["@xhmikosr/decompress-tar@8.0.1", "", { "dependencies": { "file-type": "^19.0.0", "is-stream": "^2.0.1", "tar-stream": "^3.1.7" } }, "sha512-dpEgs0cQKJ2xpIaGSO0hrzz3Kt8TQHYdizHsgDtLorWajuHJqxzot9Hbi0huRxJuAGG2qiHSQkwyvHHQtlE+fg=="], + "@xhmikosr/decompress-tar": ["@xhmikosr/decompress-tar@8.1.0", "", { "dependencies": { "file-type": "^20.5.0", "is-stream": "^2.0.1", "tar-stream": "^3.1.7" } }, "sha512-m0q8x6lwxenh1CrsTby0Jrjq4vzW/QU1OLhTHMQLEdHpmjR1lgahGz++seZI0bXF3XcZw3U3xHfqZSz+JPP2Gg=="], - "@xhmikosr/decompress-tarbz2": ["@xhmikosr/decompress-tarbz2@8.0.2", "", { "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", "file-type": "^19.6.0", "is-stream": "^2.0.1", "seek-bzip": "^2.0.0", "unbzip2-stream": "^1.4.3" } }, "sha512-p5A2r/AVynTQSsF34Pig6olt9CvRj6J5ikIhzUd3b57pUXyFDGtmBstcw+xXza0QFUh93zJsmY3zGeNDlR2AQQ=="], + "@xhmikosr/decompress-tarbz2": ["@xhmikosr/decompress-tarbz2@8.1.0", "", { "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", "file-type": "^20.5.0", "is-stream": "^2.0.1", "seek-bzip": "^2.0.0", "unbzip2-stream": "^1.4.3" } }, "sha512-aCLfr3A/FWZnOu5eqnJfme1Z1aumai/WRw55pCvBP+hCGnTFrcpsuiaVN5zmWTR53a8umxncY2JuYsD42QQEbw=="], - "@xhmikosr/decompress-targz": ["@xhmikosr/decompress-targz@8.0.1", "", { "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", "file-type": "^19.0.0", "is-stream": "^2.0.1" } }, "sha512-mvy5AIDIZjQ2IagMI/wvauEiSNHhu/g65qpdM4EVoYHUJBAmkQWqcPJa8Xzi1aKVTmOA5xLJeDk7dqSjlHq8Mg=="], + "@xhmikosr/decompress-targz": ["@xhmikosr/decompress-targz@8.1.0", "", { "dependencies": { "@xhmikosr/decompress-tar": "^8.0.1", "file-type": "^20.5.0", "is-stream": "^2.0.1" } }, "sha512-fhClQ2wTmzxzdz2OhSQNo9ExefrAagw93qaG1YggoIz/QpI7atSRa7eOHv4JZkpHWs91XNn8Hry3CwUlBQhfPA=="], - "@xhmikosr/decompress-unzip": ["@xhmikosr/decompress-unzip@7.0.0", "", { "dependencies": { "file-type": "^19.0.0", "get-stream": "^6.0.1", "yauzl": "^3.1.2" } }, "sha512-GQMpzIpWTsNr6UZbISawsGI0hJ4KA/mz5nFq+cEoPs12UybAqZWKbyIaZZyLbJebKl5FkLpsGBkrplJdjvUoSQ=="], + "@xhmikosr/decompress-unzip": ["@xhmikosr/decompress-unzip@7.1.0", "", { "dependencies": { "file-type": "^20.5.0", "get-stream": "^6.0.1", "yauzl": "^3.1.2" } }, "sha512-oqTYAcObqTlg8owulxFTqiaJkfv2SHsxxxz9Wg4krJAHVzGWlZsU8tAB30R6ow+aHrfv4Kub6WQ8u04NWVPUpA=="], - "@xhmikosr/downloader": ["@xhmikosr/downloader@15.0.1", "", { "dependencies": { "@xhmikosr/archive-type": "^7.0.0", "@xhmikosr/decompress": "^10.0.1", "content-disposition": "^0.5.4", "defaults": "^3.0.0", "ext-name": "^5.0.0", "file-type": "^19.0.0", "filenamify": "^6.0.0", "get-stream": "^6.0.1", "got": "^13.0.0" } }, "sha512-fiuFHf3Dt6pkX8HQrVBsK0uXtkgkVlhrZEh8b7VgoDqFf+zrgFBPyrwCqE/3nDwn3hLeNz+BsrS7q3mu13Lp1g=="], + "@xhmikosr/downloader": ["@xhmikosr/downloader@15.2.0", "", { "dependencies": { "@xhmikosr/archive-type": "^7.1.0", "@xhmikosr/decompress": "^10.2.0", "content-disposition": "^0.5.4", "defaults": "^2.0.2", "ext-name": "^5.0.0", "file-type": "^20.5.0", "filenamify": "^6.0.0", "get-stream": "^6.0.1", "got": "^13.0.0" } }, "sha512-lAqbig3uRGTt0sHNIM4vUG9HoM+mRl8K28WuYxyXLCUT6pyzl4Y4i0LZ3jMEsCYZ6zjPZbO9XkG91OSTd4si7g=="], "@xhmikosr/os-filter-obj": ["@xhmikosr/os-filter-obj@3.0.0", "", { "dependencies": { "arch": "^3.0.0" } }, "sha512-siPY6BD5dQ2SZPl3I0OZBHL27ZqZvLEosObsZRQ1NUB8qcxegwt0T9eKtV96JMFQpIz1elhkzqOg4c/Ri6Dp9A=="], @@ -1274,17 +1350,19 @@ "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], - "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], "acorn-globals": ["acorn-globals@6.0.0", "", { "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" } }, "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg=="], + "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], "admin": ["admin@workspace:admin"], - "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], @@ -1304,7 +1382,7 @@ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "ansis": ["ansis@3.17.0", "", {}, "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg=="], + "ansis": ["ansis@https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", {}], "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], @@ -1352,7 +1430,7 @@ "apollo-utilities": ["apollo-utilities@1.3.4", "", { "dependencies": { "@wry/equality": "^0.1.2", "fast-json-stable-stringify": "^2.0.0", "ts-invariant": "^0.4.0", "tslib": "^1.10.0" }, "peerDependencies": { "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" } }, "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig=="], - "app-root-path": ["app-root-path@3.1.0", "", {}, "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA=="], + "app-root-path": ["app-root-path@https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", {}], "arch": ["arch@3.0.0", "", {}, "sha512-AmIAC+Wtm2AU8lGfTtHsw0Y9Qtftx2YXEEtiBP10xFUtMOA+sHHx6OAddyL52mUKh1vsXQ6/w1mVDptZCyUt4Q=="], @@ -1366,7 +1444,7 @@ "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - "array-includes": ["array-includes@3.1.8", "", { "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" } }, "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ=="], + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], @@ -1398,7 +1476,7 @@ "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], - "auto-changelog": ["auto-changelog@2.5.0", "", { "dependencies": { "commander": "^7.2.0", "handlebars": "^4.7.7", "import-cwd": "^3.0.0", "node-fetch": "^2.6.1", "parse-github-url": "^1.0.3", "semver": "^7.3.5" }, "bin": { "auto-changelog": "src/index.js" } }, "sha512-UTnLjT7I9U2U/xkCUH5buDlp8C7g0SGChfib+iDrJkamcj5kaMqNKHNfbKJw1kthJUq8sUo3i3q2S6FzO/l/wA=="], + "auto-changelog": ["auto-changelog@https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.5.0.tgz", { "dependencies": { "commander": "^7.2.0", "handlebars": "^4.7.7", "import-cwd": "^3.0.0", "node-fetch": "^2.6.1", "parse-github-url": "^1.0.3", "semver": "^7.3.5" } }], "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], @@ -1408,7 +1486,7 @@ "axios": ["axios@0.21.4", "", { "dependencies": { "follow-redirects": "^1.14.0" } }, "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg=="], - "b4a": ["b4a@1.6.7", "", {}, "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="], + "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="], "babel-jest": ["babel-jest@27.5.1", "", { "dependencies": { "@jest/transform": "^27.5.1", "@jest/types": "^27.5.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg=="], @@ -1416,7 +1494,7 @@ "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@27.5.1", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ=="], - "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.1.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^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.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^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-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw=="], + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^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.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^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-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], "babel-preset-jest": ["babel-preset-jest@27.5.1", "", { "dependencies": { "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag=="], @@ -1430,19 +1508,21 @@ "bare-addon-resolve": ["bare-addon-resolve@1.9.4", "", { "dependencies": { "bare-module-resolve": "^1.10.0", "bare-semver": "^1.0.0" }, "peerDependencies": { "bare-url": "*" }, "optionalPeers": ["bare-url"] }, "sha512-unn6Vy/Yke6F99vg/7tcrvM2KUvIhTNniaSqDbam4AWkd4NhvDVSrQiRYVlNzUV2P7SPobkCK7JFVxrJk9btCg=="], - "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], + "bare-events": ["bare-events@2.7.0", "", {}, "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA=="], - "bare-module-resolve": ["bare-module-resolve@1.10.2", "", { "dependencies": { "bare-semver": "^1.0.0" }, "peerDependencies": { "bare-url": "*" }, "optionalPeers": ["bare-url"] }, "sha512-C9COe/GhWfVXKytW3DElTkiBU+Gb2OXeaVkdGdRB/lp26TVLESHkTGS876iceAGdvtPgohfp9nX8vXHGvN3++Q=="], + "bare-module-resolve": ["bare-module-resolve@1.11.1", "", { "dependencies": { "bare-semver": "^1.0.0" }, "peerDependencies": { "bare-url": "*" }, "optionalPeers": ["bare-url"] }, "sha512-DCxeT9i8sTs3vUMA3w321OX/oXtNEu5EjObQOnTmCdNp5RXHBAvAaBDHvAi9ta0q/948QPz+co6SsGi6aQMYRg=="], - "bare-os": ["bare-os@3.6.1", "", {}, "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g=="], + "bare-os": ["bare-os@3.6.2", "", {}, "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A=="], "bare-path": ["bare-path@3.0.0", "", { "dependencies": { "bare-os": "^3.0.1" } }, "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw=="], "bare-semver": ["bare-semver@1.0.1", "", {}, "sha512-UtggzHLiTrmFOC/ogQ+Hy7VfoKoIwrP1UFcYtTxoCUdLtsIErT8+SWtOC2DH/snT9h+xDrcBEPcwKei1mzemgg=="], - "bare-url": ["bare-url@2.1.6", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-FgjDeR+/yDH34By4I0qB5NxAoWv7dOTYcOXwn73kr+c93HyC2lU6tnjifqUe33LKMJcDyCYPQjEAqgOQiXkE2Q=="], + "bare-url": ["bare-url@2.2.2", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA=="], - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "base64-js": ["base64-js@https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", {}], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.12", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ=="], "bignumber.js": ["bignumber.js@9.0.0", "", {}, "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="], @@ -1452,7 +1532,7 @@ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], - "birpc": ["birpc@2.3.0", "", {}, "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g=="], + "birpc": ["birpc@2.6.1", "", {}, "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ=="], "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], @@ -1464,23 +1544,23 @@ "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], - "bootstrap": ["bootstrap@5.3.6", "", { "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA=="], + "bootstrap": ["bootstrap@5.3.8", "", { "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg=="], "bootstrap-vue-next": ["bootstrap-vue-next@0.26.8", "", { "peerDependencies": { "vue": "^3.5.13" } }, "sha512-2WolMPi4XB0J/736PPglDCIjUz2pwvOhu3SLjQYP0Rh5IncspMZMkUCa/H28Vh45xQadFtrYeBPyPF3JrpbadA=="], - "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "browser-process-hrtime": ["browser-process-hrtime@1.0.0", "", {}, "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="], - "browserslist": ["browserslist@4.24.5", "", { "dependencies": { "caniuse-lite": "^1.0.30001716", "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw=="], + "browserslist": ["browserslist@4.26.3", "", { "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", "electron-to-chromium": "^1.5.227", "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w=="], "bs-logger": ["bs-logger@0.2.6", "", { "dependencies": { "fast-json-stable-stringify": "2.x" } }, "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="], "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + "buffer": ["buffer@https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }], "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], @@ -1494,11 +1574,11 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "c12": ["c12@3.0.3", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.4.7", "exsolve": "^1.0.4", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w=="], + "c12": ["c12@3.3.0", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.2", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - "cacheable": ["cacheable@1.8.10", "", { "dependencies": { "hookified": "^1.8.1", "keyv": "^5.3.2" } }, "sha512-0ZnbicB/N2R6uziva8l6O6BieBklArWyiGx4GkwAhLKhSHyQtRfM9T1nx7HHuHDKkYB/efJQhz3QJ6x/YqoZzA=="], + "cacheable": ["cacheable@2.1.0", "", { "dependencies": { "@cacheable/memoize": "^2.0.3", "@cacheable/memory": "^2.0.3", "@cacheable/utils": "^2.1.0", "hookified": "^1.12.1", "keyv": "^5.5.3", "qified": "^0.5.0" } }, "sha512-zzL1BxdnqwD69JRT0dihnawAcLkBMwAH+hZSKjUzeBbPedVhk3qYPjRw9VOMYWwt5xRih5xd8S+3kEdGohZm/g=="], "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="], @@ -1516,9 +1596,9 @@ "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001717", "", {}, "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001748", "", {}, "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w=="], - "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], + "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -1550,7 +1630,7 @@ "clipboard-polyfill": ["clipboard-polyfill@4.1.1", "", {}, "sha512-nbvNLrcX0zviek5QHLFRAaLrx8y/s8+RF2stH43tuS+kP5XlHMrcD0UGBWq43Hwp6WuuK7KefRMP56S45ibZkA=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "cliui": ["cliui@https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }], "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], @@ -1562,19 +1642,19 @@ "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], - "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "colorette": ["colorette@https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", {}], "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + "commander": ["commander@https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", {}], - "compact-encoding": ["compact-encoding@2.16.1", "", { "dependencies": { "b4a": "^1.3.0" } }, "sha512-vP39X4nwtesmZucaAxDg4wnudOoaJTSR+fikzi8VLVxbwLmcWXf3t0LxY0n2H1AMpdoQZ08lmUf4GY3XiDPnMQ=="], + "compact-encoding": ["compact-encoding@2.17.0", "", { "dependencies": { "b4a": "^1.3.0" } }, "sha512-A5mkpopiDqCddAHTmJ/VnP7JQ1MCytRbpi13zQJGsDcKN041B++2n8oUwxBn37C86gbIt/zIARaqLVy9vI9M5Q=="], "compact-encoding-net": ["compact-encoding-net@1.2.0", "", { "dependencies": { "compact-encoding": "^2.4.1" } }, "sha512-LVXpNpF7PGQeHRVVLGgYWzuVoYAaDZvKUsUxRioGfkotzvOh4AzoQF1HBH3zMNaSnx7gJXuUr3hkjnijaH/Eng=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "concurrently": ["concurrently@9.1.2", "", { "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" }, "bin": { "concurrently": "dist/bin/concurrently.js", "conc": "dist/bin/concurrently.js" } }, "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ=="], + "concurrently": ["concurrently@9.2.1", "", { "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", "shell-quote": "1.8.3", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng=="], "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], @@ -1594,7 +1674,7 @@ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -1604,7 +1684,7 @@ "core": ["core@workspace:core"], - "core-js-pure": ["core-js-pure@3.42.0", "", {}, "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ=="], + "core-js-pure": ["core-js-pure@3.45.1", "", {}, "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ=="], "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], @@ -1614,11 +1694,11 @@ "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="], - "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + "cross-env": ["cross-env@https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", { "dependencies": { "cross-spawn": "^7.0.1" } }], "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "cross-spawn": ["cross-spawn@https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }], "crypto-random-bigint": ["crypto-random-bigint@2.1.1", "", { "dependencies": { "uint-rng": "^1.2.1" } }, "sha512-96+FDrenXybkpnLML/60S8NcG32KgJ5Y8yvNNCYPW02r+ssoXFR5XKenuIQcHLWumnGj8UPqUUHBzXNrDGkDmQ=="], @@ -1628,7 +1708,7 @@ "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], - "css-what": ["css-what@6.1.0", "", {}, "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="], + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], @@ -1638,7 +1718,7 @@ "cssom": ["cssom@0.4.4", "", {}, "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="], - "cssstyle": ["cssstyle@4.3.1", "", { "dependencies": { "@asamuzakjp/css-color": "^3.1.2", "rrweb-cssom": "^0.8.0" } }, "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q=="], + "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="], "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], @@ -1656,21 +1736,21 @@ "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], - "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], + "dayjs": ["dayjs@https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", {}], - "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "debugging-stream": ["debugging-stream@2.0.0", "", { "dependencies": { "streamx": "^2.12.4" } }, "sha512-xwfl6wB/3xc553uwtGnSa94jFxnGOc02C0WU2Nmzwr80gzeqn1FX4VcbvoKIhe8L/lPq4BTQttAbrTN94uN8rA=="], "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="], - "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - "dedent": ["dedent@1.6.0", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA=="], + "dedent": ["dedent@1.6.0", "", {}, "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA=="], "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], @@ -1680,7 +1760,7 @@ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], - "defaults": ["defaults@3.0.0", "", {}, "sha512-RsqXDEAALjfRTro+IFNKpcPCt0/Cy2FqHSIlnomiJp9YGadpQnrtbRpSgN2+np21qHcIKiva4fiOQGjS9/qR/A=="], + "defaults": ["defaults@2.0.2", "", {}, "sha512-cuIw0PImdp76AOfgkjbW4VhQODRmNNcKR73vdCH5cLd/ifj7aamfoXvYgfGkEAjNJZ3ozMIy9Gu2LutUkGEPbA=="], "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], @@ -1704,7 +1784,7 @@ "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="], - "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], @@ -1750,7 +1830,7 @@ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + "eastasianwidth": ["eastasianwidth@https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", {}], "editorconfig": ["editorconfig@1.0.4", "", { "dependencies": { "@one-ini/wasm": "0.1.1", "commander": "^10.0.0", "minimatch": "9.0.1", "semver": "^7.5.3" }, "bin": { "editorconfig": "bin/editorconfig" } }, "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q=="], @@ -1758,7 +1838,7 @@ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.150", "", {}, "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.232", "", {}, "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg=="], "email-templates": ["email-templates@10.0.1", "", { "dependencies": { "@ladjs/i18n": "^8.0.1", "consolidate": "^0.16.0", "get-paths": "^0.0.7", "html-to-text": "^8.2.0", "juice": "^8.0.0", "lodash": "^4.17.21", "nodemailer": "^6.7.7", "preview-email": "^3.0.7" } }, "sha512-LNZKS0WW9XQkjuDZd/4p/1Q/pwqaqXOP3iDxTIVIQY9vuHlIUEcRLFo8/Xh3GtZCBnm181VgvOXIABKTVyTePA=="], @@ -1770,17 +1850,17 @@ "encoding-japanese": ["encoding-japanese@2.2.0", "", {}, "sha512-EuJWwlHPZ1LbADuKTClvHtwbaFn4rOD+dRAbWysqEOXRc2Uui0hJInNJrsdH0c+OhJA4nrCBdSkW4DD5YxAo6A=="], - "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], - "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], "errx": ["errx@0.1.0", "", {}, "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="], - "es-abstract": ["es-abstract@1.23.9", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA=="], + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], "es-array-method-boxes-properly": ["es-array-method-boxes-properly@1.0.0", "", {}, "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="], @@ -1800,9 +1880,49 @@ "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], - "esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], + "esbuild": ["esbuild@0.25.10", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", "@esbuild/android-arm64": "0.25.10", "@esbuild/android-x64": "0.25.10", "@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-x64": "0.25.10", "@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-x64": "0.25.10", "@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-x64": "0.25.10", "@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-x64": "0.25.10", "@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-x64": "0.25.10", "@esbuild/openharmony-arm64": "0.25.10", "@esbuild/sunos-x64": "0.25.10", "@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-x64": "0.25.10" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ=="], - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "esbuild-android-64": ["esbuild-android-64@0.14.54", "", { "os": "android", "cpu": "x64" }, "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ=="], + + "esbuild-android-arm64": ["esbuild-android-arm64@0.14.54", "", { "os": "android", "cpu": "arm64" }, "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg=="], + + "esbuild-darwin-64": ["esbuild-darwin-64@0.14.54", "", { "os": "darwin", "cpu": "x64" }, "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug=="], + + "esbuild-darwin-arm64": ["esbuild-darwin-arm64@0.14.54", "", { "os": "darwin", "cpu": "arm64" }, "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw=="], + + "esbuild-freebsd-64": ["esbuild-freebsd-64@0.14.54", "", { "os": "freebsd", "cpu": "x64" }, "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg=="], + + "esbuild-freebsd-arm64": ["esbuild-freebsd-arm64@0.14.54", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q=="], + + "esbuild-linux-32": ["esbuild-linux-32@0.14.54", "", { "os": "linux", "cpu": "ia32" }, "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw=="], + + "esbuild-linux-64": ["esbuild-linux-64@0.14.54", "", { "os": "linux", "cpu": "x64" }, "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg=="], + + "esbuild-linux-arm": ["esbuild-linux-arm@0.14.54", "", { "os": "linux", "cpu": "arm" }, "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw=="], + + "esbuild-linux-arm64": ["esbuild-linux-arm64@0.14.54", "", { "os": "linux", "cpu": "arm64" }, "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig=="], + + "esbuild-linux-mips64le": ["esbuild-linux-mips64le@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw=="], + + "esbuild-linux-ppc64le": ["esbuild-linux-ppc64le@0.14.54", "", { "os": "linux", "cpu": "ppc64" }, "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ=="], + + "esbuild-linux-riscv64": ["esbuild-linux-riscv64@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg=="], + + "esbuild-linux-s390x": ["esbuild-linux-s390x@0.14.54", "", { "os": "linux", "cpu": "s390x" }, "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA=="], + + "esbuild-netbsd-64": ["esbuild-netbsd-64@0.14.54", "", { "os": "none", "cpu": "x64" }, "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w=="], + + "esbuild-openbsd-64": ["esbuild-openbsd-64@0.14.54", "", { "os": "openbsd", "cpu": "x64" }, "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw=="], + + "esbuild-sunos-64": ["esbuild-sunos-64@0.14.54", "", { "os": "sunos", "cpu": "x64" }, "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw=="], + + "esbuild-windows-32": ["esbuild-windows-32@0.14.54", "", { "os": "win32", "cpu": "ia32" }, "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w=="], + + "esbuild-windows-64": ["esbuild-windows-64@0.14.54", "", { "os": "win32", "cpu": "x64" }, "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ=="], + + "esbuild-windows-arm64": ["esbuild-windows-arm64@0.14.54", "", { "os": "win32", "cpu": "arm64" }, "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg=="], + + "escalade": ["escalade@https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", {}], "escape-goat": ["escape-goat@3.0.0", "", {}, "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw=="], @@ -1818,25 +1938,25 @@ "eslint-compat-utils": ["eslint-compat-utils@0.5.1", "", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q=="], - "eslint-config-prettier": ["eslint-config-prettier@10.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA=="], + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], "eslint-config-standard": ["eslint-config-standard@17.1.0", "", { "peerDependencies": { "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0" } }, "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q=="], "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], - "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], + "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], "eslint-plugin-es": ["eslint-plugin-es@3.0.1", "", { "dependencies": { "eslint-utils": "^2.0.0", "regexpp": "^3.0.0" }, "peerDependencies": { "eslint": ">=4.19.1" } }, "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ=="], "eslint-plugin-es-x": ["eslint-plugin-es-x@7.8.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.1.2", "@eslint-community/regexpp": "^4.11.0", "eslint-compat-utils": "^0.5.1" }, "peerDependencies": { "eslint": ">=8" } }, "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ=="], - "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@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.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], + "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], "eslint-plugin-n": ["eslint-plugin-n@16.6.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", "eslint-plugin-es-x": "^7.5.0", "get-tsconfig": "^4.7.0", "globals": "^13.24.0", "ignore": "^5.2.4", "is-builtin-module": "^3.2.1", "is-core-module": "^2.12.1", "minimatch": "^3.1.2", "resolve": "^1.22.2", "semver": "^7.5.3" }, "peerDependencies": { "eslint": ">=7.0.0" } }, "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ=="], "eslint-plugin-node": ["eslint-plugin-node@11.1.0", "", { "dependencies": { "eslint-plugin-es": "^3.0.0", "eslint-utils": "^2.0.0", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", "semver": "^6.1.0" }, "peerDependencies": { "eslint": ">=5.16.0" } }, "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g=="], - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.4.0", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.0" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA=="], + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="], "eslint-plugin-promise": ["eslint-plugin-promise@6.6.0", "", { "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ=="], @@ -1850,7 +1970,7 @@ "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "eslint-webpack-plugin": ["eslint-webpack-plugin@5.0.1", "", { "dependencies": { "@types/eslint": "^9.6.1", "jest-worker": "^29.7.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "schema-utils": "^4.3.0" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0", "webpack": "^5.0.0" } }, "sha512-Ur100Vi+z0uP7j4Z8Ccah0pXmNHhl3f7P2hCYZj3mZCOSc33G5c1R/vZ4KCapwWikPgRyD4dkangx6JW3KaVFQ=="], + "eslint-webpack-plugin": ["eslint-webpack-plugin@5.0.2", "", { "dependencies": { "@types/eslint": "^9.6.1", "flatted": "^3.3.3", "jest-worker": "^29.7.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "schema-utils": "^4.3.0" }, "peerDependencies": { "eslint": "^8.0.0 || ^9.0.0", "webpack": "^5.0.0" } }, "sha512-cB7EO2o+4gPUzK6zxgegSet8uu/hHwzOiG+2976MHWiwWFj9mmPbTrzlW0InFl6hl89S1D9MPKK5F7vNFpZc4g=="], "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], @@ -1874,21 +1994,25 @@ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + "execa": ["execa@5.1.1", "", { "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" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], "exit": ["exit@0.1.2", "", {}, "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="], + "exit-x": ["exit-x@0.2.2", "", {}, "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ=="], + "expect": ["expect@27.5.1", "", { "dependencies": { "@jest/types": "^27.5.1", "jest-get-type": "^27.5.1", "jest-matcher-utils": "^27.5.1", "jest-message-util": "^27.5.1" } }, "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw=="], - "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], - "express-rate-limit": ["express-rate-limit@7.5.0", "", { "peerDependencies": { "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg=="], + "express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="], - "express-slow-down": ["express-slow-down@2.0.3", "", { "dependencies": { "express-rate-limit": "7" }, "peerDependencies": { "express": "4 || 5 || ^5.0.0-beta.1" } }, "sha512-vATCiFd8uQHtTeK5/Q0nLUukhZh+RV5zkcHxLQr0X5dEFVEYqzVXEe48nW23Z49fwtR+ApD9zn9sZRisTCR99w=="], + "express-slow-down": ["express-slow-down@2.1.0", "", { "dependencies": { "express-rate-limit": "7" }, "peerDependencies": { "express": "4 || 5 || ^5.0.0-beta.1" } }, "sha512-tQ/ItTDbGfo+fLS+jxu19vgYOgZk7wyOakuAsnzl8f7HmxG3ynWAoo136+oqB+rqHCk3QyM6VoXL03qA5a4gVQ=="], - "exsolve": ["exsolve@1.0.5", "", {}, "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg=="], + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], "ext-list": ["ext-list@2.2.2", "", { "dependencies": { "mime-db": "^1.28.0" } }, "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA=="], @@ -1906,7 +2030,7 @@ "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], - "fast-equals": ["fast-equals@5.2.2", "", {}, "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw=="], + "fast-equals": ["fast-equals@5.3.2", "", {}, "sha512-6rxyATwPCkaFIL3JLqw8qXqMpIZ942pTX/tbQFkRsDGblS8tNGtlUauA/+mt6RUfqn/4MoEr+WDkYoIQbibWuQ=="], "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], @@ -1918,7 +2042,7 @@ "fast-printf": ["fast-printf@1.6.10", "", {}, "sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w=="], - "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], @@ -1926,13 +2050,15 @@ "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], - "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "federation": ["federation@workspace:federation"], + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], + "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], - "file-type": ["file-type@19.6.0", "", { "dependencies": { "get-stream": "^9.0.1", "strtok3": "^9.0.1", "token-types": "^6.0.0", "uint8array-extras": "^1.3.0" } }, "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ=="], + "file-type": ["file-type@20.5.0", "", { "dependencies": { "@tokenizer/inflate": "^0.2.6", "strtok3": "^10.2.0", "token-types": "^6.0.0", "uint8array-extras": "^1.4.0" } }, "sha512-BfHZtG/l9iMm4Ecianu7P8HRD2tBHLtjXinm4X62XBOYzi7CYA7jyqfJzOvXHqzVrVPYqBo2/GvbARMaaJkKVg=="], "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], @@ -1958,13 +2084,13 @@ "flush-promises": ["flush-promises@1.0.2", "", {}, "sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA=="], - "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "foreground-child": ["foreground-child@https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }], - "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="], + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], "form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], @@ -1984,7 +2110,7 @@ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fsevents": ["fsevents@2.3.3", "", {}, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -1994,11 +2120,13 @@ "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="], + "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], "geojson": ["geojson@0.5.0", "", {}, "sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ=="], - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + "get-caller-file": ["get-caller-file@https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", {}], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -2014,7 +2142,7 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.10.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A=="], + "get-tsconfig": ["get-tsconfig@4.11.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ=="], "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], @@ -2064,7 +2192,7 @@ "graphql-type-json": ["graphql-type-json@0.3.2", "", { "peerDependencies": { "graphql": ">=0.8.0" } }, "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg=="], - "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + "handlebars": ["handlebars@https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" } }], "harmony-reflect": ["harmony-reflect@1.6.2", "", {}, "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g=="], @@ -2090,7 +2218,7 @@ "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], - "hookified": ["hookified@1.8.2", "", {}, "sha512-5nZbBNP44sFCDjSoB//0N7m508APCgbQ4mGGo1KJGBYyCKNHfry1Pvd0JVHZIxjdnqn8nFRBAN/eFB6Rk/4w5w=="], + "hookified": ["hookified@1.12.1", "", {}, "sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q=="], "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="], @@ -2104,7 +2232,7 @@ "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], - "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], @@ -2118,9 +2246,9 @@ "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], - "hypercore-crypto": ["hypercore-crypto@3.6.0", "", { "dependencies": { "b4a": "^1.6.6", "compact-encoding": "^2.15.0", "sodium-universal": "^5.0.0" } }, "sha512-0slkW1wzq4B95SD8Z5nt1Yf/3KrIcGsBWTJTsCjHzMXie+sZ5I2IkWcxX1mo4+c0xVESnKAKphKSpGf2kf2BGA=="], + "hypercore-crypto": ["hypercore-crypto@3.6.1", "", { "dependencies": { "b4a": "^1.6.6", "compact-encoding": "^2.15.0", "sodium-universal": "^5.0.0" } }, "sha512-ltIz2uDwy9pO/ZGTvqcjzyBkvt6O4cVm4r/nNxh0GFs/RbQtqP/i4wCvLEdmU7ptgtnw7fI67WYD1aHPuv4OVA=="], - "i18n": ["i18n@0.15.1", "", { "dependencies": { "@messageformat/core": "^3.0.0", "debug": "^4.3.3", "fast-printf": "^1.6.9", "make-plural": "^7.0.0", "math-interval-parser": "^2.0.1", "mustache": "^4.2.0" } }, "sha512-yue187t8MqUPMHdKjiZGrX+L+xcUsDClGO0Cz4loaKUOK9WrGw5pgan4bv130utOwX7fHE9w2iUeHFalVQWkXA=="], + "i18n": ["i18n@0.15.2", "", { "dependencies": { "@messageformat/core": "^3.4.0", "debug": "^4.4.3", "fast-printf": "^1.6.10", "make-plural": "^7.4.0", "math-interval-parser": "^2.0.1", "mustache": "^4.2.0" } }, "sha512-mdBxCfC651UL/hNizIQgB1NHwbBKjlrPcsoTzd/X8rNbJlS1FMF//TOyHEVFg9Dxo0RcrI2ZKt1AFTNe3Q40og=="], "i18n-locales": ["i18n-locales@0.0.5", "", { "dependencies": { "@ladjs/country-language": "^0.2.1" } }, "sha512-Kve1AHy6rqyfJHPy8MIvaKBKhHhHPXV+a/TgMkjp3UBhO3gfWR40ZQn8Xy7LI6g3FhmbvkFtv+GCZy6yvuyeHQ=="], @@ -2128,19 +2256,19 @@ "identity-obj-proxy": ["identity-obj-proxy@3.0.0", "", { "dependencies": { "harmony-reflect": "^1.4.6" } }, "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA=="], - "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "ieee754": ["ieee754@https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", {}], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "ignore-by-default": ["ignore-by-default@1.0.1", "", {}, "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="], - "immutable": ["immutable@5.1.2", "", {}, "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ=="], + "immutable": ["immutable@5.1.3", "", {}, "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg=="], - "import-cwd": ["import-cwd@3.0.0", "", { "dependencies": { "import-from": "^3.0.0" } }, "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg=="], + "import-cwd": ["import-cwd@https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", { "dependencies": { "import-from": "^3.0.0" } }], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], - "import-from": ["import-from@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ=="], + "import-from": ["import-from@https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", { "dependencies": { "resolve-from": "^5.0.0" } }], "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], @@ -2192,7 +2320,7 @@ "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], - "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], @@ -2200,6 +2328,8 @@ "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], @@ -2244,7 +2374,7 @@ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "isexe": ["isexe@https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", {}], "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], @@ -2254,13 +2384,13 @@ "istanbul-lib-source-maps": ["istanbul-lib-source-maps@5.0.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0" } }, "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A=="], - "istanbul-reports": ["istanbul-reports@3.1.7", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g=="], + "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], "iterall": ["iterall@1.3.0", "", {}, "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="], - "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + "jackspeak": ["jackspeak@https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }], - "jake": ["jake@10.9.2", "", { "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" } }, "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA=="], + "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], "jest": ["jest@27.2.4", "", { "dependencies": { "@jest/core": "^27.2.4", "import-local": "^3.0.2", "jest-cli": "^27.2.4" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-h4uqb1EQLfPulWyUFFWv9e9Nn8sCqsJ/j3wk/KCY0p4s4s0ICCfP3iMf6hRf5hEhsDyvyrCgKiZXma63gMz16A=="], @@ -2322,13 +2452,13 @@ "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="], - "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], "joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], "joi-extract-type": ["joi-extract-type@15.0.8", "", { "dependencies": { "@hapi/joi": "~15", "@types/hapi__joi": "~15" } }, "sha512-Or97aW6QN6YJq0B+x/vYs65+nmcPvYDE7xhlwRl7yHzY+7Z8pVaj0zxjdJlXmIA9zRcbbYQKCGvW+I4g0kUHgA=="], - "jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], + "jose": ["jose@https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", {}], "js-beautify": ["js-beautify@1.15.4", "", { "dependencies": { "config-chain": "^1.1.13", "editorconfig": "^1.0.4", "glob": "^10.4.2", "js-cookie": "^3.0.5", "nopt": "^7.2.1" }, "bin": { "css-beautify": "js/bin/css-beautify.js", "html-beautify": "js/bin/html-beautify.js", "js-beautify": "js/bin/js-beautify.js" } }, "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA=="], @@ -2354,11 +2484,11 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], - "jsonc-eslint-parser": ["jsonc-eslint-parser@2.4.0", "", { "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", "semver": "^7.3.5" } }, "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg=="], + "jsonc-eslint-parser": ["jsonc-eslint-parser@2.4.1", "", { "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", "semver": "^7.3.5" } }, "sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw=="], "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], - "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "jstransformer": ["jstransformer@1.0.0", "", { "dependencies": { "is-promise": "^2.0.0", "promise": "^7.0.1" } }, "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A=="], @@ -2380,7 +2510,7 @@ "knitwork": ["knitwork@1.2.0", "", {}, "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="], - "known-css-properties": ["known-css-properties@0.36.0", "", {}, "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA=="], + "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], @@ -2388,7 +2518,7 @@ "leaflet": ["leaflet@1.9.4", "", {}, "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA=="], - "leaflet-geosearch": ["leaflet-geosearch@4.2.0", "", { "optionalDependencies": { "@googlemaps/js-api-loader": "^1.16.6", "leaflet": "^1.6.0" } }, "sha512-UWNhFSaUcLlAP5UQY75ziWCl3cp0UCcmcFczPHLHjuAVPOHoPTe0nSgHJuI3pSTJBQm46NYoZOlgonrWceUznQ=="], + "leaflet-geosearch": ["leaflet-geosearch@4.2.2", "", { "optionalDependencies": { "@googlemaps/js-api-loader": "^1.16.6", "leaflet": "^1.6.0" } }, "sha512-847zdoX0SJcDCwPmbjO0C8ngPby14bYl7vfY4fLAKLi+AlIa2kWX2FXChu+kwzSQp45IF3buluS4YwbYITGkwA=="], "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], @@ -2396,33 +2526,35 @@ "libbase64": ["libbase64@1.3.0", "", {}, "sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg=="], - "libmime": ["libmime@5.3.6", "", { "dependencies": { "encoding-japanese": "2.2.0", "iconv-lite": "0.6.3", "libbase64": "1.3.0", "libqp": "2.1.1" } }, "sha512-j9mBC7eiqi6fgBPAGvKCXJKJSIASanYF4EeA4iBzSG0HxQxmXnR3KbyWqTn4CwsKSebqCv2f5XZfAO6sKzgvwA=="], + "libmime": ["libmime@5.3.7", "", { "dependencies": { "encoding-japanese": "2.2.0", "iconv-lite": "0.6.3", "libbase64": "1.3.0", "libqp": "2.1.1" } }, "sha512-FlDb3Wtha8P01kTL3P9M+ZDNDWPKPmKHWaU/cG/lg5pfuAwdflVpZE+wm9m7pKmC5ww6s+zTxBKS1p6yl3KpSw=="], - "libphonenumber-js": ["libphonenumber-js@1.12.7", "", {}, "sha512-0nYZSNj/QEikyhcM5RZFXGlCB/mr4PVamnT1C2sKBnDDTYndrvbybYjvg+PMqAndQHlLbwQ3socolnL3WWTUFA=="], + "libphonenumber-js": ["libphonenumber-js@1.12.23", "", {}, "sha512-RN3q3gImZ91BvRDYjWp7ICz3gRn81mW5L4SW+2afzNCC0I/nkXstBgZThQGTE3S/9q5J90FH4dP+TXx8NhdZKg=="], "libqp": ["libqp@2.1.1", "", {}, "sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow=="], - "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], - "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], - "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="], - "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="], - "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="], - "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="], - "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="], - "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="], - "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="], - "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="], - "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="], "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], @@ -2460,7 +2592,7 @@ "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - "loupe": ["loupe@3.1.3", "", {}, "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug=="], + "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], @@ -2468,13 +2600,13 @@ "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], - "mailparser": ["mailparser@3.7.2", "", { "dependencies": { "encoding-japanese": "2.2.0", "he": "1.2.0", "html-to-text": "9.0.5", "iconv-lite": "0.6.3", "libmime": "5.3.6", "linkify-it": "5.0.0", "mailsplit": "5.4.2", "nodemailer": "6.9.16", "punycode.js": "2.3.1", "tlds": "1.255.0" } }, "sha512-iI0p2TCcIodR1qGiRoDBBwboSSff50vQAWytM5JRggLfABa4hHYCf3YVujtuzV454xrOP352VsAPIzviqMTo4Q=="], + "mailparser": ["mailparser@3.7.4", "", { "dependencies": { "encoding-japanese": "2.2.0", "he": "1.2.0", "html-to-text": "9.0.5", "iconv-lite": "0.6.3", "libmime": "5.3.7", "linkify-it": "5.0.0", "mailsplit": "5.4.5", "nodemailer": "7.0.4", "punycode.js": "2.3.1", "tlds": "1.259.0" } }, "sha512-Beh4yyR4jLq3CZZ32asajByrXnW8dLyKCAQD3WvtTiBnMtFWhxO+wa93F6sJNjDmfjxXs4NRNjw3XAGLqZR3Vg=="], - "mailsplit": ["mailsplit@5.4.2", "", { "dependencies": { "libbase64": "1.3.0", "libmime": "5.3.6", "libqp": "2.1.1" } }, "sha512-4cczG/3Iu3pyl8JgQ76dKkisurZTmxMrA4dj/e8d2jKYcFTZ7MxOzg1gTioTDMPuFXwTrVuN/gxhkrO7wLg7qA=="], + "mailsplit": ["mailsplit@5.4.5", "", { "dependencies": { "libbase64": "1.3.0", "libmime": "5.3.7", "libqp": "2.1.1" } }, "sha512-oMfhmvclR689IIaQmIcR5nODnZRRVwAKtqFT407TIvmhX2OLUBnshUTcxzQBt3+96sZVDud9NfSe1NxAkUNXEQ=="], "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], @@ -2522,13 +2654,13 @@ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "minipass": ["minipass@https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", {}], "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], - "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="], + "mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], "mock-apollo-client": ["mock-apollo-client@1.3.1", "", { "peerDependencies": { "@apollo/client": "^3.0.0" } }, "sha512-jBl1YGofh9RpTUFfShwIumiry5qRkR1LYW12K1iZ576kMFh03psHTRiuY2k3dT6cUQ28RAK4gRFl9lVloazGhA=="], @@ -2552,6 +2684,8 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], + "nat-sampler": ["nat-sampler@1.0.1", "", {}, "sha512-yQvyNN7xbqR8crTKk3U8gRgpcV1Az+vfCEijiHu9oHHsnIl8n3x+yXNHl42M6L3czGynAVoOT9TqBfS87gDdcw=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -2572,9 +2706,9 @@ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], - "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "node-fetch": ["node-fetch@https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", { "dependencies": { "whatwg-url": "^5.0.0" } }], - "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], @@ -2582,9 +2716,9 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + "node-releases": ["node-releases@2.0.23", "", {}, "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg=="], - "nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], + "nodemailer": ["nodemailer@6.6.5", "", {}, "sha512-C/v856DBijUzHcHIgGpQoTrfsH3suKIRAGliIzCstatM2cAa+MYX3LuyCrABiO/cdJTxgBBHXxV1ztiqUwst5A=="], "nodemon": ["nodemon@2.0.22", "", { "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" } }, "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ=="], @@ -2598,15 +2732,15 @@ "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], - "normalize-url": ["normalize-url@8.0.1", "", {}, "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w=="], + "normalize-url": ["normalize-url@8.1.0", "", {}, "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w=="], "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], - "nwsapi": ["nwsapi@2.2.20", "", {}, "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA=="], + "nwsapi": ["nwsapi@2.2.22", "", {}, "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ=="], - "nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], + "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -2626,7 +2760,7 @@ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -2636,7 +2770,7 @@ "open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], - "openai": ["openai@4.97.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-LRoiy0zvEf819ZUEJhgfV8PfsE8G5WpQi4AwA1uCV8SKvvtXQkoWUFkepD6plqyJQRghy2+AEPQ07FrJFKHZ9Q=="], + "openai": ["openai@4.104.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" }, "peerDependencies": { "ws": "^8.18.0", "zod": "^3.23.8" }, "optionalPeers": ["ws", "zod"], "bin": { "openai": "bin/cli" } }, "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA=="], "optimism": ["optimism@0.18.1", "", { "dependencies": { "@wry/caches": "^1.0.0", "@wry/context": "^0.7.0", "@wry/trie": "^0.5.0", "tslib": "^2.3.0" } }, "sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ=="], @@ -2662,7 +2796,7 @@ "p-wait-for": ["p-wait-for@3.2.0", "", { "dependencies": { "p-timeout": "^3.0.0" } }, "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA=="], - "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "package-json-from-dist": ["package-json-from-dist@https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", {}], "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], @@ -2670,7 +2804,7 @@ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], - "parse-github-url": ["parse-github-url@1.0.3", "", { "bin": { "parse-github-url": "cli.js" } }, "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww=="], + "parse-github-url": ["parse-github-url@https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", {}], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], @@ -2688,11 +2822,11 @@ "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "path-key": ["path-key@https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", {}], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-scurry": ["path-scurry@https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }], "path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], @@ -2700,15 +2834,13 @@ "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], - "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], + "pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="], "peberminta": ["peberminta@0.9.0", "", {}, "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ=="], - "peek-readable": ["peek-readable@5.4.2", "", {}, "sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg=="], - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], - "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + "perfect-debounce": ["perfect-debounce@2.0.0", "", {}, "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], @@ -2716,7 +2848,7 @@ "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], - "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + "pirates": ["pirates@https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", {}], "piscina": ["piscina@4.9.2", "", { "optionalDependencies": { "@napi-rs/nice": "^1.0.1" } }, "sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ=="], @@ -2728,7 +2860,7 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "postcss-html": ["postcss-html@1.8.0", "", { "dependencies": { "htmlparser2": "^8.0.0", "js-tokens": "^9.0.0", "postcss": "^8.5.0", "postcss-safe-parser": "^6.0.0" } }, "sha512-5mMeb1TgLWoRKxZ0Xh9RZDfwUUIqRrcxO2uXO+Ezl1N5lqpCiSU5Gk6+1kZediBfBHFtPCdopr2UZ2SgUsKcgQ=="], @@ -2746,7 +2878,7 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], @@ -2800,15 +2932,19 @@ "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], + "pure-rand": ["pure-rand@7.0.1", "", {}, "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ=="], + + "qified": ["qified@0.5.0", "", { "dependencies": { "hookified": "^1.12.1" } }, "sha512-Zj6Q/Vc/SQ+Fzc87N90jJUzBzxD7MVQ2ZvGyMmYtnl2u1a07CejAhvtk4ZwASos+SiHKCAIylyGHJKIek75QBw=="], + "qrcanvas": ["qrcanvas@3.1.2", "", { "dependencies": { "@babel/runtime": "^7.11.2", "qrcode-generator": "^1.4.4" } }, "sha512-lNcAyCHN0Eno/mJ5eBc7lHV/5ejAJxII0UELthG3bNnlLR+u8hCc7CR+hXBawbYUf96kNIosXfG2cJzx92ZWKg=="], "qrcanvas-vue": ["qrcanvas-vue@3.0.0", "", { "dependencies": { "@babel/runtime": "^7.16.0", "qrcanvas": "^3.1.2" }, "peerDependencies": { "vue": "3.x" } }, "sha512-B7LgAyOEJWf8Bz0y2J8M0OXE77uNWcH7PWr6q8ihyuQE5NP9zopY9wJGTZIT6Mu7oEOczPHMLDedZqFCT2Qxdw=="], - "qrcode-generator": ["qrcode-generator@1.4.4", "", {}, "sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw=="], + "qrcode-generator": ["qrcode-generator@1.5.2", "", {}, "sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw=="], "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], - "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="], + "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], "querystringify": ["querystringify@2.2.0", "", {}, "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="], @@ -2856,7 +2992,7 @@ "require-addon": ["require-addon@1.1.0", "", { "dependencies": { "bare-addon-resolve": "^1.3.0", "bare-url": "^2.1.0" } }, "sha512-KbXAD5q2+v1GJnkzd8zzbOxchTkStSyJZ9QwoCq3QwEXAaIlG3wDYRZGzVD357jmwaGY7hr5VaoEAL0BkF0Kvg=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "require-directory": ["require-directory@https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", {}], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -2888,7 +3024,7 @@ "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], - "rollup": ["rollup@4.40.2", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.40.2", "@rollup/rollup-android-arm64": "4.40.2", "@rollup/rollup-darwin-arm64": "4.40.2", "@rollup/rollup-darwin-x64": "4.40.2", "@rollup/rollup-freebsd-arm64": "4.40.2", "@rollup/rollup-freebsd-x64": "4.40.2", "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", "@rollup/rollup-linux-arm-musleabihf": "4.40.2", "@rollup/rollup-linux-arm64-gnu": "4.40.2", "@rollup/rollup-linux-arm64-musl": "4.40.2", "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", "@rollup/rollup-linux-riscv64-gnu": "4.40.2", "@rollup/rollup-linux-riscv64-musl": "4.40.2", "@rollup/rollup-linux-s390x-gnu": "4.40.2", "@rollup/rollup-linux-x64-gnu": "4.40.2", "@rollup/rollup-linux-x64-musl": "4.40.2", "@rollup/rollup-win32-arm64-msvc": "4.40.2", "@rollup/rollup-win32-ia32-msvc": "4.40.2", "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg=="], + "rollup": ["rollup@4.52.4", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.4", "@rollup/rollup-android-arm64": "4.52.4", "@rollup/rollup-darwin-arm64": "4.52.4", "@rollup/rollup-darwin-x64": "4.52.4", "@rollup/rollup-freebsd-arm64": "4.52.4", "@rollup/rollup-freebsd-x64": "4.52.4", "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", "@rollup/rollup-linux-arm-musleabihf": "4.52.4", "@rollup/rollup-linux-arm64-gnu": "4.52.4", "@rollup/rollup-linux-arm64-musl": "4.52.4", "@rollup/rollup-linux-loong64-gnu": "4.52.4", "@rollup/rollup-linux-ppc64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-musl": "4.52.4", "@rollup/rollup-linux-s390x-gnu": "4.52.4", "@rollup/rollup-linux-x64-gnu": "4.52.4", "@rollup/rollup-linux-x64-musl": "4.52.4", "@rollup/rollup-openharmony-arm64": "4.52.4", "@rollup/rollup-win32-arm64-msvc": "4.52.4", "@rollup/rollup-win32-ia32-msvc": "4.52.4", "@rollup/rollup-win32-x64-gnu": "4.52.4", "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ=="], "rrweb-cssom": ["rrweb-cssom@0.7.1", "", {}, "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg=="], @@ -2912,11 +3048,11 @@ "safety-catch": ["safety-catch@1.0.2", "", {}, "sha512-C1UYVZ4dtbBxEtvOcpjBaaD27nP8MlvyAQEp2fOTOEe6pfUpk1cDUxij6BR1jZup6rSyUTaBBplK7LanskrULA=="], - "sass": ["sass@1.87.0", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw=="], + "sass": ["sass@1.93.2", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg=="], "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="], - "schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="], + "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], @@ -2924,7 +3060,7 @@ "selderee": ["selderee@0.6.0", "", { "dependencies": { "parseley": "^0.7.0" } }, "sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg=="], - "semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + "semver": ["semver@https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", {}], "semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="], @@ -2948,15 +3084,15 @@ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "sha.js": ["sha.js@2.4.11", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, "bin": { "sha.js": "./bin.js" } }, "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="], + "sha.js": ["sha.js@https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }], "shared": ["shared@workspace:shared"], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + "shebang-command": ["shebang-command@https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }], - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shebang-regex": ["shebang-regex@https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", {}], - "shell-quote": ["shell-quote@1.8.2", "", {}, "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA=="], + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], "shvl": ["shvl@2.0.3", "", {}, "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw=="], @@ -2992,7 +3128,7 @@ "sort-keys-length": ["sort-keys-length@1.0.1", "", { "dependencies": { "sort-keys": "^1.0.0" } }, "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw=="], - "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -3002,7 +3138,7 @@ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "sql-highlight": ["sql-highlight@6.0.0", "", {}, "sha512-+fLpbAbWkQ+d0JEchJT/NrRRXbYRNbG15gFpANx73EwxQB1PRjj+k/OI0GTU0J63g8ikGkJECQp9z8XEJZvPRw=="], + "sql-highlight": ["sql-highlight@https://registry.npmjs.org/sql-highlight/-/sql-highlight-6.0.0.tgz", {}], "sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="], @@ -3014,17 +3150,19 @@ "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + "streamroller": ["streamroller@3.1.5", "", { "dependencies": { "date-format": "^4.0.14", "debug": "^4.3.4", "fs-extra": "^8.1.0" } }, "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw=="], "streamsearch": ["streamsearch@0.1.2", "", {}, "sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA=="], - "streamx": ["streamx@2.22.0", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw=="], + "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="], "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string-width-cjs": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }], "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], @@ -3036,7 +3174,7 @@ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-ansi-cjs": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }], "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], @@ -3048,25 +3186,25 @@ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], - "strtok3": ["strtok3@9.1.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.3.1" } }, "sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw=="], + "strtok3": ["strtok3@10.3.4", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg=="], - "stylelint": ["stylelint@16.19.1", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", "debug": "^4.3.7", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^10.0.8", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", "ignore": "^7.0.3", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.36.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw=="], + "stylelint": ["stylelint@16.25.0", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.2.1", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^10.1.4", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.6", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "supports-hyperlinks": "^3.2.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ=="], "stylelint-config-html": ["stylelint-config-html@1.1.0", "", { "peerDependencies": { "postcss-html": "^1.0.0", "stylelint": ">=14.0.0" } }, "sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ=="], - "stylelint-config-recommended": ["stylelint-config-recommended@16.0.0", "", { "peerDependencies": { "stylelint": "^16.16.0" } }, "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA=="], + "stylelint-config-recommended": ["stylelint-config-recommended@17.0.0", "", { "peerDependencies": { "stylelint": "^16.23.0" } }, "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA=="], "stylelint-config-recommended-scss": ["stylelint-config-recommended-scss@14.1.0", "", { "dependencies": { "postcss-scss": "^4.0.9", "stylelint-config-recommended": "^14.0.1", "stylelint-scss": "^6.4.0" }, "peerDependencies": { "postcss": "^8.3.3", "stylelint": "^16.6.1" }, "optionalPeers": ["postcss"] }, "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg=="], - "stylelint-config-recommended-vue": ["stylelint-config-recommended-vue@1.6.0", "", { "dependencies": { "semver": "^7.3.5", "stylelint-config-html": ">=1.0.0", "stylelint-config-recommended": ">=6.0.0" }, "peerDependencies": { "postcss-html": "^1.0.0", "stylelint": ">=14.0.0" } }, "sha512-syk1adIHvbH2T1OiR/spUK4oQy35PZIDw8Zmc7E0+eVK9Z9SK3tdMpGRT/bgGnAPpMt/WaL9K1u0tlF6xM0sMQ=="], + "stylelint-config-recommended-vue": ["stylelint-config-recommended-vue@1.6.1", "", { "dependencies": { "semver": "^7.3.5", "stylelint-config-html": ">=1.0.0", "stylelint-config-recommended": ">=6.0.0" }, "peerDependencies": { "postcss-html": "^1.0.0", "stylelint": ">=14.0.0" } }, "sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ=="], "stylelint-config-standard": ["stylelint-config-standard@36.0.1", "", { "dependencies": { "stylelint-config-recommended": "^14.0.1" }, "peerDependencies": { "stylelint": "^16.1.0" } }, "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw=="], "stylelint-config-standard-scss": ["stylelint-config-standard-scss@14.0.0", "", { "dependencies": { "stylelint-config-recommended-scss": "^14.1.0", "stylelint-config-standard": "^36.0.1" }, "peerDependencies": { "postcss": "^8.3.3", "stylelint": "^16.11.0" }, "optionalPeers": ["postcss"] }, "sha512-6Pa26D9mHyi4LauJ83ls3ELqCglU6VfCXchovbEqQUiEkezvKdv6VgsIoMy58i00c854wVmOw0k8W5FTpuaVqg=="], - "stylelint-scss": ["stylelint-scss@6.12.0", "", { "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", "known-css-properties": "^0.36.0", "mdn-data": "^2.21.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "stylelint": "^16.0.2" } }, "sha512-U7CKhi1YNkM1pXUXl/GMUXi8xKdhl4Ayxdyceie1nZ1XNIdaUgMV6OArpooWcDzEggwgYD0HP/xIgVJo9a655w=="], + "stylelint-scss": ["stylelint-scss@6.12.1", "", { "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", "known-css-properties": "^0.36.0", "mdn-data": "^2.21.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-selector-parser": "^7.1.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "stylelint": "^16.0.2" } }, "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA=="], "subscriptions-transport-ws": ["subscriptions-transport-ws@0.9.19", "", { "dependencies": { "backo2": "^1.0.2", "eventemitter3": "^3.1.0", "iterall": "^1.2.1", "symbol-observable": "^1.0.4", "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" }, "peerDependencies": { "graphql": ">=0.10.0" } }, "sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw=="], @@ -3084,17 +3222,17 @@ "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], - "synckit": ["synckit@0.11.4", "", { "dependencies": { "@pkgr/core": "^0.2.3", "tslib": "^2.8.1" } }, "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ=="], + "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], - "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], + "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], "terminal-link": ["terminal-link@2.1.1", "", { "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" } }, "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ=="], - "terser": ["terser@5.39.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw=="], + "terser": ["terser@5.44.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w=="], "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], @@ -3122,9 +3260,9 @@ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "tinyglobby": ["tinyglobby@0.2.13", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw=="], + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "tinypool": ["tinypool@1.0.2", "", {}, "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA=="], + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], "tinyrainbow": ["tinyrainbow@1.2.0", "", {}, "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ=="], @@ -3132,7 +3270,7 @@ "titleize": ["titleize@2.1.0", "", {}, "sha512-m+apkYlfiQTKLW+sI4vqUkwMEzfgEUEYSqljx1voUE3Wz/z1ZsxyzSxvH2X8uKVrOp7QkByWt0rA6+gvhCKy6g=="], - "tlds": ["tlds@1.258.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-XGhStWuOlBA5D8QnyN2xtgB2cUOdJ3ztisne1DYVWMcVH29qh8eQIpRmP3HnuJLdgyzG0HpdGzRMu1lm/Oictw=="], + "tlds": ["tlds@1.260.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ=="], "tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="], @@ -3140,13 +3278,15 @@ "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="], + "to-buffer": ["to-buffer@1.2.2", "", { "dependencies": { "isarray": "^2.0.5", "safe-buffer": "^5.2.1", "typed-array-buffer": "^1.0.3" } }, "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], "token-stream": ["token-stream@1.0.0", "", {}, "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg=="], - "token-types": ["token-types@6.0.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA=="], + "token-types": ["token-types@6.1.1", "", { "dependencies": { "@borewit/text-codec": "^0.1.0", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ=="], "toposort": ["toposort@2.0.2", "", {}, "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="], @@ -3174,25 +3314,25 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsx": ["tsx@4.20.3", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ=="], + "tsx": ["tsx@4.20.6", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg=="], "tua-body-scroll-lock": ["tua-body-scroll-lock@1.5.3", "", {}, "sha512-44W12iqek41kZuTdpEUt3JTUsMx0IxfTajXWfQyMLgzsPaMYUPZLcJkwa4P0x24h5DQ3lYvDuYvphBo4+L0t4w=="], "tunnel": ["tunnel@0.0.6", "", {}, "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="], - "turbo": ["turbo@2.5.2", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.2", "turbo-darwin-arm64": "2.5.2", "turbo-linux-64": "2.5.2", "turbo-linux-arm64": "2.5.2", "turbo-windows-64": "2.5.2", "turbo-windows-arm64": "2.5.2" }, "bin": { "turbo": "bin/turbo" } }, "sha512-Qo5lfuStr6LQh3sPQl7kIi243bGU4aHGDQJUf6ylAdGwks30jJFloc9NYHP7Y373+gGU9OS0faA4Mb5Sy8X9Xw=="], + "turbo": ["turbo@https://registry.npmjs.org/turbo/-/turbo-2.5.2.tgz", { "optionalDependencies": { "turbo-darwin-64": "2.5.2", "turbo-darwin-arm64": "2.5.2", "turbo-linux-64": "2.5.2", "turbo-linux-arm64": "2.5.2", "turbo-windows-64": "2.5.2", "turbo-windows-arm64": "2.5.2" } }], - "turbo-darwin-64": ["turbo-darwin-64@2.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g=="], + "turbo-darwin-64": ["turbo-darwin-64@2.5.2", "", {}, "sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.2", "", {}, "sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA=="], - "turbo-linux-64": ["turbo-linux-64@2.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA=="], + "turbo-linux-64": ["turbo-linux-64@2.5.2", "", {}, "sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.2", "", {}, "sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg=="], - "turbo-windows-64": ["turbo-windows-64@2.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-hOLcbgZzE5ttACHHyc1ajmWYq4zKT42IC3G6XqgiXxMbS+4eyVYTL+7UvCZBd3Kca1u4TLQdLQjeO76zyDJc2A=="], + "turbo-windows-64": ["turbo-windows-64@https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.5.2.tgz", {}], - "turbo-windows-arm64": ["turbo-windows-arm64@2.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.2", "", {}, "sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -3216,21 +3356,21 @@ "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="], - "typeorm": ["typeorm@0.3.25", "", { "dependencies": { "@sqltools/formatter": "^1.2.5", "ansis": "^3.17.0", "app-root-path": "^3.1.0", "buffer": "^6.0.3", "dayjs": "^1.11.13", "debug": "^4.4.0", "dedent": "^1.6.0", "dotenv": "^16.4.7", "glob": "^10.4.5", "sha.js": "^2.4.11", "sql-highlight": "^6.0.0", "tslib": "^2.8.1", "uuid": "^11.1.0", "yargs": "^17.7.2" }, "peerDependencies": { "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0", "@sap/hana-client": "^2.12.25", "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0", "hdb-pool": "^0.1.6", "ioredis": "^5.0.4", "mongodb": "^5.8.0 || ^6.0.0", "mssql": "^9.1.1 || ^10.0.1 || ^11.0.1", "mysql2": "^2.2.5 || ^3.0.1", "oracledb": "^6.3.0", "pg": "^8.5.1", "pg-native": "^3.0.0", "pg-query-stream": "^4.0.0", "redis": "^3.1.1 || ^4.0.0", "reflect-metadata": "^0.1.14 || ^0.2.0", "sql.js": "^1.4.0", "sqlite3": "^5.0.3", "ts-node": "^10.7.0", "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" }, "optionalPeers": ["@google-cloud/spanner", "@sap/hana-client", "better-sqlite3", "hdb-pool", "ioredis", "mongodb", "mssql", "mysql2", "oracledb", "pg", "pg-native", "pg-query-stream", "redis", "sql.js", "sqlite3", "ts-node", "typeorm-aurora-data-api-driver"], "bin": { "typeorm": "cli.js", "typeorm-ts-node-esm": "cli-ts-node-esm.js", "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js" } }, "sha512-fTKDFzWXKwAaBdEMU4k661seZewbNYET4r1J/z3Jwf+eAvlzMVpTLKAVcAzg75WwQk7GDmtsmkZ5MfkmXCiFWg=="], + "typeorm": ["typeorm@0.3.25", "", { "dependencies": { "@sqltools/formatter": "^1.2.5", "ansis": "^3.17.0", "app-root-path": "^3.1.0", "buffer": "^6.0.3", "dayjs": "^1.11.13", "debug": "^4.4.0", "dedent": "^1.6.0", "dotenv": "^16.4.7", "glob": "^10.4.5", "sha.js": "^2.4.11", "sql-highlight": "^6.0.0", "tslib": "^2.8.1", "uuid": "^11.1.0", "yargs": "^17.7.2" } }, "sha512-fTKDFzWXKwAaBdEMU4k661seZewbNYET4r1J/z3Jwf+eAvlzMVpTLKAVcAzg75WwQk7GDmtsmkZ5MfkmXCiFWg=="], "typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="], "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], - "udx-native": ["udx-native@1.17.8", "", { "dependencies": { "b4a": "^1.5.0", "bare-events": "^2.2.0", "require-addon": "^1.1.0", "streamx": "^2.14.0" } }, "sha512-nB5SxTF9WzTNrxJnVSyEOtapoPjxAU1KboN/z1JWMtAVXArwtQ9Mxn+jJvlx4skINQHH6xUqQsQdSCL1Ja2h1Q=="], + "udx-native": ["udx-native@1.18.3", "", { "dependencies": { "b4a": "^1.5.0", "bare-events": "^2.2.0", "require-addon": "^1.1.0", "streamx": "^2.22.0" } }, "sha512-GqYA64plvp8+LY20PQvWuS2wY6/UBKLwpWb/po0iPlEYYnyxAqdag1yKeNJJ+HZtV95T4VYxKbT1xV8eV4iTiw=="], "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], - "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + "uglify-js": ["uglify-js@https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", {}], "uint-rng": ["uint-rng@1.2.1", "", { "dependencies": { "tiny-webcrypto": "^1.0.2" } }, "sha512-swhDg5H+3DX2sIvnYA7VMBMXV/t8mPxvh49CjCDkwFmj/3OZIDOQwJANBgM1MPSUBrUHNIlXmU7/GcL7m4907g=="], - "uint8array-extras": ["uint8array-extras@1.4.0", "", {}, "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ=="], + "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], @@ -3246,7 +3386,7 @@ "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - "unimport": ["unimport@5.0.1", "", { "dependencies": { "acorn": "^8.14.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", "tinyglobby": "^0.2.13", "unplugin": "^2.3.2", "unplugin-utils": "^0.2.4" } }, "sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ=="], + "unimport": ["unimport@5.4.1", "", { "dependencies": { "acorn": "^8.15.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.2", "magic-string": "^0.30.19", "mlly": "^1.8.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", "pkg-types": "^2.3.0", "scule": "^1.3.0", "strip-literal": "^3.1.0", "tinyglobby": "^0.2.15", "unplugin": "^2.3.10", "unplugin-utils": "^0.3.0" } }, "sha512-wMZ2JKUCleCK2zfRHeWcbrUHKXOC3SVBYkyn/wTGzh0THX6sT4hSjuKXxKANN4/WMbT6ZPM4JzcDcnhD2x9Bpg=="], "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -3256,10 +3396,12 @@ "unplugin-icons": ["unplugin-icons@0.19.3", "", { "dependencies": { "@antfu/install-pkg": "^0.4.1", "@antfu/utils": "^0.7.10", "@iconify/utils": "^2.1.29", "debug": "^4.3.6", "kolorist": "^1.8.0", "local-pkg": "^0.5.0", "unplugin": "^1.12.0" }, "peerDependencies": { "@svgr/core": ">=7.0.0", "@svgx/core": "^1.0.1", "@vue/compiler-sfc": "^3.0.2 || ^2.7.0", "vue-template-compiler": "^2.6.12", "vue-template-es2015-compiler": "^1.9.0" }, "optionalPeers": ["@svgr/core", "@svgx/core", "@vue/compiler-sfc", "vue-template-compiler", "vue-template-es2015-compiler"] }, "sha512-EUegRmsAI6+rrYr0vXjFlIP+lg4fSC4zb62zAZKx8FGXlWAGgEGBCa3JDe27aRAXhistObLPbBPhwa/0jYLFkQ=="], - "unplugin-utils": ["unplugin-utils@0.2.4", "", { "dependencies": { "pathe": "^2.0.2", "picomatch": "^4.0.2" } }, "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA=="], + "unplugin-utils": ["unplugin-utils@0.3.1", "", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog=="], "unplugin-vue-components": ["unplugin-vue-components@0.27.5", "", { "dependencies": { "@antfu/utils": "^0.7.10", "@rollup/pluginutils": "^5.1.3", "chokidar": "^3.6.0", "debug": "^4.3.7", "fast-glob": "^3.3.2", "local-pkg": "^0.5.1", "magic-string": "^0.30.14", "minimatch": "^9.0.5", "mlly": "^1.7.3", "unplugin": "^1.16.0" }, "peerDependencies": { "@babel/parser": "^7.15.8", "@nuxt/kit": "^3.2.2", "vue": "2 || 3" }, "optionalPeers": ["@babel/parser", "@nuxt/kit"] }, "sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg=="], + "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], + "unslab": ["unslab@1.3.0", "", { "dependencies": { "b4a": "^1.6.6" } }, "sha512-YATkfKAFj47kTzmiQrWXMyRvaVrHsW6MEALa4bm+FhiA2YG4oira+Z3DXN6LrYOYn2Y8eO94Lwl9DOHjs1FpoQ=="], "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.2", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="], @@ -3276,7 +3418,7 @@ "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], - "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "uuid": ["uuid@https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", {}], "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], @@ -3284,13 +3426,13 @@ "valid-data-url": ["valid-data-url@3.0.1", "", {}, "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA=="], - "validator": ["validator@13.15.0", "", {}, "sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA=="], + "validator": ["validator@13.15.15", "", {}, "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - "vee-validate": ["vee-validate@4.15.0", "", { "dependencies": { "@vue/devtools-api": "^7.5.2", "type-fest": "^4.8.3" }, "peerDependencies": { "vue": "^3.4.26" } }, "sha512-PGJh1QCFwCBjbHu5aN6vB8macYVWrajbDvgo1Y/8fz9n/RVIkLmZCJDpUgu7+mUmCOPMxeyq7vXUOhbwAqdXcA=="], + "vee-validate": ["vee-validate@4.15.1", "", { "dependencies": { "@vue/devtools-api": "^7.5.2", "type-fest": "^4.8.3" }, "peerDependencies": { "vue": "^3.4.26" } }, "sha512-DkFsiTwEKau8VIxyZBGdO6tOudD+QoUBPuHj3e6QFqmbfCRj1ArmYWue9lEp6jLSWBIw4XPlDLjFIZNLdRAMSg=="], - "vite": ["vite@5.4.19", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA=="], + "vite": ["vite@5.4.20", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g=="], "vite-node": ["vite-node@2.1.9", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA=="], @@ -3314,7 +3456,7 @@ "vue-apollo": ["vue-apollo@3.1.2", "", { "dependencies": { "chalk": "^2.4.2", "serialize-javascript": "^4.0.0", "throttle-debounce": "^2.1.0" }, "peerDependencies": { "graphql-tag": "^2" } }, "sha512-ZS4b9C+iiiVmjpbTcxp2ryrRiX4lux+duPuyj4qm25hS8Y45NjQXitgLYitSToqepl52/VZDrRnD07G2RpbejQ=="], - "vue-component-type-helpers": ["vue-component-type-helpers@2.2.10", "", {}, "sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA=="], + "vue-component-type-helpers": ["vue-component-type-helpers@2.2.12", "", {}, "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw=="], "vue-demi": ["vue-demi@0.14.10", "", { "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "optionalPeers": ["@vue/composition-api"], "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" } }, "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg=="], @@ -3340,7 +3482,7 @@ "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="], - "watchpack": ["watchpack@2.4.2", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw=="], + "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], "web-resource-inliner": ["web-resource-inliner@6.0.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "escape-goat": "^3.0.0", "htmlparser2": "^5.0.0", "mime": "^2.4.6", "node-fetch": "^2.6.0", "valid-data-url": "^3.0.0" } }, "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A=="], @@ -3348,9 +3490,9 @@ "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], - "webpack": ["webpack@5.99.7", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w=="], + "webpack": ["webpack@5.102.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.2.3", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA=="], - "webpack-sources": ["webpack-sources@3.2.3", "", {}, "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="], + "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -3360,7 +3502,7 @@ "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "which": ["which@https://registry.npmjs.org/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" } }], "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], @@ -3370,7 +3512,7 @@ "which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="], - "which-runtime": ["which-runtime@1.2.1", "", {}, "sha512-8feIHccQFH/whiA1fD1b4c5+Q7T4ry1g1oHYc2mHnFh81tTQFsCvy3zhS2geUapkFAVBddUT/AM1a3rbqJweFg=="], + "which-runtime": ["which-runtime@1.3.2", "", {}, "sha512-5kwCfWml7+b2NO7KrLMhYihjRx0teKkd3yGp1Xk5Vaf2JGdSh+rgVhEALAD9c/59dP+YwJHXoEO7e8QPy7gOkw=="], "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], @@ -3382,19 +3524,19 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + "wordwrap": ["wordwrap@https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", {}], - "workerpool": ["workerpool@9.2.0", "", {}, "sha512-PKZqBOCo6CYkVOwAxWxQaSF2Fvb5Iv2fCeTP7buyWI2GiynWr46NcXSgK/idoV6e60dgCBfgYc+Un3HMvmqP8w=="], + "workerpool": ["workerpool@9.3.4", "", {}, "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "wrap-ansi": ["wrap-ansi@https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }], - "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "wrap-ansi-cjs": ["wrap-ansi@https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], - "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], "xache": ["xache@1.2.1", "", {}, "sha512-igRS6jPreJ54ABdzhh4mCDXcz+XMaWO2q1ABRV2yWYuk29jlp8VT7UBdCqNkX7rpYBbXsebVVKkwIuYZjyZNqA=="], @@ -3406,7 +3548,7 @@ "xss": ["xss@1.0.15", "", { "dependencies": { "commander": "^2.20.3", "cssfilter": "0.0.10" }, "bin": { "xss": "bin/xss" } }, "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "y18n": ["y18n@https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", {}], "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], @@ -3414,7 +3556,7 @@ "yaml-eslint-parser": ["yaml-eslint-parser@0.5.0", "", { "dependencies": { "eslint-visitor-keys": "^3.0.0", "lodash": "^4.17.21", "yaml": "^1.10.2" } }, "sha512-nJeyLA3YHAzhBTZbRAbu3W6xrSCucyxExmA+ZDtEdUFpGllxAZpto2Zxo2IG0r0eiuEiBM4e+wiAdxTziTq94g=="], - "yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "yargs": ["yargs@https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", { "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" } }], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], @@ -3426,13 +3568,15 @@ "yoctocolors-cjs": ["yoctocolors-cjs@2.1.2", "", {}, "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA=="], - "yup": ["yup@1.6.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA=="], + "yup": ["yup@1.7.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw=="], "zen-observable": ["zen-observable@0.8.15", "", {}, "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="], "zen-observable-ts": ["zen-observable-ts@1.2.5", "", { "dependencies": { "zen-observable": "0.8.15" } }, "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg=="], - "zod": ["zod@3.25.61", "", {}, "sha512-fzfJgUw78LTNnHujj9re1Ov/JJQkRZZGDMcYqSx7Hp4rPOkKywaFHq0S6GoHeXs0wGNE/sIOutkXgnwzrVOGCQ=="], + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "@anatine/esbuild-decorators/esbuild": ["esbuild@0.14.54", "", { "optionalDependencies": { "@esbuild/linux-loong64": "0.14.54", "esbuild-android-64": "0.14.54", "esbuild-android-arm64": "0.14.54", "esbuild-darwin-64": "0.14.54", "esbuild-darwin-arm64": "0.14.54", "esbuild-freebsd-64": "0.14.54", "esbuild-freebsd-arm64": "0.14.54", "esbuild-linux-32": "0.14.54", "esbuild-linux-64": "0.14.54", "esbuild-linux-arm": "0.14.54", "esbuild-linux-arm64": "0.14.54", "esbuild-linux-mips64le": "0.14.54", "esbuild-linux-ppc64le": "0.14.54", "esbuild-linux-riscv64": "0.14.54", "esbuild-linux-s390x": "0.14.54", "esbuild-netbsd-64": "0.14.54", "esbuild-openbsd-64": "0.14.54", "esbuild-sunos-64": "0.14.54", "esbuild-windows-32": "0.14.54", "esbuild-windows-64": "0.14.54", "esbuild-windows-arm64": "0.14.54" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA=="], "@apollo/protobufjs/@types/node": ["@types/node@10.17.60", "", {}, "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="], @@ -3442,18 +3586,28 @@ "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "@cacheable/memory/keyv": ["keyv@5.5.3", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A=="], + + "@cacheable/utils/keyv": ["keyv@5.5.3", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A=="], "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], "@csstools/selector-specificity/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + "@emnapi/core/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], + + "@emnapi/runtime/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], + + "@emnapi/wasi-threads/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], + "@hapi/boom/@hapi/hoek": ["@hapi/hoek@11.0.7", "", {}, "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ=="], "@hapi/joi/@hapi/hoek": ["@hapi/hoek@8.5.1", "", {}, "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="], @@ -3464,31 +3618,39 @@ "@hyperswarm/secret-stream/sodium-universal": ["sodium-universal@5.0.1", "", { "dependencies": { "sodium-native": "^5.0.1" }, "peerDependencies": { "sodium-javascript": "~0.8.0" }, "optionalPeers": ["sodium-javascript"] }, "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q=="], + "@iconify/json/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "@iconify/utils/@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], "@iconify/utils/@antfu/utils": ["@antfu/utils@8.1.1", "", {}, "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ=="], "@iconify/utils/globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="], - "@iconify/utils/local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], + "@iconify/utils/local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], - "@intlify/bundle-utils/@intlify/message-compiler": ["@intlify/message-compiler@11.1.3", "", { "dependencies": { "@intlify/shared": "11.1.3", "source-map-js": "^1.0.2" } }, "sha512-7rbqqpo2f5+tIcwZTAG/Ooy9C8NDVwfDkvSeDPWUPQW+Dyzfw2o9H103N5lKBxO7wxX9dgCDjQ8Umz73uYw3hw=="], + "@intlify/bundle-utils/@intlify/message-compiler": ["@intlify/message-compiler@11.1.12", "", { "dependencies": { "@intlify/shared": "11.1.12", "source-map-js": "^1.0.2" } }, "sha512-Fv9iQSJoJaXl4ZGkOCN1LDM3trzze0AS2zRz2EHLiwenwL6t0Ki9KySYlyr27yVOj5aVz0e55JePO+kELIvfdQ=="], - "@intlify/bundle-utils/@intlify/shared": ["@intlify/shared@11.1.3", "", {}, "sha512-pTFBgqa/99JRA2H1qfyqv97MKWJrYngXBA/I0elZcYxvJgcCw3mApAoPW3mJ7vx3j+Ti0FyKUFZ4hWxdjKaxvA=="], + "@intlify/bundle-utils/@intlify/shared": ["@intlify/shared@11.1.12", "", {}, "sha512-Om86EjuQtA69hdNj3GQec9ZC0L0vPSAnXzB3gP/gyJ7+mA7t06d9aOAiqMZ+xEOsumGP4eEBlfl8zF2LOTzf2A=="], "@intlify/bundle-utils/yaml-eslint-parser": ["yaml-eslint-parser@1.3.0", "", { "dependencies": { "eslint-visitor-keys": "^3.0.0", "yaml": "^2.0.0" } }, "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA=="], - "@intlify/unplugin-vue-i18n/@intlify/shared": ["@intlify/shared@11.1.3", "", {}, "sha512-pTFBgqa/99JRA2H1qfyqv97MKWJrYngXBA/I0elZcYxvJgcCw3mApAoPW3mJ7vx3j+Ti0FyKUFZ4hWxdjKaxvA=="], + "@intlify/core-base/@intlify/shared": ["@intlify/shared@9.14.5", "", {}, "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ=="], - "@intlify/vue-i18n-extensions/@intlify/shared": ["@intlify/shared@10.0.7", "", {}, "sha512-oeoq0L5+5P4ShXa6jBQcx+BT+USe3MjX0xJexZO1y7rfDJdwZ9+QP3jO4tcS1nxhBYYdjvFTqe4bmnLijV0GxQ=="], + "@intlify/eslint-plugin-vue-i18n/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - "@intlify/vue-i18n-extensions/vue-i18n": ["vue-i18n@10.0.7", "", { "dependencies": { "@intlify/core-base": "10.0.7", "@intlify/shared": "10.0.7", "@vue/devtools-api": "^6.5.0" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-bKsk0PYwP9gdYF4nqSAT0kDpnLu1gZzlxFl885VH4mHVhEnqP16+/mAU05r1U6NIrc0fGDWP89tZ8GzeJZpe+w=="], + "@intlify/message-compiler/@intlify/shared": ["@intlify/shared@9.14.5", "", {}, "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ=="], - "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "@intlify/unplugin-vue-i18n/@intlify/shared": ["@intlify/shared@11.1.12", "", {}, "sha512-Om86EjuQtA69hdNj3GQec9ZC0L0vPSAnXzB3gP/gyJ7+mA7t06d9aOAiqMZ+xEOsumGP4eEBlfl8zF2LOTzf2A=="], - "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + "@intlify/vue-i18n-extensions/@intlify/shared": ["@intlify/shared@10.0.8", "", {}, "sha512-BcmHpb5bQyeVNrptC3UhzpBZB/YHHDoEREOUERrmF2BRxsyOEuRrq+Z96C/D4+2KJb8kuHiouzAei7BXlG0YYw=="], - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "@intlify/vue-i18n-extensions/vue-i18n": ["vue-i18n@10.0.8", "", { "dependencies": { "@intlify/core-base": "10.0.8", "@intlify/shared": "10.0.8", "@vue/devtools-api": "^6.5.0" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-mIjy4utxMz9lMMo6G9vYePv7gUFt4ztOMhY9/4czDJxZ26xPeJ49MAGa9wBAE3XuXbYCrtVPmPxNjej7JJJkZQ=="], + + "@isaacs/cliui/string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }], "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], @@ -3496,17 +3658,25 @@ "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="], - "@jest/console/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@jest/console/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@jest/core/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@jest/core/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@jest/create-cache-key-function/@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + "@jest/create-cache-key-function/@jest/types": ["@jest/types@30.0.5", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ=="], - "@jest/environment/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@jest/environment/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@jest/fake-timers/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@jest/expect/expect": ["expect@30.2.0", "", { "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw=="], - "@jest/reporters/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@jest/expect/jest-snapshot": ["jest-snapshot@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "@jest/snapshot-utils": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "30.2.0", "graceful-fs": "^4.2.11", "jest-diff": "30.2.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" } }, "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA=="], + + "@jest/fake-timers/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/pattern/@types/node": ["@types/node@https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }], + + "@jest/pattern/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], + + "@jest/reporters/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "@jest/reporters/istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="], @@ -3514,90 +3684,128 @@ "@jest/reporters/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@jest/snapshot-utils/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + "@jest/source-map/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], "@jest/transform/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], - "@jest/types/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], - - "@ladjs/i18n/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], - - "@morev/utils/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "@jest/types/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "@morev/utils/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "@nuxt/kit/consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], - "@nuxt/kit/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], + "@nuxt/kit/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@nuxt/kit/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "@nuxt/kit/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "@nuxt/kit/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "@nuxt/kit/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "@nuxt/kit/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], - "@rollup/pluginutils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "@rollup/pluginutils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "@selderee/plugin-htmlparser2/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + "@swc-node/register/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "@swc-node/register/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], + + "@swc-node/sourcemap-support/source-map-support": ["source-map-support@https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }], + + "@swc-node/sourcemap-support/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], + "@swc/cli/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], "@swc/cli/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@types/accepts/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@swc/cli/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - "@types/body-parser/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@swc/jest/@swc/counter": ["@swc/counter@https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", {}], - "@types/connect/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@tybys/wasm-util/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], - "@types/cookies/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/accepts/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/express-serve-static-core/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/body-parser/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/fs-capacitor/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/connect/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/glob/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/cookies/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/graceful-fs/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/express-serve-static-core/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/koa/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/fs-capacitor/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/mysql/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/glob/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/node-fetch/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/graceful-fs/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/send/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/koa/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/serve-static/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/minimatch/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@types/sodium-native/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/mysql/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@types/node-fetch/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "@types/ws/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@types/nodemailer/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/send/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/serve-static/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/sodium-native/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/source-map-support/source-map": ["source-map@https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", {}], + + "@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], "@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], "@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], - "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "@vee-validate/yup/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "@vitest/mocker/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "@vue/devtools-kit/perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "@vue/reactivity/@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], + + "@vue/runtime-core/@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], + + "@vue/runtime-dom/@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], + + "@vue/server-renderer/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA=="], + + "@vue/server-renderer/@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], + + "@xhmikosr/bin-check/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "acorn-globals/acorn": ["acorn@7.4.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="], "acorn-globals/acorn-walk": ["acorn-walk@7.2.0", "", {}, "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="], + "admin/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -3626,6 +3834,8 @@ "apollo-client/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + "apollo-graphql/sha.js": ["sha.js@2.4.12", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" } }, "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w=="], + "apollo-link/ts-invariant": ["ts-invariant@0.4.4", "", { "dependencies": { "tslib": "^1.9.3" } }, "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA=="], "apollo-link/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -3640,6 +3850,12 @@ "apollo-link-http-common/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + "apollo-server-core/sha.js": ["sha.js@2.4.12", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1", "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" } }, "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w=="], + + "apollo-server-core/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "apollo-server-env/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "apollo-server-express/@types/body-parser": ["@types/body-parser@1.19.0", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ=="], "apollo-utilities/@wry/equality": ["@wry/equality@0.1.11", "", { "dependencies": { "tslib": "^1.9.3" } }, "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA=="], @@ -3650,23 +3866,35 @@ "babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + "backend/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + + "backend/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], + "backend/regenerator-runtime": ["regenerator-runtime@0.14.1", "", {}, "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="], + "backend/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "bin-version-check/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], "brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "builtins/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "c12/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "c12/dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + "c12/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], + + "c12/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "c12/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "c12/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "c12/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "cacheable/keyv": ["keyv@5.3.3", "", { "dependencies": { "@keyv/serialize": "^1.0.3" } }, "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ=="], + "cacheable/keyv": ["keyv@5.5.3", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A=="], "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], @@ -3688,28 +3916,46 @@ "clean-css/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "cliui/string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }], + + "cliui/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }], + "concurrently/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "concurrently/yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "core/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], + + "cross-fetch/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "css-select/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], "css-select/domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], "cssstyle/rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], - "database/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "database/@types/node": ["@types/node@18.19.121", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ=="], + + "database/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], "database/ts-jest": ["ts-jest@27.0.5", "", { "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", "lodash": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, "optionalPeers": ["@babel/core", "@types/jest", "babel-jest"], "bin": { "ts-jest": "cli.js" } }, "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w=="], + "database/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], "dht-node/@types/jest": ["@types/jest@27.5.1", "", { "dependencies": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" } }, "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ=="], + "dht-node/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + "dht-node/jest": ["jest@27.5.1", "", { "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", "jest-cli": "^27.5.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ=="], "dht-node/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], "dht-node/ts-jest": ["ts-jest@27.1.4", "", { "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, "optionalPeers": ["@babel/core", "@types/jest", "babel-jest"], "bin": { "ts-jest": "cli.js" } }, "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ=="], + "dht-node/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "dht-rpc/sodium-universal": ["sodium-universal@5.0.1", "", { "dependencies": { "sodium-native": "^5.0.1" }, "peerDependencies": { "sodium-javascript": "~0.8.0" }, "optionalPeers": ["sodium-javascript"] }, "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q=="], "domexception/webidl-conversions": ["webidl-conversions@5.0.0", "", {}, "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="], @@ -3720,10 +3966,18 @@ "editorconfig/minimatch": ["minimatch@9.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w=="], + "editorconfig/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "email-templates/nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], + "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "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" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], + "eslint/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "eslint-compat-utils/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -3736,27 +3990,35 @@ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + "eslint-plugin-n/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "eslint-plugin-node/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "eslint-plugin-vue/eslint-utils": ["eslint-utils@3.0.0", "", { "dependencies": { "eslint-visitor-keys": "^2.0.0" }, "peerDependencies": { "eslint": ">=5" } }, "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA=="], + "eslint-plugin-vue/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@1.3.0", "", {}, "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="], + "execa/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "fdir/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "federation/@types/express": ["@types/express@4.17.21", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ=="], "federation/apollo-server-testing": ["apollo-server-testing@2.25.2", "", { "dependencies": { "apollo-server-core": "^2.25.2" }, "peerDependencies": { "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" } }, "sha512-HjQV9wPbi/ZqpRbyyhNwCbaDnfjDM0hTRec5TOoOjurEZ/vh4hTPHwGkDZx3kbcWowhGxe2qoHM6KANSB/SxuA=="], + "federation/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + "federation/helmet": ["helmet@7.2.0", "", {}, "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw=="], "federation/ts-jest": ["ts-jest@27.0.5", "", { "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", "lodash": "4.x", "make-error": "1.x", "semver": "7.x", "yargs-parser": "20.x" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@types/jest": "^27.0.0", "babel-jest": ">=27.0.0 <28", "jest": "^27.0.0", "typescript": ">=3.8 <5.0" }, "optionalPeers": ["@babel/core", "@types/jest", "babel-jest"], "bin": { "ts-jest": "cli.js" } }, "sha512-lIJApzfTaSSbtlksfFNHkWOzLJuuSm4faFAfo5kvzOiRAuoN4/eKxVJ2zEAho8aecE04qX6K1pAzfH5QHL1/8w=="], - "file-type/get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + "federation/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], @@ -3764,6 +4026,10 @@ "fixpack/chalk": ["chalk@3.0.0", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="], + "foreground-child/signal-exit": ["signal-exit@https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", {}], + + "frontend/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + "frontend/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "giget/consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], @@ -3776,11 +4042,15 @@ "got/form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="], - "graphql-request/form-data": ["form-data@3.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35" } }, "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w=="], + "graphql-request/form-data": ["form-data@3.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35" } }, "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ=="], "graphql-tools/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], - "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "handlebars/minimist": ["minimist@https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", {}], + + "handlebars/neo-async": ["neo-async@https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", {}], + + "handlebars/source-map": ["source-map@https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", {}], "html-minifier-terser/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], @@ -3792,45 +4062,49 @@ "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "import-from/resolve-from": ["resolve-from@https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", {}], + "is-expression/acorn": ["acorn@7.4.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="], "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "istanbul-lib-report/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "jest-circus/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-circus/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "jest-circus/dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="], "jest-cli/yargs": ["yargs@16.2.0", "", { "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" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], - "jest-environment-jsdom/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-environment-jsdom/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "jest-environment-jsdom/jsdom": ["jsdom@16.7.0", "", { "dependencies": { "abab": "^2.0.5", "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", "cssstyle": "^2.3.0", "data-urls": "^2.0.0", "decimal.js": "^10.2.1", "domexception": "^2.0.1", "escodegen": "^2.0.0", "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", "parse5": "6.0.1", "saxes": "^5.0.1", "symbol-tree": "^3.2.4", "tough-cookie": "^4.0.0", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.5.0", "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "optionalPeers": ["canvas"] }, "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw=="], - "jest-environment-node/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-environment-node/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "jest-haste-map/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-haste-map/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "jest-haste-map/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], - "jest-jasmine2/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-jasmine2/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "jest-mock/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-mock/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "jest-runner/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-runner/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "jest-runner/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], "jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], - "jest-serializer/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-serializer/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "jest-util/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-snapshot/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - "jest-watcher/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-util/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "jest-worker/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "jest-watcher/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "jest-worker/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "jest-worker/jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="], @@ -3840,15 +4114,19 @@ "jsdom/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + "jsonc-eslint-parser/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "juice/commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "mailparser/html-to-text": ["html-to-text@9.0.5", "", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="], - "mailparser/nodemailer": ["nodemailer@6.9.16", "", {}, "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ=="], + "mailparser/nodemailer": ["nodemailer@7.0.4", "", {}, "sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw=="], - "mailparser/tlds": ["tlds@1.255.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw=="], + "mailparser/tlds": ["tlds@1.259.0", "", { "bin": { "tlds": "bin.js" } }, "sha512-AldGGlDP0PNgwppe2quAvuBl18UcjuNtOnDuUkqhd6ipPqrYYBt3aTxK1QTsBVknk97lS2JcafWMghjGWFtunw=="], + + "make-dir/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], "mlly/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], @@ -3862,7 +4140,7 @@ "nearley/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "node-fetch/whatwg-url": ["whatwg-url@https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }], "nodemon/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -3872,15 +4150,21 @@ "noise-curve-ed/sodium-universal": ["sodium-universal@5.0.1", "", { "dependencies": { "sodium-native": "^5.0.1" }, "peerDependencies": { "sodium-javascript": "~0.8.0" }, "optionalPeers": ["sodium-javascript"] }, "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q=="], + "npm-run-path/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + "nypm/consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], "nypm/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "nypm/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "nypm/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "openai/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "nypm/tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "openai/@types/node": ["@types/node@18.19.121", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ=="], + + "openai/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "path-scurry/lru-cache": ["lru-cache@https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", {}], "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -3890,6 +4174,8 @@ "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "preview-email/nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], + "preview-email/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -3908,12 +4194,22 @@ "seek-bzip/commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], + "semver-truncate/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "send/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="], + "sha.js/inherits": ["inherits@https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", {}], + + "sha.js/safe-buffer": ["safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", {}], + "shared/@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], + "shared/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], + + "shared/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "simple-update-notifier/semver": ["semver@7.0.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="], "sodium-secretstream/sodium-universal": ["sodium-universal@5.0.1", "", { "dependencies": { "sodium-native": "^5.0.1" }, "peerDependencies": { "sodium-javascript": "~0.8.0" }, "optionalPeers": ["sodium-javascript"] }, "sha512-rv+aH+tnKB5H0MAc2UadHShLMslpJsc4wjdnHRtiSIEYpOetCgu8MS4ExQRia+GL/MK3uuCyZPeEsi+J3h+Q+Q=="], @@ -3926,11 +4222,19 @@ "streamroller/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + "string-width-cjs/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", {}], + + "string-width-cjs/is-fullwidth-code-point": ["is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}], + + "string-width-cjs/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }], + "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "stylelint/file-entry-cache": ["file-entry-cache@10.0.8", "", { "dependencies": { "flat-cache": "^6.1.8" } }, "sha512-FGXHpfmI4XyzbLd3HQ8cbUcsFGohJpZtmQRHr8z8FxxtCe2PcpgIlVLwIgunqjvRmXypBETvwhV4ptJizA+Y1Q=="], + "strip-ansi-cjs/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}], - "stylelint/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], + "stylelint/file-entry-cache": ["file-entry-cache@10.1.4", "", { "dependencies": { "flat-cache": "^6.1.13" } }, "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA=="], + + "stylelint/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "stylelint/postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], @@ -3938,9 +4242,13 @@ "stylelint-config-recommended-scss/stylelint-config-recommended": ["stylelint-config-recommended@14.0.1", "", { "peerDependencies": { "stylelint": "^16.1.0" } }, "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg=="], + "stylelint-config-recommended-vue/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "stylelint-config-standard/stylelint-config-recommended": ["stylelint-config-recommended@14.0.1", "", { "peerDependencies": { "stylelint": "^16.1.0" } }, "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg=="], - "stylelint-scss/mdn-data": ["mdn-data@2.21.0", "", {}, "sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ=="], + "stylelint-scss/known-css-properties": ["known-css-properties@0.36.0", "", {}, "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA=="], + + "stylelint-scss/mdn-data": ["mdn-data@2.24.0", "", {}, "sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA=="], "stylelint-scss/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], @@ -3966,55 +4274,63 @@ "test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "ts-jest/jest": ["jest@27.5.1", "", { "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", "jest-cli": "^27.5.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ=="], + "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "token-types/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ts-jest/jest": ["jest@30.2.0", "", { "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", "import-local": "^3.2.0", "jest-cli": "30.2.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": "./bin/jest.js" }, "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A=="], "ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], "ts-jest/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "typed-rest-client/qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "type-graphql/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], - "typeorm/debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + "type-graphql/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], - "typeorm/dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + "typeorm/debug": ["debug@https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", { "dependencies": { "ms": "^2.1.3" } }], - "typeorm/glob": ["glob@10.4.5", "", { "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" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + "typeorm/dotenv": ["dotenv@https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", {}], - "typeorm/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + "typeorm/glob": ["glob@https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", { "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" } }], + + "typeorm/tslib": ["tslib@https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", {}], + + "typeorm/uuid": ["uuid@https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", {}], "unbzip2-stream/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], "unctx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "unctx/unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], + "unctx/unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], "unimport/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "unimport/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "unimport/local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="], + "unimport/local-pkg": ["local-pkg@1.1.2", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], "unimport/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "unimport/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "unimport/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "unimport/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "unimport/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "unimport/unplugin": ["unplugin@2.3.2", "", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w=="], + "unimport/unplugin": ["unplugin@2.3.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw=="], "unplugin-utils/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "unplugin-utils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "unplugin-utils/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "unplugin-vue-components/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "unplugin-vue-components/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "update-browserslist-db/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "vee-validate/@vue/devtools-api": ["@vue/devtools-api@7.7.6", "", { "dependencies": { "@vue/devtools-kit": "^7.7.6" } }, "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw=="], + "vee-validate/@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], "vee-validate/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], @@ -4024,67 +4340,187 @@ "vite-plugin-html/@rollup/pluginutils": ["@rollup/pluginutils@4.2.1", "", { "dependencies": { "estree-walker": "^2.0.1", "picomatch": "^2.2.2" } }, "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ=="], - "vite-plugin-html/dotenv": ["dotenv@16.5.0", "", {}, "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg=="], + "vite-plugin-html/colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + + "vite-plugin-html/dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], "vite-plugin-html/pathe": ["pathe@0.2.0", "", {}, "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw=="], + "vue/@vue/compiler-dom": ["@vue/compiler-dom@3.5.13", "", { "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA=="], + + "vue/@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", "@vue/compiler-dom": "3.5.13", "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ=="], + + "vue/@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="], + "vue-apollo/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], "vue-apollo/throttle-debounce": ["throttle-debounce@2.3.0", "", {}, "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="], + "vue-eslint-parser/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "vue-i18n/@intlify/core-base": ["@intlify/core-base@9.13.1", "", { "dependencies": { "@intlify/message-compiler": "9.13.1", "@intlify/shared": "9.13.1" } }, "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w=="], + "web-resource-inliner/htmlparser2": ["htmlparser2@5.0.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^3.3.0", "domutils": "^2.4.2", "entities": "^2.0.0" } }, "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ=="], "web-resource-inliner/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], + "web-resource-inliner/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - "wkx/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "wkx/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }], + + "wrap-ansi/string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }], + + "wrap-ansi/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }], + + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }], + + "wrap-ansi-cjs/string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }], "xss/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "yargs/string-width": ["string-width@https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }], + + "yargs/yargs-parser": ["yargs-parser@https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", {}], + + "@anatine/esbuild-decorators/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.14.54", "", { "os": "linux", "cpu": "none" }, "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw=="], + "@apollographql/graphql-upload-8-fork/http-errors/depd": ["depd@1.1.2", "", {}, "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ=="], "@apollographql/graphql-upload-8-fork/http-errors/statuses": ["statuses@1.5.0", "", {}, "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA=="], "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@hyperswarm/secret-stream/sodium-universal/sodium-native": ["sodium-native@5.0.1", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-Q305aUXc0OzK7VVRvWkeEQJQIHs6slhFwWpyqLB5iJqhpyt2lYIVu96Y6PQ7TABIlWXVF3YiWDU3xS2Snkus+g=="], + "@hyperswarm/secret-stream/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], - "@iconify/utils/@antfu/install-pkg/package-manager-detector": ["package-manager-detector@1.3.0", "", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="], + "@iconify/utils/@antfu/install-pkg/package-manager-detector": ["package-manager-detector@1.4.0", "", {}, "sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw=="], "@iconify/utils/@antfu/install-pkg/tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], - "@iconify/utils/local-pkg/pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="], + "@iconify/utils/local-pkg/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], - "@intlify/bundle-utils/yaml-eslint-parser/yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], + "@intlify/bundle-utils/yaml-eslint-parser/yaml": ["yaml@2.8.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], - "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base": ["@intlify/core-base@10.0.7", "", { "dependencies": { "@intlify/message-compiler": "10.0.7", "@intlify/shared": "10.0.7" } }, "sha512-mE71aUH5baH0me8duB4FY5qevUJizypHsYw3eCvmOx07QvmKppgOONx3dYINxuA89Z2qkAGb/K6Nrpi7aAMwew=="], + "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base": ["@intlify/core-base@10.0.8", "", { "dependencies": { "@intlify/message-compiler": "10.0.8", "@intlify/shared": "10.0.8" } }, "sha512-FoHslNWSoHjdUBLy35bpm9PV/0LVI/DSv9L6Km6J2ad8r/mm0VaGg06C40FqlE8u2ADcGUM60lyoU7Myo4WNZQ=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", {}], - "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", {}], - "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", {}], "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "@jest/create-cache-key-function/@jest/types/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@jest/console/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], - "@jest/create-cache-key-function/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + "@jest/core/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/create-cache-key-function/@jest/types/@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", {}], + + "@jest/create-cache-key-function/@jest/types/@types/istanbul-reports": ["@types/istanbul-reports@https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", { "dependencies": { "@types/istanbul-lib-report": "*" } }], + + "@jest/create-cache-key-function/@jest/types/@types/node": ["@types/node@https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }], + + "@jest/create-cache-key-function/@jest/types/@types/yargs": ["@types/yargs@https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", { "dependencies": { "@types/yargs-parser": "*" } }], + + "@jest/create-cache-key-function/@jest/types/chalk": ["chalk@https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }], + + "@jest/environment/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/expect/expect/jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + + "@jest/expect/expect/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "@jest/expect/expect/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "@jest/expect/expect/jest-util": ["jest-util@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.2" } }, "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA=="], + + "@jest/expect/jest-snapshot/@jest/transform": ["@jest/transform@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA=="], + + "@jest/expect/jest-snapshot/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + + "@jest/expect/jest-snapshot/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "@jest/expect/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + + "@jest/expect/jest-snapshot/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "@jest/expect/jest-snapshot/jest-util": ["jest-util@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.2" } }, "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA=="], + + "@jest/expect/jest-snapshot/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "@jest/expect/jest-snapshot/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@jest/fake-timers/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/pattern/@types/node/undici-types": ["undici-types@https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", {}], + + "@jest/reporters/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], "@jest/reporters/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "@jest/snapshot-utils/@jest/types/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/snapshot-utils/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + "@jest/transform/write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "@jest/types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "@nuxt/kit/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], - "@swc/cli/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@swc-node/register/debug/ms": ["ms@https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", {}], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@swc-node/sourcemap-support/source-map-support/buffer-from": ["buffer-from@https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", {}], + + "@swc-node/sourcemap-support/source-map-support/source-map": ["source-map@https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", {}], + + "@swc/cli/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@types/accepts/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/body-parser/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/connect/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/cookies/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/express-serve-static-core/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/fs-capacitor/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/glob/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/graceful-fs/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/koa/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/minimatch/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@types/mysql/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/node-fetch/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/nodemailer/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/send/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/serve-static/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/sodium-native/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@types/ws/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg=="], @@ -4092,15 +4528,25 @@ "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], + "@vue/server-renderer/@vue/compiler-ssr/@vue/compiler-dom": ["@vue/compiler-dom@3.5.13", "", { "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA=="], + + "admin/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "apollo-cache-inmemory/optimism/@wry/context": ["@wry/context@0.4.4", "", { "dependencies": { "@types/node": ">=6", "tslib": "^1.9.3" } }, "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag=="], - "apollo-server-express/@types/body-parser/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "apollo-server-env/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "apollo-server-express/@types/body-parser/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "backend/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -4120,55 +4566,115 @@ "chokidar-cli/yargs/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], + "chokidar-cli/yargs/get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "chokidar-cli/yargs/require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "chokidar-cli/yargs/string-width": ["string-width@3.1.0", "", { "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w=="], "chokidar-cli/yargs/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], "chokidar-cli/yargs/yargs-parser": ["yargs-parser@13.1.2", "", { "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg=="], + "cliui/string-width/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", {}], + + "cliui/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}], + + "concurrently/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "concurrently/yargs/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "concurrently/yargs/get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "concurrently/yargs/require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "concurrently/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "cross-fetch/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "css-select/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + "database/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "database/ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "database/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + "dht-node/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "dht-node/ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "dht-node/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], - "dht-rpc/sodium-universal/sodium-native": ["sodium-native@5.0.1", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-Q305aUXc0OzK7VVRvWkeEQJQIHs6slhFwWpyqLB5iJqhpyt2lYIVu96Y6PQ7TABIlWXVF3YiWDU3xS2Snkus+g=="], + "dht-rpc/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], - "editorconfig/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "editorconfig/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "eslint-plugin-vue/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="], + "eslint/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "eslint/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "eslint/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "execa/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "execa/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "execa/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "federation/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "federation/ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "federation/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], - "file-type/get-stream/is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], - - "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "fixpack/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "frontend/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "global-prefix/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "html-to-text/htmlparser2/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], "html-to-text/htmlparser2/domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], "html-to-text/htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], - "hypercore-crypto/sodium-universal/sodium-native": ["sodium-native@5.0.1", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-Q305aUXc0OzK7VVRvWkeEQJQIHs6slhFwWpyqLB5iJqhpyt2lYIVu96Y6PQ7TABIlWXVF3YiWDU3xS2Snkus+g=="], + "hypercore-crypto/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], + + "jest-circus/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], "jest-cli/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + "jest-cli/yargs/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "jest-cli/yargs/get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "jest-cli/yargs/require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "jest-cli/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "jest-cli/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + "jest-environment-jsdom/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "jest-environment-jsdom/jsdom/cssstyle": ["cssstyle@2.3.0", "", { "dependencies": { "cssom": "~0.3.6" } }, "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A=="], "jest-environment-jsdom/jsdom/data-urls": ["data-urls@2.0.0", "", { "dependencies": { "abab": "^2.0.3", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0" } }, "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ=="], - "jest-environment-jsdom/jsdom/form-data": ["form-data@3.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35" } }, "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w=="], + "jest-environment-jsdom/jsdom/form-data": ["form-data@3.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35" } }, "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ=="], "jest-environment-jsdom/jsdom/html-encoding-sniffer": ["html-encoding-sniffer@2.0.1", "", { "dependencies": { "whatwg-encoding": "^1.0.5" } }, "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ=="], @@ -4194,32 +4700,62 @@ "jest-environment-jsdom/jsdom/xml-name-validator": ["xml-name-validator@3.0.0", "", {}, "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="], + "jest-environment-node/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "jest-haste-map/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "jest-jasmine2/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "jest-mock/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "jest-runner/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "jest-serializer/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "jest-util/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "jest-watcher/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "jest-worker/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "jest-worker/jest-util/@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="], + "js-beautify/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "js-beautify/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + "js-beautify/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "jsdom/parse5/entities": ["entities@6.0.0", "", {}, "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw=="], + "js-beautify/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "js-beautify/glob/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "js-beautify/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "jsdom/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "mailparser/html-to-text/@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="], "mailparser/html-to-text/selderee": ["selderee@0.11.0", "", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="], - "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "node-fetch/whatwg-url/tr46": ["tr46@https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", {}], - "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", {}], "nodemon/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "nodemon/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "noise-curve-ed/sodium-universal/sodium-native": ["sodium-native@5.0.1", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-Q305aUXc0OzK7VVRvWkeEQJQIHs6slhFwWpyqLB5iJqhpyt2lYIVu96Y6PQ7TABIlWXVF3YiWDU3xS2Snkus+g=="], + "noise-curve-ed/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], "nypm/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + "openai/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "run-applescript/execa/cross-spawn": ["cross-spawn@6.0.6", "", { "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw=="], @@ -4236,27 +4772,53 @@ "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "sodium-secretstream/sodium-universal/sodium-native": ["sodium-native@5.0.1", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-Q305aUXc0OzK7VVRvWkeEQJQIHs6slhFwWpyqLB5iJqhpyt2lYIVu96Y6PQ7TABIlWXVF3YiWDU3xS2Snkus+g=="], + "sodium-secretstream/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], "streamroller/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], "streamroller/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - "stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.8", "", { "dependencies": { "cacheable": "^1.8.9", "flatted": "^3.3.3", "hookified": "^1.8.1" } }, "sha512-R6MaD3nrJAtO7C3QOuS79ficm2pEAy++TgEUD8ii1LVlbcgZ9DtASLkt9B+RZSFCzm7QHDMlXPsqqB6W2Pfr1Q=="], + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}], + + "stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.17", "", { "dependencies": { "cacheable": "^2.0.3", "flatted": "^3.3.3", "hookified": "^1.12.0" } }, "sha512-Jzse4YoiUJBVYTwz5Bwl4h/2VQM7e2KK3MVAMlXzX9uamIHAH/TXUlRKU1AQGQOryQhN0EsmufiiF40G057YXA=="], "table/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "terminal-link/supports-hyperlinks/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "terser-webpack-plugin/jest-worker/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "terser-webpack-plugin/jest-worker/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "terser-webpack-plugin/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "test-exclude/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - "typeorm/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "test-exclude/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], - "unctx/unplugin/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "test-exclude/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "test-exclude/glob/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "test-exclude/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ts-jest/jest/@jest/core": ["@jest/core@30.2.0", "", { "dependencies": { "@jest/console": "30.2.0", "@jest/pattern": "30.0.1", "@jest/reporters": "30.2.0", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-changed-files": "30.2.0", "jest-config": "30.2.0", "jest-haste-map": "30.2.0", "jest-message-util": "30.2.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.2.0", "jest-resolve-dependencies": "30.2.0", "jest-runner": "30.2.0", "jest-runtime": "30.2.0", "jest-snapshot": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0", "jest-watcher": "30.2.0", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ=="], + + "ts-jest/jest/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + + "ts-jest/jest/jest-cli": ["jest-cli@30.2.0", "", { "dependencies": { "@jest/core": "30.2.0", "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", "jest-config": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0", "yargs": "^17.7.2" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "./bin/jest.js" } }, "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA=="], + + "type-graphql/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "typeorm/debug/ms": ["ms@https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", {}], + + "typeorm/glob/minimatch": ["minimatch@https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }], + + "unbzip2-stream/buffer/base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "unbzip2-stream/buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "unctx/unplugin/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "unimport/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], @@ -4264,51 +4826,51 @@ "unplugin-vue-components/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "unplugin-vue-components/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "unplugin-vue-components/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", {}, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", {}, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", {}, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", {}, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", {}, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", {}, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", {}, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", {}, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", {}, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", {}, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", {}, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", {}, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", {}, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", {}, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", {}, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", {}, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", {}, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", {}, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", {}, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", {}, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", {}, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", {}, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], @@ -4316,29 +4878,141 @@ "vue-apollo/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + "vue-i18n/@intlify/core-base/@intlify/message-compiler": ["@intlify/message-compiler@9.13.1", "", { "dependencies": { "@intlify/shared": "9.13.1", "source-map-js": "^1.0.2" } }, "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w=="], + + "vue/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q=="], + + "vue/@vue/compiler-sfc/@vue/compiler-core": ["@vue/compiler-core@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q=="], + + "vue/@vue/compiler-sfc/@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA=="], + "web-resource-inliner/htmlparser2/domhandler": ["domhandler@3.3.0", "", { "dependencies": { "domelementtype": "^2.0.1" } }, "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA=="], "web-resource-inliner/htmlparser2/domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], "web-resource-inliner/htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + "web-resource-inliner/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + "wkx/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "wrap-ansi-cjs/ansi-styles/color-convert": ["color-convert@https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }], + + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", {}], + + "wrap-ansi-cjs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}], + + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}], + + "wrap-ansi/ansi-styles/color-convert": ["color-convert@https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", {}], + + "wrap-ansi/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}], + + "yargs/string-width/emoji-regex": ["emoji-regex@https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", {}], + + "yargs/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}], + + "yargs/string-width/strip-ansi": ["strip-ansi@https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }], + "@iconify/utils/local-pkg/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], "@iconify/utils/local-pkg/pkg-types/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base/@intlify/message-compiler": ["@intlify/message-compiler@10.0.7", "", { "dependencies": { "@intlify/shared": "10.0.7", "source-map-js": "^1.0.2" } }, "sha512-nrC4cDL/UHZSUqd8sRbVz+DPukzZ8NnG5OK+EB/nlxsH35deyzyVkXP/QuR8mFZrISJ+4hCd6VtCQCcT+RO+5g=="], + "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base/@intlify/message-compiler": ["@intlify/message-compiler@10.0.8", "", { "dependencies": { "@intlify/shared": "10.0.8", "source-map-js": "^1.0.2" } }, "sha512-DV+sYXIkHVd5yVb2mL7br/NEUwzUoLBsMkV3H0InefWgmYa34NLZUvMCGi5oWX+Hqr2Y2qUxnVrnOWF4aBlgWg=="], "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "@jest/create-cache-key-function/@jest/types/@types/istanbul-reports/@types/istanbul-lib-report": ["@types/istanbul-lib-report@https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }], + + "@jest/create-cache-key-function/@jest/types/@types/node/undici-types": ["undici-types@https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", {}], + + "@jest/create-cache-key-function/@jest/types/@types/yargs/@types/yargs-parser": ["@types/yargs-parser@https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", {}], + + "@jest/create-cache-key-function/@jest/types/chalk/ansi-styles": ["ansi-styles@https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }], + + "@jest/create-cache-key-function/@jest/types/chalk/supports-color": ["supports-color@https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }], + + "@jest/expect/expect/jest-matcher-utils/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "@jest/expect/expect/jest-matcher-utils/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "@jest/expect/expect/jest-message-util/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + + "@jest/expect/expect/jest-message-util/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "@jest/expect/expect/jest-mock/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + + "@jest/expect/expect/jest-mock/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/expect/expect/jest-util/@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + + "@jest/expect/expect/jest-util/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/expect/expect/jest-util/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "@jest/expect/expect/jest-util/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "@jest/expect/jest-snapshot/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "@jest/expect/jest-snapshot/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "@jest/expect/jest-snapshot/@jest/transform/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "@jest/expect/jest-snapshot/@jest/transform/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], + + "@jest/expect/jest-snapshot/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "@jest/expect/jest-snapshot/@jest/types/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/expect/jest-snapshot/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@jest/expect/jest-snapshot/jest-util/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/expect/jest-snapshot/jest-util/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "@jest/expect/jest-snapshot/jest-util/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "@jest/expect/jest-snapshot/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@jest/expect/jest-snapshot/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "@jest/snapshot-utils/@jest/types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "@swc/cli/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@types/minimatch/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "apollo-cache-inmemory/optimism/@wry/context/@types/node": ["@types/node@18.19.96", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-PzBvgsZ7YdFs/Kng1BSW8IGv68/SPcOxYYhT7luxD7QyzIhFS1xPTpfK3K9eHBa7hVwlW+z8nN0mOd515yaduQ=="], + "@vue/server-renderer/@vue/compiler-ssr/@vue/compiler-dom/@vue/compiler-core": ["@vue/compiler-core@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q=="], + + "admin/cross-env/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "admin/cross-env/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "admin/cross-env/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "apollo-cache-inmemory/optimism/@wry/context/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "apollo-server-env/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "apollo-server-env/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "apollo-server-express/@types/body-parser/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "backend/cross-env/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "backend/cross-env/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "backend/cross-env/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "cheerio-select/domutils/dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], @@ -4356,14 +5030,54 @@ "chokidar-cli/yargs/yargs-parser/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + "concurrently/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "cross-fetch/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "cross-fetch/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "css-select/domutils/dom-serializer/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + "database/cross-env/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "database/cross-env/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "database/cross-env/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "dht-node/cross-env/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "dht-node/cross-env/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "dht-node/cross-env/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "editorconfig/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "eslint/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "eslint/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "execa/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "execa/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "federation/cross-env/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "federation/cross-env/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "federation/cross-env/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "filelist/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "frontend/cross-env/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "frontend/cross-env/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "frontend/cross-env/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "html-to-text/htmlparser2/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + "jest-cli/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "jest-environment-jsdom/jsdom/cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], "jest-environment-jsdom/jsdom/http-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], @@ -4376,12 +5090,26 @@ "jest-environment-jsdom/jsdom/whatwg-url/tr46": ["tr46@2.1.0", "", { "dependencies": { "punycode": "^2.1.1" } }, "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw=="], + "jest-worker/jest-util/@jest/types/@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="], + "jest-worker/jest-util/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], - "js-beautify/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "js-beautify/glob/foreground-child/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "js-beautify/glob/jackspeak/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "js-beautify/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "js-beautify/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], "mailparser/html-to-text/selderee/parseley": ["parseley@0.12.1", "", { "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" } }, "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw=="], + "openai/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "openai/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], "run-applescript/execa/cross-spawn/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], @@ -4394,9 +5122,73 @@ "run-applescript/execa/npm-run-path/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="], + "terser-webpack-plugin/jest-worker/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "test-exclude/glob/foreground-child/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "test-exclude/glob/jackspeak/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "test-exclude/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "test-exclude/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "typeorm/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "ts-jest/jest/@jest/core/@jest/console": ["@jest/console@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0" } }, "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ=="], + + "ts-jest/jest/@jest/core/@jest/reporters": ["@jest/reporters@30.2.0", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "30.2.0", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "jest-worker": "30.2.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ=="], + + "ts-jest/jest/@jest/core/@jest/test-result": ["@jest/test-result@30.2.0", "", { "dependencies": { "@jest/console": "30.2.0", "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" } }, "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg=="], + + "ts-jest/jest/@jest/core/@jest/transform": ["@jest/transform@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA=="], + + "ts-jest/jest/@jest/core/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/@jest/core/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "ts-jest/jest/@jest/core/jest-changed-files": ["jest-changed-files@30.2.0", "", { "dependencies": { "execa": "^5.1.1", "jest-util": "30.2.0", "p-limit": "^3.1.0" } }, "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ=="], + + "ts-jest/jest/@jest/core/jest-config": ["jest-config@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", "@jest/test-sequencer": "30.2.0", "@jest/types": "30.2.0", "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "jest-circus": "30.2.0", "jest-docblock": "30.2.0", "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.2.0", "jest-runner": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "esbuild-register", "ts-node"] }, "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA=="], + + "ts-jest/jest/@jest/core/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/@jest/core/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "ts-jest/jest/@jest/core/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], + + "ts-jest/jest/@jest/core/jest-resolve": ["jest-resolve@30.2.0", "", { "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", "jest-util": "30.2.0", "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" } }, "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A=="], + + "ts-jest/jest/@jest/core/jest-resolve-dependencies": ["jest-resolve-dependencies@30.2.0", "", { "dependencies": { "jest-regex-util": "30.0.1", "jest-snapshot": "30.2.0" } }, "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w=="], + + "ts-jest/jest/@jest/core/jest-runner": ["jest-runner@30.2.0", "", { "dependencies": { "@jest/console": "30.2.0", "@jest/environment": "30.2.0", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.2.0", "jest-environment-node": "30.2.0", "jest-haste-map": "30.2.0", "jest-leak-detector": "30.2.0", "jest-message-util": "30.2.0", "jest-resolve": "30.2.0", "jest-runtime": "30.2.0", "jest-util": "30.2.0", "jest-watcher": "30.2.0", "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ=="], + + "ts-jest/jest/@jest/core/jest-runtime": ["jest-runtime@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.2.0", "jest-snapshot": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg=="], + + "ts-jest/jest/@jest/core/jest-snapshot": ["jest-snapshot@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "@jest/snapshot-utils": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "30.2.0", "graceful-fs": "^4.2.11", "jest-diff": "30.2.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" } }, "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA=="], + + "ts-jest/jest/@jest/core/jest-util": ["jest-util@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.2" } }, "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA=="], + + "ts-jest/jest/@jest/core/jest-validate": ["jest-validate@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", "pretty-format": "30.2.0" } }, "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw=="], + + "ts-jest/jest/@jest/core/jest-watcher": ["jest-watcher@30.2.0", "", { "dependencies": { "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", "jest-util": "30.2.0", "string-length": "^4.0.2" } }, "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg=="], + + "ts-jest/jest/@jest/core/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "ts-jest/jest/@jest/types/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "ts-jest/jest/jest-cli/@jest/test-result": ["@jest/test-result@30.2.0", "", { "dependencies": { "@jest/console": "30.2.0", "@jest/types": "30.2.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" } }, "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg=="], + + "ts-jest/jest/jest-cli/jest-config": ["jest-config@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", "@jest/test-sequencer": "30.2.0", "@jest/types": "30.2.0", "babel-jest": "30.2.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "jest-circus": "30.2.0", "jest-docblock": "30.2.0", "jest-environment-node": "30.2.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.2.0", "jest-runner": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0", "micromatch": "^4.0.8", "parse-json": "^5.2.0", "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "esbuild-register", "ts-node"] }, "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA=="], + + "ts-jest/jest/jest-cli/jest-util": ["jest-util@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.2" } }, "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA=="], + + "ts-jest/jest/jest-cli/jest-validate": ["jest-validate@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", "pretty-format": "30.2.0" } }, "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw=="], + + "ts-jest/jest/jest-cli/yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "typeorm/glob/minimatch/brace-expansion": ["brace-expansion@https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }], "unplugin-vue-components/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -4406,10 +5198,68 @@ "web-resource-inliner/htmlparser2/domutils/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + "web-resource-inliner/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "web-resource-inliner/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "wrap-ansi-cjs/ansi-styles/color-convert/color-name": ["color-name@https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", {}], + + "wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", {}], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", {}], + + "@intlify/vue-i18n-extensions/vue-i18n/@intlify/core-base/@intlify/message-compiler/source-map-js": ["source-map-js@https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", {}], + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "@jest/create-cache-key-function/@jest/types/chalk/ansi-styles/color-convert": ["color-convert@https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }], + + "@jest/create-cache-key-function/@jest/types/chalk/supports-color/has-flag": ["has-flag@https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", {}], + + "@jest/expect/expect/jest-matcher-utils/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@jest/expect/expect/jest-matcher-utils/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "@jest/expect/expect/jest-message-util/@jest/types/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/expect/expect/jest-message-util/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@jest/expect/expect/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "@jest/expect/expect/jest-message-util/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "@jest/expect/expect/jest-mock/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@jest/expect/expect/jest-mock/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/expect/expect/jest-util/@jest/types/@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], + + "@jest/expect/expect/jest-util/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/expect/jest-snapshot/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "@jest/expect/jest-snapshot/@jest/transform/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "@jest/expect/jest-snapshot/@jest/transform/jest-haste-map/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@jest/expect/jest-snapshot/@jest/transform/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "@jest/expect/jest-snapshot/@jest/types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/expect/jest-snapshot/jest-util/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "admin/cross-env/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "admin/cross-env/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "apollo-cache-inmemory/optimism/@wry/context/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "backend/cross-env/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "backend/cross-env/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "chokidar-cli/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], "chokidar-cli/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], @@ -4420,20 +5270,806 @@ "chokidar-cli/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + "database/cross-env/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "database/cross-env/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "dht-node/cross-env/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "dht-node/cross-env/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "federation/cross-env/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "federation/cross-env/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "frontend/cross-env/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "frontend/cross-env/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jest-worker/jest-util/@jest/types/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], + + "js-beautify/glob/foreground-child/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "js-beautify/glob/foreground-child/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "js-beautify/glob/foreground-child/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "js-beautify/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "run-applescript/execa/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], - "typeorm/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "run-applescript/execa/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "test-exclude/glob/foreground-child/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "test-exclude/glob/foreground-child/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "test-exclude/glob/foreground-child/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob": ["glob@10.4.5", "", { "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" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "ts-jest/jest/@jest/core/@jest/reporters/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/@jest/core/@jest/reporters/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/@jest/core/@jest/reporters/v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], + + "ts-jest/jest/@jest/core/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "ts-jest/jest/@jest/core/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "ts-jest/jest/@jest/core/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "ts-jest/jest/@jest/core/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/@jest/core/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@30.2.0", "", { "dependencies": { "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "slash": "^3.0.0" } }, "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest": ["babel-jest@30.2.0", "", { "dependencies": { "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^7.0.1", "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw=="], + + "ts-jest/jest/@jest/core/jest-config/glob": ["glob@10.4.5", "", { "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" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus": ["jest-circus@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", "jest-each": "30.2.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-runtime": "30.2.0", "jest-snapshot": "30.2.0", "jest-util": "30.2.0", "p-limit": "^3.1.0", "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg=="], + + "ts-jest/jest/@jest/core/jest-config/jest-docblock": ["jest-docblock@30.2.0", "", { "dependencies": { "detect-newline": "^3.1.0" } }, "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA=="], + + "ts-jest/jest/@jest/core/jest-config/jest-environment-node": ["jest-environment-node@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0" } }, "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA=="], + + "ts-jest/jest/@jest/core/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/@jest/core/jest-runner/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/@jest/core/jest-runner/emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-docblock": ["jest-docblock@30.2.0", "", { "dependencies": { "detect-newline": "^3.1.0" } }, "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-environment-node": ["jest-environment-node@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0" } }, "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-leak-detector": ["jest-leak-detector@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "pretty-format": "30.2.0" } }, "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/@jest/core/jest-runner/source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], + + "ts-jest/jest/@jest/core/jest-runtime/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/@jest/core/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/@jest/core/jest-runtime/@jest/globals": ["@jest/globals@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", "@jest/types": "30.2.0", "jest-mock": "30.2.0" } }, "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw=="], + + "ts-jest/jest/@jest/core/jest-runtime/@jest/source-map": ["@jest/source-map@30.0.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", "graceful-fs": "^4.2.11" } }, "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg=="], + + "ts-jest/jest/@jest/core/jest-runtime/cjs-module-lexer": ["cjs-module-lexer@2.1.0", "", {}, "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob": ["glob@10.4.5", "", { "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" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "ts-jest/jest/@jest/core/jest-runtime/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/@jest/core/jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "ts-jest/jest/@jest/core/jest-snapshot/expect": ["expect@30.2.0", "", { "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw=="], + + "ts-jest/jest/@jest/core/jest-snapshot/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "ts-jest/jest/@jest/core/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + + "ts-jest/jest/@jest/core/jest-util/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "ts-jest/jest/@jest/core/jest-watcher/emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "ts-jest/jest/@jest/core/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "ts-jest/jest/@jest/core/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "ts-jest/jest/@jest/types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console": ["@jest/console@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0" } }, "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ=="], + + "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer": ["@jest/test-sequencer@30.2.0", "", { "dependencies": { "@jest/test-result": "30.2.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "slash": "^3.0.0" } }, "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest": ["babel-jest@30.2.0", "", { "dependencies": { "@jest/transform": "30.2.0", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^7.0.1", "babel-preset-jest": "30.2.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw=="], + + "ts-jest/jest/jest-cli/jest-config/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "ts-jest/jest/jest-cli/jest-config/glob": ["glob@10.4.5", "", { "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" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus": ["jest-circus@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", "jest-each": "30.2.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-runtime": "30.2.0", "jest-snapshot": "30.2.0", "jest-util": "30.2.0", "p-limit": "^3.1.0", "pretty-format": "30.2.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-docblock": ["jest-docblock@30.2.0", "", { "dependencies": { "detect-newline": "^3.1.0" } }, "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node": ["jest-environment-node@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0", "jest-util": "30.2.0", "jest-validate": "30.2.0" } }, "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-resolve": ["jest-resolve@30.2.0", "", { "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-pnp-resolver": "^1.2.3", "jest-util": "30.2.0", "jest-validate": "30.2.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" } }, "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner": ["jest-runner@30.2.0", "", { "dependencies": { "@jest/console": "30.2.0", "@jest/environment": "30.2.0", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.2.0", "jest-environment-node": "30.2.0", "jest-haste-map": "30.2.0", "jest-leak-detector": "30.2.0", "jest-message-util": "30.2.0", "jest-resolve": "30.2.0", "jest-runtime": "30.2.0", "jest-util": "30.2.0", "jest-watcher": "30.2.0", "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ=="], + + "ts-jest/jest/jest-cli/jest-config/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "ts-jest/jest/jest-cli/jest-util/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-util/ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "ts-jest/jest/jest-cli/jest-util/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "ts-jest/jest/jest-cli/jest-validate/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "ts-jest/jest/jest-cli/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "ts-jest/jest/jest-cli/yargs/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "ts-jest/jest/jest-cli/yargs/get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "ts-jest/jest/jest-cli/yargs/require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "ts-jest/jest/jest-cli/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "typeorm/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", {}], "vue-apollo/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + "@jest/create-cache-key-function/@jest/types/chalk/ansi-styles/color-convert/color-name": ["color-name@https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", {}], + + "@jest/expect/expect/jest-message-util/@jest/types/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/expect/jest-snapshot/@jest/transform/jest-haste-map/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "@jest/expect/jest-snapshot/@jest/transform/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "chokidar-cli/yargs/cliui/wrap-ansi/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], "chokidar-cli/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "js-beautify/glob/foreground-child/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "js-beautify/glob/foreground-child/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/string-width/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "js-beautify/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "test-exclude/glob/foreground-child/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "test-exclude/glob/foreground-child/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/string-width/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "test-exclude/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/@jest/core/@jest/reporters/v8-to-istanbul/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "ts-jest/jest/@jest/core/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/@jest/core/@jest/transform/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest/babel-preset-jest": ["babel-preset-jest@30.2.0", "", { "dependencies": { "babel-plugin-jest-hoist": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "ts-jest/jest/@jest/core/jest-config/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "ts-jest/jest/@jest/core/jest-config/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "ts-jest/jest/@jest/core/jest-config/glob/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "ts-jest/jest/@jest/core/jest-config/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/dedent": ["dedent@1.7.0", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/jest-each": ["jest-each@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", "chalk": "^4.1.2", "jest-util": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + + "ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/@jest/core/jest-config/jest-environment-node/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/@jest/core/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/@jest/core/jest-runner/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/@jest/core/jest-runner/@jest/environment/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-environment-node/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-environment-node/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/@jest/core/jest-runner/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "ts-jest/jest/@jest/core/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "ts-jest/jest/@jest/core/jest-snapshot/expect/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform": ["@jest/transform@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/babel-preset-jest": ["babel-preset-jest@30.2.0", "", { "dependencies": { "babel-plugin-jest-hoist": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "ts-jest/jest/jest-cli/jest-config/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "ts-jest/jest/jest-cli/jest-config/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "ts-jest/jest/jest-cli/jest-config/glob/package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "ts-jest/jest/jest-cli/jest-config/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/dedent": ["dedent@1.7.0", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-each": ["jest-each@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "@jest/types": "30.2.0", "chalk": "^4.1.2", "jest-util": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime": ["jest-runtime@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.2.0", "jest-snapshot": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot": ["jest-snapshot@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "@jest/snapshot-utils": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "30.2.0", "graceful-fs": "^4.2.11", "jest-diff": "30.2.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" } }, "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/console": ["@jest/console@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0" } }, "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment": ["@jest/environment@30.2.0", "", { "dependencies": { "@jest/fake-timers": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "jest-mock": "30.2.0" } }, "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform": ["@jest/transform@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-leak-detector": ["jest-leak-detector@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "pretty-format": "30.2.0" } }, "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime": ["jest-runtime@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/fake-timers": "30.2.0", "@jest/globals": "30.2.0", "@jest/source-map": "30.0.1", "@jest/test-result": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", "glob": "^10.3.10", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-regex-util": "30.0.1", "jest-resolve": "30.2.0", "jest-snapshot": "30.2.0", "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-watcher": ["jest-watcher@30.2.0", "", { "dependencies": { "@jest/test-result": "30.2.0", "@jest/types": "30.2.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", "jest-util": "30.2.0", "string-length": "^4.0.2" } }, "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="], + + "ts-jest/jest/jest-cli/jest-config/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "ts-jest/jest/jest-cli/jest-config/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "ts-jest/jest/jest-cli/jest-util/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-validate/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "ts-jest/jest/jest-cli/jest-validate/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "ts-jest/jest/jest-cli/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "chokidar-cli/yargs/cliui/wrap-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest/babel-preset-jest/babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@30.2.0", "", { "dependencies": { "@types/babel__core": "^7.20.5" } }, "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "ts-jest/jest/@jest/core/jest-config/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ts-jest/jest/@jest/core/jest-config/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/jest-matcher-utils/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/@jest/core/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/@jest/core/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + + "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/babel-preset-jest/babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@30.2.0", "", { "dependencies": { "@types/babel__core": "^7.20.5" } }, "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "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" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "ts-jest/jest/jest-cli/jest-config/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "ts-jest/jest/jest-cli/jest-config/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-matcher-utils/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/globals": ["@jest/globals@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", "@jest/types": "30.2.0", "jest-mock": "30.2.0" } }, "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/source-map": ["@jest/source-map@30.0.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", "graceful-fs": "^4.2.11" } }, "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform": ["@jest/transform@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/cjs-module-lexer": ["cjs-module-lexer@2.1.0", "", {}, "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform": ["@jest/transform@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.2.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.2.0", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "micromatch": "^4.0.8", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/expect": ["expect@30.2.0", "", { "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/fake-timers": ["@jest/fake-timers@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/globals": ["@jest/globals@30.2.0", "", { "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", "@jest/types": "30.2.0", "jest-mock": "30.2.0" } }, "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/source-map": ["@jest/source-map@30.0.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "callsites": "^3.1.0", "graceful-fs": "^4.2.11" } }, "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/cjs-module-lexer": ["cjs-module-lexer@2.1.0", "", {}, "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot": ["jest-snapshot@30.2.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "@jest/snapshot-utils": "30.2.0", "@jest/transform": "30.2.0", "@jest/types": "30.2.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "30.2.0", "graceful-fs": "^4.2.11", "jest-diff": "30.2.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-util": "30.2.0", "pretty-format": "30.2.0", "semver": "^7.7.2", "synckit": "^0.11.8" } }, "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "ts-jest/jest/@jest/core/jest-config/babel-jest/babel-plugin-istanbul/test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ts-jest/jest/@jest/core/jest-config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/@jest/core/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/@jest/core/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/@jest/core/jest-runner/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "ts-jest/jest/jest-cli/@jest/test-result/@jest/console/jest-message-util/pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/jest-haste-map/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/babel-plugin-istanbul/test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child/cross-spawn/path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ts-jest/jest/jest-cli/jest-config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/expect/jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-environment-node/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-resolve/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers": ["@sinonjs/fake-timers@13.0.5", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/expect": ["expect@30.2.0", "", { "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/jest-snapshot/jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/foreground-child/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/string-width/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/@jest/core/@jest/reporters/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "ts-jest/jest/@jest/core/jest-config/glob/foreground-child/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/string-width/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/@jest/core/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/foreground-child/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/string-width/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/@jest/core/jest-runtime/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/jest-haste-map/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "ts-jest/jest/jest-cli/jest-config/glob/foreground-child/cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/string-width/eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "ts-jest/jest/jest-cli/jest-config/glob/jackspeak/@isaacs/cliui/wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/environment/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/babel-plugin-istanbul/test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-runner/jest-runtime/@jest/fake-timers/@sinonjs/fake-timers/@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/babel-plugin-istanbul/test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/babel-plugin-istanbul/test-exclude/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], } } From 6b89e1d43c03b3976696b6cc6135a642f8737979 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Oct 2025 15:49:36 +0200 Subject: [PATCH 39/72] update npm packages and lint --- .../resolver/TransactionLinkResolver.test.ts | 3 + .../resolver/TransactionResolver.test.ts | 3 + bun.lock | 176 ++++++++++++++---- database/src/AppDatabase.ts | 7 +- database/src/entity/Community.ts | 2 +- database/src/entity/Contribution.ts | 2 +- database/src/entity/DltTransaction.ts | 17 +- database/src/entity/Event.ts | 2 +- database/src/entity/Transaction.ts | 22 ++- database/src/entity/TransactionLink.ts | 30 ++- database/src/entity/User.ts | 16 +- database/src/index.ts | 2 +- database/src/logging/AbstractLogging.view.ts | 3 +- .../logging/PendingTransactionLogging.view.ts | 2 +- .../src/logging/UserContactLogging.view.ts | 12 +- database/src/logging/UserLogging.view.ts | 2 +- database/src/logging/UserRoleLogging.view.ts | 12 +- database/src/queries/communities.test.ts | 8 +- database/src/queries/communities.ts | 24 +-- database/src/queries/events.ts | 30 ++- database/src/queries/index.ts | 8 +- .../src/queries/pendingTransactions.test.ts | 81 ++++---- database/src/queries/pendingTransactions.ts | 6 +- database/src/queries/transactionLinks.ts | 2 +- database/src/queries/user.test.ts | 41 ++-- database/src/queries/user.ts | 23 ++- database/src/seeds/community.ts | 64 +++---- .../src/seeds/factory/pendingTransaction.ts | 8 +- database/src/seeds/factory/user.ts | 16 +- database/src/seeds/users/peter-lustig.ts | 2 +- database/src/util/index.ts | 2 +- package.json | 2 +- shared/tsconfig.json | 6 +- yarn.lock | 75 +++++++- 34 files changed, 474 insertions(+), 237 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts index d7c2fc713..b6abcb0b2 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts @@ -37,11 +37,14 @@ import { TRANSACTIONS_LOCK } from 'database' import { LOG4JS_BASE_CATEGORY_NAME } from '@/config/const' import { getLogger } from 'config-schema/test/testSetup' import { transactionLinkCode } from './TransactionLinkResolver' +import { CONFIG } from '@/config' const logErrorLogger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.server.LogError`) jest.mock('@/password/EncryptorUtils') +CONFIG.DLT_CONNECTOR = false + // mock semaphore to allow use fake timers jest.mock('database/src/util/TRANSACTIONS_LOCK') TRANSACTIONS_LOCK.acquire = jest.fn().mockResolvedValue(jest.fn()) diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts index 7fc4630f8..c6cc69250 100644 --- a/backend/src/graphql/resolver/TransactionResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionResolver.test.ts @@ -33,10 +33,13 @@ import { garrickOllivander } from '@/seeds/users/garrick-ollivander' import { peterLustig } from '@/seeds/users/peter-lustig' import { stephenHawking } from '@/seeds/users/stephen-hawking' import { getLogger } from 'config-schema/test/testSetup' +import { CONFIG } from '@/config' jest.mock('@/password/EncryptorUtils') const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.server.LogError`) +CONFIG.DLT_CONNECTOR = false +CONFIG.EMAIL = false let mutate: ApolloServerTestClient['mutate'] let query: ApolloServerTestClient['query'] diff --git a/bun.lock b/bun.lock index 88deb2864..223e7dcfa 100644 --- a/bun.lock +++ b/bun.lock @@ -11,7 +11,7 @@ "uuid": "^8.3.2", }, "devDependencies": { - "@biomejs/biome": "2.0.0", + "@biomejs/biome": "^2.2.5", }, }, "admin": { @@ -544,23 +544,23 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], - "@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "@biomejs/biome": ["@biomejs/biome@2.2.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.2.5", "@biomejs/cli-darwin-x64": "2.2.5", "@biomejs/cli-linux-arm64": "2.2.5", "@biomejs/cli-linux-arm64-musl": "2.2.5", "@biomejs/cli-linux-x64": "2.2.5", "@biomejs/cli-linux-x64-musl": "2.2.5", "@biomejs/cli-win32-arm64": "2.2.5", "@biomejs/cli-win32-x64": "2.2.5" }, "bin": { "biome": "bin/biome" } }, "sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.2.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.2.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.2.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.2.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.2.5", "", { "os": "linux", "cpu": "x64" }, "sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.2.5", "", { "os": "linux", "cpu": "x64" }, "sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.2.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.2.5", "", { "os": "win32", "cpu": "x64" }, "sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw=="], "@borewit/text-codec": ["@borewit/text-codec@0.1.1", "", {}, "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA=="], @@ -1674,7 +1674,7 @@ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -2760,7 +2760,7 @@ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -3586,8 +3586,6 @@ "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], @@ -3688,6 +3686,8 @@ "@jest/source-map/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], "@jest/transform/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -3696,14 +3696,14 @@ "@jest/types/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + "@morev/utils/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "@morev/utils/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "@nuxt/kit/consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], "@nuxt/kit/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@nuxt/kit/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "@nuxt/kit/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "@nuxt/kit/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], @@ -3866,6 +3866,8 @@ "babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], + "backend/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "backend/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], "backend/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], @@ -3888,8 +3890,6 @@ "c12/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], - "c12/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "c12/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "c12/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], @@ -3924,6 +3924,10 @@ "concurrently/yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "config-schema/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + + "core/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "core/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], "cross-fetch/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], @@ -3934,6 +3938,8 @@ "cssstyle/rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], + "database/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "database/@types/node": ["@types/node@18.19.121", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ=="], "database/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], @@ -3944,6 +3950,8 @@ "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + "dht-node/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "dht-node/@types/jest": ["@types/jest@27.5.1", "", { "dependencies": { "jest-matcher-utils": "^27.0.0", "pretty-format": "^27.0.0" } }, "sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ=="], "dht-node/cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], @@ -4008,6 +4016,8 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "federation/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "federation/@types/express": ["@types/express@4.17.21", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ=="], "federation/apollo-server-testing": ["apollo-server-testing@2.25.2", "", { "dependencies": { "apollo-server-core": "^2.25.2" }, "peerDependencies": { "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" } }, "sha512-HjQV9wPbi/ZqpRbyyhNwCbaDnfjDM0hTRec5TOoOjurEZ/vh4hTPHwGkDZx3kbcWowhGxe2qoHM6KANSB/SxuA=="], @@ -4204,6 +4214,8 @@ "sha.js/safe-buffer": ["safe-buffer@https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", {}], + "shared/@biomejs/biome": ["@biomejs/biome@2.0.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0", "@biomejs/cli-darwin-x64": "2.0.0", "@biomejs/cli-linux-arm64": "2.0.0", "@biomejs/cli-linux-arm64-musl": "2.0.0", "@biomejs/cli-linux-x64": "2.0.0", "@biomejs/cli-linux-x64-musl": "2.0.0", "@biomejs/cli-win32-arm64": "2.0.0", "@biomejs/cli-win32-x64": "2.0.0" } }, "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ=="], + "shared/@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], "shared/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="], @@ -4330,6 +4342,8 @@ "update-browserslist-db/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "vee-validate/@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], "vee-validate/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], @@ -4546,6 +4560,22 @@ "apollo-server-express/@types/body-parser/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + "backend/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "backend/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "backend/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "backend/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "backend/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "backend/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "backend/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "backend/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "backend/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -4592,16 +4622,80 @@ "concurrently/yargs/y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + "config-schema/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "config-schema/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "config-schema/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "config-schema/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "config-schema/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "config-schema/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "config-schema/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "config-schema/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + + "core/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "core/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "core/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "core/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "core/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "core/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "core/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "core/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "cross-fetch/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "css-select/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + "database/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "database/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "database/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "database/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "database/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "database/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "database/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "database/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "database/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "database/ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], "database/ts-jest/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + "dht-node/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "dht-node/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "dht-node/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "dht-node/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "dht-node/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "dht-node/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "dht-node/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "dht-node/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "dht-node/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "dht-node/ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -4630,6 +4724,22 @@ "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "federation/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "federation/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "federation/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "federation/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "federation/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "federation/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "federation/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "federation/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "federation/cross-env/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "federation/ts-jest/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -4772,6 +4882,22 @@ "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "shared/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0", "", {}, "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw=="], + + "shared/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0", "", {}, "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw=="], + + "shared/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0", "", {}, "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw=="], + + "shared/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0", "", {}, "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA=="], + + "shared/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0", "", {}, "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg=="], + + "shared/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0", "", {}, "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA=="], + + "shared/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0", "", {}, "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw=="], + + "shared/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0", "", {}, "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg=="], + "sodium-secretstream/sodium-universal/sodium-native": ["sodium-native@5.0.9", "", { "dependencies": { "require-addon": "^1.1.0", "which-runtime": "^1.2.1" } }, "sha512-6fpu3d6zdrRpLhuV3CDIBO5g90KkgaeR+c3xvDDz0ZnDkAlqbbPhFW7zhMJfsskfZ9SuC3SvBbqvxcECkXRyKw=="], "streamroller/fs-extra/jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], @@ -4960,8 +5086,6 @@ "@jest/expect/jest-snapshot/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], - "@jest/expect/jest-snapshot/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "@jest/expect/jest-snapshot/@jest/transform/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], "@jest/expect/jest-snapshot/@jest/transform/jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], @@ -5342,8 +5466,6 @@ "ts-jest/jest/@jest/core/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], - "ts-jest/jest/@jest/core/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "ts-jest/jest/@jest/core/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], "ts-jest/jest/@jest/core/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], @@ -5516,8 +5638,6 @@ "ts-jest/jest/@jest/core/@jest/reporters/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "ts-jest/jest/@jest/core/@jest/reporters/v8-to-istanbul/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "ts-jest/jest/@jest/core/@jest/transform/babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], "ts-jest/jest/@jest/core/@jest/transform/babel-plugin-istanbul/test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="], @@ -5728,8 +5848,6 @@ "ts-jest/jest/jest-cli/jest-config/@jest/test-sequencer/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], - "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], "ts-jest/jest/jest-cli/jest-config/babel-jest/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], @@ -5796,8 +5914,6 @@ "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], - "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "ts-jest/jest/jest-cli/jest-config/jest-runner/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], "ts-jest/jest/jest-cli/jest-config/jest-runner/@types/node/undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], @@ -5930,16 +6046,12 @@ "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], - "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-runtime/jest-haste-map/jest-worker": ["jest-worker@30.2.0", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.2.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g=="], "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/babel-plugin-istanbul": ["babel-plugin-istanbul@7.0.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^6.0.0" } }, "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA=="], - "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/jest-haste-map": ["jest-haste-map@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", "jest-util": "30.2.0", "jest-worker": "30.2.0", "micromatch": "^4.0.8", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.3" } }, "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw=="], "ts-jest/jest/jest-cli/jest-config/jest-circus/jest-snapshot/@jest/transform/pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], diff --git a/database/src/AppDatabase.ts b/database/src/AppDatabase.ts index f995a176a..e29a09965 100644 --- a/database/src/AppDatabase.ts +++ b/database/src/AppDatabase.ts @@ -1,10 +1,9 @@ -import { DataSource as DBDataSource, FileLogger } from 'typeorm' -import { Migration, entities } from './entity' - import { getLogger } from 'log4js' +import { DataSource as DBDataSource, FileLogger } from 'typeorm' import { latestDbVersion } from '.' import { CONFIG } from './config' import { LOG4JS_BASE_CATEGORY_NAME } from './config/const' +import { entities, Migration } from './entity' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.AppDatabase`) @@ -93,7 +92,7 @@ export class AppDatabase { public async destroy(): Promise { await this.dataSource?.destroy() } - + // ###################################### // private methods // ###################################### diff --git a/database/src/entity/Community.ts b/database/src/entity/Community.ts index f6597306a..af9cc1e7d 100644 --- a/database/src/entity/Community.ts +++ b/database/src/entity/Community.ts @@ -10,8 +10,8 @@ import { UpdateDateColumn, } from 'typeorm' import { FederatedCommunity } from './FederatedCommunity' -import { User } from './User' import { GeometryTransformer } from './transformer/GeometryTransformer' +import { User } from './User' @Entity('communities') export class Community extends BaseEntity { diff --git a/database/src/entity/Contribution.ts b/database/src/entity/Contribution.ts index 976385263..a2f410e1d 100644 --- a/database/src/entity/Contribution.ts +++ b/database/src/entity/Contribution.ts @@ -12,8 +12,8 @@ import { } from 'typeorm' import { ContributionMessage } from './ContributionMessage' import { Transaction } from './Transaction' -import { User } from './User' import { DecimalTransformer } from './transformer/DecimalTransformer' +import { User } from './User' @Entity('contributions') export class Contribution extends BaseEntity { diff --git a/database/src/entity/DltTransaction.ts b/database/src/entity/DltTransaction.ts index adb581490..2df3fb92c 100644 --- a/database/src/entity/DltTransaction.ts +++ b/database/src/entity/DltTransaction.ts @@ -1,7 +1,7 @@ import { BaseEntity, Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm' import { Transaction } from './Transaction' -import { User } from './User' import { TransactionLink } from './TransactionLink' +import { User } from './User' @Entity('dlt_transactions', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class DltTransaction extends BaseEntity { @@ -48,15 +48,24 @@ export class DltTransaction extends BaseEntity { @Column({ name: 'error', type: 'text', nullable: true }) error: string | null - @OneToOne(() => Transaction, (transaction) => transaction.dltTransaction) + @OneToOne( + () => Transaction, + (transaction) => transaction.dltTransaction, + ) @JoinColumn({ name: 'transaction_id' }) transaction?: Transaction | null - @OneToOne(() => User, (user) => user.dltTransaction) + @OneToOne( + () => User, + (user) => user.dltTransaction, + ) @JoinColumn({ name: 'user_id' }) user?: User | null - @OneToOne(() => TransactionLink, (transactionLink) => transactionLink.dltTransaction) + @OneToOne( + () => TransactionLink, + (transactionLink) => transactionLink.dltTransaction, + ) @JoinColumn({ name: 'transaction_link_id' }) transactionLink?: TransactionLink | null } diff --git a/database/src/entity/Event.ts b/database/src/entity/Event.ts index 9d17ffdeb..b5ed77b21 100644 --- a/database/src/entity/Event.ts +++ b/database/src/entity/Event.ts @@ -13,8 +13,8 @@ import { ContributionLink } from './ContributionLink' import { ContributionMessage } from './ContributionMessage' import { Transaction } from './Transaction' import { TransactionLink } from './TransactionLink' -import { User } from './User' import { DecimalTransformer } from './transformer/DecimalTransformer' +import { User } from './User' @Entity('events') export class Event extends BaseEntity { diff --git a/database/src/entity/Transaction.ts b/database/src/entity/Transaction.ts index 6a6e13b5b..293b3af32 100644 --- a/database/src/entity/Transaction.ts +++ b/database/src/entity/Transaction.ts @@ -1,10 +1,18 @@ /* eslint-disable no-use-before-define */ import { Decimal } from 'decimal.js-light' -import { BaseEntity, Column, Entity, JoinColumn, ManyToOne, OneToOne, PrimaryGeneratedColumn } from 'typeorm' +import { + BaseEntity, + Column, + Entity, + JoinColumn, + ManyToOne, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm' import { Contribution } from './Contribution' import { DltTransaction } from './DltTransaction' -import { DecimalTransformer } from './transformer/DecimalTransformer' import { TransactionLink } from './TransactionLink' +import { DecimalTransformer } from './transformer/DecimalTransformer' @Entity('transactions') export class Transaction extends BaseEntity { @@ -159,7 +167,10 @@ export class Transaction extends BaseEntity { @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) contribution?: Contribution | null - @OneToOne(() => DltTransaction, (dlt) => dlt.transactionId) + @OneToOne( + () => DltTransaction, + (dlt) => dlt.transactionId, + ) @JoinColumn({ name: 'id', referencedColumnName: 'transactionId' }) dltTransaction?: DltTransaction | null @@ -167,7 +178,10 @@ export class Transaction extends BaseEntity { @JoinColumn({ name: 'previous' }) previousTransaction?: Transaction | null - @ManyToOne(() => TransactionLink, (transactionLink) => transactionLink.transactions) + @ManyToOne( + () => TransactionLink, + (transactionLink) => transactionLink.transactions, + ) @JoinColumn({ name: 'transaction_link_id' }) transactionLink?: TransactionLink | null } diff --git a/database/src/entity/TransactionLink.ts b/database/src/entity/TransactionLink.ts index f18c5acec..326573c16 100644 --- a/database/src/entity/TransactionLink.ts +++ b/database/src/entity/TransactionLink.ts @@ -1,9 +1,18 @@ import { Decimal } from 'decimal.js-light' -import { BaseEntity, Column, DeleteDateColumn, Entity, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm' -import { DecimalTransformer } from './transformer/DecimalTransformer' -import { User } from './User' +import { + BaseEntity, + Column, + DeleteDateColumn, + Entity, + JoinColumn, + OneToMany, + OneToOne, + PrimaryGeneratedColumn, +} from 'typeorm' import { DltTransaction } from './DltTransaction' import { Transaction } from './Transaction' +import { DecimalTransformer } from './transformer/DecimalTransformer' +import { User } from './User' @Entity('transaction_links') export class TransactionLink extends BaseEntity { @@ -62,15 +71,24 @@ export class TransactionLink extends BaseEntity { @Column({ type: 'int', unsigned: true, nullable: true }) redeemedBy: number | null - @OneToOne(() => DltTransaction, (dlt) => dlt.transactionLinkId) + @OneToOne( + () => DltTransaction, + (dlt) => dlt.transactionLinkId, + ) @JoinColumn({ name: 'id', referencedColumnName: 'transactionLinkId' }) dltTransaction?: DltTransaction | null - @OneToOne(() => User, (user) => user.transactionLink) + @OneToOne( + () => User, + (user) => user.transactionLink, + ) @JoinColumn({ name: 'userId' }) user: User - @OneToMany(() => Transaction, (transaction) => transaction.transactionLink) + @OneToMany( + () => Transaction, + (transaction) => transaction.transactionLink, + ) @JoinColumn({ referencedColumnName: 'transaction_link_id' }) transactions: Transaction[] } diff --git a/database/src/entity/User.ts b/database/src/entity/User.ts index f438e8ac8..b2366b93c 100644 --- a/database/src/entity/User.ts +++ b/database/src/entity/User.ts @@ -13,11 +13,11 @@ import { import { Community } from './Community' import { Contribution } from './Contribution' import { ContributionMessage } from './ContributionMessage' -import { UserContact } from './UserContact' -import { UserRole } from './UserRole' -import { GeometryTransformer } from './transformer/GeometryTransformer' import { DltTransaction } from './DltTransaction' import { TransactionLink } from './TransactionLink' +import { GeometryTransformer } from './transformer/GeometryTransformer' +import { UserContact } from './UserContact' +import { UserRole } from './UserRole' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { @@ -216,11 +216,17 @@ export class User extends BaseEntity { @JoinColumn({ name: 'user_id' }) userContacts?: UserContact[] - @OneToOne(() => DltTransaction, (dlt) => dlt.userId) + @OneToOne( + () => DltTransaction, + (dlt) => dlt.userId, + ) @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) dltTransaction?: DltTransaction | null - @OneToOne(() => TransactionLink, (transactionLink) => transactionLink.userId) + @OneToOne( + () => TransactionLink, + (transactionLink) => transactionLink.userId, + ) @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) transactionLink?: TransactionLink | null } diff --git a/database/src/index.ts b/database/src/index.ts index 56dec24ee..72718cd94 100644 --- a/database/src/index.ts +++ b/database/src/index.ts @@ -58,7 +58,7 @@ export const entities = [ ] export { latestDbVersion } +export { AppDatabase } from './AppDatabase' export * from './logging' export * from './queries' export * from './util' -export { AppDatabase } from './AppDatabase' diff --git a/database/src/logging/AbstractLogging.view.ts b/database/src/logging/AbstractLogging.view.ts index 00fdd4703..7e1616c65 100644 --- a/database/src/logging/AbstractLogging.view.ts +++ b/database/src/logging/AbstractLogging.view.ts @@ -1,6 +1,5 @@ -import util from 'util' - import { Decimal } from 'decimal.js-light' +import util from 'util' export abstract class AbstractLoggingView { protected bufferStringFormat: BufferEncoding = 'hex' diff --git a/database/src/logging/PendingTransactionLogging.view.ts b/database/src/logging/PendingTransactionLogging.view.ts index fad2d8f56..20e08e662 100644 --- a/database/src/logging/PendingTransactionLogging.view.ts +++ b/database/src/logging/PendingTransactionLogging.view.ts @@ -1,7 +1,7 @@ +import { PendingTransactionState } from 'shared' import { PendingTransaction, Transaction } from '../entity' import { AbstractLoggingView } from './AbstractLogging.view' import { TransactionLoggingView } from './TransactionLogging.view' -import { PendingTransactionState } from 'shared' export class PendingTransactionLoggingView extends AbstractLoggingView { public constructor(private self: PendingTransaction) { diff --git a/database/src/logging/UserContactLogging.view.ts b/database/src/logging/UserContactLogging.view.ts index 4bd567cad..5230c4311 100644 --- a/database/src/logging/UserContactLogging.view.ts +++ b/database/src/logging/UserContactLogging.view.ts @@ -8,7 +8,10 @@ enum OptInType { } export class UserContactLoggingView extends AbstractLoggingView { - public constructor(private self: UserContact, private showUser = true) { + public constructor( + private self: UserContact, + private showUser = true, + ) { super() } @@ -16,9 +19,10 @@ export class UserContactLoggingView extends AbstractLoggingView { return { id: this.self.id, type: this.self.type, - user: this.showUser && this.self.user - ? new UserLoggingView(this.self.user).toJSON() - : { id: this.self.userId }, + user: + this.showUser && this.self.user + ? new UserLoggingView(this.self.user).toJSON() + : { id: this.self.userId }, email: this.self.email?.substring(0, 3) + '...', emailVerificationCode: this.self.emailVerificationCode?.substring(0, 4) + '...', emailOptInTypeId: OptInType[this.self.emailOptInTypeId], diff --git a/database/src/logging/UserLogging.view.ts b/database/src/logging/UserLogging.view.ts index 84db8a6fe..9d5f2bf92 100644 --- a/database/src/logging/UserLogging.view.ts +++ b/database/src/logging/UserLogging.view.ts @@ -1,10 +1,10 @@ import { User } from '../entity' import { AbstractLoggingView } from './AbstractLogging.view' +import { CommunityLoggingView } from './CommunityLogging.view' import { ContributionLoggingView } from './ContributionLogging.view' import { ContributionMessageLoggingView } from './ContributionMessageLogging.view' import { UserContactLoggingView } from './UserContactLogging.view' import { UserRoleLoggingView } from './UserRoleLogging.view' -import { CommunityLoggingView } from './CommunityLogging.view' enum PasswordEncryptionType { NO_PASSWORD = 0, diff --git a/database/src/logging/UserRoleLogging.view.ts b/database/src/logging/UserRoleLogging.view.ts index ebfa3aed8..2d47bba19 100644 --- a/database/src/logging/UserRoleLogging.view.ts +++ b/database/src/logging/UserRoleLogging.view.ts @@ -3,16 +3,20 @@ import { AbstractLoggingView } from './AbstractLogging.view' import { UserLoggingView } from './UserLogging.view' export class UserRoleLoggingView extends AbstractLoggingView { - public constructor(private self: UserRole, private showUser = true) { + public constructor( + private self: UserRole, + private showUser = true, + ) { super() } public toJSON(): any { return { id: this.self.id, - user: this.showUser && this.self.user - ? new UserLoggingView(this.self.user).toJSON() - : { id: this.self.userId }, + user: + this.showUser && this.self.user + ? new UserLoggingView(this.self.user).toJSON() + : { id: this.self.userId }, role: this.self.role, createdAt: this.dateToString(this.self.createdAt), updatedAt: this.dateToString(this.self.updatedAt), diff --git a/database/src/queries/communities.test.ts b/database/src/queries/communities.test.ts index 18975256c..0655dba92 100644 --- a/database/src/queries/communities.test.ts +++ b/database/src/queries/communities.test.ts @@ -1,8 +1,8 @@ +import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest' import { Community as DbCommunity, FederatedCommunity as DbFederatedCommunity } from '..' import { AppDatabase } from '../AppDatabase' -import { getHomeCommunity, getReachableCommunities } from './communities' -import { describe, expect, it, beforeEach, beforeAll, afterAll } from 'vitest' import { createCommunity, createVerifiedFederatedCommunity } from '../seeds/community' +import { getHomeCommunity, getReachableCommunities } from './communities' const db = AppDatabase.getInstance() @@ -39,7 +39,7 @@ describe('community.queries', () => { expect(community?.privateKey).toStrictEqual(homeCom.privateKey) }) }) - describe('getReachableCommunities', () => { + describe('getReachableCommunities', () => { it('home community counts also to reachable communities', async () => { await createCommunity(false) expect(await getReachableCommunities(1000)).toHaveLength(1) @@ -86,4 +86,4 @@ describe('community.queries', () => { expect(await getReachableCommunities(1000)).toHaveLength(0) }) }) -}) \ No newline at end of file +}) diff --git a/database/src/queries/communities.ts b/database/src/queries/communities.ts index e216f8af6..22c59314b 100644 --- a/database/src/queries/communities.ts +++ b/database/src/queries/communities.ts @@ -1,6 +1,6 @@ +import { urlSchema, uuidv4Schema } from 'shared' import { FindOptionsOrder, FindOptionsWhere, IsNull, MoreThanOrEqual, Not } from 'typeorm' import { Community as DbCommunity } from '../entity' -import { urlSchema, uuidv4Schema } from 'shared' /** * Retrieves the home community, i.e., a community that is not foreign. @@ -20,7 +20,9 @@ export async function getCommunityByUuid(communityUuid: string): Promise { +export function findWithCommunityIdentifier( + communityIdentifier: string, +): FindOptionsWhere { const where: FindOptionsWhere = {} // pre filter identifier type to reduce db query complexity if (urlSchema.safeParse(communityIdentifier).success) { @@ -42,22 +44,22 @@ export async function getCommunityWithFederatedCommunityByIdentifier( }) } -// returns all reachable communities +// returns all reachable communities // home community and all federated communities which have been verified within the last authenticationTimeoutMs export async function getReachableCommunities( authenticationTimeoutMs: number, - order?: FindOptionsOrder + order?: FindOptionsOrder, ): Promise { return await DbCommunity.find({ - where: [ - { - authenticatedAt: Not(IsNull()), - federatedCommunities: { - verifiedAt: MoreThanOrEqual(new Date(Date.now() - authenticationTimeoutMs)) - } + where: [ + { + authenticatedAt: Not(IsNull()), + federatedCommunities: { + verifiedAt: MoreThanOrEqual(new Date(Date.now() - authenticationTimeoutMs)), + }, }, { foreign: false }, ], order, }) -} \ No newline at end of file +} diff --git a/database/src/queries/events.ts b/database/src/queries/events.ts index ff0967944..2e954d4eb 100644 --- a/database/src/queries/events.ts +++ b/database/src/queries/events.ts @@ -1,19 +1,15 @@ -import { - ContributionLink as DbContributionLink, - Event as DbEvent, - User as DbUser -} from '../entity' +import { ContributionLink as DbContributionLink, Event as DbEvent, User as DbUser } from '../entity' -export async function findModeratorCreatingContributionLink(contributionLink: DbContributionLink): Promise { - const event = await DbEvent.findOne( - { - where: { - involvedContributionLinkId: contributionLink.id, - // todo: move event types into db - type: 'ADMIN_CONTRIBUTION_LINK_CREATE' - }, - relations: { actingUser: true } - } - ) +export async function findModeratorCreatingContributionLink( + contributionLink: DbContributionLink, +): Promise { + const event = await DbEvent.findOne({ + where: { + involvedContributionLinkId: contributionLink.id, + // todo: move event types into db + type: 'ADMIN_CONTRIBUTION_LINK_CREATE', + }, + relations: { actingUser: true }, + }) return event?.actingUser -} \ No newline at end of file +} diff --git a/database/src/queries/index.ts b/database/src/queries/index.ts index 54b5c6d4e..5fdc68c82 100644 --- a/database/src/queries/index.ts +++ b/database/src/queries/index.ts @@ -1,10 +1,10 @@ import { LOG4JS_BASE_CATEGORY_NAME } from '../config/const' -export * from './user' export * from './communities' -export * from './pendingTransactions' -export * from './transactions' -export * from './transactionLinks' export * from './events' +export * from './pendingTransactions' +export * from './transactionLinks' +export * from './transactions' +export * from './user' export const LOG4JS_QUERIES_CATEGORY_NAME = `${LOG4JS_BASE_CATEGORY_NAME}.queries` diff --git a/database/src/queries/pendingTransactions.test.ts b/database/src/queries/pendingTransactions.test.ts index c59c312e4..1f7d0a3b7 100644 --- a/database/src/queries/pendingTransactions.test.ts +++ b/database/src/queries/pendingTransactions.test.ts @@ -1,22 +1,22 @@ -import { - PendingTransaction as DbPendingTransaction, - User as DbUser, - UserContact as DbUserContact, - Community as DbCommunity -} from '..' -import { countOpenPendingTransactions } from './pendingTransactions' +import Decimal from 'decimal.js-light' import { PendingTransactionState } from 'shared' +import { v4 as uuidv4 } from 'uuid' +import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { + Community as DbCommunity, + PendingTransaction as DbPendingTransaction, + User as DbUser, + UserContact as DbUserContact, +} from '..' import { AppDatabase } from '../AppDatabase' -import { userFactory } from '../seeds/factory/user' +import { createCommunity } from '../seeds/community' import { pendingTransactionFactory } from '../seeds/factory/pendingTransaction' +import { userFactory } from '../seeds/factory/user' import { bibiBloxberg } from '../seeds/users/bibi-bloxberg' -import { peterLustig } from '../seeds/users/peter-lustig' import { bobBaumeister } from '../seeds/users/bob-baumeister' import { garrickOllivander } from '../seeds/users/garrick-ollivander' -import { describe, expect, it, beforeAll, afterAll } from 'vitest' -import { createCommunity } from '../seeds/community' -import { v4 as uuidv4 } from 'uuid' -import Decimal from 'decimal.js-light' +import { peterLustig } from '../seeds/users/peter-lustig' +import { countOpenPendingTransactions } from './pendingTransactions' const db = AppDatabase.getInstance() @@ -27,7 +27,6 @@ afterAll(async () => { await db.destroy() }) - describe('countOpenPendingTransactions', () => { let bibi: DbUser let peter: DbUser @@ -41,45 +40,44 @@ describe('countOpenPendingTransactions', () => { await createCommunity(false) - bibi = await userFactory(bibiBloxberg) + bibi = await userFactory(bibiBloxberg) peter = await userFactory(peterLustig) bob = await userFactory(bobBaumeister) garrick = await userFactory(garrickOllivander) // Bibi -> Peter await pendingTransactionFactory( - bibi, - peter, - new Decimal(10), - 'Bibi -> Peter new', - PendingTransactionState.NEW + bibi, + peter, + new Decimal(10), + 'Bibi -> Peter new', + PendingTransactionState.NEW, ) await pendingTransactionFactory( - bibi, - peter, - new Decimal(100.01), - 'Bibi -> Peter settled', - PendingTransactionState.SETTLED + bibi, + peter, + new Decimal(100.01), + 'Bibi -> Peter settled', + PendingTransactionState.SETTLED, ) // Peter -> Bibi await pendingTransactionFactory( - peter, - bibi, - new Decimal(12), - 'Peter -> Bibi new', - PendingTransactionState.NEW + peter, + bibi, + new Decimal(12), + 'Peter -> Bibi new', + PendingTransactionState.NEW, ) // Bob -> Peter await pendingTransactionFactory( - bob, - peter, - new Decimal(17.1), - 'Bob -> Peter new', - PendingTransactionState.NEW + bob, + peter, + new Decimal(17.1), + 'Bob -> Peter new', + PendingTransactionState.NEW, ) - }) it('should return 0 if called with empty array', async () => { const count = await countOpenPendingTransactions([]) @@ -104,21 +102,20 @@ describe('countOpenPendingTransactions', () => { it('peter and bob have one transaction together, peter two additional, should return 3', async () => { const count = await countOpenPendingTransactions([peter.gradidoID, bob.gradidoID]) expect(count).toBe(3) - }) - + }) + it('peter has three transactions, should return 3', async () => { const count = await countOpenPendingTransactions([peter.gradidoID]) expect(count).toBe(3) - }) - + }) it('bibi has two transactions, should return 2', async () => { const count = await countOpenPendingTransactions([bibi.gradidoID]) expect(count).toBe(2) - }) + }) it('bob has one transaction, should return 1', async () => { const count = await countOpenPendingTransactions([bob.gradidoID]) expect(count).toBe(1) - }) + }) }) diff --git a/database/src/queries/pendingTransactions.ts b/database/src/queries/pendingTransactions.ts index 44bf63f82..b6481af33 100644 --- a/database/src/queries/pendingTransactions.ts +++ b/database/src/queries/pendingTransactions.ts @@ -1,6 +1,6 @@ -import { PendingTransaction as DbPendingTransaction } from '../entity' -import { In } from 'typeorm' import { PendingTransactionState } from 'shared' +import { In } from 'typeorm' +import { PendingTransaction as DbPendingTransaction } from '../entity' /** * Counts the number of open pending transactions for the given users. @@ -15,4 +15,4 @@ export async function countOpenPendingTransactions(users: string[]): Promise { return await DbTransactionLink.findOneOrFail({ diff --git a/database/src/queries/user.test.ts b/database/src/queries/user.test.ts index 873ca7a2b..57096d264 100644 --- a/database/src/queries/user.test.ts +++ b/database/src/queries/user.test.ts @@ -1,14 +1,14 @@ -import { User as DbUser, UserContact as DbUserContact, Community as DbCommunity } from '..' +import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest' +import { clearLogs, getLogger, printLogs } from '../../../config-schema/test/testSetup.vitest' +import { Community as DbCommunity, User as DbUser, UserContact as DbUserContact } from '..' import { AppDatabase } from '../AppDatabase' -import { aliasExists, findUserByIdentifier } from './user' +import { createCommunity } from '../seeds/community' import { userFactory } from '../seeds/factory/user' import { bibiBloxberg } from '../seeds/users/bibi-bloxberg' -import { describe, expect, it, beforeAll, afterAll, beforeEach, } from 'vitest' -import { createCommunity } from '../seeds/community' -import { peterLustig } from '../seeds/users/peter-lustig' import { bobBaumeister } from '../seeds/users/bob-baumeister' -import { getLogger, printLogs, clearLogs } from '../../../config-schema/test/testSetup.vitest' +import { peterLustig } from '../seeds/users/peter-lustig' import { LOG4JS_QUERIES_CATEGORY_NAME } from '.' +import { aliasExists, findUserByIdentifier } from './user' const db = AppDatabase.getInstance() const userIdentifierLoggerName = `${LOG4JS_QUERIES_CATEGORY_NAME}.user.findUserByIdentifier` @@ -26,9 +26,9 @@ describe('user.queries', () => { await DbUser.clear() await DbUserContact.clear() - const bibi = bibiBloxberg + const bibi = bibiBloxberg bibi.alias = 'b-b' - await userFactory(bibi) + await userFactory(bibi) }) it('should return true if alias exists', async () => { @@ -70,12 +70,12 @@ describe('user.queries', () => { const user = await findUserByIdentifier(userBibi.gradidoID, communityUuid) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias, communityUuid) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email, communityUuid) expect(user).toMatchObject(userBibi) @@ -85,18 +85,18 @@ describe('user.queries', () => { expect(user).toBeNull() }) }) - + describe('communityIdentifier is community name', () => { it('userIdentifier is gradido id', async () => { const user = await findUserByIdentifier(userBibi.gradidoID, communityName) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias, communityName) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email, communityName) expect(user).toMatchObject(userBibi) @@ -117,12 +117,12 @@ describe('user.queries', () => { const user = await findUserByIdentifier(userBibi.gradidoID) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email) expect(user).toMatchObject(userBibi) @@ -130,11 +130,12 @@ describe('user.queries', () => { it('userIdentifier is unknown type', async () => { const user = await findUserByIdentifier('sa') printLogs() - expect(getLogger(userIdentifierLoggerName).warn).toHaveBeenCalledWith('Unknown identifier type', 'sa') + expect(getLogger(userIdentifierLoggerName).warn).toHaveBeenCalledWith( + 'Unknown identifier type', + 'sa', + ) expect(user).toBeNull() }) - }) + }) }) -}) - - +}) diff --git a/database/src/queries/user.ts b/database/src/queries/user.ts index d42bd689c..9e7d84c27 100644 --- a/database/src/queries/user.ts +++ b/database/src/queries/user.ts @@ -1,7 +1,7 @@ +import { getLogger } from 'log4js' +import { aliasSchema, emailSchema, uuidv4Schema } from 'shared' import { Raw } from 'typeorm' import { User as DbUser, UserContact as DbUserContact } from '../entity' -import { aliasSchema, emailSchema, uuidv4Schema } from 'shared' -import { getLogger } from 'log4js' import { findWithCommunityIdentifier, LOG4JS_QUERIES_CATEGORY_NAME } from './index' export async function aliasExists(alias: string): Promise { @@ -11,7 +11,11 @@ export async function aliasExists(alias: string): Promise { return user !== null } -export async function getUserById(id: number, withCommunity: boolean = false, withEmailContact: boolean = false): Promise { +export async function getUserById( + id: number, + withCommunity: boolean = false, + withEmailContact: boolean = false, +): Promise { return DbUser.findOneOrFail({ where: { id }, relations: { community: withCommunity, emailContact: withEmailContact }, @@ -28,8 +32,8 @@ export const findUserByIdentifier = async ( identifier: string, communityIdentifier?: string, ): Promise => { - const communityWhere = communityIdentifier - ? findWithCommunityIdentifier(communityIdentifier) + const communityWhere = communityIdentifier + ? findWithCommunityIdentifier(communityIdentifier) : undefined if (uuidv4Schema.safeParse(identifier).success) { @@ -48,12 +52,12 @@ export const findUserByIdentifier = async ( }, relations: { user: { community: true } }, }) - if (userContact) { + if (userContact) { // TODO: remove circular reference const user = userContact.user user.emailContact = userContact return user - } + } } else if (aliasSchema.safeParse(identifier).success) { return await DbUser.findOne({ where: { alias: identifier, community: communityWhere }, @@ -61,7 +65,10 @@ export const findUserByIdentifier = async ( }) } else { // should don't happen often, so we create only in the rare case a logger for it - getLogger(`${LOG4JS_QUERIES_CATEGORY_NAME}.user.findUserByIdentifier`).warn('Unknown identifier type', identifier) + getLogger(`${LOG4JS_QUERIES_CATEGORY_NAME}.user.findUserByIdentifier`).warn( + 'Unknown identifier type', + identifier, + ) } return null } diff --git a/database/src/seeds/community.ts b/database/src/seeds/community.ts index 4db872398..6260583dd 100644 --- a/database/src/seeds/community.ts +++ b/database/src/seeds/community.ts @@ -1,42 +1,42 @@ -import { Community, FederatedCommunity } from '../entity' import { randomBytes } from 'node:crypto' import { v4 as uuidv4 } from 'uuid' +import { Community, FederatedCommunity } from '../entity' export async function createCommunity(foreign: boolean, save: boolean = true): Promise { - const community = new Community() - community.publicKey = randomBytes(32) - community.communityUuid = uuidv4() - community.name = 'HomeCommunity-name' - community.creationDate = new Date() + const community = new Community() + community.publicKey = randomBytes(32) + community.communityUuid = uuidv4() + community.name = 'HomeCommunity-name' + community.creationDate = new Date() - if(foreign) { - community.foreign = true - community.name = 'ForeignCommunity-name' - community.description = 'ForeignCommunity-description' - community.url = `http://foreign-${Math.random()}/api` - community.authenticatedAt = new Date() - } else { - community.foreign = false - // todo: generate valid public/private key pair (ed25519) - community.privateKey = randomBytes(64) - community.name = 'HomeCommunity-name' - community.description = 'HomeCommunity-description' - community.url = 'http://localhost/api' - } - return save ? await community.save() : community + if (foreign) { + community.foreign = true + community.name = 'ForeignCommunity-name' + community.description = 'ForeignCommunity-description' + community.url = `http://foreign-${Math.random()}/api` + community.authenticatedAt = new Date() + } else { + community.foreign = false + // todo: generate valid public/private key pair (ed25519) + community.privateKey = randomBytes(64) + community.name = 'HomeCommunity-name' + community.description = 'HomeCommunity-description' + community.url = 'http://localhost/api' + } + return save ? await community.save() : community } export async function createVerifiedFederatedCommunity( - apiVersion: string, - verifiedBeforeMs: number, - community: Community, - save: boolean = true + apiVersion: string, + verifiedBeforeMs: number, + community: Community, + save: boolean = true, ): Promise { - const federatedCommunity = new FederatedCommunity() - federatedCommunity.apiVersion = apiVersion - federatedCommunity.endPoint = community.url - federatedCommunity.publicKey = community.publicKey - federatedCommunity.community = community - federatedCommunity.verifiedAt = new Date(Date.now() - verifiedBeforeMs) - return save ? await federatedCommunity.save() : federatedCommunity + const federatedCommunity = new FederatedCommunity() + federatedCommunity.apiVersion = apiVersion + federatedCommunity.endPoint = community.url + federatedCommunity.publicKey = community.publicKey + federatedCommunity.community = community + federatedCommunity.verifiedAt = new Date(Date.now() - verifiedBeforeMs) + return save ? await federatedCommunity.save() : federatedCommunity } diff --git a/database/src/seeds/factory/pendingTransaction.ts b/database/src/seeds/factory/pendingTransaction.ts index 2e8c7d256..75cb7c70e 100644 --- a/database/src/seeds/factory/pendingTransaction.ts +++ b/database/src/seeds/factory/pendingTransaction.ts @@ -1,6 +1,6 @@ -import { User as DbUser, PendingTransaction as DbPendingTransaction } from '../..' -import { PendingTransactionState } from 'shared' import { Decimal } from 'decimal.js-light' +import { PendingTransactionState } from 'shared' +import { PendingTransaction as DbPendingTransaction, User as DbUser } from '../..' export async function pendingTransactionFactory( sender: DbUser, @@ -17,7 +17,7 @@ export async function pendingTransactionFactory( pendingTransaction.userGradidoID = sender.gradidoID pendingTransaction.userCommunityUuid = sender.communityUuid! pendingTransaction.linkedUserId = receiver.id - pendingTransaction.linkedUserGradidoID = receiver.gradidoID - pendingTransaction.linkedUserCommunityUuid = receiver.communityUuid! + pendingTransaction.linkedUserGradidoID = receiver.gradidoID + pendingTransaction.linkedUserCommunityUuid = receiver.communityUuid! await pendingTransaction.save() } diff --git a/database/src/seeds/factory/user.ts b/database/src/seeds/factory/user.ts index 3772fe66d..912cf00d0 100644 --- a/database/src/seeds/factory/user.ts +++ b/database/src/seeds/factory/user.ts @@ -1,16 +1,16 @@ -import { UserInterface } from '../users/UserInterface' -import { User, UserContact } from '../../entity' -import { v4 } from 'uuid' -import { UserContactType, OptInType, PasswordEncryptionType } from 'shared' -import { getHomeCommunity } from '../../queries/communities' import random from 'crypto-random-bigint' +import { OptInType, PasswordEncryptionType, UserContactType } from 'shared' +import { v4 } from 'uuid' +import { User, UserContact } from '../../entity' +import { getHomeCommunity } from '../../queries/communities' +import { UserInterface } from '../users/UserInterface' export const userFactory = async (user: UserInterface): Promise => { let dbUserContact = new UserContact() dbUserContact.email = user.email ?? '' dbUserContact.type = UserContactType.USER_CONTACT_EMAIL - + let dbUser = new User() dbUser.firstName = user.firstName ?? '' dbUser.lastName = user.lastName ?? '' @@ -35,11 +35,11 @@ export const userFactory = async (user: UserInterface): Promise => { dbUser.community = homeCommunity dbUser.communityUuid = homeCommunity.communityUuid! } - // TODO: improve with cascade + // TODO: improve with cascade dbUser = await dbUser.save() dbUserContact.userId = dbUser.id dbUserContact = await dbUserContact.save() dbUser.emailId = dbUserContact.id dbUser.emailContact = dbUserContact return dbUser.save() -} \ No newline at end of file +} diff --git a/database/src/seeds/users/peter-lustig.ts b/database/src/seeds/users/peter-lustig.ts index 58b07fe99..ebd5235af 100644 --- a/database/src/seeds/users/peter-lustig.ts +++ b/database/src/seeds/users/peter-lustig.ts @@ -7,5 +7,5 @@ export const peterLustig: UserInterface = { // description: 'Latzhose und Nickelbrille', createdAt: new Date('2020-11-25T10:48:43'), emailChecked: true, - language: 'de' + language: 'de', } diff --git a/database/src/util/index.ts b/database/src/util/index.ts index d2fde2126..e2eb6c04e 100644 --- a/database/src/util/index.ts +++ b/database/src/util/index.ts @@ -1,2 +1,2 @@ -export * from './TRANSACTIONS_LOCK' export * from './TRANSACTION_LINK_LOCK' +export * from './TRANSACTIONS_LOCK' diff --git a/package.json b/package.json index 464aa991b..e3cf8fb82 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "uuid": "^8.3.2" }, "devDependencies": { - "@biomejs/biome": "2.0.0" + "@biomejs/biome": "^2.2.5" }, "engines": { "node": ">=18" diff --git a/shared/tsconfig.json b/shared/tsconfig.json index 75b686340..298ef9475 100644 --- a/shared/tsconfig.json +++ b/shared/tsconfig.json @@ -47,7 +47,11 @@ // "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. */ + "typeRoots": [ /* List of folders to include type definitions from. */ + "@types", + "node_modules/@types", + "../node_modules/@types" + ], /* List of folders to include type definitions from. */ // "types": ["bun-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'. */ diff --git a/yarn.lock b/yarn.lock index 2b815e0ef..c5cf10a37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -400,46 +400,100 @@ "@biomejs/cli-win32-arm64" "2.0.0" "@biomejs/cli-win32-x64" "2.0.0" +"@biomejs/biome@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-2.2.5.tgz#291df1137404843537dd50eaa0174c12c0681d82" + integrity sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "2.2.5" + "@biomejs/cli-darwin-x64" "2.2.5" + "@biomejs/cli-linux-arm64" "2.2.5" + "@biomejs/cli-linux-arm64-musl" "2.2.5" + "@biomejs/cli-linux-x64" "2.2.5" + "@biomejs/cli-linux-x64-musl" "2.2.5" + "@biomejs/cli-win32-arm64" "2.2.5" + "@biomejs/cli-win32-x64" "2.2.5" + "@biomejs/cli-darwin-arm64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz#67135faa8bd52933fdaad09a160f9fc3a9defef3" integrity sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw== +"@biomejs/cli-darwin-arm64@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.5.tgz#2a181f4b0daef11e24b96eaac9dd7866125b2524" + integrity sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ== + "@biomejs/cli-darwin-x64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz#49a7e064bad53e095d8a152b072adffcdeb4fb8e" integrity sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw== +"@biomejs/cli-darwin-x64@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.5.tgz#0ecfa984d8b76dda4771b95cf1d796d79c257a18" + integrity sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg== + "@biomejs/cli-linux-arm64-musl@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz#bfde27de8262a20e57e153f3807f47a01ccaeab3" integrity sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA== +"@biomejs/cli-linux-arm64-musl@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.5.tgz#264e632302e61c0b34c13d3d92b6f9b8fb5e1e97" + integrity sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw== + "@biomejs/cli-linux-arm64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz#c2404b3869c03a6fa5a8b979755bc6dfd5a5ec47" integrity sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw== +"@biomejs/cli-linux-arm64@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.5.tgz#acc71fb62fb6d022766042fb004da47439bd1b24" + integrity sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ== + "@biomejs/cli-linux-x64-musl@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz#8ab214ac7e21a2af29435439145888c50f2bdd2f" integrity sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA== +"@biomejs/cli-linux-x64-musl@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.5.tgz#03df0646ed4e26631ef3e1fcb4fc527e45345b86" + integrity sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ== + "@biomejs/cli-linux-x64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz#cbd172ead9e5bba8cd590d06e6e548445cf7ab2a" integrity sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg== +"@biomejs/cli-linux-x64@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.5.tgz#2740f260da9518554219ed07729ec0fdd8104135" + integrity sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew== + "@biomejs/cli-win32-arm64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz#4677f4e034b3f4906e448b704f3314b38062a111" integrity sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw== +"@biomejs/cli-win32-arm64@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.5.tgz#75db880f3bb6c481435f0f602093b1ced9b2327e" + integrity sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg== + "@biomejs/cli-win32-x64@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz#f460a6950235c8f4bbd4cc405b210fec5cdb8ac9" integrity sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg== +"@biomejs/cli-win32-x64@2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.5.tgz#f0f3a85c5fb7954661fe454ef2df998205df1570" + integrity sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" @@ -2383,10 +2437,10 @@ dependencies: dotenv "*" -"@types/email-templates@^10.0.4": - version "10.0.4" - resolved "https://registry.npmjs.org/@types/email-templates/-/email-templates-10.0.4.tgz" - integrity sha512-8O2bdGPO6RYgH2DrnFAcuV++s+8KNA5e2Erjl6UxgKRVsBH9zXu2YLrLyOBRMn2VyEYmzgF+6QQUslpVhj0y/g== +"@types/email-templates@10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/email-templates/-/email-templates-10.0.1.tgz#88f218564a6341092f447fbe110047f6bf3e955a" + integrity sha512-IHdgtoOUfMB4t5y5wgm8G0i2/U90GeJPxIEAViMaLlJPCJzaYSlVHXI8bx3qbgbD6gxyOsSRyrFvBSTgNEQc+g== dependencies: "@types/html-to-text" "*" "@types/nodemailer" "*" @@ -2691,7 +2745,7 @@ dependencies: undici-types "~5.26.4" -"@types/nodemailer@*", "@types/nodemailer@^6.4.4": +"@types/nodemailer@*", "@types/nodemailer@6.4.17": version "6.4.17" resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz" integrity sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww== @@ -5459,9 +5513,9 @@ electron-to-chromium@^1.5.73: resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.144.tgz" integrity sha512-eJIaMRKeAzxfBSxtjYnoIAw/tdD6VIH6tHBZepZnAbE3Gyqqs5mGN87DvcldPUbVkIljTK8pY0CMcUljP64lfQ== -email-templates@^10.0.1: +email-templates@10.0.1: version "10.0.1" - resolved "https://registry.npmjs.org/email-templates/-/email-templates-10.0.1.tgz" + resolved "https://registry.yarnpkg.com/email-templates/-/email-templates-10.0.1.tgz#00ed3d394c3b64fa7b8127027e52b01d70c468d4" integrity sha512-LNZKS0WW9XQkjuDZd/4p/1Q/pwqaqXOP3iDxTIVIQY9vuHlIUEcRLFo8/Xh3GtZCBnm181VgvOXIABKTVyTePA== dependencies: "@ladjs/i18n" "^8.0.1" @@ -9147,12 +9201,17 @@ node-releases@^2.0.19: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== +nodemailer@6.6.5: + version "6.6.5" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.6.5.tgz#f9f6953cee5cfe82cbea152eeddacf7a0442049a" + integrity sha512-C/v856DBijUzHcHIgGpQoTrfsH3suKIRAGliIzCstatM2cAa+MYX3LuyCrABiO/cdJTxgBBHXxV1ztiqUwst5A== + nodemailer@6.9.16: version "6.9.16" resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz" integrity sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ== -nodemailer@^6.6.5, nodemailer@^6.7.7, nodemailer@^6.9.13: +nodemailer@^6.7.7, nodemailer@^6.9.13: version "6.10.1" resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.10.1.tgz" integrity sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA== From a782e3610a18a0219aa46c48714ff58f1ccdaadb Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 9 Oct 2025 13:19:55 +0200 Subject: [PATCH 40/72] fix tests --- backend/package.json | 8 ++-- .../dltConnector/DltConnectorClient.test.ts | 2 +- .../resolver/TransactionResolver.test.ts | 44 ------------------- .../src/graphql/resolver/semaphore.test.ts | 3 ++ bun.lock | 32 ++++++-------- dht-node/.env.dist | 2 +- 6 files changed, 23 insertions(+), 68 deletions(-) diff --git a/backend/package.json b/backend/package.json index 89e0f22b5..554e166ae 100644 --- a/backend/package.json +++ b/backend/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "cross-env": "^7.0.3", - "email-templates": "10.0.1", + "email-templates": "^10.0.1", "sodium-native": "^3.4.1" }, "devDependencies": { @@ -41,14 +41,14 @@ "@swc/cli": "^0.7.3", "@swc/core": "^1.11.24", "@swc/helpers": "^0.5.17", - "@types/email-templates": "10.0.1", + "@types/email-templates": "^10.0.4", "@types/express": "^4.17.21", "@types/faker": "^5.5.9", "@types/i18n": "^0.13.4", "@types/jest": "27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^17.0.21", - "@types/nodemailer": "6.4.17", + "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "@types/source-map-support": "^0.5.10", "@types/uuid": "^8.3.4", @@ -82,7 +82,7 @@ "log4js": "^6.7.1", "mkdirp": "^3.0.1", "ncp": "^2.0.0", - "nodemailer": "6.6.5", + "nodemailer": "^6.6.5", "nodemon": "^2.0.7", "openai": "^4.87.3", "prettier": "^3.5.3", diff --git a/backend/src/apis/dltConnector/DltConnectorClient.test.ts b/backend/src/apis/dltConnector/DltConnectorClient.test.ts index 0e2043a09..e3673791b 100644 --- a/backend/src/apis/dltConnector/DltConnectorClient.test.ts +++ b/backend/src/apis/dltConnector/DltConnectorClient.test.ts @@ -4,7 +4,7 @@ import { DltConnectorClient } from './DltConnectorClient' describe('undefined DltConnectorClient', () => { it('invalid url', () => { - CONFIG.DLT_CONNECTOR_URL = 'invalid' + CONFIG.DLT_CONNECTOR_URL = '' CONFIG.DLT_CONNECTOR = true const result = DltConnectorClient.getInstance() expect(result).toBeUndefined() diff --git a/backend/src/graphql/resolver/TransactionResolver.test.ts b/backend/src/graphql/resolver/TransactionResolver.test.ts index c6cc69250..a134ca84b 100644 --- a/backend/src/graphql/resolver/TransactionResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionResolver.test.ts @@ -437,50 +437,6 @@ describe('send coins', () => { }), ) }) - - describe('sendTransactionsToDltConnector', () => { - let transaction: Transaction[] - let dltTransactions: DltTransaction[] - beforeAll(async () => { - // Find the previous created transactions of sendCoin mutation - transaction = await Transaction.find({ - where: { memo: 'unrepeatable memo' }, - order: { balanceDate: 'ASC', id: 'ASC' }, - }) - - // and read aslong as all async created dlt-transactions are finished - do { - dltTransactions = await DltTransaction.find({ - where: { transactionId: In([transaction[0].id, transaction[1].id]) }, - // relations: ['transaction'], - // order: { createdAt: 'ASC', id: 'ASC' }, - }) - } while (transaction.length > dltTransactions.length) - }) - - it('has wait till sendTransactionsToDltConnector created all dlt-transactions', () => { - expect(dltTransactions).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - id: expect.any(Number), - transactionId: transaction[0].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - expect.objectContaining({ - id: expect.any(Number), - transactionId: transaction[1].id, - messageId: null, - verified: false, - createdAt: expect.any(Date), - verifiedAt: null, - }), - ]), - ) - }) - }) }) describe('send coins via gradido ID', () => { it('sends the coins', async () => { diff --git a/backend/src/graphql/resolver/semaphore.test.ts b/backend/src/graphql/resolver/semaphore.test.ts index 3917efd31..9b4ec07df 100644 --- a/backend/src/graphql/resolver/semaphore.test.ts +++ b/backend/src/graphql/resolver/semaphore.test.ts @@ -21,9 +21,12 @@ import { import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { bobBaumeister } from '@/seeds/users/bob-baumeister' import { peterLustig } from '@/seeds/users/peter-lustig' +import { CONFIG } from '@/config' jest.mock('@/password/EncryptorUtils') +CONFIG.DLT_CONNECTOR = false + let mutate: ApolloServerTestClient['mutate'] let con: DataSource let testEnv: { diff --git a/bun.lock b/bun.lock index ed59d73cb..9b8884678 100644 --- a/bun.lock +++ b/bun.lock @@ -89,7 +89,7 @@ "version": "2.6.1", "dependencies": { "cross-env": "^7.0.3", - "email-templates": "10.0.1", + "email-templates": "^10.0.1", "sodium-native": "^3.4.1", }, "devDependencies": { @@ -98,14 +98,14 @@ "@swc/cli": "^0.7.3", "@swc/core": "^1.11.24", "@swc/helpers": "^0.5.17", - "@types/email-templates": "10.0.1", + "@types/email-templates": "^10.0.4", "@types/express": "^4.17.21", "@types/faker": "^5.5.9", "@types/i18n": "^0.13.4", "@types/jest": "27.0.2", "@types/lodash.clonedeep": "^4.5.6", "@types/node": "^17.0.21", - "@types/nodemailer": "6.4.17", + "@types/nodemailer": "^6.4.4", "@types/sodium-native": "^2.3.5", "@types/source-map-support": "^0.5.10", "@types/uuid": "^8.3.4", @@ -139,7 +139,7 @@ "log4js": "^6.7.1", "mkdirp": "^3.0.1", "ncp": "^2.0.0", - "nodemailer": "6.6.5", + "nodemailer": "^6.6.5", "nodemon": "^2.0.7", "openai": "^4.87.3", "prettier": "^3.5.3", @@ -1063,7 +1063,7 @@ "@types/dotenv": ["@types/dotenv@8.2.3", "", { "dependencies": { "dotenv": "*" } }, "sha512-g2FXjlDX/cYuc5CiQvyU/6kkbP1JtmGzh0obW50zD7OKeILVL0NSpPWLXVfqoAGQjom2/SLLx9zHq0KXvD6mbw=="], - "@types/email-templates": ["@types/email-templates@10.0.1", "", { "dependencies": { "@types/html-to-text": "*", "@types/nodemailer": "*", "juice": "^8.0.0" } }, "sha512-IHdgtoOUfMB4t5y5wgm8G0i2/U90GeJPxIEAViMaLlJPCJzaYSlVHXI8bx3qbgbD6gxyOsSRyrFvBSTgNEQc+g=="], + "@types/email-templates": ["@types/email-templates@10.0.4", "", { "dependencies": { "@types/html-to-text": "*", "@types/nodemailer": "*", "juice": "^8.0.0" } }, "sha512-8O2bdGPO6RYgH2DrnFAcuV++s+8KNA5e2Erjl6UxgKRVsBH9zXu2YLrLyOBRMn2VyEYmzgF+6QQUslpVhj0y/g=="], "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], @@ -1631,7 +1631,7 @@ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], - "convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cookie": ["cookie@0.7.1", "", {}, "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="], @@ -2629,7 +2629,7 @@ "node-releases": ["node-releases@2.0.23", "", {}, "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg=="], - "nodemailer": ["nodemailer@6.6.5", "", {}, "sha512-C/v856DBijUzHcHIgGpQoTrfsH3suKIRAGliIzCstatM2cAa+MYX3LuyCrABiO/cdJTxgBBHXxV1ztiqUwst5A=="], + "nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], "nodemon": ["nodemon@2.0.22", "", { "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" }, "bin": { "nodemon": "bin/nodemon.js" } }, "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ=="], @@ -2671,7 +2671,7 @@ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], - "ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -3491,8 +3491,6 @@ "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "@babel/core/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], @@ -3575,20 +3573,22 @@ "@jest/source-map/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "@jest/transform/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "@jest/transform/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "@jest/transform/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="], "@jest/types/@types/node": ["@types/node@18.19.129", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-hrmi5jWt2w60ayox3iIXwpMEnfUvOLJCRtrOPbHtH15nTjvO7uhnelvrdAs0dO0/zl5DZ3ZbahiaXEVb54ca/A=="], + "@morev/utils/ohash": ["ohash@1.1.6", "", {}, "sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg=="], + "@morev/utils/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "@nuxt/kit/consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], "@nuxt/kit/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], - "@nuxt/kit/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "@nuxt/kit/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "@nuxt/kit/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], @@ -3733,8 +3733,6 @@ "c12/dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], - "c12/ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "c12/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], "c12/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], @@ -3793,8 +3791,6 @@ "editorconfig/minimatch": ["minimatch@9.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w=="], - "email-templates/nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], - "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "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" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], @@ -3977,8 +3973,6 @@ "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], - "preview-email/nodemailer": ["nodemailer@6.10.1", "", {}, "sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA=="], - "preview-email/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -4093,6 +4087,8 @@ "unplugin-vue-components/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "v8-to-istanbul/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="], + "vee-validate/@vue/devtools-api": ["@vue/devtools-api@7.7.7", "", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], "vee-validate/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], diff --git a/dht-node/.env.dist b/dht-node/.env.dist index 351bc251d..1f4fca697 100644 --- a/dht-node/.env.dist +++ b/dht-node/.env.dist @@ -13,7 +13,7 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.dht-node.log # Federation # if you set the value of FEDERATION_DHT_TOPIC, the DHT hyperswarm will start to announce and listen on an hash created from this topic FEDERATION_DHT_TOPIC=GRADIDO_HUB -# FEDERATION_DHT_SEED=64ebcb0e3ad547848fef4197c6e2332f +FEDERATION_DHT_SEED=64ebcb0e3ad547848fed4197c6e1332f FEDERATION_COMMUNITY_URL=http://localhost # comma separated values, which apis should be announced FEDERATION_COMMUNITY_APIS=1_0 \ No newline at end of file From cced5644911167d12709bd07f45904587dfe227d Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 9 Oct 2025 13:24:40 +0200 Subject: [PATCH 41/72] missing save --- backend/src/graphql/resolver/UserResolver.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 56e3b039b..2398a3a95 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -25,7 +25,7 @@ import { Root, } from 'type-graphql' import { IRestResponse } from 'typed-rest-client' -import { EntityManager, EntityNotFoundError, In, Point } from 'typeorm' +import { EntityNotFoundError, In, Point } from 'typeorm' import { v4 as uuidv4 } from 'uuid' import { UserArgs } from '@arg//UserArgs' @@ -104,11 +104,8 @@ import { deleteUserRole, setUserRole } from './util/modifyUserRole' import { sendUserToGms } from './util/sendUserToGms' import { syncHumhub } from './util/syncHumhub' import { validateAlias } from 'core' -<<<<<<< HEAD import { registerAddressTransaction } from '@/apis/dltConnector' -======= import { updateAllDefinedAndChanged } from 'shared' ->>>>>>> master const LANGUAGES = ['de', 'en', 'es', 'fr', 'nl'] const DEFAULT_LANGUAGE = 'de' From 4548b1354b71372e7124e5a3cf351111966c48c7 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 20 Oct 2025 15:56:18 +0200 Subject: [PATCH 42/72] remove unused code --- dlt-connector/src/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 835a1cef5..95f0068ce 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -140,7 +140,4 @@ main().catch((e) => { console.error(e) process.exit(1) }) -function exitHook(arg0: () => void) { - throw new Error('Function not implemented.') -} From 4658f33b88c6dc423cff5eaa65253e108691f6ab Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 21 Oct 2025 08:19:09 +0200 Subject: [PATCH 43/72] fix backend test --- .../resolver/TransactionLinkResolver.ts | 2 +- .../graphql/resolver/TransactionResolver.ts | 5 +-- .../src/graphql/resolver/semaphore.test.ts | 38 +++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index 3756d3bd9..869104bae 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -396,8 +396,8 @@ export class TransactionLinkResolver { } return true } else { + const releaseLinkLock = await TRANSACTION_LINK_LOCK.acquire() const now = new Date() - const releaseLinkLock = await TRANSACTION_LINK_LOCK.acquire() try { const transactionLink = await DbTransactionLink.findOne({ where: { code } }) if (!transactionLink) { diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 505438f6a..0bd77166c 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -58,6 +58,8 @@ export const executeTransaction = async ( logger: Logger, transactionLink?: dbTransactionLink | null, ): Promise => { + // acquire lock + const releaseLock = await TRANSACTIONS_LOCK.acquire() const receivedCallDate = new Date() let dltTransactionPromise: Promise = Promise.resolve(null) if (!transactionLink) { @@ -66,9 +68,6 @@ export const executeTransaction = async ( dltTransactionPromise = redeemDeferredTransferTransaction(transactionLink, amount.toString(), receivedCallDate, recipient) } - // acquire lock - const releaseLock = await TRANSACTIONS_LOCK.acquire() - try { logger.info('executeTransaction', memo) diff --git a/backend/src/graphql/resolver/semaphore.test.ts b/backend/src/graphql/resolver/semaphore.test.ts index 9b4ec07df..d0bf08b7c 100644 --- a/backend/src/graphql/resolver/semaphore.test.ts +++ b/backend/src/graphql/resolver/semaphore.test.ts @@ -22,10 +22,12 @@ import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg' import { bobBaumeister } from '@/seeds/users/bob-baumeister' import { peterLustig } from '@/seeds/users/peter-lustig' import { CONFIG } from '@/config' +import { TRANSACTIONS_LOCK } from 'database' jest.mock('@/password/EncryptorUtils') CONFIG.DLT_CONNECTOR = false +CONFIG.EMAIL = false let mutate: ApolloServerTestClient['mutate'] let con: DataSource @@ -47,7 +49,43 @@ afterAll(async () => { await con.destroy() }) +type RunOrder = { [key: number]: { start: number, end: number } } +async function fakeWork(runOrder: RunOrder, index: number) { + const releaseLock = await TRANSACTIONS_LOCK.acquire() + const startDate = new Date() + await new Promise((resolve) => setTimeout(resolve, Math.random() * 50)) + const endDate = new Date() + runOrder[index] = { start: startDate.getTime(), end: endDate.getTime() } + releaseLock() +} + describe('semaphore', () => { + it("didn't should run in parallel", async () => { + const runOrder: RunOrder = {} + await Promise.all([ + fakeWork(runOrder, 1), + fakeWork(runOrder, 2), + fakeWork(runOrder, 3), + fakeWork(runOrder, 4), + fakeWork(runOrder, 5), + ]) + expect(runOrder[1].start).toBeLessThan(runOrder[1].end) + expect(runOrder[1].start).toBeLessThan(runOrder[2].start) + expect(runOrder[2].start).toBeLessThan(runOrder[2].end) + expect(runOrder[2].start).toBeLessThan(runOrder[3].start) + expect(runOrder[3].start).toBeLessThan(runOrder[3].end) + expect(runOrder[3].start).toBeLessThan(runOrder[4].start) + expect(runOrder[4].start).toBeLessThan(runOrder[4].end) + expect(runOrder[4].start).toBeLessThan(runOrder[5].start) + expect(runOrder[5].start).toBeLessThan(runOrder[5].end) + expect(runOrder[1].end).toBeLessThan(runOrder[2].end) + expect(runOrder[2].end).toBeLessThan(runOrder[3].end) + expect(runOrder[3].end).toBeLessThan(runOrder[4].end) + expect(runOrder[4].end).toBeLessThan(runOrder[5].end) + }) +}) + +describe('semaphore fullstack', () => { let contributionLinkCode = '' let bobsTransactionLinkCode = '' let bibisTransactionLinkCode = '' From ed94bb7ea0dd2ece9a6f4947fe3db5be25913308 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 21 Oct 2025 11:56:31 +0200 Subject: [PATCH 44/72] fix test, refactor --- .../client/GradidoNode/input.schema.test.ts | 8 +- .../src/client/GradidoNode/input.schema.ts | 4 +- dlt-connector/src/client/hiero/HieroClient.ts | 56 ++++--- dlt-connector/src/config/index.ts | 12 +- .../src/data/KeyPairIdentifier.logic.ts | 75 +++++---- dlt-connector/src/errors.ts | 7 + dlt-connector/src/index.ts | 18 +-- .../KeyPairCalculation.context.test.ts | 99 ------------ .../KeyPairCalculation.context.ts | 54 ------- .../AbstractKeyPair.role.ts | 0 .../AbstractRemoteKeyPair.role.ts | 0 .../AccountKeyPair.role.ts | 0 .../ForeignCommunityKeyPair.role.ts | 0 .../HomeCommunityKeyPair.role.ts | 0 .../LinkedTransactionKeyPair.role.ts | 0 .../RemoteAccountKeyPair.role.ts | 0 .../ResolveKeyPair.context.test.ts | 84 ++++++++++ .../resolveKeyPair/ResolveKeyPair.context.ts | 81 ++++++++++ .../UserKeyPair.role.ts | 0 .../UserKeyPairRole.test.ts | 0 .../CommunityRootTransaction.role.ts | 4 +- .../sendToHiero/CreationTransaction.role.ts | 15 +- .../DeferredTransferTransaction.role.ts | 9 +- .../RedeemDeferredTransferTransaction.role.ts | 6 +- .../RegisterAddressTransaction.role.test.ts | 38 +++-- .../RegisterAddressTransaction.role.ts | 10 +- .../sendToHiero/SendToHiero.context.ts | 144 ++++++++++------- .../sendToHiero/TransferTransaction.role.ts | 6 +- dlt-connector/src/schemas/account.schema.ts | 9 +- .../src/schemas/transaction.schema.test.ts | 25 +-- .../src/schemas/transaction.schema.ts | 9 +- .../src/schemas/typeConverter.schema.test.ts | 54 ++++--- dlt-connector/src/schemas/typeGuard.schema.ts | 67 ++++---- dlt-connector/src/server/index.test.ts | 39 +++-- dlt-connector/src/server/index.ts | 147 ++++++++++++------ dlt-connector/src/server/input.schema.ts | 6 +- 36 files changed, 617 insertions(+), 469 deletions(-) delete mode 100644 dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts delete mode 100644 dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/AbstractKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/AbstractRemoteKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/AccountKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/ForeignCommunityKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/HomeCommunityKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/LinkedTransactionKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/RemoteAccountKeyPair.role.ts (100%) create mode 100644 dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts create mode 100644 dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/UserKeyPair.role.ts (100%) rename dlt-connector/src/interactions/{keyPairCalculation => resolveKeyPair}/UserKeyPairRole.test.ts (100%) diff --git a/dlt-connector/src/client/GradidoNode/input.schema.test.ts b/dlt-connector/src/client/GradidoNode/input.schema.test.ts index 1268290fc..b4c86326e 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.test.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.test.ts @@ -2,18 +2,18 @@ import { beforeAll, describe, expect, it } from 'bun:test' import { parse } from 'valibot' import { HieroId, - HieroTransactionId, + HieroTransactionIdString, hieroIdSchema, - hieroTransactionIdSchema, + hieroTransactionIdStringSchema, } from '../../schemas/typeGuard.schema' import { transactionIdentifierSchema } from './input.schema' let topic: HieroId const topicString = '0.0.261' -let hieroTransactionId: HieroTransactionId +let hieroTransactionId: HieroTransactionIdString beforeAll(() => { topic = parse(hieroIdSchema, topicString) - hieroTransactionId = parse(hieroTransactionIdSchema, '0.0.261-1755348116-1281621') + hieroTransactionId = parse(hieroTransactionIdStringSchema, '0.0.261-1755348116-1281621') }) describe('transactionIdentifierSchema ', () => { diff --git a/dlt-connector/src/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts index baa075baf..16a8643f5 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -1,5 +1,5 @@ import * as v from 'valibot' -import { hieroIdSchema, hieroTransactionIdSchema } from '../../schemas/typeGuard.schema' +import { hieroIdSchema, hieroTransactionIdStringSchema } from '../../schemas/typeGuard.schema' export const transactionsRangeSchema = v.object({ // default value is 1, from first transactions @@ -18,7 +18,7 @@ export const transactionIdentifierSchema = v.pipe( v.pipe(v.number('expect number type'), v.minValue(1, 'expect number >= 1')), undefined, ), - hieroTransactionId: v.nullish(hieroTransactionIdSchema, undefined), + hieroTransactionId: v.nullish(hieroTransactionIdStringSchema, undefined), topic: hieroIdSchema, }), v.custom((value: any) => { diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index 92a994345..a22e8f27b 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -62,7 +62,9 @@ export class HieroClient { this.logger.info(`waiting for ${this.pendingPromises.length} pending promises`) await Promise.all(this.pendingPromises) const endTime = new Date() - this.logger.info(`all pending promises resolved, used time: ${endTime.getTime() - startTime.getTime()}ms`) + this.logger.info( + `all pending promises resolved, used time: ${endTime.getTime() - startTime.getTime()}ms`, + ) } public async sendMessage( @@ -85,28 +87,34 @@ export class HieroClient { }).freezeWithSigner(this.wallet) // sign and execute transaction needs some time, so let it run in background const pendingPromiseIndex = this.pendingPromises.push( - hieroTransaction.signWithSigner(this.wallet).then(async (signedHieroTransaction) => { - const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) - logger.info(`message sent to topic ${topicId}, transaction id: ${sendResponse.transactionId.toString()}`) - if (logger.isInfoEnabled()) { - // only for logging - sendResponse.getReceiptWithSigner(this.wallet).then((receipt) => { - logger.info( - `message send status: ${receipt.status.toString()}`, - ) - }) - // only for logging - sendResponse.getRecordWithSigner(this.wallet).then((record) => { - logger.info(`message sent, cost: ${record.transactionFee.toString()}`) - const localEndTime = new Date() - logger.info(`HieroClient.sendMessage used time (full process): ${localEndTime.getTime() - startTime.getTime()}ms`) - }) - } - }).catch((e) => { - logger.error(e) - }).finally(() => { - this.pendingPromises.splice(pendingPromiseIndex, 1) - }) + hieroTransaction + .signWithSigner(this.wallet) + .then(async (signedHieroTransaction) => { + const sendResponse = await signedHieroTransaction.executeWithSigner(this.wallet) + logger.info( + `message sent to topic ${topicId}, transaction id: ${sendResponse.transactionId.toString()}`, + ) + if (logger.isInfoEnabled()) { + // only for logging + sendResponse.getReceiptWithSigner(this.wallet).then((receipt) => { + logger.info(`message send status: ${receipt.status.toString()}`) + }) + // only for logging + sendResponse.getRecordWithSigner(this.wallet).then((record) => { + logger.info(`message sent, cost: ${record.transactionFee.toString()}`) + const localEndTime = new Date() + logger.info( + `HieroClient.sendMessage used time (full process): ${localEndTime.getTime() - startTime.getTime()}ms`, + ) + }) + } + }) + .catch((e) => { + logger.error(e) + }) + .finally(() => { + this.pendingPromises.splice(pendingPromiseIndex, 1) + }), ) const endTime = new Date() logger.info(`HieroClient.sendMessage used time: ${endTime.getTime() - startTime.getTime()}ms`) @@ -148,7 +156,7 @@ export class HieroClient { autoRenewPeriod: undefined, autoRenewAccountId: undefined, }) - + transaction = await transaction.freezeWithSigner(this.wallet) transaction = await transaction.signWithSigner(this.wallet) const createResponse = await transaction.executeWithSigner(this.wallet) diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 164b78601..10e3cea39 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -1,5 +1,5 @@ import dotenv from 'dotenv' -import { parse, InferOutput, ValiError } from 'valibot' +import { InferOutput, parse, ValiError } from 'valibot' import { configSchema } from './schema' dotenv.config() @@ -8,15 +8,17 @@ type ConfigOutput = InferOutput let config: ConfigOutput try { - console.info('Config loading...') config = parse(configSchema, process.env) -} catch (error: Error | unknown) { +} catch (error) { if (error instanceof ValiError) { - console.error(`${error.issues[0].path[0].key}: ${error.message} received: ${error.issues[0].received}`) + // biome-ignore lint/suspicious/noConsole: need to parse config before initializing logger + console.error( + `${error.issues[0].path[0].key}: ${error.message} received: ${error.issues[0].received}`, + ) } else { + // biome-ignore lint/suspicious/noConsole: need to parse config before initializing logger console.error(error) } - // console.error('Config error:', JSON.stringify(error, null, 2)) process.exit(1) } diff --git a/dlt-connector/src/data/KeyPairIdentifier.logic.ts b/dlt-connector/src/data/KeyPairIdentifier.logic.ts index c64dda299..7ae40ea99 100644 --- a/dlt-connector/src/data/KeyPairIdentifier.logic.ts +++ b/dlt-connector/src/data/KeyPairIdentifier.logic.ts @@ -1,8 +1,25 @@ import { MemoryBlock } from 'gradido-blockchain-js' -import { ParameterError } from '../errors' +import { InvalidCallError, ParameterError } from '../errors' import { IdentifierKeyPair } from '../schemas/account.schema' -import { HieroId } from '../schemas/typeGuard.schema' +import { HieroId, IdentifierSeed, Uuidv4 } from '../schemas/typeGuard.schema' +/** + * @DCI-Logic + * Domain logic for identifying and classifying key pairs used in the Gradido blockchain. + * + * This logic determines the type of key pair (community, user, account, or seed) + * and provides deterministic methods for deriving consistent cache keys and hashes. + * It is pure, stateless, and guaranteed to operate on validated input + * (checked beforehand by Valibot using {@link identifierKeyPairSchema}). + * + * Responsibilities: + * - Identify key pair type via `isCommunityKeyPair()`, `isUserKeyPair()`, `isAccountKeyPair()`, or `isSeedKeyPair()` + * - Provide derived deterministic keys for caching or retrieval + * (e.g. `getCommunityUserKey()`, `getCommunityUserAccountKey()`) + * - or simple: `getKey()` if you don't need to know the details + * - Ensure that invalid method calls throw precise domain-specific errors + * (`InvalidCallError` for misuse, `ParameterError` for unexpected input) + */ export class KeyPairIdentifierLogic { public constructor(public identifier: IdentifierKeyPair) {} @@ -30,33 +47,27 @@ export class KeyPairIdentifierLogic { ) } - getSeed(): string { + getSeed(): IdentifierSeed { if (!this.identifier.seed) { - throw new Error( - 'get seed called on non seed key pair identifier, please check first with isSeedKeyPair()', - ) + throw new InvalidCallError('Invalid call: getSeed() on non-seed identifier') } - return this.identifier.seed.seed + return this.identifier.seed } getCommunityTopicId(): HieroId { return this.identifier.communityTopicId } - getUserUuid(): string { + getUserUuid(): Uuidv4 { if (!this.identifier.account) { - throw new Error( - 'get user uuid called on non user key pair identifier, please check first with isUserKeyPair() or isAccountKeyPair()', - ) + throw new InvalidCallError('Invalid call: getUserUuid() on non-user identifier') } return this.identifier.account.userUuid } getAccountNr(): number { - if (!this.identifier.account?.accountNr) { - throw new Error( - 'get account nr called on non account key pair identifier, please check first with isAccountKeyPair()', - ) + if (!this.identifier.account) { + throw new InvalidCallError('Invalid call: getAccountNr() on non-account identifier') } return this.identifier.account.accountNr } @@ -64,32 +75,36 @@ export class KeyPairIdentifierLogic { getSeedKey(): string { return this.getSeed() } - getCommunityKey(): HieroId { + getCommunityKey(): string { return this.getCommunityTopicId() } getCommunityUserKey(): string { - return this.createCommunityUserHash() + return this.deriveCommunityUserHash() } getCommunityUserAccountKey(): string { - return this.createCommunityUserHash() + this.getAccountNr().toString() + return this.deriveCommunityUserHash() + this.getAccountNr().toString() } getKey(): string { - if (this.isSeedKeyPair()) { - return this.getSeedKey() - } else if (this.isCommunityKeyPair()) { - return this.getCommunityKey() - } else if (this.isUserKeyPair()) { - return this.getCommunityUserKey() - } else if (this.isAccountKeyPair()) { - return this.getCommunityUserAccountKey() + switch (true) { + case this.isSeedKeyPair(): + return this.getSeedKey() + case this.isCommunityKeyPair(): + return this.getCommunityKey() + case this.isUserKeyPair(): + return this.getCommunityUserKey() + case this.isAccountKeyPair(): + return this.getCommunityUserAccountKey() + default: + throw new ParameterError('KeyPairIdentifier: unhandled input constellation') } - throw new ParameterError('KeyPairIdentifier: unhandled input type') } - private createCommunityUserHash(): string { - if (!this.identifier.account?.userUuid || !this.identifier.communityTopicId) { - throw new ParameterError('userUuid and/or communityTopicId is undefined') + private deriveCommunityUserHash(): string { + if (!this.identifier.account) { + throw new InvalidCallError( + 'Invalid call: getCommunityUserKey or getCommunityUserAccountKey() on non-user/non-account identifier', + ) } const resultString = this.identifier.communityTopicId + this.identifier.account.userUuid.replace(/-/g, '') diff --git a/dlt-connector/src/errors.ts b/dlt-connector/src/errors.ts index 3bedb023a..907048f5a 100644 --- a/dlt-connector/src/errors.ts +++ b/dlt-connector/src/errors.ts @@ -55,3 +55,10 @@ export class ParameterError extends Error { this.name = 'ParameterError' } } + +export class InvalidCallError extends Error { + constructor(message: string) { + super(message) + this.name = 'InvalidCallError' + } +} diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 95f0068ce..2a681d300 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -7,6 +7,7 @@ import { BackendClient } from './client/backend/BackendClient' import { GradidoNodeClient } from './client/GradidoNode/GradidoNodeClient' import { HieroClient } from './client/hiero/HieroClient' import { CONFIG } from './config' +import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from './config/const' import { SendToHieroContext } from './interactions/sendToHiero/SendToHiero.context' import { KeyPairCacheManager } from './KeyPairCacheManager' import { Community, communitySchema } from './schemas/transaction.schema' @@ -52,7 +53,7 @@ async function main() { function setupGracefulShutdown(logger: Logger) { const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'] - signals.forEach(sig => { + signals.forEach((sig) => { process.on(sig, async () => { logger.info(`[shutdown] Got ${sig}, cleaning up…`) await gracefulShutdown(logger) @@ -60,13 +61,13 @@ function setupGracefulShutdown(logger: Logger) { }) }) - if (process.platform === "win32") { - const rl = require("readline").createInterface({ + if (process.platform === 'win32') { + const rl = require('readline').createInterface({ input: process.stdin, output: process.stdout, }) - rl.on("SIGINT", () => { - process.emit("SIGINT" as any) + rl.on('SIGINT', () => { + process.emit('SIGINT' as any) }) } } @@ -113,8 +114,8 @@ async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): } else { // if topic exist, check if we need to update it let topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) - console.log(`topicInfo: ${JSON.stringify(topicInfo, null, 2)}`) - /*if ( + // console.log(`topicInfo: ${JSON.stringify(topicInfo, null, 2)}`) + if ( topicInfo.expirationTime.getTime() - new Date().getTime() < MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE ) { @@ -123,7 +124,7 @@ async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): logger.info( `updated topic info, new expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, ) - }*/ + } } if (!homeCommunity.hieroTopicId) { throw new Error('still no topic id, after creating topic and update community in backend.') @@ -140,4 +141,3 @@ main().catch((e) => { console.error(e) process.exit(1) }) - diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts deleted file mode 100644 index 7c7103d94..000000000 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { describe, it, expect, mock, beforeAll, afterAll } from 'bun:test' -import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { KeyPairCalculation } from './KeyPairCalculation.context' -import { parse } from 'valibot' -import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' -import { KeyPairCacheManager } from '../../KeyPairCacheManager' -import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' -import { identifierKeyPairSchema } from '../../schemas/account.schema' -/* -// Mock JsonRpcClient -const mockRpcCall = mock((params) => { - console.log('mockRpcCall', params) - return { - isSuccess: () => false, - isError: () => true, - error: { - code: GradidoNodeErrorCodes.TRANSACTION_NOT_FOUND - } - } -}) -const mockRpcCallResolved = mock() - -mock.module('../../utils/network', () => ({ - isPortOpenRetry: async () => true, -})) - -mock.module('jsonrpc-ts-client', () => { - return { - default: class MockJsonRpcClient { - constructor() {} - exec = mockRpcCall - }, - } -}) -*/ - -mock.module('../../KeyPairCacheManager', () => { - let homeCommunityTopicId: HieroId | undefined - return { - KeyPairCacheManager: { - getInstance: () => ({ - setHomeCommunityTopicId: (topicId: HieroId) => { - homeCommunityTopicId = topicId - }, - getHomeCommunityTopicId: () => homeCommunityTopicId, - getKeyPair: (key: string, create: () => KeyPairEd25519) => { - return create() - }, - }), - }, - } -}) - -mock.module('../../config', () => ({ - CONFIG: { - HOME_COMMUNITY_SEED: MemoryBlock.fromHex('0102030401060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fe7'), - }, -})) - -const topicId = '0.0.21732' -const userUuid = 'aa25cf6f-2879-4745-b2ea-6d3c37fb44b0' - -console.log('userUuid', userUuid) - -afterAll(() => { - mock.restore() -}) - -describe('KeyPairCalculation', () => { - beforeAll(() => { - KeyPairCacheManager.getInstance().setHomeCommunityTopicId(parse(hieroIdSchema, '0.0.21732')) - }) - it('community key pair', async () => { - const identifier = new KeyPairIdentifierLogic(parse(identifierKeyPairSchema, { communityTopicId: topicId })) - const keyPair = await KeyPairCalculation(identifier) - expect(keyPair.getPublicKey()?.convertToHex()).toBe('7bcb0d0ad26d3f7ba597716c38a570220cece49b959e57927ee0c39a5a9c3adf') - }) - it('user key pair', async () => { - const identifier = new KeyPairIdentifierLogic(parse(identifierKeyPairSchema, { - communityTopicId: topicId, - account: { userUuid } - })) - expect(identifier.isAccountKeyPair()).toBe(false) - expect(identifier.isUserKeyPair()).toBe(true) - const keyPair = await KeyPairCalculation(identifier) - expect(keyPair.getPublicKey()?.convertToHex()).toBe('d61ae86c262fc0b5d763a8f41a03098fae73a7649a62aac844378a0eb0055921') - }) - - it('account key pair', async () => { - const identifier = new KeyPairIdentifierLogic(parse(identifierKeyPairSchema, { - communityTopicId: topicId, - account: { userUuid, accountNr: 1 } - })) - expect(identifier.isAccountKeyPair()).toBe(true) - expect(identifier.isUserKeyPair()).toBe(false) - const keyPair = await KeyPairCalculation(identifier) - expect(keyPair.getPublicKey()?.convertToHex()).toBe('6cffb0ee0b20dae828e46f2e003f78ac57b85e7268e587703932f06e1b2daee4') - }) -}) diff --git a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts b/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts deleted file mode 100644 index 883b214e8..000000000 --- a/dlt-connector/src/interactions/keyPairCalculation/KeyPairCalculation.context.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { KeyPairEd25519 } from 'gradido-blockchain-js' - -import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { KeyPairCacheManager } from '../../KeyPairCacheManager' -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' - -/** - * @DCI-Context - * Context for calculating key pair for signing transactions - */ -export async function KeyPairCalculation(input: KeyPairIdentifierLogic): Promise { - const cache = KeyPairCacheManager.getInstance() - return await cache.getKeyPair(input.getKey(), async () => { - if (input.isSeedKeyPair()) { - return new LinkedTransactionKeyPairRole(input.getSeed()).generateKeyPair() - } - // If input does not belong to the home community, handle as remote key pair - if (cache.getHomeCommunityTopicId() !== input.getCommunityTopicId()) { - const role = input.isAccountKeyPair() - ? new RemoteAccountKeyPairRole(input.identifier) - : new ForeignCommunityKeyPairRole(input.getCommunityTopicId()) - return await role.retrieveKeyPair() - } - const communityKeyPair = await cache.getKeyPair(input.getCommunityKey(), async () => { - return new HomeCommunityKeyPairRole().generateKeyPair() - }) - if (!communityKeyPair) { - throw new Error("couldn't generate community key pair") - } - if (input.isCommunityKeyPair()) { - return communityKeyPair - } - const userKeyPair = await cache.getKeyPair(input.getCommunityUserKey(), async () => { - return new UserKeyPairRole(input.getUserUuid(), communityKeyPair).generateKeyPair() - }) - if (!userKeyPair) { - throw new Error("couldn't generate user key pair") - } - if (input.isUserKeyPair()) { - return userKeyPair - } - const accountNr = input.getAccountNr() - const accountKeyPair = new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() - if (input.isAccountKeyPair()) { - return accountKeyPair - } - throw new Error("couldn't generate account key pair, unexpected type") - }) -} diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/AbstractKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/AbstractKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/AbstractKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/AbstractRemoteKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/AbstractRemoteKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/AbstractRemoteKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/AccountKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/AccountKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/AccountKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/ForeignCommunityKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/ForeignCommunityKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/ForeignCommunityKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/HomeCommunityKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/HomeCommunityKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/HomeCommunityKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/LinkedTransactionKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/LinkedTransactionKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/LinkedTransactionKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/RemoteAccountKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/RemoteAccountKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/RemoteAccountKeyPair.role.ts diff --git a/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts new file mode 100644 index 000000000..6d208eaff --- /dev/null +++ b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts @@ -0,0 +1,84 @@ +import { afterAll, beforeAll, describe, expect, it, mock } from 'bun:test' +import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' +import { parse } from 'valibot' +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { KeyPairCacheManager } from '../../KeyPairCacheManager' +import { identifierKeyPairSchema } from '../../schemas/account.schema' +import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' +import { ResolveKeyPair } from './ResolveKeyPair.context' + +mock.module('../../KeyPairCacheManager', () => { + let homeCommunityTopicId: HieroId | undefined + return { + KeyPairCacheManager: { + getInstance: () => ({ + setHomeCommunityTopicId: (topicId: HieroId) => { + homeCommunityTopicId = topicId + }, + getHomeCommunityTopicId: () => homeCommunityTopicId, + getKeyPair: (key: string, create: () => KeyPairEd25519) => { + return create() + }, + }), + }, + } +}) + +mock.module('../../config', () => ({ + CONFIG: { + HOME_COMMUNITY_SEED: MemoryBlock.fromHex( + '0102030401060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fe7', + ), + }, +})) + +const topicId = '0.0.21732' +const userUuid = 'aa25cf6f-2879-4745-b2ea-6d3c37fb44b0' + +afterAll(() => { + mock.restore() +}) + +describe('KeyPairCalculation', () => { + beforeAll(() => { + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(parse(hieroIdSchema, '0.0.21732')) + }) + it('community key pair', async () => { + const identifier = new KeyPairIdentifierLogic( + parse(identifierKeyPairSchema, { communityTopicId: topicId }), + ) + const keyPair = await ResolveKeyPair(identifier) + expect(keyPair.getPublicKey()?.convertToHex()).toBe( + '7bcb0d0ad26d3f7ba597716c38a570220cece49b959e57927ee0c39a5a9c3adf', + ) + }) + it('user key pair', async () => { + const identifier = new KeyPairIdentifierLogic( + parse(identifierKeyPairSchema, { + communityTopicId: topicId, + account: { userUuid }, + }), + ) + expect(identifier.isAccountKeyPair()).toBe(false) + expect(identifier.isUserKeyPair()).toBe(true) + const keyPair = await ResolveKeyPair(identifier) + expect(keyPair.getPublicKey()?.convertToHex()).toBe( + 'd61ae86c262fc0b5d763a8f41a03098fae73a7649a62aac844378a0eb0055921', + ) + }) + + it('account key pair', async () => { + const identifier = new KeyPairIdentifierLogic( + parse(identifierKeyPairSchema, { + communityTopicId: topicId, + account: { userUuid, accountNr: 1 }, + }), + ) + expect(identifier.isAccountKeyPair()).toBe(true) + expect(identifier.isUserKeyPair()).toBe(false) + const keyPair = await ResolveKeyPair(identifier) + expect(keyPair.getPublicKey()?.convertToHex()).toBe( + '6cffb0ee0b20dae828e46f2e003f78ac57b85e7268e587703932f06e1b2daee4', + ) + }) +}) diff --git a/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts new file mode 100644 index 000000000..2fbdd906c --- /dev/null +++ b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts @@ -0,0 +1,81 @@ +import { KeyPairEd25519 } from 'gradido-blockchain-js' + +import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' +import { KeyPairCacheManager } from '../../KeyPairCacheManager' +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' + +/** + * @DCI-Context + * Context for resolving the correct KeyPair for signing Gradido transactions. + * + * The context determines — based on the given {@link KeyPairIdentifierLogic} — + * which kind of KeyPair is required (community, user, account, remote, etc.). + * + * It first attempts to retrieve the KeyPair from the global {@link KeyPairCacheManager}. + * If no cached KeyPair exists, it dynamically generates or fetches it using the appropriate Role: + * - {@link LinkedTransactionKeyPairRole} for seed-based keys + * - {@link RemoteAccountKeyPairRole} or {@link ForeignCommunityKeyPairRole} for remote communities + * - {@link HomeCommunityKeyPairRole} for local community keys + * - {@link UserKeyPairRole} and {@link AccountKeyPairRole} for user and account levels + * + * Once generated, the KeyPair is stored in the cache for future reuse. + * + * @param input - Key pair identification logic containing all attributes + * (communityTopicId, userUuid, accountNr, seed, etc.) + * @returns The resolved {@link KeyPairEd25519} for the given input. + * + * @throws Error if the required KeyPair cannot be generated or resolved. + */ +export async function ResolveKeyPair(input: KeyPairIdentifierLogic): Promise { + const cache = KeyPairCacheManager.getInstance() + + return await cache.getKeyPair( + input.getKey(), + // function is called from cache manager, if key isn't currently cached + async () => { + // Seed (from linked transactions) + if (input.isSeedKeyPair()) { + return new LinkedTransactionKeyPairRole(input.getSeed()).generateKeyPair() + } + // Remote community branch + if (cache.getHomeCommunityTopicId() !== input.getCommunityTopicId()) { + const role = input.isAccountKeyPair() + ? new RemoteAccountKeyPairRole(input.identifier) + : new ForeignCommunityKeyPairRole(input.getCommunityTopicId()) + return await role.retrieveKeyPair() + } + // Community + const communityKeyPair = await cache.getKeyPair(input.getCommunityKey(), async () => { + return new HomeCommunityKeyPairRole().generateKeyPair() + }) + if (!communityKeyPair) { + throw new Error("couldn't generate community key pair") + } + if (input.isCommunityKeyPair()) { + return communityKeyPair + } + // User + const userKeyPair = await cache.getKeyPair(input.getCommunityUserKey(), async () => { + return new UserKeyPairRole(input.getUserUuid(), communityKeyPair).generateKeyPair() + }) + if (!userKeyPair) { + throw new Error("couldn't generate user key pair") + } + if (input.isUserKeyPair()) { + return userKeyPair + } + // Account + const accountNr = input.getAccountNr() + const accountKeyPair = new AccountKeyPairRole(accountNr, userKeyPair).generateKeyPair() + if (input.isAccountKeyPair()) { + return accountKeyPair + } + throw new Error("couldn't generate account key pair, unexpected type") + }, + ) +} diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts b/dlt-connector/src/interactions/resolveKeyPair/UserKeyPair.role.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/UserKeyPair.role.ts rename to dlt-connector/src/interactions/resolveKeyPair/UserKeyPair.role.ts diff --git a/dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts b/dlt-connector/src/interactions/resolveKeyPair/UserKeyPairRole.test.ts similarity index 100% rename from dlt-connector/src/interactions/keyPairCalculation/UserKeyPairRole.test.ts rename to dlt-connector/src/interactions/resolveKeyPair/UserKeyPairRole.test.ts diff --git a/dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts index 34299683a..6207e28ec 100644 --- a/dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/CommunityRootTransaction.role.ts @@ -8,7 +8,7 @@ import { GMW_ACCOUNT_DERIVATION_INDEX, hardenDerivationIndex, } from '../../utils/derivationHelper' -import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' +import { ResolveKeyPair } from '../resolveKeyPair/ResolveKeyPair.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class CommunityRootTransactionRole extends AbstractTransactionRole { @@ -26,7 +26,7 @@ export class CommunityRootTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() - const communityKeyPair = await KeyPairCalculation( + const communityKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic({ communityTopicId: this.community.hieroTopicId }), ) const gmwKeyPair = communityKeyPair.deriveChild( diff --git a/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts index fd70682ea..d11b031e2 100644 --- a/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts @@ -13,7 +13,7 @@ import { Transaction, } from '../../schemas/transaction.schema' import { HieroId } from '../../schemas/typeGuard.schema' -import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' +import { ResolveKeyPair } from '../resolveKeyPair/ResolveKeyPair.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class CreationTransactionRole extends AbstractTransactionRole { @@ -21,12 +21,7 @@ export class CreationTransactionRole extends AbstractTransactionRole { private readonly creationTransaction: CreationTransaction constructor(transaction: Transaction) { super() - try { - this.creationTransaction = parse(creationTransactionSchema, transaction) - } catch (error) { - console.error('creation: invalid transaction', JSON.stringify(error, null, 2)) - throw new Error('creation: invalid transaction') - } + this.creationTransaction = parse(creationTransactionSchema, transaction) this.homeCommunityTopicId = KeyPairCacheManager.getInstance().getHomeCommunityTopicId() if ( this.homeCommunityTopicId !== this.creationTransaction.user.communityTopicId || @@ -47,14 +42,14 @@ export class CreationTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // Recipient: user (account owner) - const recipientKeyPair = await KeyPairCalculation( + const recipientKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic(this.creationTransaction.user), ) // Signer: linkedUser (admin/moderator) - const signerKeyPair = await KeyPairCalculation( + const signerKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic(this.creationTransaction.linkedUser), ) - const homeCommunityKeyPair = await KeyPairCalculation( + const homeCommunityKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic({ communityTopicId: this.homeCommunityTopicId, }), diff --git a/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts index 36569d708..ac0b924f6 100644 --- a/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts @@ -7,14 +7,13 @@ import { } from 'gradido-blockchain-js' import { parse } from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { IdentifierSeed, identifierSeedSchema } from '../../schemas/account.schema' import { DeferredTransferTransaction, deferredTransferTransactionSchema, Transaction, } from '../../schemas/transaction.schema' -import { HieroId } from '../../schemas/typeGuard.schema' -import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' +import { HieroId, IdentifierSeed, identifierSeedSchema } from '../../schemas/typeGuard.schema' +import { ResolveKeyPair } from '../resolveKeyPair/ResolveKeyPair.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class DeferredTransferTransactionRole extends AbstractTransactionRole { @@ -36,10 +35,10 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() - const senderKeyPair = await KeyPairCalculation( + const senderKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic(this.deferredTransferTransaction.user), ) - const recipientKeyPair = await KeyPairCalculation( + const recipientKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic({ communityTopicId: this.deferredTransferTransaction.linkedUser.communityTopicId, seed: this.seed, diff --git a/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts index a91990360..76d621762 100644 --- a/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts @@ -9,7 +9,7 @@ import { UserAccount, } from '../../schemas/transaction.schema' import { HieroId } from '../../schemas/typeGuard.schema' -import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' +import { ResolveKeyPair } from '../resolveKeyPair/ResolveKeyPair.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRole { @@ -34,7 +34,7 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() - const senderKeyPair = await KeyPairCalculation( + const senderKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic(this.redeemDeferredTransferTransaction.user), ) const senderPublicKey = senderKeyPair.getPublicKey() @@ -56,7 +56,7 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo "redeem deferred transfer: couldn't deserialize deferred transfer from Gradido Node", ) } - const recipientKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(this.linkedUser)) + const recipientKeyPair = await ResolveKeyPair(new KeyPairIdentifierLogic(this.linkedUser)) builder .setCreatedAt(this.redeemDeferredTransferTransaction.createdAt) diff --git a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts index 032ec5eec..968a3c992 100644 --- a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts @@ -1,11 +1,9 @@ -import { describe, it, expect } from 'bun:test' -import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' -import { parse } from 'valibot' -import { - transactionSchema, -} from '../../schemas/transaction.schema' -import { hieroIdSchema } from '../../schemas/typeGuard.schema' +import { describe, expect, it } from 'bun:test' import { InteractionToJson, InteractionValidate, ValidateType_SINGLE } from 'gradido-blockchain-js' +import { parse } from 'valibot' +import { transactionSchema } from '../../schemas/transaction.schema' +import { hieroIdSchema } from '../../schemas/typeGuard.schema' +import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' const userUuid = '408780b2-59b3-402a-94be-56a4f4f4e8ec' const transaction = { @@ -21,15 +19,21 @@ const transaction = { createdAt: '2022-01-01T00:00:00.000Z', } -describe('RegisterAddressTransaction.role', () => { +describe('RegisterAddressTransaction.role', () => { it('get correct prepared builder', async () => { - const registerAddressTransactionRole = new RegisterAddressTransactionRole(parse(transactionSchema, transaction)) - expect(registerAddressTransactionRole.getSenderCommunityTopicId()).toBe(parse(hieroIdSchema, '0.0.21732')) - expect(() => registerAddressTransactionRole.getRecipientCommunityTopicId()).toThrow() - const builder = await registerAddressTransactionRole.getGradidoTransactionBuilder() - const gradidoTransaction = builder.build() - expect(() => new InteractionValidate(gradidoTransaction).run(ValidateType_SINGLE)).not.toThrow() - const json = JSON.parse(new InteractionToJson(gradidoTransaction).run()) - expect(json.bodyBytes.json.registerAddress.nameHash).toBe('bac2c06682808947f140d6766d02943761d4129ec055bb1f84dc3a4201a94c08') + const registerAddressTransactionRole = new RegisterAddressTransactionRole( + parse(transactionSchema, transaction), + ) + expect(registerAddressTransactionRole.getSenderCommunityTopicId()).toBe( + parse(hieroIdSchema, '0.0.21732'), + ) + expect(() => registerAddressTransactionRole.getRecipientCommunityTopicId()).toThrow() + const builder = await registerAddressTransactionRole.getGradidoTransactionBuilder() + const gradidoTransaction = builder.build() + expect(() => new InteractionValidate(gradidoTransaction).run(ValidateType_SINGLE)).not.toThrow() + const json = JSON.parse(new InteractionToJson(gradidoTransaction).run()) + expect(json.bodyBytes.json.registerAddress.nameHash).toBe( + 'bac2c06682808947f140d6766d02943761d4129ec055bb1f84dc3a4201a94c08', + ) }) -}) \ No newline at end of file +}) diff --git a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts index 32f78bac1..8f0f50e6b 100644 --- a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts @@ -12,7 +12,7 @@ import { Transaction, } from '../../schemas/transaction.schema' import { HieroId } from '../../schemas/typeGuard.schema' -import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' +import { ResolveKeyPair } from '../resolveKeyPair/ResolveKeyPair.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class RegisterAddressTransactionRole extends AbstractTransactionRole { @@ -35,15 +35,13 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() const communityTopicId = this.registerAddressTransaction.user.communityTopicId - const communityKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic({ communityTopicId })) + const communityKeyPair = await ResolveKeyPair(new KeyPairIdentifierLogic({ communityTopicId })) const keyPairIdentifier = this.registerAddressTransaction.user // when accountNr is 0 it is the user account keyPairIdentifier.account.accountNr = 0 - const userKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(keyPairIdentifier)) + const userKeyPair = await ResolveKeyPair(new KeyPairIdentifierLogic(keyPairIdentifier)) keyPairIdentifier.account.accountNr = 1 - const accountKeyPair = await KeyPairCalculation( - new KeyPairIdentifierLogic(keyPairIdentifier), - ) + const accountKeyPair = await ResolveKeyPair(new KeyPairIdentifierLogic(keyPairIdentifier)) builder .setCreatedAt(this.registerAddressTransaction.createdAt) diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index 5061233be..e3ab0b7ed 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -1,24 +1,25 @@ import { GradidoTransaction, + HieroTransactionId, + InteractionSerialize, InteractionValidate, - MemoryBlock, ValidateType_SINGLE, } from 'gradido-blockchain-js' import { getLogger } from 'log4js' -import { parse, safeParse } from 'valibot' +import * as v from 'valibot' import { HieroClient } from '../../client/hiero/HieroClient' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { InputTransactionType } from '../../enum/InputTransactionType' import { - Community, + CommunityInput, communitySchema, - Transaction, + TransactionInput, transactionSchema, } from '../../schemas/transaction.schema' import { HieroId, - HieroTransactionId, - hieroTransactionIdSchema, + HieroTransactionIdString, + hieroTransactionIdStringSchema, } from '../../schemas/typeGuard.schema' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' @@ -36,70 +37,99 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToHiero.SendT * send every transaction only once to hiero! */ export async function SendToHieroContext( - input: Transaction | Community, -): Promise { - // let gradido blockchain validator run, it will throw an exception when something is wrong - const validate = (transaction: GradidoTransaction): void => { - const validator = new InteractionValidate(transaction) - validator.run(ValidateType_SINGLE) - } - - // send transaction as hiero topic message - const sendViaHiero = async ( - gradidoTransaction: GradidoTransaction, - topic: HieroId, - ): Promise => { - const client = HieroClient.getInstance() - const transactionId = await client.sendMessage(topic, gradidoTransaction) - if (!transactionId) { - throw new Error('missing transaction id from hiero') - } - logger.info('transmitted Gradido Transaction to Hiero', { transactionId: transactionId.toString() }) - return transactionId.toString() - } - - // choose correct role based on transaction type and input type - const chooseCorrectRole = (input: Transaction | Community): AbstractTransactionRole => { - const communityParsingResult = safeParse(communitySchema, input) - if (communityParsingResult.success) { - return new CommunityRootTransactionRole(communityParsingResult.output) - } - - const transaction = input as Transaction - switch (transaction.type) { - case InputTransactionType.GRADIDO_CREATION: - return new CreationTransactionRole(transaction) - case InputTransactionType.GRADIDO_TRANSFER: - return new TransferTransactionRole(transaction) - case InputTransactionType.REGISTER_ADDRESS: - return new RegisterAddressTransactionRole(transaction) - case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: - return new DeferredTransferTransactionRole(transaction) - case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: - return new RedeemDeferredTransferTransactionRole(transaction) - default: - throw new Error('not supported transaction type: ' + transaction.type) - } - } - + input: TransactionInput | CommunityInput, +): Promise { const role = chooseCorrectRole(input) const builder = await role.getGradidoTransactionBuilder() if (builder.isCrossCommunityTransaction()) { + // build cross group transaction const outboundTransaction = builder.buildOutbound() validate(outboundTransaction) - const outboundHieroTransactionId = await sendViaHiero( + + // send outbound transaction to hiero at first, because we need the transaction id for inbound transaction + const outboundHieroTransactionIdString = await sendViaHiero( outboundTransaction, role.getSenderCommunityTopicId(), ) - builder.setParentMessageId(MemoryBlock.createPtr(new MemoryBlock(outboundHieroTransactionId))) + + // serialize Hiero transaction ID and attach it to the builder for the inbound transaction + const transactionIdSerializer = new InteractionSerialize( + new HieroTransactionId(outboundHieroTransactionIdString), + ) + builder.setParentMessageId(transactionIdSerializer.run()) + + // build and validate inbound transaction const inboundTransaction = builder.buildInbound() validate(inboundTransaction) + + // send inbound transaction to hiero await sendViaHiero(inboundTransaction, role.getRecipientCommunityTopicId()) - return parse(hieroTransactionIdSchema, outboundHieroTransactionId) + return outboundHieroTransactionIdString } else { + // build and validate local transaction const transaction = builder.build() validate(transaction) - const hieroTransactionId = await sendViaHiero(transaction, role.getSenderCommunityTopicId()) - return parse(hieroTransactionIdSchema, hieroTransactionId) + + // send transaction to hiero + const hieroTransactionIdString = await sendViaHiero( + transaction, + role.getSenderCommunityTopicId(), + ) + return hieroTransactionIdString + } +} + +// let gradido blockchain validator run, it will throw an exception when something is wrong +function validate(transaction: GradidoTransaction): void { + const validator = new InteractionValidate(transaction) + validator.run(ValidateType_SINGLE) +} + +// send transaction as hiero topic message +async function sendViaHiero( + gradidoTransaction: GradidoTransaction, + topic: HieroId, +): Promise { + const client = HieroClient.getInstance() + const transactionId = await client.sendMessage(topic, gradidoTransaction) + if (!transactionId) { + throw new Error('missing transaction id from hiero') + } + logger.info('transmitted Gradido Transaction to Hiero', { + transactionId: transactionId.toString(), + }) + return v.parse(hieroTransactionIdStringSchema, transactionId.toString()) +} + +// choose correct role based on transaction type and input type +function chooseCorrectRole(input: TransactionInput | CommunityInput): AbstractTransactionRole { + const communityParsingResult = v.safeParse(communitySchema, input) + if (communityParsingResult.success) { + return new CommunityRootTransactionRole(communityParsingResult.output) + } + + const transactionParsingResult = v.safeParse(transactionSchema, input) + if (!transactionParsingResult.success) { + logger.error("error validating transaction, doesn't match any schema", { + transactionSchema: v.flatten(transactionParsingResult.issues), + communitySchema: v.flatten(communityParsingResult.issues), + }) + throw new Error('invalid input') + } + + const transaction = transactionParsingResult.output + switch (transaction.type) { + case InputTransactionType.GRADIDO_CREATION: + return new CreationTransactionRole(transaction) + case InputTransactionType.GRADIDO_TRANSFER: + return new TransferTransactionRole(transaction) + case InputTransactionType.REGISTER_ADDRESS: + return new RegisterAddressTransactionRole(transaction) + case InputTransactionType.GRADIDO_DEFERRED_TRANSFER: + return new DeferredTransferTransactionRole(transaction) + case InputTransactionType.GRADIDO_REDEEM_DEFERRED_TRANSFER: + return new RedeemDeferredTransferTransactionRole(transaction) + default: + throw new Error('not supported transaction type: ' + transaction.type) } } diff --git a/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts index 473bfbc1e..03d1480b9 100644 --- a/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts @@ -12,7 +12,7 @@ import { transferTransactionSchema, } from '../../schemas/transaction.schema' import { HieroId } from '../../schemas/typeGuard.schema' -import { KeyPairCalculation } from '../keyPairCalculation/KeyPairCalculation.context' +import { ResolveKeyPair } from '../resolveKeyPair/ResolveKeyPair.context' import { AbstractTransactionRole } from './AbstractTransaction.role' export class TransferTransactionRole extends AbstractTransactionRole { @@ -33,11 +33,11 @@ export class TransferTransactionRole extends AbstractTransactionRole { public async getGradidoTransactionBuilder(): Promise { const builder = new GradidoTransactionBuilder() // sender + signer - const senderKeyPair = await KeyPairCalculation( + const senderKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic(this.transferTransaction.user), ) // recipient - const recipientKeyPair = await KeyPairCalculation( + const recipientKeyPair = await ResolveKeyPair( new KeyPairIdentifierLogic(this.transferTransaction.linkedUser), ) diff --git a/dlt-connector/src/schemas/account.schema.ts b/dlt-connector/src/schemas/account.schema.ts index d1dbb4802..e328a2f90 100644 --- a/dlt-connector/src/schemas/account.schema.ts +++ b/dlt-connector/src/schemas/account.schema.ts @@ -1,12 +1,5 @@ import * as v from 'valibot' -import { hieroIdSchema, uuidv4Schema } from './typeGuard.schema' - -// use code from transaction links -export const identifierSeedSchema = v.object({ - seed: v.pipe(v.string('expect string type'), v.length(24, 'expect seed length 24')), -}) - -export type IdentifierSeed = v.InferOutput +import { hieroIdSchema, identifierSeedSchema, uuidv4Schema } from './typeGuard.schema' // identifier for gradido community accounts, inside a community export const identifierCommunityAccountSchema = v.object({ diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index 7d204dba5..de87cacfd 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -1,23 +1,28 @@ import { beforeAll, describe, expect, it } from 'bun:test' -import { TypeBoxFromValibot } from '@sinclair/typemap' import { TypeCompiler } from '@sinclair/typebox/compiler' +import { TypeBoxFromValibot } from '@sinclair/typemap' import { randomBytes } from 'crypto' +import { AddressType_COMMUNITY_HUMAN } from 'gradido-blockchain-js' import { v4 as uuidv4 } from 'uuid' import { parse } from 'valibot' +import { AccountType } from '../enum/AccountType' import { InputTransactionType } from '../enum/InputTransactionType' import { gradidoAmountSchema, HieroId, hieroIdSchema, + identifierSeedSchema, Memo, memoSchema, timeoutDurationSchema, Uuidv4, uuidv4Schema, } from '../schemas/typeGuard.schema' -import { registerAddressTransactionSchema, TransactionInput, transactionSchema } from './transaction.schema' -import { AccountType } from '../enum/AccountType' -import { AddressType_COMMUNITY_HUMAN } from 'gradido-blockchain-js' +import { + registerAddressTransactionSchema, + TransactionInput, + transactionSchema, +} from './transaction.schema' const transactionLinkCode = (date: Date): string => { const time = date.getTime().toString(16) @@ -91,7 +96,7 @@ describe('transaction schemas', () => { expect(check.Check(registerAddress)).toBe(true) }) }) - + it('valid, gradido transfer', () => { const gradidoTransfer: TransactionInput = { user: { @@ -162,6 +167,8 @@ describe('transaction schemas', () => { }) }) it('valid, gradido transaction link / deferred transfer', () => { + const seed = transactionLinkCode(new Date()) + const seedParsed = parse(identifierSeedSchema, seed) const gradidoTransactionLink: TransactionInput = { user: { communityTopicId: topicString, @@ -171,9 +178,7 @@ describe('transaction schemas', () => { }, linkedUser: { communityTopicId: topicString, - seed: { - seed: transactionLinkCode(new Date()), - }, + seed, }, amount: '100', memo: memoString, @@ -191,9 +196,7 @@ describe('transaction schemas', () => { }, linkedUser: { communityTopicId: topic, - seed: { - seed: gradidoTransactionLink.linkedUser!.seed!.seed, - }, + seed: seedParsed, }, amount: parse(gradidoAmountSchema, gradidoTransactionLink.amount!), memo, diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index 7c1855ec8..dea8c48dc 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -1,19 +1,16 @@ import * as v from 'valibot' +import { AccountType } from '../enum/AccountType' import { InputTransactionType } from '../enum/InputTransactionType' -import { - identifierAccountSchema, - identifierCommunityAccountSchema, - identifierSeedSchema, -} from './account.schema' +import { identifierAccountSchema, identifierCommunityAccountSchema } from './account.schema' import { addressTypeSchema, dateSchema } from './typeConverter.schema' import { gradidoAmountSchema, hieroIdSchema, + identifierSeedSchema, memoSchema, timeoutDurationSchema, uuidv4Schema, } from './typeGuard.schema' -import { AccountType } from '../enum/AccountType' /** * Schema for community, for creating new CommunityRoot Transaction on gradido blockchain diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index dd8944247..2caa499b5 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -1,7 +1,7 @@ -import { Static, TypeBoxFromValibot } from '@sinclair/typemap' -import { TypeCompiler } from '@sinclair/typebox/compiler' // only for IDE, bun don't need this to work import { describe, expect, it } from 'bun:test' +import { TypeCompiler } from '@sinclair/typebox/compiler' +import { Static, TypeBoxFromValibot } from '@sinclair/typemap' import { AddressType_COMMUNITY_AUF } from 'gradido-blockchain-js' import * as v from 'valibot' import { AccountType } from '../enum/AccountType' @@ -26,25 +26,25 @@ describe('basic.schema', () => { expect(() => v.parse(dateSchema, 'invalid date')).toThrow(new Error('invalid date')) }) it('with type box', () => { - // Derive TypeBox Schema from the Valibot Schema - const DateSchema = TypeBoxFromValibot(dateSchema) + // Derive TypeBox Schema from the Valibot Schema + const DateSchema = TypeBoxFromValibot(dateSchema) - // Build the compiler - const check = TypeCompiler.Compile(DateSchema) - - // Valid value (String) - expect(check.Check('2021-01-01T10:10:00.000Z')).toBe(true) - - // typebox cannot use valibot custom validation and transformations, it will check only the input types - expect(check.Check('invalid date')).toBe(true) - - // Type inference (TypeScript) - type DateType = Static - const validDate: DateType = '2021-01-01T10:10:00.000Z' - const validDate2: DateType = new Date('2021-01-01') + // Build the compiler + const check = TypeCompiler.Compile(DateSchema) - // @ts-expect-error - const invalidDate: DateType = 123 // should fail in TS + // Valid value (String) + expect(check.Check('2021-01-01T10:10:00.000Z')).toBe(true) + + // typebox cannot use valibot custom validation and transformations, it will check only the input types + expect(check.Check('invalid date')).toBe(true) + + // Type inference (TypeScript) + type DateType = Static + const _validDate: DateType = '2021-01-01T10:10:00.000Z' + const _validDate2: DateType = new Date('2021-01-01') + + // @ts-expect-error + const _invalidDate: DateType = 123 // should fail in TS }) }) @@ -74,16 +74,24 @@ describe('basic.schema', () => { const check = TypeCompiler.Compile(AddressTypeSchema) expect(check.Check(AccountType.COMMUNITY_AUF)).toBe(true) // type box will throw an error, because it cannot handle valibots custom validation - expect(() => check.Check(AddressType_COMMUNITY_AUF)).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) - expect(() => check.Check('invalid')).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) + expect(() => check.Check(AddressType_COMMUNITY_AUF)).toThrow( + new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`), + ) + expect(() => check.Check('invalid')).toThrow( + new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`), + ) }) it('accountType with type box', () => { const AccountTypeSchema = TypeBoxFromValibot(accountTypeSchema) const check = TypeCompiler.Compile(AccountTypeSchema) expect(check.Check(AccountType.COMMUNITY_AUF)).toBe(true) // type box will throw an error, because it cannot handle valibots custom validation - expect(() => check.Check(AddressType_COMMUNITY_AUF)).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) - expect(() => check.Check('invalid')).toThrow(new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`)) + expect(() => check.Check(AddressType_COMMUNITY_AUF)).toThrow( + new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`), + ) + expect(() => check.Check('invalid')).toThrow( + new TypeError(`undefined is not an object (evaluating 'schema["~run"]')`), + ) }) }) diff --git a/dlt-connector/src/schemas/typeGuard.schema.ts b/dlt-connector/src/schemas/typeGuard.schema.ts index d580abe3a..3a93ac62f 100644 --- a/dlt-connector/src/schemas/typeGuard.schema.ts +++ b/dlt-connector/src/schemas/typeGuard.schema.ts @@ -39,6 +39,24 @@ export const uuidv4Schema = v.pipe( export type Uuidv4Input = v.InferInput +/** + * type guard for seed string + * create with `v.parse(seedSchema, '0c4676adfd96519a0551596c')` + * seed is a string of length 24 + */ +declare const validIdentifierSeed: unique symbol +export type IdentifierSeed = string & { [validIdentifierSeed]: true } + +// use code from transaction links +export const identifierSeedSchema = v.pipe( + v.string('expect string type'), + v.hexadecimal('expect hexadecimal string'), + v.length(24, 'expect seed length 24'), + v.transform((input: string) => input as IdentifierSeed), +) + +export type IdentifierSeedInput = v.InferInput + /** * type guard for memory block size 32 * create with `v.parse(memoryBlock32Schema, MemoryBlock.fromHex('39568d7e148a0afee7f27a67dbf7d4e87d1fdec958e2680df98a469690ffc1a2'))` @@ -124,16 +142,20 @@ export type HieroIdInput = v.InferInput * basically it is a Hiero id with a timestamp seconds-nanoseconds since 1970-01-01T00:00:00Z * seconds is int64, nanoseconds int32 */ -declare const validHieroTransactionId: unique symbol -export type HieroTransactionId = string & { [validHieroTransactionId]: true } +declare const validHieroTransactionIdString: unique symbol +export type HieroTransactionIdString = string & { [validHieroTransactionIdString]: true } -export const hieroTransactionIdSchema = v.pipe( - v.string('expect hiero transaction id type, for example 0.0.141760-1755138896-607329203 or 0.0.141760@1755138896.607329203'), +export const hieroTransactionIdStringSchema = v.pipe( + v.string( + 'expect hiero transaction id type, for example 0.0.141760-1755138896-607329203 or 0.0.141760@1755138896.607329203', + ), v.regex(/^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+-[0-9]+|@[0-9]+\.[0-9]+)$/), - v.transform((input: string) => input as HieroTransactionId), + v.transform( + (input: string) => input as HieroTransactionIdString, + ), ) -export type HieroTransactionIdInput = v.InferInput +export type HieroTransactionIdInput = v.InferInput /** * type guard for memo @@ -176,14 +198,12 @@ export const timeoutDurationSchema = v.pipe( ), v.instance(DurationSeconds, 'expect DurationSeconds type'), ]), - v.transform( - (input: number | DurationSeconds) => { - if (input instanceof DurationSeconds) { - return input as TimeoutDuration - } - return new DurationSeconds(input) as TimeoutDuration - }, - ), + v.transform((input: number | DurationSeconds) => { + if (input instanceof DurationSeconds) { + return input as TimeoutDuration + } + return new DurationSeconds(input) as TimeoutDuration + }), ) /** @@ -210,16 +230,11 @@ declare const validGradidoAmount: unique symbol export type GradidoAmount = GradidoUnit & { [validGradidoAmount]: true } export const gradidoAmountSchema = v.pipe( - v.union([ - amountSchema, - v.instance(GradidoUnit, 'expect GradidoUnit type'), - ]), - v.transform( - (input: Amount | GradidoUnit) => { - if (input instanceof GradidoUnit) { - return input as GradidoAmount - } - return GradidoUnit.fromString(input) as GradidoAmount - }, - ), + v.union([amountSchema, v.instance(GradidoUnit, 'expect GradidoUnit type')]), + v.transform((input: Amount | GradidoUnit) => { + if (input instanceof GradidoUnit) { + return input as GradidoAmount + } + return GradidoUnit.fromString(input) as GradidoAmount + }), ) diff --git a/dlt-connector/src/server/index.test.ts b/dlt-connector/src/server/index.test.ts index f3a9aed7d..3fa0ce07b 100644 --- a/dlt-connector/src/server/index.test.ts +++ b/dlt-connector/src/server/index.test.ts @@ -1,10 +1,10 @@ -import { appRoutes } from '.' -import { describe, it, expect, beforeAll, mock } from 'bun:test' -import { KeyPairCacheManager } from '../KeyPairCacheManager' -import { hieroIdSchema } from '../schemas/typeGuard.schema' -import { parse } from 'valibot' -import { HieroId } from '../schemas/typeGuard.schema' +import { beforeAll, describe, expect, it, mock } from 'bun:test' +import { AccountId, Timestamp, TransactionId } from '@hashgraph/sdk' import { GradidoTransaction, KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' +import { parse } from 'valibot' +import { KeyPairCacheManager } from '../KeyPairCacheManager' +import { HieroId, hieroIdSchema } from '../schemas/typeGuard.schema' +import { appRoutes } from '.' const userUuid = '408780b2-59b3-402a-94be-56a4f4f4e8ec' @@ -29,7 +29,7 @@ mock.module('../client/hiero/HieroClient', () => ({ HieroClient: { getInstance: () => ({ sendMessage: (topicId: HieroId, transaction: GradidoTransaction) => { - return { receipt: { status: '0.0.21732' }, response: { transactionId: '0.0.6566984@1758029639.561157605' } } + return new TransactionId(new AccountId(0, 0, 6566984), new Timestamp(1758029639, 561157605)) }, }), }, @@ -37,7 +37,9 @@ mock.module('../client/hiero/HieroClient', () => ({ mock.module('../config', () => ({ CONFIG: { - HOME_COMMUNITY_SEED: MemoryBlock.fromHex('0102030401060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fe7'), + HOME_COMMUNITY_SEED: MemoryBlock.fromHex( + '0102030401060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1fe7', + ), }, })) @@ -59,17 +61,22 @@ describe('Server', () => { accountType: 'COMMUNITY_HUMAN', createdAt: '2022-01-01T00:00:00.000Z', } - const response = await appRoutes.handle(new Request('http://localhost/sendTransaction', { - method: 'POST', - body: JSON.stringify(transaction), - headers: { - 'Content-Type': 'application/json', - }, - })) + const response = await appRoutes.handle( + new Request('http://localhost/sendTransaction', { + method: 'POST', + body: JSON.stringify(transaction), + headers: { + 'Content-Type': 'application/json', + }, + }), + ) if (response.status !== 200) { + // biome-ignore lint/suspicious/noConsole: helper for debugging if test fails console.log(await response.text()) } expect(response.status).toBe(200) - expect(await response.text()).toBe('0.0.6566984@1758029639.561157605') + expect(await response.json()).toMatchObject({ + transactionId: '0.0.6566984@1758029639.561157605', + }) }) }) diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index b8aa44fd3..7168a76dc 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -1,92 +1,147 @@ import { TypeBoxFromValibot } from '@sinclair/typemap' -import { Type } from '@sinclair/typebox' import { Elysia, status, t } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' import { getLogger } from 'log4js' -import { parse } from 'valibot' +import * as v from 'valibot' import { GradidoNodeClient } from '../client/GradidoNode/GradidoNodeClient' import { LOG4JS_BASE_CATEGORY } from '../config/const' import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' -import { KeyPairCalculation } from '../interactions/keyPairCalculation/KeyPairCalculation.context' +import { ResolveKeyPair } from '../interactions/resolveKeyPair/ResolveKeyPair.context' import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.context' -import { IdentifierAccount, identifierAccountSchema } from '../schemas/account.schema' +import { IdentifierAccountInput, identifierAccountSchema } from '../schemas/account.schema' import { transactionSchema } from '../schemas/transaction.schema' -import { hieroIdSchema, hieroTransactionIdSchema } from '../schemas/typeGuard.schema' +import { hieroTransactionIdStringSchema } from '../schemas/typeGuard.schema' import { - accountIdentifierSeedSchema, - accountIdentifierUserSchema, - existSchema, + accountIdentifierSeedTypeBoxSchema, + accountIdentifierUserTypeBoxSchema, + existTypeBoxSchema, } from './input.schema' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) +/** + * To define a route in Elysia: + * + * 1. Choose the HTTP method: get, post, patch, put, or delete. + * + * 2. Define the route path: + * - **Params**: values inside the path. + * Example: path: `/isCommunityExist/:communityTopicId` + * → called with: GET `/isCommunityExist/0.0.21732` + * + * - **Query**: values in the query string. + * Example: path: `/isCommunityExist` + * → called with: GET `/isCommunityExist?communityTopicId=0.0.21732` + * + * 3. Write the route handler: + * Return a JSON object — often by calling your business logic. + * + * 4. Define validation schemas using TypeBoxFromValibot: + * - `params` (for path parameters) + * - `query` (for query strings) + * - `body` (for POST/PUT/PATCH requests) + * - `response` (for output) + * + * Example: + * .get( + * '/isCommunityExist/:communityTopicId', + * async ({ params: { communityTopicId } }) => ({ + * exists: await isCommunityExist({ communityTopicId }) + * }), + * { + * params: t.Object({ communityTopicId: TypeBoxFromValibot(hieroIdSchema) }), + * response: t.Object({ exists: t.Boolean() }), + * }, + * ) + * + * 🔗 More info: https://elysiajs.com/at-glance.html + */ export const appRoutes = new Elysia() + // check if account exists by user, call example: + // GET /isAccountExist/by-user/0.0.21732/408780b2-59b3-402a-94be-56a4f4f4e8ec/0 .get( '/isAccountExist/by-user/:communityTopicId/:userUuid/:accountNr', - async ({ params: { communityTopicId, userUuid, accountNr } }) => { - const accountIdentifier = parse(identifierAccountSchema, { + async ({ params: { communityTopicId, userUuid, accountNr } }) => ({ + exists: await isAccountExist({ communityTopicId, account: { userUuid, accountNr }, - }) - return { exists: await isAccountExist(accountIdentifier) } + }), + }), + { + params: accountIdentifierUserTypeBoxSchema, + response: existTypeBoxSchema, }, - // validation schemas - { params: accountIdentifierUserSchema, response: existSchema }, ) + // check if account exists by seed, call example: + // GET /isAccountExist/by-seed/0.0.21732/0c4676adfd96519a0551596c .get( '/isAccountExist/by-seed/:communityTopicId/:seed', - async ({ params: { communityTopicId, seed } }) => { - const accountIdentifier = parse(identifierAccountSchema, { + async ({ params: { communityTopicId, seed } }) => ({ + exists: await isAccountExist({ communityTopicId, - seed: { seed }, - }) - return { exists: await isAccountExist(accountIdentifier) } + seed, + }), + }), + { + params: accountIdentifierSeedTypeBoxSchema, + response: existTypeBoxSchema, }, - // validation schemas - { params: accountIdentifierSeedSchema, response: existSchema }, ) + // send transaction to hiero, call example for send transaction: + // POST /sendTransaction + // body: { + // user: { + // communityTopicId: '0.0.21732', + // account: { + // userUuid: '408780b2-59b3-402a-94be-56a4f4f4e8ec', + // accountNr: 0, + // }, + // }, + // linkedUser: { + // communityTopicId: '0.0.21732', + // account: { + // userUuid: '10689787-00fe-4295-a996-05c0952558d9', + // accountNr: 0, + // }, + // }, + // amount: 10, + // memo: 'test', + // type: 'TRANSFER', + // createdAt: '2022-01-01T00:00:00.000Z', + // } .post( '/sendTransaction', - async ({ body }) => { - try { - const hieroTransactionId = await SendToHieroContext(parse(transactionSchema, body)) - console.log('server will return:', hieroTransactionId) - return { transactionId: hieroTransactionId } - } catch (e) { - if (e instanceof TypeError) { - console.log(`message: ${e.message}, stack: ${e.stack}`) - } - console.log(e) - throw status(500, e) - } - }, - // validation schemas + async ({ body }) => ({ + transactionId: await SendToHieroContext(body), + }), { body: TypeBoxFromValibot(transactionSchema), - response: t.Object({ transactionId: TypeBoxFromValibot(hieroTransactionIdSchema) }), + response: t.Object({ transactionId: TypeBoxFromValibot(hieroTransactionIdStringSchema) }), }, ) -async function isAccountExist(identifierAccount: IdentifierAccount): Promise { +// function stay here for now because it is small and simple, but maybe later if more functions are added, move it to a separate file +async function isAccountExist(identifierAccount: IdentifierAccountInput): Promise { + // check and prepare input const startTime = Date.now() - const accountKeyPair = await KeyPairCalculation(new KeyPairIdentifierLogic(identifierAccount)) + const identifierAccountParsed = v.parse(identifierAccountSchema, identifierAccount) + const accountKeyPair = await ResolveKeyPair(new KeyPairIdentifierLogic(identifierAccountParsed)) const publicKey = accountKeyPair.getPublicKey() if (!publicKey) { - throw status(404, "couldn't calculate account key pair") + throw status(404, { message: "couldn't calculate account key pair" }) } // ask gradido node server for account type, if type !== NONE account exist const addressType = await GradidoNodeClient.getInstance().getAddressType( publicKey.convertToHex(), - identifierAccount.communityTopicId, + identifierAccountParsed.communityTopicId, ) + const exists = addressType !== AddressType_NONE const endTime = Date.now() - logger.info( - `isAccountExist: ${addressType !== AddressType_NONE}, time used: ${endTime - startTime}ms`, - ) + logger.info(`isAccountExist: ${exists}, time used: ${endTime - startTime}ms`) if (logger.isDebugEnabled()) { - logger.debug('params', identifierAccount) + logger.debug('params', identifierAccountParsed) } - return addressType !== AddressType_NONE + return exists } -export type DltRoutes = typeof appRoutes \ No newline at end of file +export type DltRoutes = typeof appRoutes diff --git a/dlt-connector/src/server/input.schema.ts b/dlt-connector/src/server/input.schema.ts index 336ade786..515e5b35f 100644 --- a/dlt-connector/src/server/input.schema.ts +++ b/dlt-connector/src/server/input.schema.ts @@ -2,18 +2,18 @@ import { TypeBoxFromValibot } from '@sinclair/typemap' import { t } from 'elysia' import { hieroIdSchema, uuidv4Schema } from '../schemas/typeGuard.schema' -export const accountIdentifierUserSchema = t.Object({ +export const accountIdentifierUserTypeBoxSchema = t.Object({ communityTopicId: TypeBoxFromValibot(hieroIdSchema), userUuid: TypeBoxFromValibot(uuidv4Schema), accountNr: t.Number({ min: 0 }), }) // identifier for a gradido account created by transaction link / deferred transfer -export const accountIdentifierSeedSchema = t.Object({ +export const accountIdentifierSeedTypeBoxSchema = t.Object({ communityTopicId: TypeBoxFromValibot(hieroIdSchema), seed: TypeBoxFromValibot(uuidv4Schema), }) -export const existSchema = t.Object({ +export const existTypeBoxSchema = t.Object({ exists: t.Boolean(), }) From 617b1d6ad50eea8f9c35b3148e393efc1e6e6092 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 09:28:19 +0200 Subject: [PATCH 45/72] fix docker build and lint github workflows for dlt-connector --- .github/workflows/lint.yml | 15 ++- .github/workflows/test_dlt_connector.yml | 34 +++---- dlt-connector/Dockerfile | 119 +++++++++++++++++++++++ dlt-connector/bun.lock | 3 + dlt-connector/package.json | 1 + docker-compose.override.yml | 2 +- docker-compose.yml | 1 - 7 files changed, 149 insertions(+), 26 deletions(-) create mode 100644 dlt-connector/Dockerfile diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 1416b2e04..99124cf34 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -25,7 +25,6 @@ jobs: run: | cd ./config-schema biome ci . - echo $? echo "success=$([ $? -eq 0 ] && echo true || echo false)" >> $GITHUB_OUTPUT - name: Lint - Shared id: shared @@ -57,6 +56,12 @@ jobs: cd ./dht-node biome ci . echo "success=$([ $? -eq 0 ] && echo true || echo false)" >> $GITHUB_OUTPUT + - name: Lint - DLT Connector + id: dlt-connector + run: | + cd ./dlt-connector + biome ci . + echo "success=$([ $? -eq 0 ] && echo true || echo false)" >> $GITHUB_OUTPUT - name: Lint - Federation id: federation run: | @@ -112,6 +117,14 @@ jobs: - name: Check result from previous step run: if [ "${{ needs.lint.outputs.dht-node }}" != "true" ]; then exit 1; fi + lint_dlt_connector: + name: Lint - DLT Connector + needs: lint + runs-on: ubuntu-latest + steps: + - name: Check result from previous step + run: if [ "${{ needs.lint.outputs.dlt-connector }}" != "true" ]; then exit 1; fi + lint_federation: name: Lint - Federation needs: lint diff --git a/.github/workflows/test_dlt_connector.yml b/.github/workflows/test_dlt_connector.yml index 7d3803065..da220cba7 100644 --- a/.github/workflows/test_dlt_connector.yml +++ b/.github/workflows/test_dlt_connector.yml @@ -30,27 +30,7 @@ jobs: uses: actions/checkout@v3 - name: Build 'test' image - run: | - docker build --target test -t "gradido/dlt-connector:test" -f dlt-connector/Dockerfile . - docker save "gradido/dlt-connector:test" > /tmp/dlt-connector.tar - - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: docker-dlt-connector-test - path: /tmp/dlt-connector.tar - - lint: - name: Lint - DLT Connector - if: needs.files-changed.outputs.dlt_connector == 'true' - needs: files-changed - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Lint - run: cd dlt-connector && yarn && yarn run lint + run: docker build --target test -t "gradido/dlt-connector:test" -f dlt-connector/Dockerfile . unit_test: name: Unit Tests - DLT Connector @@ -60,6 +40,14 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v3 + + - name: install bun + uses: oven-sh/setup-bun@v2 + with: + bun-version-file: '.bun-version' - - name: DLT-Connector | Unit tests - run: cd dlt-connector && yarn && yarn test + - name: install dependencies + run: cd dlt-connector && bun install --frozen-lockfile + + - name: typecheck && unit test + run: cd dlt-connector && bun typecheck && bun test diff --git a/dlt-connector/Dockerfile b/dlt-connector/Dockerfile new file mode 100644 index 000000000..234c1df91 --- /dev/null +++ b/dlt-connector/Dockerfile @@ -0,0 +1,119 @@ +################################################################################## +# BASE ########################################################################### +################################################################################## +#FROM node:18.20.7-bookworm-slim as base +FROM oven/bun:1.3.0-slim as base +#FROM node:18.20.7-alpine3.21 as base +# change to alpine after sodium-native ship with native alpine build + +# 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 +## App relevant Envs +ENV PORT="4000" +## Timezone +ENV TZ=UTC + +# Labels +LABEL org.label-schema.build-date="${BUILD_DATE}" +LABEL org.label-schema.name="gradido:dlt-connector" +LABEL org.label-schema.description="Gradido DLT Connector" +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/dlt-connector" +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 + + +# Settings +## Expose Container Port +EXPOSE ${PORT} + +## Workdir +RUN mkdir -p ${DOCKER_WORKDIR} +WORKDIR ${DOCKER_WORKDIR} + +################################################################################## +# BUN ############################################################################ +################################################################################## +#FROM base as bun-base + +#RUN apt update && apt install -y --no-install-recommends ca-certificates curl bash unzip +#COPY .bun-version .bun-version +#RUN apk update && apk add --no-cache curl tar bash +#RUN BUN_VERSION=$(cat .bun-version) && \ + # curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" +# Add bun's global bin directory to PATH +#ENV PATH="/root/.bun/bin:${PATH}" + +################################################################################## +# Development #################################################################### +################################################################################## +FROM base AS development + +# Run command +CMD /bin/sh -c "cd dlt-connector && bun install --no-cache --frozen-lockfile && bun dev" + +################################################################################## +# Basic Image with bun setup and project and source code ######################### +################################################################################## +FROM base as base-src +COPY --chown=app:app ./dlt-connector ./dlt-connector + +################################################################################## +# Build ########################################################################## +################################################################################## +FROM base-src as build + +RUN cd dlt-connector && bun install --no-cache --frozen-lockfile +RUN cd dlt-connector && bun typecheck && bun run build + +################################################################################## +# TEST ########################################################################### +################################################################################## +FROM build as test + +# Run command +CMD /bin/sh -c "cd dlt-connector && bun test" + +################################################################################## +# install only node modules needed for running bundle ############################ +################################################################################## +FROM base-src as production-node-modules + +COPY ./scripts ./scripts +# add node_modules from production_node_modules +RUN cd dlt-connector && bun install --production --frozen-lockfile --no-cache \ + && rm -rf /tmp/* ~/.cache node_modules/.cache \ + && ../scripts/clean-prebuilds.sh + +################################################################################## +# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) # +################################################################################## +FROM base as production + +# Copy "binary"-files from build image +COPY --chown=app:app --from=build ${DOCKER_WORKDIR}/dlt-connector/build/index.js ./index.js +# add node_modules from production_node_modules +COPY --chown=app:app --from=production-node-modules ${DOCKER_WORKDIR}/dlt-connector/node_modules ./node_modules + +COPY ./dlt-connector/.env . +COPY ./dlt-connector/log4js-config.json . + +# Run command +CMD ["bun", "index.js"] diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 93b3943c1..7ea3a4eab 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -12,6 +12,7 @@ "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", "@types/bun": "^1.2.17", + "@types/uuid": "^8.3.4", "dotenv": "^10.0.0", "elysia": "1.3.8", "graphql-request": "^7.2.0", @@ -271,6 +272,8 @@ "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + "@types/uuid": ["@types/uuid@8.3.4", "", {}, "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="], + "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="], "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], diff --git a/dlt-connector/package.json b/dlt-connector/package.json index bb7269703..7dc4e590d 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -25,6 +25,7 @@ "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", "@types/bun": "^1.2.17", + "@types/uuid": "^8.3.4", "dotenv": "^10.0.0", "elysia": "1.3.8", "graphql-request": "^7.2.0", diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 8b19c4425..3d68512ce 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -104,7 +104,7 @@ services: - node_modules_dlt_connector:/app/node_modules - turbo_cache:/tmp/turbo # bind the local folder to the docker to allow live reload - - ./dlt-connector:/app + - .:/app ######################################################## # FEDERATION ########################################### diff --git a/docker-compose.yml b/docker-compose.yml index 3f11c6a07..aeaac0c60 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -172,7 +172,6 @@ services: - BUILD_VERSION - BUILD_COMMIT - NODE_ENV="production" - - DB_HOST=mariadb # Application only envs volumes: # : – mirror bidirectional path in local context with path in Docker container From 0525b144b72e89488bd65509ddd62eba7dedd89a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 10:38:40 +0200 Subject: [PATCH 46/72] remove not longer used stuff, fix lint workflow --- .github/workflows/lint.yml | 1 + .../graphql/resolver/TransactionResolver.ts | 2 - backend/src/index.ts | 4 -- backend/src/util/InterruptiveSleep.ts | 27 -------- backend/src/util/InterruptiveSleepManager.ts | 67 ------------------- 5 files changed, 1 insertion(+), 100 deletions(-) delete mode 100644 backend/src/util/InterruptiveSleep.ts delete mode 100644 backend/src/util/InterruptiveSleepManager.ts diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 99124cf34..df24c2b9f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,6 +12,7 @@ jobs: backend: ${{ steps.backend.outputs.success }} database: ${{ steps.database.outputs.success }} dht-node: ${{ steps.dht-node.outputs.success }} + dlt-connector: ${{ steps.dlt-connector.outputs.success }} federation: ${{ steps.federation.outputs.success }} steps: - name: Checkout diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 0bd77166c..4575a8b3e 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -185,8 +185,6 @@ export const executeTransaction = async ( await queryRunner.release() } - // notify dlt-connector loop for new work - // InterruptiveSleepManager.getInstance().interrupt(TRANSMIT_TO_IOTA_INTERRUPTIVE_SLEEP_KEY) await sendTransactionReceivedEmail({ firstName: recipient.firstName, lastName: recipient.lastName, diff --git a/backend/src/index.ts b/backend/src/index.ts index d7e883933..80d6d5d7e 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -20,10 +20,6 @@ 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/util/InterruptiveSleep.ts b/backend/src/util/InterruptiveSleep.ts deleted file mode 100644 index 86afcf9b5..000000000 --- a/backend/src/util/InterruptiveSleep.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { delay } from 'core' - -/** - * 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 - } - - public async sleep(ms: number): Promise { - let waited = 0 - this.interruptSleep = false - while (waited < ms && !this.interruptSleep) { - await delay(this.msSteps) - waited += this.msSteps - } - } -} diff --git a/backend/src/util/InterruptiveSleepManager.ts b/backend/src/util/InterruptiveSleepManager.ts deleted file mode 100644 index 246269623..000000000 --- a/backend/src/util/InterruptiveSleepManager.ts +++ /dev/null @@ -1,67 +0,0 @@ -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 5d4611f83fdf3491ccea4e9718244245c7642929 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 11:22:24 +0200 Subject: [PATCH 47/72] remove simple white space and order changes to make review less noisy --- backend/src/seeds/factory/user.ts | 1 + .../migrations/0091-add_dlt_users_table.ts | 30 -------- .../migrations/0092-merge_dlt_tables.ts | 37 ---------- .../migrations/0096-upgrade_dlt_tables.ts | 26 +++++++ database/src/AppDatabase.ts | 6 +- database/src/entity/Community.ts | 2 +- database/src/entity/Contribution.ts | 2 +- database/src/entity/Event.ts | 2 +- database/src/entity/User.ts | 2 +- database/src/logging/AbstractLogging.view.ts | 2 +- .../logging/PendingTransactionLogging.view.ts | 2 +- database/src/queries/communities.test.ts | 4 +- database/src/queries/communities.ts | 18 +++-- database/src/queries/index.ts | 4 +- .../src/queries/pendingTransactions.test.ts | 71 ++++++++++--------- database/src/queries/pendingTransactions.ts | 6 +- database/src/queries/transactionLinks.ts | 2 +- database/src/queries/user.test.ts | 38 +++++----- database/src/queries/user.ts | 17 ++--- .../src/seeds/factory/pendingTransaction.ts | 8 +-- database/src/seeds/factory/user.ts | 16 ++--- database/src/seeds/users/peter-lustig.ts | 2 +- database/src/util/index.ts | 2 +- dht-node/.env.dist | 2 +- 24 files changed, 129 insertions(+), 173 deletions(-) delete mode 100644 database/migration/migrations/0091-add_dlt_users_table.ts delete mode 100644 database/migration/migrations/0092-merge_dlt_tables.ts create mode 100644 database/migration/migrations/0096-upgrade_dlt_tables.ts diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 5da84c3b2..7904c61b2 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -13,6 +13,7 @@ export const userFactory = async ( user: UserInterface, ): Promise => { const { mutate } = client + const homeCom = await writeHomeCommunityEntry() // console.log('call createUser with', JSON.stringify(user, null, 2)) const response = await mutate({ mutation: createUser, variables: user }) diff --git a/database/migration/migrations/0091-add_dlt_users_table.ts b/database/migration/migrations/0091-add_dlt_users_table.ts deleted file mode 100644 index 95f5c2ca2..000000000 --- a/database/migration/migrations/0091-add_dlt_users_table.ts +++ /dev/null @@ -1,30 +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>) { - 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` 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( - 'ALTER TABLE `dlt_transactions` RENAME COLUMN `transaction_id` TO `transactions_id`;', - ) - await queryFn('ALTER TABLE `dlt_transactions` DROP COLUMN `error`;') -} diff --git a/database/migration/migrations/0092-merge_dlt_tables.ts b/database/migration/migrations/0092-merge_dlt_tables.ts deleted file mode 100644 index 70ee2d49e..000000000 --- a/database/migration/migrations/0092-merge_dlt_tables.ts +++ /dev/null @@ -1,37 +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>) { - 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\`, - ADD \`type_id\` INT UNSIGNED NOT NULL AFTER \`transaction_link_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\` - DROP COLUMN \`type_id\` - ; - `) -} diff --git a/database/migration/migrations/0096-upgrade_dlt_tables.ts b/database/migration/migrations/0096-upgrade_dlt_tables.ts new file mode 100644 index 000000000..849cdfc88 --- /dev/null +++ b/database/migration/migrations/0096-upgrade_dlt_tables.ts @@ -0,0 +1,26 @@ +/* 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(` + ALTER TABLE \`dlt_transactions\` + CHANGE \`transactions_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 \`type_id\` INT UNSIGNED NOT NULL AFTER \`transaction_link_id\`, + ADD \`error\` text NULL DEFAULT NULL AFTER \`verified_at\`, + ; + `) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + ALTER TABLE \`dlt_transactions\` + CHANGE \`transaction_id\` \`transactions_id\` INT(10) UNSIGNED NOT NULL, + DROP COLUMN \`user_id\`, + DROP COLUMN \`transaction_link_id\`, + DROP COLUMN \`type_id\`, + DROP COLUMN \`error\` + ; + `) +} diff --git a/database/src/AppDatabase.ts b/database/src/AppDatabase.ts index e29a09965..c5275cb18 100644 --- a/database/src/AppDatabase.ts +++ b/database/src/AppDatabase.ts @@ -1,9 +1,9 @@ -import { getLogger } from 'log4js' import { DataSource as DBDataSource, FileLogger } from 'typeorm' +import { Migration, entities } from './entity' +import { getLogger } from 'log4js' import { latestDbVersion } from '.' import { CONFIG } from './config' import { LOG4JS_BASE_CATEGORY_NAME } from './config/const' -import { entities, Migration } from './entity' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.AppDatabase`) @@ -92,7 +92,7 @@ export class AppDatabase { public async destroy(): Promise { await this.dataSource?.destroy() } - + // ###################################### // private methods // ###################################### diff --git a/database/src/entity/Community.ts b/database/src/entity/Community.ts index af9cc1e7d..f6597306a 100644 --- a/database/src/entity/Community.ts +++ b/database/src/entity/Community.ts @@ -10,8 +10,8 @@ import { UpdateDateColumn, } from 'typeorm' import { FederatedCommunity } from './FederatedCommunity' -import { GeometryTransformer } from './transformer/GeometryTransformer' import { User } from './User' +import { GeometryTransformer } from './transformer/GeometryTransformer' @Entity('communities') export class Community extends BaseEntity { diff --git a/database/src/entity/Contribution.ts b/database/src/entity/Contribution.ts index a2f410e1d..976385263 100644 --- a/database/src/entity/Contribution.ts +++ b/database/src/entity/Contribution.ts @@ -12,8 +12,8 @@ import { } from 'typeorm' import { ContributionMessage } from './ContributionMessage' import { Transaction } from './Transaction' -import { DecimalTransformer } from './transformer/DecimalTransformer' import { User } from './User' +import { DecimalTransformer } from './transformer/DecimalTransformer' @Entity('contributions') export class Contribution extends BaseEntity { diff --git a/database/src/entity/Event.ts b/database/src/entity/Event.ts index b5ed77b21..9d17ffdeb 100644 --- a/database/src/entity/Event.ts +++ b/database/src/entity/Event.ts @@ -13,8 +13,8 @@ import { ContributionLink } from './ContributionLink' import { ContributionMessage } from './ContributionMessage' import { Transaction } from './Transaction' import { TransactionLink } from './TransactionLink' -import { DecimalTransformer } from './transformer/DecimalTransformer' import { User } from './User' +import { DecimalTransformer } from './transformer/DecimalTransformer' @Entity('events') export class Event extends BaseEntity { diff --git a/database/src/entity/User.ts b/database/src/entity/User.ts index b2366b93c..6a40e9858 100644 --- a/database/src/entity/User.ts +++ b/database/src/entity/User.ts @@ -15,9 +15,9 @@ import { Contribution } from './Contribution' import { ContributionMessage } from './ContributionMessage' import { DltTransaction } from './DltTransaction' import { TransactionLink } from './TransactionLink' -import { GeometryTransformer } from './transformer/GeometryTransformer' import { UserContact } from './UserContact' import { UserRole } from './UserRole' +import { GeometryTransformer } from './transformer/GeometryTransformer' @Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) export class User extends BaseEntity { diff --git a/database/src/logging/AbstractLogging.view.ts b/database/src/logging/AbstractLogging.view.ts index 7e1616c65..f9a96ad5a 100644 --- a/database/src/logging/AbstractLogging.view.ts +++ b/database/src/logging/AbstractLogging.view.ts @@ -1,5 +1,5 @@ -import { Decimal } from 'decimal.js-light' import util from 'util' +import { Decimal } from 'decimal.js-light' export abstract class AbstractLoggingView { protected bufferStringFormat: BufferEncoding = 'hex' diff --git a/database/src/logging/PendingTransactionLogging.view.ts b/database/src/logging/PendingTransactionLogging.view.ts index 20e08e662..fad2d8f56 100644 --- a/database/src/logging/PendingTransactionLogging.view.ts +++ b/database/src/logging/PendingTransactionLogging.view.ts @@ -1,7 +1,7 @@ -import { PendingTransactionState } from 'shared' import { PendingTransaction, Transaction } from '../entity' import { AbstractLoggingView } from './AbstractLogging.view' import { TransactionLoggingView } from './TransactionLogging.view' +import { PendingTransactionState } from 'shared' export class PendingTransactionLoggingView extends AbstractLoggingView { public constructor(private self: PendingTransaction) { diff --git a/database/src/queries/communities.test.ts b/database/src/queries/communities.test.ts index b6a374cb9..b435c3649 100644 --- a/database/src/queries/communities.test.ts +++ b/database/src/queries/communities.test.ts @@ -1,7 +1,7 @@ -import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest' import { Community as DbCommunity, FederatedCommunity as DbFederatedCommunity } from '..' import { AppDatabase } from '../AppDatabase' import { getCommunityByPublicKeyOrFail, getHomeCommunity, getHomeCommunityWithFederatedCommunityOrFail, getReachableCommunities } from './communities' +import { describe, expect, it, beforeEach, beforeAll, afterAll } from 'vitest' import { createCommunity, createVerifiedFederatedCommunity } from '../seeds/community' import { Ed25519PublicKey } from 'shared' @@ -117,4 +117,4 @@ describe('community.queries', () => { expect(await getReachableCommunities(1000)).toHaveLength(0) }) }) -}) +}) \ No newline at end of file diff --git a/database/src/queries/communities.ts b/database/src/queries/communities.ts index 48f0080f0..fee69b27e 100644 --- a/database/src/queries/communities.ts +++ b/database/src/queries/communities.ts @@ -27,9 +27,7 @@ export async function getCommunityByUuid(communityUuid: string): Promise { +export function findWithCommunityIdentifier(communityIdentifier: string): FindOptionsWhere { const where: FindOptionsWhere = {} // pre filter identifier type to reduce db query complexity if (urlSchema.safeParse(communityIdentifier).success) { @@ -71,15 +69,15 @@ export async function getCommunityByPublicKeyOrFail(publicKey: Ed25519PublicKey) // home community and all federated communities which have been verified within the last authenticationTimeoutMs export async function getReachableCommunities( authenticationTimeoutMs: number, - order?: FindOptionsOrder, + order?: FindOptionsOrder ): Promise { return await DbCommunity.find({ - where: [ - { - authenticatedAt: Not(IsNull()), - federatedCommunities: { + where: [ + { + authenticatedAt: Not(IsNull()), + federatedCommunities: { verifiedAt: MoreThanOrEqual(new Date(Date.now() - authenticationTimeoutMs)), - }, + } }, { foreign: false }, ], @@ -94,4 +92,4 @@ export async function getNotReachableCommunities( where: { authenticatedAt: IsNull(), foreign: true }, order, }) -} +} \ No newline at end of file diff --git a/database/src/queries/index.ts b/database/src/queries/index.ts index 8241e010c..2cd0164ce 100644 --- a/database/src/queries/index.ts +++ b/database/src/queries/index.ts @@ -1,11 +1,11 @@ import { LOG4JS_BASE_CATEGORY_NAME } from '../config/const' +export * from './user' export * from './communities' export * from './events' export * from './pendingTransactions' -export * from './transactionLinks' export * from './transactions' -export * from './user' +export * from './transactionLinks' export * from './communityHandshakes' export const LOG4JS_QUERIES_CATEGORY_NAME = `${LOG4JS_BASE_CATEGORY_NAME}.queries` diff --git a/database/src/queries/pendingTransactions.test.ts b/database/src/queries/pendingTransactions.test.ts index 1f7d0a3b7..5eab17136 100644 --- a/database/src/queries/pendingTransactions.test.ts +++ b/database/src/queries/pendingTransactions.test.ts @@ -1,22 +1,22 @@ -import Decimal from 'decimal.js-light' -import { PendingTransactionState } from 'shared' -import { v4 as uuidv4 } from 'uuid' -import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { - Community as DbCommunity, PendingTransaction as DbPendingTransaction, User as DbUser, UserContact as DbUserContact, + Community as DbCommunity, } from '..' +import { countOpenPendingTransactions } from './pendingTransactions' +import { PendingTransactionState } from 'shared' import { AppDatabase } from '../AppDatabase' -import { createCommunity } from '../seeds/community' -import { pendingTransactionFactory } from '../seeds/factory/pendingTransaction' import { userFactory } from '../seeds/factory/user' +import { pendingTransactionFactory } from '../seeds/factory/pendingTransaction' import { bibiBloxberg } from '../seeds/users/bibi-bloxberg' +import { peterLustig } from '../seeds/users/peter-lustig' import { bobBaumeister } from '../seeds/users/bob-baumeister' import { garrickOllivander } from '../seeds/users/garrick-ollivander' -import { peterLustig } from '../seeds/users/peter-lustig' -import { countOpenPendingTransactions } from './pendingTransactions' +import { describe, expect, it, beforeAll, afterAll } from 'vitest' +import { createCommunity } from '../seeds/community' +import { v4 as uuidv4 } from 'uuid' +import Decimal from 'decimal.js-light' const db = AppDatabase.getInstance() @@ -27,6 +27,7 @@ afterAll(async () => { await db.destroy() }) + describe('countOpenPendingTransactions', () => { let bibi: DbUser let peter: DbUser @@ -40,44 +41,45 @@ describe('countOpenPendingTransactions', () => { await createCommunity(false) - bibi = await userFactory(bibiBloxberg) + bibi = await userFactory(bibiBloxberg) peter = await userFactory(peterLustig) bob = await userFactory(bobBaumeister) garrick = await userFactory(garrickOllivander) // Bibi -> Peter await pendingTransactionFactory( - bibi, - peter, - new Decimal(10), - 'Bibi -> Peter new', - PendingTransactionState.NEW, + bibi, + peter, + new Decimal(10), + 'Bibi -> Peter new', + PendingTransactionState.NEW ) await pendingTransactionFactory( - bibi, - peter, - new Decimal(100.01), - 'Bibi -> Peter settled', - PendingTransactionState.SETTLED, + bibi, + peter, + new Decimal(100.01), + 'Bibi -> Peter settled', + PendingTransactionState.SETTLED ) // Peter -> Bibi await pendingTransactionFactory( - peter, - bibi, - new Decimal(12), - 'Peter -> Bibi new', - PendingTransactionState.NEW, + peter, + bibi, + new Decimal(12), + 'Peter -> Bibi new', + PendingTransactionState.NEW ) // Bob -> Peter await pendingTransactionFactory( - bob, - peter, - new Decimal(17.1), - 'Bob -> Peter new', - PendingTransactionState.NEW, + bob, + peter, + new Decimal(17.1), + 'Bob -> Peter new', + PendingTransactionState.NEW ) + }) it('should return 0 if called with empty array', async () => { const count = await countOpenPendingTransactions([]) @@ -102,20 +104,21 @@ describe('countOpenPendingTransactions', () => { it('peter and bob have one transaction together, peter two additional, should return 3', async () => { const count = await countOpenPendingTransactions([peter.gradidoID, bob.gradidoID]) expect(count).toBe(3) - }) - + }) + it('peter has three transactions, should return 3', async () => { const count = await countOpenPendingTransactions([peter.gradidoID]) expect(count).toBe(3) }) + it('bibi has two transactions, should return 2', async () => { const count = await countOpenPendingTransactions([bibi.gradidoID]) expect(count).toBe(2) - }) + }) it('bob has one transaction, should return 1', async () => { const count = await countOpenPendingTransactions([bob.gradidoID]) expect(count).toBe(1) - }) + }) }) diff --git a/database/src/queries/pendingTransactions.ts b/database/src/queries/pendingTransactions.ts index b6481af33..44bf63f82 100644 --- a/database/src/queries/pendingTransactions.ts +++ b/database/src/queries/pendingTransactions.ts @@ -1,6 +1,6 @@ -import { PendingTransactionState } from 'shared' -import { In } from 'typeorm' import { PendingTransaction as DbPendingTransaction } from '../entity' +import { In } from 'typeorm' +import { PendingTransactionState } from 'shared' /** * Counts the number of open pending transactions for the given users. @@ -15,4 +15,4 @@ export async function countOpenPendingTransactions(users: string[]): Promise { return await DbTransactionLink.findOneOrFail({ diff --git a/database/src/queries/user.test.ts b/database/src/queries/user.test.ts index 57096d264..23279770d 100644 --- a/database/src/queries/user.test.ts +++ b/database/src/queries/user.test.ts @@ -1,14 +1,14 @@ -import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest' -import { clearLogs, getLogger, printLogs } from '../../../config-schema/test/testSetup.vitest' -import { Community as DbCommunity, User as DbUser, UserContact as DbUserContact } from '..' +import { User as DbUser, UserContact as DbUserContact, Community as DbCommunity } from '../entity' import { AppDatabase } from '../AppDatabase' -import { createCommunity } from '../seeds/community' +import { aliasExists, findUserByIdentifier } from './user' import { userFactory } from '../seeds/factory/user' import { bibiBloxberg } from '../seeds/users/bibi-bloxberg' -import { bobBaumeister } from '../seeds/users/bob-baumeister' +import { describe, expect, it, beforeAll, afterAll, beforeEach, } from 'vitest' +import { createCommunity } from '../seeds/community' import { peterLustig } from '../seeds/users/peter-lustig' +import { bobBaumeister } from '../seeds/users/bob-baumeister' +import { getLogger, printLogs, clearLogs } from '../../../config-schema/test/testSetup.vitest' import { LOG4JS_QUERIES_CATEGORY_NAME } from '.' -import { aliasExists, findUserByIdentifier } from './user' const db = AppDatabase.getInstance() const userIdentifierLoggerName = `${LOG4JS_QUERIES_CATEGORY_NAME}.user.findUserByIdentifier` @@ -26,9 +26,9 @@ describe('user.queries', () => { await DbUser.clear() await DbUserContact.clear() - const bibi = bibiBloxberg + const bibi = bibiBloxberg bibi.alias = 'b-b' - await userFactory(bibi) + await userFactory(bibi) }) it('should return true if alias exists', async () => { @@ -70,12 +70,12 @@ describe('user.queries', () => { const user = await findUserByIdentifier(userBibi.gradidoID, communityUuid) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias, communityUuid) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email, communityUuid) expect(user).toMatchObject(userBibi) @@ -85,18 +85,18 @@ describe('user.queries', () => { expect(user).toBeNull() }) }) - + describe('communityIdentifier is community name', () => { it('userIdentifier is gradido id', async () => { const user = await findUserByIdentifier(userBibi.gradidoID, communityName) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias, communityName) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email, communityName) expect(user).toMatchObject(userBibi) @@ -117,12 +117,12 @@ describe('user.queries', () => { const user = await findUserByIdentifier(userBibi.gradidoID) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email) expect(user).toMatchObject(userBibi) @@ -130,12 +130,10 @@ describe('user.queries', () => { it('userIdentifier is unknown type', async () => { const user = await findUserByIdentifier('sa') printLogs() - expect(getLogger(userIdentifierLoggerName).warn).toHaveBeenCalledWith( - 'Unknown identifier type', - 'sa', - ) + expect(getLogger(userIdentifierLoggerName).warn).toHaveBeenCalledWith('Unknown identifier type', 'sa') expect(user).toBeNull() }) - }) + }) }) }) + diff --git a/database/src/queries/user.ts b/database/src/queries/user.ts index 9e7d84c27..c117c9ff8 100644 --- a/database/src/queries/user.ts +++ b/database/src/queries/user.ts @@ -1,7 +1,7 @@ -import { getLogger } from 'log4js' -import { aliasSchema, emailSchema, uuidv4Schema } from 'shared' import { Raw } from 'typeorm' import { User as DbUser, UserContact as DbUserContact } from '../entity' +import { aliasSchema, emailSchema, uuidv4Schema } from 'shared' +import { getLogger } from 'log4js' import { findWithCommunityIdentifier, LOG4JS_QUERIES_CATEGORY_NAME } from './index' export async function aliasExists(alias: string): Promise { @@ -32,8 +32,8 @@ export const findUserByIdentifier = async ( identifier: string, communityIdentifier?: string, ): Promise => { - const communityWhere = communityIdentifier - ? findWithCommunityIdentifier(communityIdentifier) + const communityWhere = communityIdentifier + ? findWithCommunityIdentifier(communityIdentifier) : undefined if (uuidv4Schema.safeParse(identifier).success) { @@ -52,12 +52,12 @@ export const findUserByIdentifier = async ( }, relations: { user: { community: true } }, }) - if (userContact) { + if (userContact) { // TODO: remove circular reference const user = userContact.user user.emailContact = userContact return user - } + } } else if (aliasSchema.safeParse(identifier).success) { return await DbUser.findOne({ where: { alias: identifier, community: communityWhere }, @@ -65,10 +65,7 @@ export const findUserByIdentifier = async ( }) } else { // should don't happen often, so we create only in the rare case a logger for it - getLogger(`${LOG4JS_QUERIES_CATEGORY_NAME}.user.findUserByIdentifier`).warn( - 'Unknown identifier type', - identifier, - ) + getLogger(`${LOG4JS_QUERIES_CATEGORY_NAME}.user.findUserByIdentifier`).warn('Unknown identifier type', identifier) } return null } diff --git a/database/src/seeds/factory/pendingTransaction.ts b/database/src/seeds/factory/pendingTransaction.ts index 75cb7c70e..64f10cee7 100644 --- a/database/src/seeds/factory/pendingTransaction.ts +++ b/database/src/seeds/factory/pendingTransaction.ts @@ -1,6 +1,6 @@ -import { Decimal } from 'decimal.js-light' -import { PendingTransactionState } from 'shared' import { PendingTransaction as DbPendingTransaction, User as DbUser } from '../..' +import { PendingTransactionState } from 'shared' +import { Decimal } from 'decimal.js-light' export async function pendingTransactionFactory( sender: DbUser, @@ -14,8 +14,8 @@ export async function pendingTransactionFactory( pendingTransaction.memo = memo pendingTransaction.amount = amount pendingTransaction.userId = sender.id - pendingTransaction.userGradidoID = sender.gradidoID - pendingTransaction.userCommunityUuid = sender.communityUuid! + pendingTransaction.userGradidoID = sender.gradidoID + pendingTransaction.userCommunityUuid = sender.communityUuid! pendingTransaction.linkedUserId = receiver.id pendingTransaction.linkedUserGradidoID = receiver.gradidoID pendingTransaction.linkedUserCommunityUuid = receiver.communityUuid! diff --git a/database/src/seeds/factory/user.ts b/database/src/seeds/factory/user.ts index 912cf00d0..369aa51a4 100644 --- a/database/src/seeds/factory/user.ts +++ b/database/src/seeds/factory/user.ts @@ -1,16 +1,16 @@ -import random from 'crypto-random-bigint' -import { OptInType, PasswordEncryptionType, UserContactType } from 'shared' -import { v4 } from 'uuid' -import { User, UserContact } from '../../entity' -import { getHomeCommunity } from '../../queries/communities' import { UserInterface } from '../users/UserInterface' +import { User, UserContact } from '../../entity' +import { v4 } from 'uuid' +import { UserContactType, OptInType, PasswordEncryptionType } from 'shared' +import { getHomeCommunity } from '../../queries/communities' +import random from 'crypto-random-bigint' export const userFactory = async (user: UserInterface): Promise => { let dbUserContact = new UserContact() dbUserContact.email = user.email ?? '' dbUserContact.type = UserContactType.USER_CONTACT_EMAIL - + let dbUser = new User() dbUser.firstName = user.firstName ?? '' dbUser.lastName = user.lastName ?? '' @@ -35,11 +35,11 @@ export const userFactory = async (user: UserInterface): Promise => { dbUser.community = homeCommunity dbUser.communityUuid = homeCommunity.communityUuid! } - // TODO: improve with cascade + // TODO: improve with cascade dbUser = await dbUser.save() dbUserContact.userId = dbUser.id dbUserContact = await dbUserContact.save() dbUser.emailId = dbUserContact.id dbUser.emailContact = dbUserContact return dbUser.save() -} +} \ No newline at end of file diff --git a/database/src/seeds/users/peter-lustig.ts b/database/src/seeds/users/peter-lustig.ts index ebd5235af..58b07fe99 100644 --- a/database/src/seeds/users/peter-lustig.ts +++ b/database/src/seeds/users/peter-lustig.ts @@ -7,5 +7,5 @@ export const peterLustig: UserInterface = { // description: 'Latzhose und Nickelbrille', createdAt: new Date('2020-11-25T10:48:43'), emailChecked: true, - language: 'de', + language: 'de' } diff --git a/database/src/util/index.ts b/database/src/util/index.ts index e2eb6c04e..d2fde2126 100644 --- a/database/src/util/index.ts +++ b/database/src/util/index.ts @@ -1,2 +1,2 @@ -export * from './TRANSACTION_LINK_LOCK' export * from './TRANSACTIONS_LOCK' +export * from './TRANSACTION_LINK_LOCK' diff --git a/dht-node/.env.dist b/dht-node/.env.dist index 1f4fca697..351bc251d 100644 --- a/dht-node/.env.dist +++ b/dht-node/.env.dist @@ -13,7 +13,7 @@ TYPEORM_LOGGING_RELATIVE_PATH=typeorm.dht-node.log # Federation # if you set the value of FEDERATION_DHT_TOPIC, the DHT hyperswarm will start to announce and listen on an hash created from this topic FEDERATION_DHT_TOPIC=GRADIDO_HUB -FEDERATION_DHT_SEED=64ebcb0e3ad547848fed4197c6e1332f +# FEDERATION_DHT_SEED=64ebcb0e3ad547848fef4197c6e2332f FEDERATION_COMMUNITY_URL=http://localhost # comma separated values, which apis should be announced FEDERATION_COMMUNITY_APIS=1_0 \ No newline at end of file From c2ca16bebcb7baf24b29400a6b87a82be25ef986 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 11:31:28 +0200 Subject: [PATCH 48/72] again --- backend/src/index.ts | 2 +- backend/src/seeds/factory/user.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index 80d6d5d7e..283554a9d 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -20,7 +20,7 @@ async function main() { console.log(`GraphIQL available at http://localhost:${CONFIG.PORT}`) } }) - void startValidateCommunities(Number(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER)) + await startValidateCommunities(Number(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER)) } main().catch((e) => { diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 7904c61b2..3cae22f71 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -13,7 +13,7 @@ export const userFactory = async ( user: UserInterface, ): Promise => { const { mutate } = client - + const homeCom = await writeHomeCommunityEntry() // console.log('call createUser with', JSON.stringify(user, null, 2)) const response = await mutate({ mutation: createUser, variables: user }) From 2ac59f99cf15b97a626b44fae61fc7caa66a1726 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 11:36:30 +0200 Subject: [PATCH 49/72] again revert --- .github/workflows/lint.yml | 1 + .gitignore | 2 +- database/src/AppDatabase.ts | 1 + database/src/logging/AbstractLogging.view.ts | 1 + .../src/queries/pendingTransactions.test.ts | 16 ++++++++-------- database/src/queries/user.test.ts | 17 +++++++++-------- database/src/seeds/community.ts | 2 +- .../src/seeds/factory/pendingTransaction.ts | 10 +++++----- database/src/seeds/factory/user.ts | 2 +- 9 files changed, 28 insertions(+), 24 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index df24c2b9f..341053694 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,6 +26,7 @@ jobs: run: | cd ./config-schema biome ci . + echo $? echo "success=$([ $? -eq 0 ] && echo true || echo false)" >> $GITHUB_OUTPUT - name: Lint - Shared id: shared diff --git a/.gitignore b/.gitignore index d98f0c163..d82288fbd 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ messages.pot nbproject .metadata /out/* -.env +/.env package-lock.json /deployment/bare_metal/.env /deployment/bare_metal/nginx/sites-available/gradido.conf diff --git a/database/src/AppDatabase.ts b/database/src/AppDatabase.ts index c5275cb18..3096aaecd 100644 --- a/database/src/AppDatabase.ts +++ b/database/src/AppDatabase.ts @@ -1,5 +1,6 @@ import { DataSource as DBDataSource, FileLogger } from 'typeorm' import { Migration, entities } from './entity' + import { getLogger } from 'log4js' import { latestDbVersion } from '.' import { CONFIG } from './config' diff --git a/database/src/logging/AbstractLogging.view.ts b/database/src/logging/AbstractLogging.view.ts index f9a96ad5a..00fdd4703 100644 --- a/database/src/logging/AbstractLogging.view.ts +++ b/database/src/logging/AbstractLogging.view.ts @@ -1,4 +1,5 @@ import util from 'util' + import { Decimal } from 'decimal.js-light' export abstract class AbstractLoggingView { diff --git a/database/src/queries/pendingTransactions.test.ts b/database/src/queries/pendingTransactions.test.ts index 5eab17136..c59c312e4 100644 --- a/database/src/queries/pendingTransactions.test.ts +++ b/database/src/queries/pendingTransactions.test.ts @@ -1,8 +1,8 @@ -import { - PendingTransaction as DbPendingTransaction, - User as DbUser, - UserContact as DbUserContact, - Community as DbCommunity, +import { + PendingTransaction as DbPendingTransaction, + User as DbUser, + UserContact as DbUserContact, + Community as DbCommunity } from '..' import { countOpenPendingTransactions } from './pendingTransactions' import { PendingTransactionState } from 'shared' @@ -79,7 +79,7 @@ describe('countOpenPendingTransactions', () => { 'Bob -> Peter new', PendingTransactionState.NEW ) - + }) it('should return 0 if called with empty array', async () => { const count = await countOpenPendingTransactions([]) @@ -109,13 +109,13 @@ describe('countOpenPendingTransactions', () => { it('peter has three transactions, should return 3', async () => { const count = await countOpenPendingTransactions([peter.gradidoID]) expect(count).toBe(3) - }) + }) it('bibi has two transactions, should return 2', async () => { const count = await countOpenPendingTransactions([bibi.gradidoID]) expect(count).toBe(2) - }) + }) it('bob has one transaction, should return 1', async () => { const count = await countOpenPendingTransactions([bob.gradidoID]) diff --git a/database/src/queries/user.test.ts b/database/src/queries/user.test.ts index 23279770d..b653a5349 100644 --- a/database/src/queries/user.test.ts +++ b/database/src/queries/user.test.ts @@ -1,4 +1,4 @@ -import { User as DbUser, UserContact as DbUserContact, Community as DbCommunity } from '../entity' +import { User as DbUser, UserContact as DbUserContact, Community as DbCommunity } from '..' import { AppDatabase } from '../AppDatabase' import { aliasExists, findUserByIdentifier } from './user' import { userFactory } from '../seeds/factory/user' @@ -70,12 +70,12 @@ describe('user.queries', () => { const user = await findUserByIdentifier(userBibi.gradidoID, communityUuid) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias, communityUuid) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email, communityUuid) expect(user).toMatchObject(userBibi) @@ -85,18 +85,18 @@ describe('user.queries', () => { expect(user).toBeNull() }) }) - + describe('communityIdentifier is community name', () => { it('userIdentifier is gradido id', async () => { const user = await findUserByIdentifier(userBibi.gradidoID, communityName) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias, communityName) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email, communityName) expect(user).toMatchObject(userBibi) @@ -117,12 +117,12 @@ describe('user.queries', () => { const user = await findUserByIdentifier(userBibi.gradidoID) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is alias', async () => { const user = await findUserByIdentifier(userBibi.alias) expect(user).toMatchObject(userBibi) }) - + it('userIdentifier is email', async () => { const user = await findUserByIdentifier(userBibi.emailContact.email) expect(user).toMatchObject(userBibi) @@ -137,3 +137,4 @@ describe('user.queries', () => { }) }) + diff --git a/database/src/seeds/community.ts b/database/src/seeds/community.ts index 000eea9ef..12a5bd67f 100644 --- a/database/src/seeds/community.ts +++ b/database/src/seeds/community.ts @@ -1,6 +1,6 @@ +import { Community, FederatedCommunity } from '../entity' import { randomBytes } from 'node:crypto' import { v4 as uuidv4 } from 'uuid' -import { Community, FederatedCommunity } from '../entity' /** * Creates a community. diff --git a/database/src/seeds/factory/pendingTransaction.ts b/database/src/seeds/factory/pendingTransaction.ts index 64f10cee7..2e8c7d256 100644 --- a/database/src/seeds/factory/pendingTransaction.ts +++ b/database/src/seeds/factory/pendingTransaction.ts @@ -1,4 +1,4 @@ -import { PendingTransaction as DbPendingTransaction, User as DbUser } from '../..' +import { User as DbUser, PendingTransaction as DbPendingTransaction } from '../..' import { PendingTransactionState } from 'shared' import { Decimal } from 'decimal.js-light' @@ -14,10 +14,10 @@ export async function pendingTransactionFactory( pendingTransaction.memo = memo pendingTransaction.amount = amount pendingTransaction.userId = sender.id - pendingTransaction.userGradidoID = sender.gradidoID - pendingTransaction.userCommunityUuid = sender.communityUuid! + pendingTransaction.userGradidoID = sender.gradidoID + pendingTransaction.userCommunityUuid = sender.communityUuid! pendingTransaction.linkedUserId = receiver.id - pendingTransaction.linkedUserGradidoID = receiver.gradidoID - pendingTransaction.linkedUserCommunityUuid = receiver.communityUuid! + pendingTransaction.linkedUserGradidoID = receiver.gradidoID + pendingTransaction.linkedUserCommunityUuid = receiver.communityUuid! await pendingTransaction.save() } diff --git a/database/src/seeds/factory/user.ts b/database/src/seeds/factory/user.ts index 369aa51a4..3772fe66d 100644 --- a/database/src/seeds/factory/user.ts +++ b/database/src/seeds/factory/user.ts @@ -10,7 +10,7 @@ export const userFactory = async (user: UserInterface): Promise => { dbUserContact.email = user.email ?? '' dbUserContact.type = UserContactType.USER_CONTACT_EMAIL - + let dbUser = new User() dbUser.firstName = user.firstName ?? '' dbUser.lastName = user.lastName ?? '' From 45321810f78e252a091703cc505483613bbc8ad5 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 11:44:18 +0200 Subject: [PATCH 50/72] reduce review noise --- backend/src/graphql/resolver/TransactionResolver.ts | 9 +++++---- backend/src/graphql/resolver/UserResolver.test.ts | 8 +++++--- backend/src/graphql/resolver/UserResolver.ts | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 4575a8b3e..359e69b45 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -69,7 +69,7 @@ export const executeTransaction = async ( } try { - logger.info('executeTransaction', memo) + logger.info('executeTransaction', amount, memo, sender, recipient) if (await countOpenPendingTransactions([sender.gradidoID, recipient.gradidoID]) > 0) { throw new LogError( @@ -88,7 +88,7 @@ export const executeTransaction = async ( receivedCallDate, transactionLink, ) - logger.debug(`calculated balance=${sendBalance?.balance.toString()} decay=${sendBalance?.decay.decay.toString()} lastTransactionId=${sendBalance?.lastTransactionId}`) + logger.debug(`calculated Balance=${sendBalance}`) if (!sendBalance) { throw new LogError('User has not enough GDD or amount is < 0', sendBalance) } @@ -147,7 +147,7 @@ export const executeTransaction = async ( // Save linked transaction id for send transactionSend.linkedTransactionId = transactionReceive.id await queryRunner.manager.update(dbTransaction, { id: transactionSend.id }, transactionSend) - logger.debug('send Transaction updated', new TransactionLoggingView(transactionSend).toJSON()) + logger.debug('send Transaction updated', transactionSend) if (transactionLink) { logger.info('transactionLink', transactionLink) @@ -161,8 +161,10 @@ export const executeTransaction = async ( } await queryRunner.commitTransaction() + logger.info(`commit Transaction successful...`) await EVENT_TRANSACTION_SEND(sender, recipient, transactionSend, transactionSend.amount) + await EVENT_TRANSACTION_RECEIVE( recipient, sender, @@ -184,7 +186,6 @@ export const executeTransaction = async ( } finally { await queryRunner.release() } - await sendTransactionReceivedEmail({ firstName: recipient.firstName, lastName: recipient.lastName, diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 35142e890..cee570c94 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -79,9 +79,11 @@ jest.mock('@/emails/sendEmailVariants', () => { return { __esModule: true, ...originalModule, - sendAccountActivationEmail: jest.fn(), - sendAccountMultiRegistrationEmail: jest.fn(), - sendResetPasswordEmail: jest.fn(), + sendAccountActivationEmail: jest.fn((a) => originalModule.sendAccountActivationEmail(a)), + sendAccountMultiRegistrationEmail: jest.fn((a) => + originalModule.sendAccountMultiRegistrationEmail(a), + ), + sendResetPasswordEmail: jest.fn((a) => originalModule.sendResetPasswordEmail(a)), } }) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 2398a3a95..70b1642a8 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -25,7 +25,7 @@ import { Root, } from 'type-graphql' import { IRestResponse } from 'typed-rest-client' -import { EntityNotFoundError, In, Point } from 'typeorm' +import { EntityManager, EntityNotFoundError, In, Point } from 'typeorm' import { v4 as uuidv4 } from 'uuid' import { UserArgs } from '@arg//UserArgs' From 6caddf05c0bbf10758b149972516e616014f3ebf Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 12:16:56 +0200 Subject: [PATCH 51/72] fix migration mysql --- database/migration/migrations/0096-upgrade_dlt_tables.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migration/migrations/0096-upgrade_dlt_tables.ts b/database/migration/migrations/0096-upgrade_dlt_tables.ts index 849cdfc88..8ee2550ca 100644 --- a/database/migration/migrations/0096-upgrade_dlt_tables.ts +++ b/database/migration/migrations/0096-upgrade_dlt_tables.ts @@ -8,7 +8,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis ADD \`user_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`transaction_id\`, ADD \`transaction_link_id\` INT UNSIGNED NULL DEFAULT NULL AFTER \`user_id\`, ADD \`type_id\` INT UNSIGNED NOT NULL AFTER \`transaction_link_id\`, - ADD \`error\` text NULL DEFAULT NULL AFTER \`verified_at\`, + ADD \`error\` text NULL DEFAULT NULL AFTER \`verified_at\` ; `) } From 5f36c197f65c657a74490e843591195588075ccc Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 12:41:38 +0200 Subject: [PATCH 52/72] fix test --- .github/workflows/test_dlt_connector.yml | 10 ++++++++-- dlt-connector/.gitignore | 9 +++++++++ dlt-connector/src/config/schema.ts | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 dlt-connector/.gitignore diff --git a/.github/workflows/test_dlt_connector.yml b/.github/workflows/test_dlt_connector.yml index da220cba7..4e1b660e8 100644 --- a/.github/workflows/test_dlt_connector.yml +++ b/.github/workflows/test_dlt_connector.yml @@ -30,7 +30,7 @@ jobs: uses: actions/checkout@v3 - name: Build 'test' image - run: docker build --target test -t "gradido/dlt-connector:test" -f dlt-connector/Dockerfile . + run: docker build --target production -t "gradido/dlt-connector:productionTest" -f dlt-connector/Dockerfile . unit_test: name: Unit Tests - DLT Connector @@ -50,4 +50,10 @@ jobs: run: cd dlt-connector && bun install --frozen-lockfile - name: typecheck && unit test - run: cd dlt-connector && bun typecheck && bun test + run: | + GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=$(openssl rand -hex 16) + GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=$(openssl rand -hex 16) + HOME_COMMUNITY_SEED=$(openssl rand -hex 32) + HIERO_OPERATOR_KEY=$(openssl rand -hex 32) + HIERO_OPERATOR_ID="0.0.2" + cd dlt-connector && bun typecheck && bun test diff --git a/dlt-connector/.gitignore b/dlt-connector/.gitignore new file mode 100644 index 000000000..5435dd5ff --- /dev/null +++ b/dlt-connector/.gitignore @@ -0,0 +1,9 @@ +/node_modules/ +/.env +/.env.bak +/build/ +/locales/ +package-json.lock +coverage +# emacs +*~ diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index 3dfe3cbe9..6c364a3ef 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -20,7 +20,7 @@ export const configSchema = v.object({ ), '6010', ), - JWT_SECRET: v.pipe( + JWT_SECRET: v.optional(v.pipe( v.string('The JWT secret for connecting to the backend'), v.custom((input: unknown): boolean => { if (process.env.NODE_ENV === 'production' && input === 'secret123') { @@ -28,7 +28,7 @@ export const configSchema = v.object({ } return true }, "Shouldn't use default value in production"), - ), + ), 'secret123'), GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET: hexSchema, GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY: hex16Schema, HOME_COMMUNITY_SEED: v.pipe( From 6da30e9fd2c6be42db23b38314445fff1c33d75a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 12:45:08 +0200 Subject: [PATCH 53/72] again fix --- .github/workflows/test_dlt_connector.yml | 11 +++++++++++ dlt-connector/src/config/schema.ts | 21 ++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test_dlt_connector.yml b/.github/workflows/test_dlt_connector.yml index 4e1b660e8..bfde9cc8b 100644 --- a/.github/workflows/test_dlt_connector.yml +++ b/.github/workflows/test_dlt_connector.yml @@ -28,6 +28,17 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v3 + + - name: create .env + run: | + cd dlt-connector + cat < .env + GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=$(openssl rand -hex 16) + GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=$(openssl rand -hex 16) + HOME_COMMUNITY_SEED=$(openssl rand -hex 32) + HIERO_OPERATOR_KEY=$(openssl rand -hex 32) + HIERO_OPERATOR_ID="0.0.2" + EOF - name: Build 'test' image run: docker build --target production -t "gradido/dlt-connector:productionTest" -f dlt-connector/Dockerfile . diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index 6c364a3ef..08eeb2b80 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -20,15 +20,18 @@ export const configSchema = v.object({ ), '6010', ), - JWT_SECRET: v.optional(v.pipe( - v.string('The JWT secret for connecting to the backend'), - v.custom((input: unknown): boolean => { - if (process.env.NODE_ENV === 'production' && input === 'secret123') { - return false - } - return true - }, "Shouldn't use default value in production"), - ), 'secret123'), + JWT_SECRET: v.optional( + v.pipe( + v.string('The JWT secret for connecting to the backend'), + v.custom((input: unknown): boolean => { + if (process.env.NODE_ENV === 'production' && input === 'secret123') { + return false + } + return true + }, "Shouldn't use default value in production"), + ), + 'secret123', + ), GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET: hexSchema, GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY: hex16Schema, HOME_COMMUNITY_SEED: v.pipe( From 19c8bb8d446d285c34ed521b3fa5e57dab705bba Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 12:50:05 +0200 Subject: [PATCH 54/72] add export --- .github/workflows/test_dlt_connector.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test_dlt_connector.yml b/.github/workflows/test_dlt_connector.yml index bfde9cc8b..3ba43063f 100644 --- a/.github/workflows/test_dlt_connector.yml +++ b/.github/workflows/test_dlt_connector.yml @@ -62,9 +62,10 @@ jobs: - name: typecheck && unit test run: | - GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=$(openssl rand -hex 16) - GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=$(openssl rand -hex 16) - HOME_COMMUNITY_SEED=$(openssl rand -hex 32) - HIERO_OPERATOR_KEY=$(openssl rand -hex 32) - HIERO_OPERATOR_ID="0.0.2" - cd dlt-connector && bun typecheck && bun test + export GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=$(openssl rand -hex 16) + export GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=$(openssl rand -hex 16) + export HOME_COMMUNITY_SEED=$(openssl rand -hex 32) + export HIERO_OPERATOR_KEY=$(openssl rand -hex 32) + export HIERO_OPERATOR_ID="0.0.2" + cd dlt-connector && bun typecheck && bun test + From 04e0075679cdade8b68a599f8a0f79cfe534d33e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 13:26:43 +0200 Subject: [PATCH 55/72] finetuning of structure --- .../src/{ => cache}/KeyPairCacheManager.ts | 5 ++- .../client/GradidoNode/GradidoNodeClient.ts | 24 +++++------ .../client/GradidoNode/input.schema.test.ts | 14 +++--- .../src/client/backend/BackendClient.ts | 8 +--- .../src/client/backend/community.schema.ts | 43 ------------------- dlt-connector/src/client/backend/graphql.ts | 30 +++++++++++++ ...y.schema.test.ts => output.schema.test.ts} | 2 +- .../src/client/backend/output.schema.ts | 14 ++++++ dlt-connector/src/client/hiero/HieroClient.ts | 10 ++--- dlt-connector/src/config/index.ts | 8 ++-- dlt-connector/src/index.ts | 6 +-- .../ResolveKeyPair.context.test.ts | 12 +++--- .../resolveKeyPair/ResolveKeyPair.context.ts | 3 +- .../sendToHiero/CreationTransaction.role.ts | 2 +- .../DeferredTransferTransaction.role.ts | 6 +-- .../RedeemDeferredTransferTransaction.role.ts | 4 +- .../RegisterAddressTransaction.role.test.ts | 6 +-- .../RegisterAddressTransaction.role.ts | 6 +-- .../sendToHiero/TransferTransaction.role.ts | 4 +- dlt-connector/src/schemas/base.schema.ts | 2 - .../src/schemas/transaction.schema.test.ts | 28 ++++++------ dlt-connector/src/server/index.test.ts | 6 +-- 22 files changed, 118 insertions(+), 125 deletions(-) rename dlt-connector/src/{ => cache}/KeyPairCacheManager.ts (92%) delete mode 100644 dlt-connector/src/client/backend/community.schema.ts create mode 100644 dlt-connector/src/client/backend/graphql.ts rename dlt-connector/src/client/backend/{community.schema.test.ts => output.schema.test.ts} (93%) create mode 100644 dlt-connector/src/client/backend/output.schema.ts delete mode 100644 dlt-connector/src/schemas/base.schema.ts diff --git a/dlt-connector/src/KeyPairCacheManager.ts b/dlt-connector/src/cache/KeyPairCacheManager.ts similarity index 92% rename from dlt-connector/src/KeyPairCacheManager.ts rename to dlt-connector/src/cache/KeyPairCacheManager.ts index a74780471..8d7c3bf56 100644 --- a/dlt-connector/src/KeyPairCacheManager.ts +++ b/dlt-connector/src/cache/KeyPairCacheManager.ts @@ -1,11 +1,12 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' import { getLogger, Logger } from 'log4js' -import { LOG4JS_BASE_CATEGORY } from './config/const' -import { HieroId } from './schemas/typeGuard.schema' +import { LOG4JS_BASE_CATEGORY } from '../config/const' +import { HieroId } from '../schemas/typeGuard.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts +// TODO: TTL (time to live) based, maybe even optional use of redis /** * A Singleton class defines the `getInstance` method that lets clients access * the unique singleton instance. diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts index c7f9d2fb7..9f43b95ef 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -2,7 +2,7 @@ import { ConfirmedTransaction } from 'gradido-blockchain-js' import JsonRpcClient from 'jsonrpc-ts-client' import { JsonRpcEitherResponse } from 'jsonrpc-ts-client/dist/types/utils/jsonrpc' import { getLogger, Logger } from 'log4js' -import { parse } from 'valibot' +import * as v from 'valibot' import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { Uuidv4Hash } from '../../data/Uuidv4Hash' @@ -61,13 +61,13 @@ export class GradidoNodeClient { transactionIdentifier: TransactionIdentifierInput, ): Promise { const parameter = { - ...parse(transactionIdentifierSchema, transactionIdentifier), + ...v.parse(transactionIdentifierSchema, transactionIdentifier), format: 'base64', } const response = await this.rpcCall<{ transaction: string }>('getTransaction', parameter) if (response.isSuccess()) { // this.logger.debug('result: ', response.result.transaction) - return parse(confirmedTransactionSchema, response.result.transaction) + return v.parse(confirmedTransactionSchema, response.result.transaction) } if (response.isError()) { if (response.error.code === GradidoNodeErrorCodes.TRANSACTION_NOT_FOUND) { @@ -92,7 +92,7 @@ export class GradidoNodeClient { } const response = await this.rpcCall<{ transaction: string }>('getLastTransaction', parameter) if (response.isSuccess()) { - return parse(confirmedTransactionSchema, response.result.transaction) + return v.parse(confirmedTransactionSchema, response.result.transaction) } if (response.isError()) { if (response.error.code === GradidoNodeErrorCodes.GRADIDO_NODE_ERROR) { @@ -121,7 +121,7 @@ export class GradidoNodeClient { */ public async getTransactions(input: TransactionsRangeInput): Promise { const parameter = { - ...parse(transactionsRangeSchema, input), + ...v.parse(transactionsRangeSchema, input), format: 'base64', } const result = await this.rpcCallResolved<{ transactions: string[] }>( @@ -129,7 +129,7 @@ export class GradidoNodeClient { parameter, ) return result.transactions.map((transactionBase64) => - parse(confirmedTransactionSchema, transactionBase64), + v.parse(confirmedTransactionSchema, transactionBase64), ) } @@ -146,8 +146,8 @@ export class GradidoNodeClient { pubkey: Hex32Input, ): Promise { const parameter = { - ...parse(transactionsRangeSchema, transactionRange), - pubkey: parse(hex32Schema, pubkey), + ...v.parse(transactionsRangeSchema, transactionRange), + pubkey: v.parse(hex32Schema, pubkey), format: 'base64', } const response = await this.rpcCallResolved<{ transactions: string[] }>( @@ -155,7 +155,7 @@ export class GradidoNodeClient { parameter, ) return response.transactions.map((transactionBase64) => - parse(confirmedTransactionSchema, transactionBase64), + v.parse(confirmedTransactionSchema, transactionBase64), ) } @@ -172,14 +172,14 @@ export class GradidoNodeClient { public async getAddressType(pubkey: Hex32Input, hieroTopic: HieroId): Promise { const parameter = { - pubkey: parse(hex32Schema, pubkey), + pubkey: v.parse(hex32Schema, pubkey), topic: hieroTopic, } const response = await this.rpcCallResolved<{ addressType: string }>( 'getAddressType', parameter, ) - return parse(addressTypeSchema, response.addressType) + return v.parse(addressTypeSchema, response.addressType) } /** @@ -204,7 +204,7 @@ export class GradidoNodeClient { ) if (response.isSuccess()) { this.logger.info(`call findUserByNameHash, used ${response.result.timeUsed}`) - return parse(hex32Schema, response.result.pubkey) + return v.parse(hex32Schema, response.result.pubkey) } if ( response.isError() && diff --git a/dlt-connector/src/client/GradidoNode/input.schema.test.ts b/dlt-connector/src/client/GradidoNode/input.schema.test.ts index b4c86326e..fbe63dabb 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.test.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.test.ts @@ -1,5 +1,5 @@ import { beforeAll, describe, expect, it } from 'bun:test' -import { parse } from 'valibot' +import * as v from 'valibot' import { HieroId, HieroTransactionIdString, @@ -12,14 +12,14 @@ let topic: HieroId const topicString = '0.0.261' let hieroTransactionId: HieroTransactionIdString beforeAll(() => { - topic = parse(hieroIdSchema, topicString) - hieroTransactionId = parse(hieroTransactionIdStringSchema, '0.0.261-1755348116-1281621') + topic = v.parse(hieroIdSchema, topicString) + hieroTransactionId = v.parse(hieroTransactionIdStringSchema, '0.0.261-1755348116-1281621') }) describe('transactionIdentifierSchema ', () => { it('valid, transaction identified by transactionNr and topic', () => { expect( - parse(transactionIdentifierSchema, { + v.parse(transactionIdentifierSchema, { transactionId: 1, topic: topicString, }), @@ -31,7 +31,7 @@ describe('transactionIdentifierSchema ', () => { }) it('valid, transaction identified by hieroTransactionId and topic', () => { expect( - parse(transactionIdentifierSchema, { + v.parse(transactionIdentifierSchema, { hieroTransactionId: '0.0.261-1755348116-1281621', topic: topicString, }), @@ -42,7 +42,7 @@ describe('transactionIdentifierSchema ', () => { }) it('invalid, missing topic', () => { expect(() => - parse(transactionIdentifierSchema, { + v.parse(transactionIdentifierSchema, { transactionId: 1, hieroTransactionId: '0.0.261-1755348116-1281621', }), @@ -50,7 +50,7 @@ describe('transactionIdentifierSchema ', () => { }) it('invalid, transactionNr and iotaMessageId set', () => { expect(() => - parse(transactionIdentifierSchema, { + v.parse(transactionIdentifierSchema, { transactionId: 1, hieroTransactionId: '0.0.261-1755348116-1281621', topic, diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index 2d587a4d8..d5cc3be9e 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -5,12 +5,8 @@ import * as v from 'valibot' import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId, Uuidv4 } from '../../schemas/typeGuard.schema' -import { - type Community, - communitySchema, - homeCommunityGraphqlQuery, - setHomeCommunityTopicId, -} from './community.schema' +import { homeCommunityGraphqlQuery, setHomeCommunityTopicId } from './graphql' +import { type Community, communitySchema } from './output.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example // and ../federation/client/FederationClientFactory.ts diff --git a/dlt-connector/src/client/backend/community.schema.ts b/dlt-connector/src/client/backend/community.schema.ts deleted file mode 100644 index a37159bc5..000000000 --- a/dlt-connector/src/client/backend/community.schema.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { gql } from 'graphql-request' -import * as v from 'valibot' -import { dateSchema } from '../../schemas/typeConverter.schema' -import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' - -/** - * Schema Definitions for graphql response - */ -export const communitySchema = v.object({ - uuid: uuidv4Schema, - name: v.string('expect string type'), - hieroTopicId: v.nullish(hieroIdSchema), - foreign: v.boolean('expect boolean type'), - creationDate: dateSchema, -}) - -export type CommunityInput = v.InferInput -export type Community = v.InferOutput - -// graphql query for getting home community in tune with community schema -export const homeCommunityGraphqlQuery = gql` - query { - homeCommunity { - uuid - name - hieroTopicId - foreign - creationDate - } - } -` - -export const setHomeCommunityTopicId = gql` - mutation ($uuid: String!, $hieroTopicId: String){ - updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { - uuid - name - hieroTopicId - foreign - creationDate - } - } -` diff --git a/dlt-connector/src/client/backend/graphql.ts b/dlt-connector/src/client/backend/graphql.ts new file mode 100644 index 000000000..11d1eb099 --- /dev/null +++ b/dlt-connector/src/client/backend/graphql.ts @@ -0,0 +1,30 @@ +import { gql } from 'graphql-request' + +/** + * Schema Definitions for graphql requests + */ + +// graphql query for getting home community in tune with community schema +export const homeCommunityGraphqlQuery = gql` + query { + homeCommunity { + uuid + name + hieroTopicId + foreign + creationDate + } + } +` + +export const setHomeCommunityTopicId = gql` + mutation ($uuid: String!, $hieroTopicId: String){ + updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { + uuid + name + hieroTopicId + foreign + creationDate + } + } +` diff --git a/dlt-connector/src/client/backend/community.schema.test.ts b/dlt-connector/src/client/backend/output.schema.test.ts similarity index 93% rename from dlt-connector/src/client/backend/community.schema.test.ts rename to dlt-connector/src/client/backend/output.schema.test.ts index 180ab9d5a..6697bd210 100644 --- a/dlt-connector/src/client/backend/community.schema.test.ts +++ b/dlt-connector/src/client/backend/output.schema.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'bun:test' import * as v from 'valibot' import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' -import { communitySchema } from './community.schema' +import { communitySchema } from './output.schema' describe('community.schema', () => { it('community', () => { diff --git a/dlt-connector/src/client/backend/output.schema.ts b/dlt-connector/src/client/backend/output.schema.ts new file mode 100644 index 000000000..86c658fe8 --- /dev/null +++ b/dlt-connector/src/client/backend/output.schema.ts @@ -0,0 +1,14 @@ +import * as v from 'valibot' +import { dateSchema } from '../../schemas/typeConverter.schema' +import { hieroIdSchema, uuidv4Schema } from '../../schemas/typeGuard.schema' + +export const communitySchema = v.object({ + uuid: uuidv4Schema, + name: v.string('expect string type'), + hieroTopicId: v.nullish(hieroIdSchema), + foreign: v.boolean('expect boolean type'), + creationDate: dateSchema, +}) + +export type CommunityInput = v.InferInput +export type Community = v.InferOutput diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index a22e8f27b..e48eefc92 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -10,13 +10,11 @@ import { TopicMessageSubmitTransaction, TopicUpdateTransaction, TransactionId, - TransactionReceipt, - TransactionResponse, Wallet, } from '@hashgraph/sdk' -import { GradidoTransaction, HieroTopicId } from 'gradido-blockchain-js' +import { GradidoTransaction } from 'gradido-blockchain-js' import { getLogger, Logger } from 'log4js' -import { parse } from 'valibot' +import * as v from 'valibot' import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' @@ -139,7 +137,7 @@ export class HieroClient { } this.logger.debug(`topic sequence number: ${info.sequenceNumber.toNumber()}`) // this.logger.debug(JSON.stringify(info, null, 2)) - return parse(topicInfoSchema, { + return v.parse(topicInfoSchema, { topicId: topicId.toString(), sequenceNumber: info.sequenceNumber.toNumber(), expirationTime: info.expirationTime?.toDate(), @@ -165,7 +163,7 @@ export class HieroClient { this.logger.addContext('topicId', createReceipt.topicId?.toString()) const record = await createResponse.getRecordWithSigner(this.wallet) this.logger.info(`topic created, cost: ${record.transactionFee.toString()}`) - return parse(hieroIdSchema, createReceipt.topicId?.toString()) + return v.parse(hieroIdSchema, createReceipt.topicId?.toString()) } public async updateTopic(topicId: HieroId): Promise { diff --git a/dlt-connector/src/config/index.ts b/dlt-connector/src/config/index.ts index 10e3cea39..044cb610d 100644 --- a/dlt-connector/src/config/index.ts +++ b/dlt-connector/src/config/index.ts @@ -1,16 +1,16 @@ import dotenv from 'dotenv' -import { InferOutput, parse, ValiError } from 'valibot' +import * as v from 'valibot' import { configSchema } from './schema' dotenv.config() -type ConfigOutput = InferOutput +type ConfigOutput = v.InferOutput let config: ConfigOutput try { - config = parse(configSchema, process.env) + config = v.parse(configSchema, process.env) } catch (error) { - if (error instanceof ValiError) { + if (error instanceof v.ValiError) { // biome-ignore lint/suspicious/noConsole: need to parse config before initializing logger console.error( `${error.issues[0].path[0].key}: ${error.message} received: ${error.issues[0].received}`, diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 2a681d300..22ae267e2 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -2,14 +2,14 @@ import { readFileSync } from 'node:fs' import { Elysia } from 'elysia' import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' import { configure, getLogger, Logger } from 'log4js' -import { parse } from 'valibot' +import * as v from 'valibot' +import { KeyPairCacheManager } from './cache/KeyPairCacheManager' import { BackendClient } from './client/backend/BackendClient' import { GradidoNodeClient } from './client/GradidoNode/GradidoNodeClient' import { HieroClient } from './client/hiero/HieroClient' import { CONFIG } from './config' import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from './config/const' import { SendToHieroContext } from './interactions/sendToHiero/SendToHiero.context' -import { KeyPairCacheManager } from './KeyPairCacheManager' import { Community, communitySchema } from './schemas/transaction.schema' import { appRoutes } from './server' import { isPortOpenRetry } from './utils/network' @@ -133,7 +133,7 @@ async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): logger.info(`home community topic: ${homeCommunity.hieroTopicId}`) logger.info(`gradido node server: ${CONFIG.NODE_SERVER_URL}`) logger.info(`gradido backend server: ${CONFIG.BACKEND_SERVER_URL}`) - return parse(communitySchema, homeCommunity) + return v.parse(communitySchema, homeCommunity) } main().catch((e) => { diff --git a/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts index 6d208eaff..16a444cd8 100644 --- a/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts +++ b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.test.ts @@ -1,8 +1,8 @@ import { afterAll, beforeAll, describe, expect, it, mock } from 'bun:test' import { KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' -import { parse } from 'valibot' +import * as v from 'valibot' +import { KeyPairCacheManager } from '../../cache/KeyPairCacheManager' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { KeyPairCacheManager } from '../../KeyPairCacheManager' import { identifierKeyPairSchema } from '../../schemas/account.schema' import { HieroId, hieroIdSchema } from '../../schemas/typeGuard.schema' import { ResolveKeyPair } from './ResolveKeyPair.context' @@ -41,11 +41,11 @@ afterAll(() => { describe('KeyPairCalculation', () => { beforeAll(() => { - KeyPairCacheManager.getInstance().setHomeCommunityTopicId(parse(hieroIdSchema, '0.0.21732')) + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(v.parse(hieroIdSchema, '0.0.21732')) }) it('community key pair', async () => { const identifier = new KeyPairIdentifierLogic( - parse(identifierKeyPairSchema, { communityTopicId: topicId }), + v.parse(identifierKeyPairSchema, { communityTopicId: topicId }), ) const keyPair = await ResolveKeyPair(identifier) expect(keyPair.getPublicKey()?.convertToHex()).toBe( @@ -54,7 +54,7 @@ describe('KeyPairCalculation', () => { }) it('user key pair', async () => { const identifier = new KeyPairIdentifierLogic( - parse(identifierKeyPairSchema, { + v.parse(identifierKeyPairSchema, { communityTopicId: topicId, account: { userUuid }, }), @@ -69,7 +69,7 @@ describe('KeyPairCalculation', () => { it('account key pair', async () => { const identifier = new KeyPairIdentifierLogic( - parse(identifierKeyPairSchema, { + v.parse(identifierKeyPairSchema, { communityTopicId: topicId, account: { userUuid, accountNr: 1 }, }), diff --git a/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts index 2fbdd906c..406463c4c 100644 --- a/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts +++ b/dlt-connector/src/interactions/resolveKeyPair/ResolveKeyPair.context.ts @@ -1,7 +1,6 @@ import { KeyPairEd25519 } from 'gradido-blockchain-js' - +import { KeyPairCacheManager } from '../../cache/KeyPairCacheManager' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { KeyPairCacheManager } from '../../KeyPairCacheManager' import { AccountKeyPairRole } from './AccountKeyPair.role' import { ForeignCommunityKeyPairRole } from './ForeignCommunityKeyPair.role' import { HomeCommunityKeyPairRole } from './HomeCommunityKeyPair.role' diff --git a/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts index d11b031e2..4b0f7aefd 100644 --- a/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/CreationTransaction.role.ts @@ -5,8 +5,8 @@ import { TransferAmount, } from 'gradido-blockchain-js' import { parse } from 'valibot' +import { KeyPairCacheManager } from '../../cache/KeyPairCacheManager' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' -import { KeyPairCacheManager } from '../../KeyPairCacheManager' import { CreationTransaction, creationTransactionSchema, diff --git a/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts index ac0b924f6..95459a8b6 100644 --- a/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/DeferredTransferTransaction.role.ts @@ -5,7 +5,7 @@ import { GradidoTransfer, TransferAmount, } from 'gradido-blockchain-js' -import { parse } from 'valibot' +import * as v from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { DeferredTransferTransaction, @@ -21,8 +21,8 @@ export class DeferredTransferTransactionRole extends AbstractTransactionRole { private readonly deferredTransferTransaction: DeferredTransferTransaction constructor(transaction: Transaction) { super() - this.deferredTransferTransaction = parse(deferredTransferTransactionSchema, transaction) - this.seed = parse(identifierSeedSchema, this.deferredTransferTransaction.linkedUser.seed) + this.deferredTransferTransaction = v.parse(deferredTransferTransactionSchema, transaction) + this.seed = v.parse(identifierSeedSchema, this.deferredTransferTransaction.linkedUser.seed) } getSenderCommunityTopicId(): HieroId { diff --git a/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts index 76d621762..626712404 100644 --- a/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RedeemDeferredTransferTransaction.role.ts @@ -1,5 +1,5 @@ import { GradidoTransactionBuilder, GradidoTransfer, TransferAmount } from 'gradido-blockchain-js' -import { parse } from 'valibot' +import * as v from 'valibot' import { GradidoNodeClient } from '../../client/GradidoNode/GradidoNodeClient' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { @@ -17,7 +17,7 @@ export class RedeemDeferredTransferTransactionRole extends AbstractTransactionRo private readonly redeemDeferredTransferTransaction: RedeemDeferredTransferTransaction constructor(transaction: Transaction) { super() - this.redeemDeferredTransferTransaction = parse( + this.redeemDeferredTransferTransaction = v.parse( redeemDeferredTransferTransactionSchema, transaction, ) diff --git a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts index 968a3c992..ef896e1e8 100644 --- a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'bun:test' import { InteractionToJson, InteractionValidate, ValidateType_SINGLE } from 'gradido-blockchain-js' -import { parse } from 'valibot' +import * as v from 'valibot' import { transactionSchema } from '../../schemas/transaction.schema' import { hieroIdSchema } from '../../schemas/typeGuard.schema' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' @@ -22,10 +22,10 @@ const transaction = { describe('RegisterAddressTransaction.role', () => { it('get correct prepared builder', async () => { const registerAddressTransactionRole = new RegisterAddressTransactionRole( - parse(transactionSchema, transaction), + v.parse(transactionSchema, transaction), ) expect(registerAddressTransactionRole.getSenderCommunityTopicId()).toBe( - parse(hieroIdSchema, '0.0.21732'), + v.parse(hieroIdSchema, '0.0.21732'), ) expect(() => registerAddressTransactionRole.getRecipientCommunityTopicId()).toThrow() const builder = await registerAddressTransactionRole.getGradidoTransactionBuilder() diff --git a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts index 8f0f50e6b..acb40975c 100644 --- a/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/RegisterAddressTransaction.role.ts @@ -1,5 +1,5 @@ import { AddressType, GradidoTransactionBuilder } from 'gradido-blockchain-js' -import { parse } from 'valibot' +import * as v from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { Uuidv4Hash } from '../../data/Uuidv4Hash' import { @@ -20,8 +20,8 @@ export class RegisterAddressTransactionRole extends AbstractTransactionRole { private readonly account: IdentifierCommunityAccount constructor(input: Transaction) { super() - this.registerAddressTransaction = parse(registerAddressTransactionSchema, input) - this.account = parse(identifierCommunityAccountSchema, input.user.account) + this.registerAddressTransaction = v.parse(registerAddressTransactionSchema, input) + this.account = v.parse(identifierCommunityAccountSchema, input.user.account) } getSenderCommunityTopicId(): HieroId { diff --git a/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts b/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts index 03d1480b9..f0a1314cb 100644 --- a/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts +++ b/dlt-connector/src/interactions/sendToHiero/TransferTransaction.role.ts @@ -4,7 +4,7 @@ import { GradidoTransactionBuilder, TransferAmount, } from 'gradido-blockchain-js' -import { parse } from 'valibot' +import * as v from 'valibot' import { KeyPairIdentifierLogic } from '../../data/KeyPairIdentifier.logic' import { Transaction, @@ -19,7 +19,7 @@ export class TransferTransactionRole extends AbstractTransactionRole { private transferTransaction: TransferTransaction constructor(input: Transaction) { super() - this.transferTransaction = parse(transferTransactionSchema, input) + this.transferTransaction = v.parse(transferTransactionSchema, input) } getSenderCommunityTopicId(): HieroId { diff --git a/dlt-connector/src/schemas/base.schema.ts b/dlt-connector/src/schemas/base.schema.ts deleted file mode 100644 index da3dbfdfa..000000000 --- a/dlt-connector/src/schemas/base.schema.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { MemoryBlock } from 'gradido-blockchain-js' -import * as v from 'valibot' diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index de87cacfd..533cd35b9 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -4,7 +4,7 @@ import { TypeBoxFromValibot } from '@sinclair/typemap' import { randomBytes } from 'crypto' import { AddressType_COMMUNITY_HUMAN } from 'gradido-blockchain-js' import { v4 as uuidv4 } from 'uuid' -import { parse } from 'valibot' +import * as v from 'valibot' import { AccountType } from '../enum/AccountType' import { InputTransactionType } from '../enum/InputTransactionType' import { @@ -35,7 +35,7 @@ const transactionLinkCode = (date: Date): string => { let topic: HieroId const topicString = '0.0.261' beforeAll(() => { - topic = parse(hieroIdSchema, topicString) + topic = v.parse(hieroIdSchema, topicString) }) describe('transaction schemas', () => { @@ -45,9 +45,9 @@ describe('transaction schemas', () => { let memo: Memo beforeAll(() => { userUuidString = uuidv4() - userUuid = parse(uuidv4Schema, userUuidString) + userUuid = v.parse(uuidv4Schema, userUuidString) memoString = 'TestMemo' - memo = parse(memoSchema, memoString) + memo = v.parse(memoSchema, memoString) }) describe('register address', () => { let registerAddress: TransactionInput @@ -63,7 +63,7 @@ describe('transaction schemas', () => { } }) it('valid transaction schema', () => { - expect(parse(transactionSchema, registerAddress)).toEqual({ + expect(v.parse(transactionSchema, registerAddress)).toEqual({ user: { communityTopicId: topic, account: { @@ -77,7 +77,7 @@ describe('transaction schemas', () => { }) }) it('valid register address schema', () => { - expect(parse(registerAddressTransactionSchema, registerAddress)).toEqual({ + expect(v.parse(registerAddressTransactionSchema, registerAddress)).toEqual({ user: { communityTopicId: topic, account: { @@ -112,7 +112,7 @@ describe('transaction schemas', () => { type: InputTransactionType.GRADIDO_TRANSFER, createdAt: '2022-01-01T00:00:00.000Z', } - expect(parse(transactionSchema, gradidoTransfer)).toEqual({ + expect(v.parse(transactionSchema, gradidoTransfer)).toEqual({ user: { communityTopicId: topic, account: { @@ -127,7 +127,7 @@ describe('transaction schemas', () => { accountNr: 0, }, }, - amount: parse(gradidoAmountSchema, gradidoTransfer.amount!), + amount: v.parse(gradidoAmountSchema, gradidoTransfer.amount!), memo, type: gradidoTransfer.type, createdAt: new Date(gradidoTransfer.createdAt), @@ -150,7 +150,7 @@ describe('transaction schemas', () => { createdAt: '2022-01-01T00:00:00.000Z', targetDate: '2021-11-01T10:00', } - expect(parse(transactionSchema, gradidoCreation)).toEqual({ + expect(v.parse(transactionSchema, gradidoCreation)).toEqual({ user: { communityTopicId: topic, account: { userUuid, accountNr: 0 }, @@ -159,7 +159,7 @@ describe('transaction schemas', () => { communityTopicId: topic, account: { userUuid, accountNr: 0 }, }, - amount: parse(gradidoAmountSchema, gradidoCreation.amount!), + amount: v.parse(gradidoAmountSchema, gradidoCreation.amount!), memo, type: gradidoCreation.type, createdAt: new Date(gradidoCreation.createdAt), @@ -168,7 +168,7 @@ describe('transaction schemas', () => { }) it('valid, gradido transaction link / deferred transfer', () => { const seed = transactionLinkCode(new Date()) - const seedParsed = parse(identifierSeedSchema, seed) + const seedParsed = v.parse(identifierSeedSchema, seed) const gradidoTransactionLink: TransactionInput = { user: { communityTopicId: topicString, @@ -186,7 +186,7 @@ describe('transaction schemas', () => { createdAt: '2022-01-01T00:00:00.000Z', timeoutDuration: 60 * 60 * 24 * 30, } - expect(parse(transactionSchema, gradidoTransactionLink)).toEqual({ + expect(v.parse(transactionSchema, gradidoTransactionLink)).toEqual({ user: { communityTopicId: topic, account: { @@ -198,11 +198,11 @@ describe('transaction schemas', () => { communityTopicId: topic, seed: seedParsed, }, - amount: parse(gradidoAmountSchema, gradidoTransactionLink.amount!), + amount: v.parse(gradidoAmountSchema, gradidoTransactionLink.amount!), memo, type: gradidoTransactionLink.type, createdAt: new Date(gradidoTransactionLink.createdAt), - timeoutDuration: parse(timeoutDurationSchema, gradidoTransactionLink.timeoutDuration!), + timeoutDuration: v.parse(timeoutDurationSchema, gradidoTransactionLink.timeoutDuration!), }) }) }) diff --git a/dlt-connector/src/server/index.test.ts b/dlt-connector/src/server/index.test.ts index 3fa0ce07b..9ec7f236a 100644 --- a/dlt-connector/src/server/index.test.ts +++ b/dlt-connector/src/server/index.test.ts @@ -1,8 +1,8 @@ import { beforeAll, describe, expect, it, mock } from 'bun:test' import { AccountId, Timestamp, TransactionId } from '@hashgraph/sdk' import { GradidoTransaction, KeyPairEd25519, MemoryBlock } from 'gradido-blockchain-js' -import { parse } from 'valibot' -import { KeyPairCacheManager } from '../KeyPairCacheManager' +import * as v from 'valibot' +import { KeyPairCacheManager } from '../cache/KeyPairCacheManager' import { HieroId, hieroIdSchema } from '../schemas/typeGuard.schema' import { appRoutes } from '.' @@ -44,7 +44,7 @@ mock.module('../config', () => ({ })) beforeAll(() => { - KeyPairCacheManager.getInstance().setHomeCommunityTopicId(parse(hieroIdSchema, '0.0.21732')) + KeyPairCacheManager.getInstance().setHomeCommunityTopicId(v.parse(hieroIdSchema, '0.0.21732')) }) describe('Server', () => { From 1560486dd39fb44ca21741a8f95b28a401520d9e Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 14:21:05 +0200 Subject: [PATCH 56/72] split main code --- dlt-connector/src/bootstrap/appContext.ts | 26 +++++ dlt-connector/src/bootstrap/init.ts | 81 +++++++++++++ dlt-connector/src/bootstrap/shutdown.ts | 28 +++++ dlt-connector/src/index.ts | 132 ++-------------------- 4 files changed, 147 insertions(+), 120 deletions(-) create mode 100644 dlt-connector/src/bootstrap/appContext.ts create mode 100644 dlt-connector/src/bootstrap/init.ts create mode 100644 dlt-connector/src/bootstrap/shutdown.ts diff --git a/dlt-connector/src/bootstrap/appContext.ts b/dlt-connector/src/bootstrap/appContext.ts new file mode 100644 index 000000000..5a1cbbc18 --- /dev/null +++ b/dlt-connector/src/bootstrap/appContext.ts @@ -0,0 +1,26 @@ +import { BackendClient } from '../client/backend/BackendClient' +import { HieroClient } from '../client/hiero/HieroClient' +import { GradidoNodeClient } from '../client/GradidoNode/GradidoNodeClient' +import { KeyPairCacheManager } from '../cache/KeyPairCacheManager' + +export type AppContextClients = { + backend: BackendClient + hiero: HieroClient + gradidoNode: GradidoNodeClient +} + +export type AppContext = { + cache: KeyPairCacheManager + clients: AppContextClients +} + +export function createAppContext(): AppContext { + return { + cache: KeyPairCacheManager.getInstance(), + clients: { + backend: BackendClient.getInstance(), + hiero: HieroClient.getInstance(), + gradidoNode: GradidoNodeClient.getInstance(), + }, + } +} \ No newline at end of file diff --git a/dlt-connector/src/bootstrap/init.ts b/dlt-connector/src/bootstrap/init.ts new file mode 100644 index 000000000..dfd0f7226 --- /dev/null +++ b/dlt-connector/src/bootstrap/init.ts @@ -0,0 +1,81 @@ +import { readFileSync } from 'node:fs' +import { CONFIG } from '../config' +import { configure, getLogger, Logger } from 'log4js' +import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' +import { type AppContext, type AppContextClients } from './appContext' +import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from '../config/const' +import * as v from 'valibot' +import { Community, communitySchema } from '../schemas/transaction.schema' +import { isPortOpenRetry } from '../utils/network' +import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.context' + +export function loadConfig(): Logger { + // configure log4js + // TODO: replace late by loader from config-schema + const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8')) + configure(options) + const logger = getLogger('dlt') + + // load crypto keys for gradido blockchain lib + loadCryptoKeys( + MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), + MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY), + ) + return logger +} + +export async function checkHieroAccount(logger: Logger, clients: AppContextClients): Promise { + const balance = await clients.hiero.getBalance() + logger.info(`Hiero Account Balance: ${balance.hbars.toString()}`) +} + +export async function checkHomeCommunity(appContext: AppContext, logger: Logger): Promise { + const { backend, hiero } = appContext.clients + + // wait for backend server + await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) + // ask backend for home community + let homeCommunity = await backend.getHomeCommunityDraft() + // on missing topicId, create one + if (!homeCommunity.hieroTopicId) { + const topicId = await hiero.createTopic(homeCommunity.name) + // update topic on backend server + homeCommunity = await backend.setHomeCommunityTopicId(homeCommunity.uuid, topicId) + } else { + // if topic exist, check if we need to update it + let topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) + // console.log(`topicInfo: ${JSON.stringify(topicInfo, null, 2)}`) + if ( + topicInfo.expirationTime.getTime() - new Date().getTime() < + MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE + ) { + await hiero.updateTopic(homeCommunity.hieroTopicId) + topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) + logger.info( + `updated topic info, new expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, + ) + } + } + if (!homeCommunity.hieroTopicId) { + throw new Error('still no topic id, after creating topic and update community in backend.') + } + appContext.cache.setHomeCommunityTopicId(homeCommunity.hieroTopicId) + logger.info(`home community topic: ${homeCommunity.hieroTopicId}`) + logger.info(`gradido node server: ${CONFIG.NODE_SERVER_URL}`) + logger.info(`gradido backend server: ${CONFIG.BACKEND_SERVER_URL}`) + return v.parse(communitySchema, homeCommunity) +} + +export async function checkGradidoNode(clients: AppContextClients, logger: Logger, homeCommunity: Community): Promise { + // ask gradido node if community blockchain was created + try { + if ( + !(await clients.gradidoNode.getTransaction({ transactionId: 1, topic: homeCommunity.hieroTopicId })) + ) { + // if not exist, create community root transaction + await SendToHieroContext(homeCommunity) + } + } catch (e) { + logger.error(`error requesting gradido node: ${e}`) + } +} \ No newline at end of file diff --git a/dlt-connector/src/bootstrap/shutdown.ts b/dlt-connector/src/bootstrap/shutdown.ts new file mode 100644 index 000000000..7c9b48c80 --- /dev/null +++ b/dlt-connector/src/bootstrap/shutdown.ts @@ -0,0 +1,28 @@ +import { Logger } from 'log4js' +import { type AppContextClients } from './appContext' + +export function setupGracefulShutdown(logger: Logger, clients: AppContextClients) { + const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'] + signals.forEach((sig) => { + process.on(sig, async () => { + logger.info(`[shutdown] Got ${sig}, cleaning up…`) + await gracefulShutdown(logger, clients) + process.exit(0) + }) + }) + + if (process.platform === 'win32') { + const rl = require('readline').createInterface({ + input: process.stdin, + output: process.stdout, + }) + rl.on('SIGINT', () => { + process.emit('SIGINT' as any) + }) + } +} + +async function gracefulShutdown(logger: Logger, clients: AppContextClients) { + logger.info('graceful shutdown') + await clients.hiero.waitForPendingPromises() +} \ No newline at end of file diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index 22ae267e2..eb82bab91 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,141 +1,33 @@ -import { readFileSync } from 'node:fs' import { Elysia } from 'elysia' -import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' -import { configure, getLogger, Logger } from 'log4js' -import * as v from 'valibot' -import { KeyPairCacheManager } from './cache/KeyPairCacheManager' -import { BackendClient } from './client/backend/BackendClient' -import { GradidoNodeClient } from './client/GradidoNode/GradidoNodeClient' -import { HieroClient } from './client/hiero/HieroClient' import { CONFIG } from './config' -import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from './config/const' -import { SendToHieroContext } from './interactions/sendToHiero/SendToHiero.context' -import { Community, communitySchema } from './schemas/transaction.schema' import { appRoutes } from './server' -import { isPortOpenRetry } from './utils/network' - -type Clients = { - backend: BackendClient - hiero: HieroClient - gradidoNode: GradidoNodeClient -} +import { setupGracefulShutdown } from './bootstrap/shutdown' +import { createAppContext } from './bootstrap/appContext' +import { checkHieroAccount, checkHomeCommunity, checkGradidoNode, loadConfig } from './bootstrap/init' async function main() { - // load everything from .env + // load log4js-config, logger and gradido-blockchain-js crypto keys const logger = loadConfig() - const clients = createClients() - const { hiero, gradidoNode } = clients + // initialize singletons (clients and cache) + const appContext = createAppContext() // show hiero account balance, double also as check if valid hiero account was given in config - const balance = await hiero.getBalance() - logger.info(`Hiero Account Balance: ${balance.hbars.toString()}`) + await checkHieroAccount(logger, appContext.clients) // get home community, create topic if not exist, or check topic expiration and update it if needed - const homeCommunity = await homeCommunitySetup(clients, logger) + const homeCommunity = await checkHomeCommunity(appContext, logger) // ask gradido node if community blockchain was created - try { - if ( - !(await gradidoNode.getTransaction({ transactionId: 1, topic: homeCommunity.hieroTopicId })) - ) { - // if not exist, create community root transaction - await SendToHieroContext(homeCommunity) - } - } catch (e) { - logger.error(`error requesting gradido node: ${e}`) - } + // if not exist, create community root transaction + await checkGradidoNode(appContext.clients, logger, homeCommunity) + // listen for rpc request from backend (graphql replaced with elysiaJS) new Elysia().use(appRoutes).listen(CONFIG.DLT_CONNECTOR_PORT, () => { logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) - setupGracefulShutdown(logger) + setupGracefulShutdown(logger, appContext.clients) }) } -function setupGracefulShutdown(logger: Logger) { - const signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM'] - signals.forEach((sig) => { - process.on(sig, async () => { - logger.info(`[shutdown] Got ${sig}, cleaning up…`) - await gracefulShutdown(logger) - process.exit(0) - }) - }) - - if (process.platform === 'win32') { - const rl = require('readline').createInterface({ - input: process.stdin, - output: process.stdout, - }) - rl.on('SIGINT', () => { - process.emit('SIGINT' as any) - }) - } -} - -async function gracefulShutdown(logger: Logger) { - logger.info('graceful shutdown') - await HieroClient.getInstance().waitForPendingPromises() -} - -function loadConfig(): Logger { - // configure log4js - // TODO: replace late by loader from config-schema - const options = JSON.parse(readFileSync(CONFIG.LOG4JS_CONFIG, 'utf-8')) - configure(options) - const logger = getLogger('dlt') - - // load crypto keys for gradido blockchain lib - loadCryptoKeys( - MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET), - MemoryBlock.fromHex(CONFIG.GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY), - ) - return logger -} - -// needed to be called after loading config -function createClients(): Clients { - return { - backend: BackendClient.getInstance(), - hiero: HieroClient.getInstance(), - gradidoNode: GradidoNodeClient.getInstance(), - } -} - -async function homeCommunitySetup({ backend, hiero }: Clients, logger: Logger): Promise { - // wait for backend server - await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) - // ask backend for home community - let homeCommunity = await backend.getHomeCommunityDraft() - // on missing topicId, create one - if (!homeCommunity.hieroTopicId) { - const topicId = await hiero.createTopic(homeCommunity.name) - // update topic on backend server - homeCommunity = await backend.setHomeCommunityTopicId(homeCommunity.uuid, topicId) - } else { - // if topic exist, check if we need to update it - let topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) - // console.log(`topicInfo: ${JSON.stringify(topicInfo, null, 2)}`) - if ( - topicInfo.expirationTime.getTime() - new Date().getTime() < - MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE - ) { - await hiero.updateTopic(homeCommunity.hieroTopicId) - topicInfo = await hiero.getTopicInfo(homeCommunity.hieroTopicId) - logger.info( - `updated topic info, new expiration time: ${topicInfo.expirationTime.toLocaleDateString()}`, - ) - } - } - if (!homeCommunity.hieroTopicId) { - throw new Error('still no topic id, after creating topic and update community in backend.') - } - KeyPairCacheManager.getInstance().setHomeCommunityTopicId(homeCommunity.hieroTopicId) - logger.info(`home community topic: ${homeCommunity.hieroTopicId}`) - logger.info(`gradido node server: ${CONFIG.NODE_SERVER_URL}`) - logger.info(`gradido backend server: ${CONFIG.BACKEND_SERVER_URL}`) - return v.parse(communitySchema, homeCommunity) -} - main().catch((e) => { // biome-ignore lint/suspicious/noConsole: maybe logger isn't initialized here console.error(e) From 7ef816ea80157b1fa39c6da5c460b0390fa1cbf5 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 14:22:12 +0200 Subject: [PATCH 57/72] fix lint --- dlt-connector/src/bootstrap/appContext.ts | 8 ++--- dlt-connector/src/bootstrap/init.ts | 44 ++++++++++++++--------- dlt-connector/src/bootstrap/shutdown.ts | 2 +- dlt-connector/src/index.ts | 13 ++++--- 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/dlt-connector/src/bootstrap/appContext.ts b/dlt-connector/src/bootstrap/appContext.ts index 5a1cbbc18..44d69b619 100644 --- a/dlt-connector/src/bootstrap/appContext.ts +++ b/dlt-connector/src/bootstrap/appContext.ts @@ -1,7 +1,7 @@ -import { BackendClient } from '../client/backend/BackendClient' -import { HieroClient } from '../client/hiero/HieroClient' -import { GradidoNodeClient } from '../client/GradidoNode/GradidoNodeClient' import { KeyPairCacheManager } from '../cache/KeyPairCacheManager' +import { BackendClient } from '../client/backend/BackendClient' +import { GradidoNodeClient } from '../client/GradidoNode/GradidoNodeClient' +import { HieroClient } from '../client/hiero/HieroClient' export type AppContextClients = { backend: BackendClient @@ -23,4 +23,4 @@ export function createAppContext(): AppContext { gradidoNode: GradidoNodeClient.getInstance(), }, } -} \ No newline at end of file +} diff --git a/dlt-connector/src/bootstrap/init.ts b/dlt-connector/src/bootstrap/init.ts index dfd0f7226..1d70f4003 100644 --- a/dlt-connector/src/bootstrap/init.ts +++ b/dlt-connector/src/bootstrap/init.ts @@ -1,13 +1,13 @@ import { readFileSync } from 'node:fs' -import { CONFIG } from '../config' -import { configure, getLogger, Logger } from 'log4js' import { loadCryptoKeys, MemoryBlock } from 'gradido-blockchain-js' -import { type AppContext, type AppContextClients } from './appContext' -import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from '../config/const' +import { configure, getLogger, Logger } from 'log4js' import * as v from 'valibot' +import { CONFIG } from '../config' +import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE } from '../config/const' +import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.context' import { Community, communitySchema } from '../schemas/transaction.schema' import { isPortOpenRetry } from '../utils/network' -import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.context' +import { type AppContext, type AppContextClients } from './appContext' export function loadConfig(): Logger { // configure log4js @@ -29,7 +29,10 @@ export async function checkHieroAccount(logger: Logger, clients: AppContextClien logger.info(`Hiero Account Balance: ${balance.hbars.toString()}`) } -export async function checkHomeCommunity(appContext: AppContext, logger: Logger): Promise { +export async function checkHomeCommunity( + appContext: AppContext, + logger: Logger, +): Promise { const { backend, hiero } = appContext.clients // wait for backend server @@ -66,16 +69,23 @@ export async function checkHomeCommunity(appContext: AppContext, logger: Logger) return v.parse(communitySchema, homeCommunity) } -export async function checkGradidoNode(clients: AppContextClients, logger: Logger, homeCommunity: Community): Promise { +export async function checkGradidoNode( + clients: AppContextClients, + logger: Logger, + homeCommunity: Community, +): Promise { // ask gradido node if community blockchain was created - try { - if ( - !(await clients.gradidoNode.getTransaction({ transactionId: 1, topic: homeCommunity.hieroTopicId })) - ) { - // if not exist, create community root transaction - await SendToHieroContext(homeCommunity) - } - } catch (e) { - logger.error(`error requesting gradido node: ${e}`) + try { + if ( + !(await clients.gradidoNode.getTransaction({ + transactionId: 1, + topic: homeCommunity.hieroTopicId, + })) + ) { + // if not exist, create community root transaction + await SendToHieroContext(homeCommunity) } -} \ No newline at end of file + } catch (e) { + logger.error(`error requesting gradido node: ${e}`) + } +} diff --git a/dlt-connector/src/bootstrap/shutdown.ts b/dlt-connector/src/bootstrap/shutdown.ts index 7c9b48c80..781430008 100644 --- a/dlt-connector/src/bootstrap/shutdown.ts +++ b/dlt-connector/src/bootstrap/shutdown.ts @@ -25,4 +25,4 @@ export function setupGracefulShutdown(logger: Logger, clients: AppContextClients async function gracefulShutdown(logger: Logger, clients: AppContextClients) { logger.info('graceful shutdown') await clients.hiero.waitForPendingPromises() -} \ No newline at end of file +} diff --git a/dlt-connector/src/index.ts b/dlt-connector/src/index.ts index eb82bab91..1d4513e83 100644 --- a/dlt-connector/src/index.ts +++ b/dlt-connector/src/index.ts @@ -1,9 +1,14 @@ import { Elysia } from 'elysia' +import { createAppContext } from './bootstrap/appContext' +import { + checkGradidoNode, + checkHieroAccount, + checkHomeCommunity, + loadConfig, +} from './bootstrap/init' +import { setupGracefulShutdown } from './bootstrap/shutdown' import { CONFIG } from './config' import { appRoutes } from './server' -import { setupGracefulShutdown } from './bootstrap/shutdown' -import { createAppContext } from './bootstrap/appContext' -import { checkHieroAccount, checkHomeCommunity, checkGradidoNode, loadConfig } from './bootstrap/init' async function main() { // load log4js-config, logger and gradido-blockchain-js crypto keys @@ -20,7 +25,7 @@ async function main() { // ask gradido node if community blockchain was created // if not exist, create community root transaction await checkGradidoNode(appContext.clients, logger, homeCommunity) - + // listen for rpc request from backend (graphql replaced with elysiaJS) new Elysia().use(appRoutes).listen(CONFIG.DLT_CONNECTOR_PORT, () => { logger.info(`Server is running at http://localhost:${CONFIG.DLT_CONNECTOR_PORT}`) From b3eea7ab471232c658a4b5cc63292b5f06942d0a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 14:51:22 +0200 Subject: [PATCH 58/72] move files around, rename them --- .../src/client/GradidoNode/GradidoNodeClient.ts | 4 ++-- .../GradidoNode}/GradidoNodeErrorCodes.ts | 0 .../AccountType.ts => data/AccountType.enum.ts} | 0 .../AddressType.ts => data/AddressType.enum.ts} | 0 .../InputTransactionType.enum.ts} | 0 dlt-connector/src/enum/TransactionErrorType.ts | 15 --------------- .../sendToHiero/SendToHiero.context.ts | 2 +- .../src/schemas/transaction.schema.test.ts | 4 ++-- dlt-connector/src/schemas/transaction.schema.ts | 4 ++-- .../src/schemas/typeConverter.schema.test.ts | 2 +- dlt-connector/src/schemas/typeConverter.schema.ts | 4 ++-- dlt-connector/src/utils/typeConverter.ts | 4 ++-- 12 files changed, 12 insertions(+), 27 deletions(-) rename dlt-connector/src/{enum => client/GradidoNode}/GradidoNodeErrorCodes.ts (100%) rename dlt-connector/src/{enum/AccountType.ts => data/AccountType.enum.ts} (100%) rename dlt-connector/src/{enum/AddressType.ts => data/AddressType.enum.ts} (100%) rename dlt-connector/src/{enum/InputTransactionType.ts => data/InputTransactionType.enum.ts} (100%) delete mode 100644 dlt-connector/src/enum/TransactionErrorType.ts diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts index 9f43b95ef..efbfc6d22 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -5,12 +5,12 @@ import { getLogger, Logger } from 'log4js' import * as v from 'valibot' import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' +import { AddressType } from '../../data/AddressType.enum' import { Uuidv4Hash } from '../../data/Uuidv4Hash' -import { AddressType } from '../../enum/AddressType' -import { GradidoNodeErrorCodes } from '../../enum/GradidoNodeErrorCodes' import { addressTypeSchema, confirmedTransactionSchema } from '../../schemas/typeConverter.schema' import { Hex32, Hex32Input, HieroId, hex32Schema } from '../../schemas/typeGuard.schema' import { isPortOpenRetry } from '../../utils/network' +import { GradidoNodeErrorCodes } from './GradidoNodeErrorCodes' import { TransactionIdentifierInput, TransactionsRangeInput, diff --git a/dlt-connector/src/enum/GradidoNodeErrorCodes.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeErrorCodes.ts similarity index 100% rename from dlt-connector/src/enum/GradidoNodeErrorCodes.ts rename to dlt-connector/src/client/GradidoNode/GradidoNodeErrorCodes.ts diff --git a/dlt-connector/src/enum/AccountType.ts b/dlt-connector/src/data/AccountType.enum.ts similarity index 100% rename from dlt-connector/src/enum/AccountType.ts rename to dlt-connector/src/data/AccountType.enum.ts diff --git a/dlt-connector/src/enum/AddressType.ts b/dlt-connector/src/data/AddressType.enum.ts similarity index 100% rename from dlt-connector/src/enum/AddressType.ts rename to dlt-connector/src/data/AddressType.enum.ts diff --git a/dlt-connector/src/enum/InputTransactionType.ts b/dlt-connector/src/data/InputTransactionType.enum.ts similarity index 100% rename from dlt-connector/src/enum/InputTransactionType.ts rename to dlt-connector/src/data/InputTransactionType.enum.ts diff --git a/dlt-connector/src/enum/TransactionErrorType.ts b/dlt-connector/src/enum/TransactionErrorType.ts deleted file mode 100644 index 0da6ebb53..000000000 --- a/dlt-connector/src/enum/TransactionErrorType.ts +++ /dev/null @@ -1,15 +0,0 @@ -// enum for graphql -// error groups for resolver answers -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', - PROTO_ENCODE_ERROR = 'Proto Encode Error', - INVALID_SIGNATURE = 'Invalid Signature', - LOGIC_ERROR = 'Logic Error', - NOT_FOUND = 'Not found', - VALIDATION_ERROR = 'Validation Error', -} diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index e3ab0b7ed..1dd74976c 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -9,7 +9,7 @@ import { getLogger } from 'log4js' import * as v from 'valibot' import { HieroClient } from '../../client/hiero/HieroClient' import { LOG4JS_BASE_CATEGORY } from '../../config/const' -import { InputTransactionType } from '../../enum/InputTransactionType' +import { InputTransactionType } from '../../data/InputTransactionType.enum' import { CommunityInput, communitySchema, diff --git a/dlt-connector/src/schemas/transaction.schema.test.ts b/dlt-connector/src/schemas/transaction.schema.test.ts index 533cd35b9..de22e98ba 100644 --- a/dlt-connector/src/schemas/transaction.schema.test.ts +++ b/dlt-connector/src/schemas/transaction.schema.test.ts @@ -5,8 +5,8 @@ import { randomBytes } from 'crypto' import { AddressType_COMMUNITY_HUMAN } from 'gradido-blockchain-js' import { v4 as uuidv4 } from 'uuid' import * as v from 'valibot' -import { AccountType } from '../enum/AccountType' -import { InputTransactionType } from '../enum/InputTransactionType' +import { AccountType } from '../data/AccountType.enum' +import { InputTransactionType } from '../data/InputTransactionType.enum' import { gradidoAmountSchema, HieroId, diff --git a/dlt-connector/src/schemas/transaction.schema.ts b/dlt-connector/src/schemas/transaction.schema.ts index dea8c48dc..b018a8e86 100644 --- a/dlt-connector/src/schemas/transaction.schema.ts +++ b/dlt-connector/src/schemas/transaction.schema.ts @@ -1,6 +1,6 @@ import * as v from 'valibot' -import { AccountType } from '../enum/AccountType' -import { InputTransactionType } from '../enum/InputTransactionType' +import { AccountType } from '../data/AccountType.enum' +import { InputTransactionType } from '../data/InputTransactionType.enum' import { identifierAccountSchema, identifierCommunityAccountSchema } from './account.schema' import { addressTypeSchema, dateSchema } from './typeConverter.schema' import { diff --git a/dlt-connector/src/schemas/typeConverter.schema.test.ts b/dlt-connector/src/schemas/typeConverter.schema.test.ts index 2caa499b5..5420de106 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.test.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.test.ts @@ -4,7 +4,7 @@ import { TypeCompiler } from '@sinclair/typebox/compiler' import { Static, TypeBoxFromValibot } from '@sinclair/typemap' import { AddressType_COMMUNITY_AUF } from 'gradido-blockchain-js' import * as v from 'valibot' -import { AccountType } from '../enum/AccountType' +import { AccountType } from '../data/AccountType.enum' import { accountTypeSchema, addressTypeSchema, diff --git a/dlt-connector/src/schemas/typeConverter.schema.ts b/dlt-connector/src/schemas/typeConverter.schema.ts index 2e4811c11..3d68cfe24 100644 --- a/dlt-connector/src/schemas/typeConverter.schema.ts +++ b/dlt-connector/src/schemas/typeConverter.schema.ts @@ -1,7 +1,7 @@ import { ConfirmedTransaction } from 'gradido-blockchain-js' import * as v from 'valibot' -import { AccountType } from '../enum/AccountType' -import { AddressType } from '../enum/AddressType' +import { AccountType } from '../data/AccountType.enum' +import { AddressType } from '../data/AddressType.enum' import { confirmedTransactionFromBase64, isAddressType, diff --git a/dlt-connector/src/utils/typeConverter.ts b/dlt-connector/src/utils/typeConverter.ts index 5b1279beb..148efebd6 100644 --- a/dlt-connector/src/utils/typeConverter.ts +++ b/dlt-connector/src/utils/typeConverter.ts @@ -4,8 +4,8 @@ import { InteractionDeserialize, MemoryBlock, } from 'gradido-blockchain-js' -import { AccountType } from '../enum/AccountType' -import { AddressType } from '../enum/AddressType' +import { AccountType } from '../data/AccountType.enum' +import { AddressType } from '../data/AddressType.enum' export const confirmedTransactionFromBase64 = (base64: string): ConfirmedTransaction => { const confirmedTransactionBinaryPtr = MemoryBlock.createPtr(MemoryBlock.fromBase64(base64)) From 3bdb5427950bd0f7ff004226c8ec2b28486c7ddf Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 22 Oct 2025 15:13:03 +0200 Subject: [PATCH 59/72] move output schema from server in correct file --- dlt-connector/src/server/index.ts | 2 +- dlt-connector/src/server/input.schema.ts | 4 ---- dlt-connector/src/server/output.schema.ts | 5 +++++ 3 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 dlt-connector/src/server/output.schema.ts diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index 7168a76dc..406d04d06 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -14,8 +14,8 @@ import { hieroTransactionIdStringSchema } from '../schemas/typeGuard.schema' import { accountIdentifierSeedTypeBoxSchema, accountIdentifierUserTypeBoxSchema, - existTypeBoxSchema, } from './input.schema' +import { existTypeBoxSchema } from './output.schema' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.server`) diff --git a/dlt-connector/src/server/input.schema.ts b/dlt-connector/src/server/input.schema.ts index 515e5b35f..df93f1d9b 100644 --- a/dlt-connector/src/server/input.schema.ts +++ b/dlt-connector/src/server/input.schema.ts @@ -13,7 +13,3 @@ export const accountIdentifierSeedTypeBoxSchema = t.Object({ communityTopicId: TypeBoxFromValibot(hieroIdSchema), seed: TypeBoxFromValibot(uuidv4Schema), }) - -export const existTypeBoxSchema = t.Object({ - exists: t.Boolean(), -}) diff --git a/dlt-connector/src/server/output.schema.ts b/dlt-connector/src/server/output.schema.ts new file mode 100644 index 000000000..845871317 --- /dev/null +++ b/dlt-connector/src/server/output.schema.ts @@ -0,0 +1,5 @@ +import { t } from 'elysia' + +export const existTypeBoxSchema = t.Object({ + exists: t.Boolean(), +}) From 190ba6d67831e94f6988ec7f70f9bf2d4d929fb1 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 23 Oct 2025 08:10:12 +0200 Subject: [PATCH 60/72] copy pr message into readme --- dlt-connector/README.md | 63 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/dlt-connector/README.md b/dlt-connector/README.md index d56e77437..8c7722092 100644 --- a/dlt-connector/README.md +++ b/dlt-connector/README.md @@ -1 +1,62 @@ -# Elysia with Bun runtime +# DLT Connector + +## Overview + +This implements the **DLT Connector** using [gradido-blockchain-js](https://github.com/gradido/gradido-blockchain-js) as a Node module. +[gradido-blockchain-js](https://github.com/gradido/gradido-blockchain-js) builds the native library [gradido_blockchain](https://github.com/gradido/gradido_blockchain) via SWIG, making it accessible to Node.js. + +Most of the Logic is handled by gradido-blockchain. +The connector’s purpose is to send Gradido transactions, serialized in blockchain format, through the Hiero SDK into the Hedera Network as Topic Messages. +The [gradido-node](https://github.com/gradido/gradido_node) listens to these Hedera/Hiero topics, validates the transactions, and stores them efficiently. +Transactions can then be retrieved via a JSON-RPC 2.0 API from [gradido-node](https://github.com/gradido/gradido_node) + +--- + +## Structure + +The module makes extensive use of schema validation with [Valibot](https://valibot.dev/guides/introduction/). +All objects without internal logic are represented as Valibot schemas, with their corresponding TypeScript types inferred automatically. +Valibot allows clear separation of *input* and *output* types, reducing the need for repetitive `null | undefined` checks. +When a function expects an output type, TypeScript ensures that the data has been validated via `parse` or `safeParse`, guaranteeing type safety at runtime. + +--- + +### `src/bootstrap` +Contains initialization code executed once at program startup by `src/index.ts`. + +### `src/cache` +Contains code for caching expensive computations or remote data. +Currently used only by `KeyPairCacheManager`. + +### `src/client` +Contains the client implementations for communication with +[`gradido-node`](https://github.com/gradido/gradido_node), the backend, and the Hiero service. +Each `Client` class is a singleton providing: +- configuration and connection management +- API-call methods mirroring the target service +Each client may include optional `input.schema.ts` and/or `output.schema.ts` files defining Valibot schemas for its complex data structures. + +### `src/config` +Contains the Valibot-based configuration schema, default values, and logic for parsing `process.env`. +If a required field is missing or invalid, the module prints an error and terminates the process. + +### `src/data` +Contains DCI (Data-Context-Interaction) Data Objects: +simple domain objects that are difficult to express as Valibot schemas, as well as Logic Objects containing core business logic. +Also includes domain enums. + +### `src/interactions` +Contains complex business logic (Interactions in DCI terms). +Each use case resides in its own subfolder with one Context Object and corresponding Role Objects. + +### `src/schemas` +Contains Valibot schemas shared across multiple parts of the program. + +### `src/server` +Contains the [Elysia](https://elysiajs.com/at-glance.html)-based REST API used by the backend to submit new Gradido transactions. +It is intended to integrate with Valibot schemas; currently, it uses `@sinclair/typebox` to convert Valibot schemas to the native format expected by Elysia. + +### `src/utils` +Contains small, generic helper functions that do not clearly fit into any of the other directories. + +--- From e2cda2c297d60fd12b26322bd6c85088962596f9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 23 Oct 2025 09:53:34 +0200 Subject: [PATCH 61/72] update constructing of backend and gradido node server urls --- dlt-connector/.env.dist | 4 ++-- dlt-connector/src/bootstrap/init.ts | 6 ++--- .../client/GradidoNode/GradidoNodeClient.ts | 12 ++++++++-- dlt-connector/src/config/schema.ts | 22 ++++++++++++++----- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/dlt-connector/.env.dist b/dlt-connector/.env.dist index ff40bd5d1..8253699ca 100644 --- a/dlt-connector/.env.dist +++ b/dlt-connector/.env.dist @@ -13,12 +13,12 @@ IOTA_HOME_COMMUNITY_SEED=aabbccddeeff00112233445566778899aabbccddeeff00112233445 DLT_CONNECTOR_PORT=6010 # Gradido Node Server URL -NODE_SERVER_URL=http://localhost:8340/api +DLT_NODE_SERVER_PORT=8340 # Gradido Blockchain GRADIDO_BLOCKCHAIN_CRYPTO_APP_SECRET=21ffbbc616fe GRADIDO_BLOCKCHAIN_SERVER_CRYPTO_KEY=a51ef8ac7ef1abf162fb7a65261acd7a # Route to Backend -BACKEND_SERVER_URL=http://localhost:4000 +PORT=4000 JWT_SECRET=secret123 \ No newline at end of file diff --git a/dlt-connector/src/bootstrap/init.ts b/dlt-connector/src/bootstrap/init.ts index 1d70f4003..c41553594 100644 --- a/dlt-connector/src/bootstrap/init.ts +++ b/dlt-connector/src/bootstrap/init.ts @@ -36,7 +36,7 @@ export async function checkHomeCommunity( const { backend, hiero } = appContext.clients // wait for backend server - await isPortOpenRetry(CONFIG.BACKEND_SERVER_URL) + await isPortOpenRetry(backend.url) // ask backend for home community let homeCommunity = await backend.getHomeCommunityDraft() // on missing topicId, create one @@ -64,8 +64,8 @@ export async function checkHomeCommunity( } appContext.cache.setHomeCommunityTopicId(homeCommunity.hieroTopicId) logger.info(`home community topic: ${homeCommunity.hieroTopicId}`) - logger.info(`gradido node server: ${CONFIG.NODE_SERVER_URL}`) - logger.info(`gradido backend server: ${CONFIG.BACKEND_SERVER_URL}`) + logger.info(`gradido node server: ${appContext.clients.gradidoNode.url}`) + logger.info(`gradido backend server: ${appContext.clients.backend.url}`) return v.parse(communitySchema, homeCommunity) } diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts index efbfc6d22..3bd3bab51 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -36,13 +36,21 @@ export class GradidoNodeClient { private static instance: GradidoNodeClient client: JsonRpcClient logger: Logger + urlValue: string private constructor() { this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNodeClient`) + this.urlValue = `http://localhost:${CONFIG.DLT_NODE_SERVER_PORT}` + this.logger.addContext('url', this.urlValue) this.client = new JsonRpcClient({ - url: CONFIG.NODE_SERVER_URL, + url: this.urlValue, }) } + + public get url(): string { + return this.urlValue + } + public static getInstance(): GradidoNodeClient { if (!GradidoNodeClient.instance) { GradidoNodeClient.instance = new GradidoNodeClient() @@ -233,7 +241,7 @@ export class GradidoNodeClient { // template rpcCall, check first if port is open before executing json rpc 2.0 request protected async rpcCall(method: string, parameter: any): Promise> { this.logger.debug('call %s with %s', method, parameter) - await isPortOpenRetry(CONFIG.NODE_SERVER_URL) + await isPortOpenRetry(this.url) return this.client.exec(method, parameter) } diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index 08eeb2b80..2ce01dcee 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -69,12 +69,22 @@ export const configSchema = v.object({ ), 500, ), - NODE_SERVER_URL: v.optional( - v.string('The URL of the gradido node server'), - 'http://localhost:6010', + DLT_NODE_SERVER_PORT: v.optional( + v.pipe( + v.string('A valid port on which the DLT node server is running'), + v.transform((input: string) => Number(input)), + v.minValue(1), + v.maxValue(65535), + ), + '8340', ), - BACKEND_SERVER_URL: v.optional( - v.string('The URL of the gradido backend server'), - 'http://localhost:6010', + PORT: v.optional( + v.pipe( + v.string('A valid port on which the backend server is running'), + v.transform((input: string) => Number(input)), + v.minValue(1), + v.maxValue(65535), + ), + '4000', ), }) From 4b59cf2377a63840a6dba35610600138dc306bcb Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 24 Oct 2025 07:20:49 +0200 Subject: [PATCH 62/72] add missing change --- dlt-connector/src/client/backend/BackendClient.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index d5cc3be9e..cee82769a 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -18,6 +18,7 @@ export class BackendClient { private static instance: BackendClient client: GraphQLClient logger: Logger + urlValue: string /** * The Singleton's constructor should always be private to prevent direct @@ -25,8 +26,10 @@ export class BackendClient { */ private constructor() { this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.BackendClient`) - this.logger.addContext('url', CONFIG.BACKEND_SERVER_URL) - this.client = new GraphQLClient(CONFIG.BACKEND_SERVER_URL, { + this.urlValue = `http://localhost:${CONFIG.PORT}` + this.logger.addContext('url', this.urlValue) + + this.client = new GraphQLClient(this.urlValue, { headers: { 'content-type': 'application/json', }, @@ -38,6 +41,10 @@ export class BackendClient { }) } + public get url(): string { + return this.url + } + /** * The static method that controls the access to the singleton instance. * From 567fbbaf66eae1bff00f2d884229884e7564e6fa Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 24 Oct 2025 07:49:06 +0200 Subject: [PATCH 63/72] check for valid recipient community topic before sending outbound cross group transaction --- dlt-connector/src/config/const.ts | 2 ++ .../sendToHiero/SendToHiero.context.ts | 6 +++++- dlt-connector/src/utils/hiero.ts | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 dlt-connector/src/utils/hiero.ts diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index e0dfc82a3..fa66eb6e7 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -1,3 +1,5 @@ export const LOG4JS_BASE_CATEGORY = 'dlt' // 7 days export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 +// 10 minutes +export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE = 1000 * 60 * 10 \ No newline at end of file diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index 1dd74976c..f510be3bd 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -28,7 +28,7 @@ import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.r import { RedeemDeferredTransferTransactionRole } from './RedeemDeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' - +import { isTopicStillOpen } from '../../utils/hiero' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToHiero.SendToHieroContext`) /** @@ -46,6 +46,10 @@ export async function SendToHieroContext( const outboundTransaction = builder.buildOutbound() validate(outboundTransaction) + if (!isTopicStillOpen(role.getRecipientCommunityTopicId())) { + throw new Error('recipient topic is not open long enough for sending messages') + } + // send outbound transaction to hiero at first, because we need the transaction id for inbound transaction const outboundHieroTransactionIdString = await sendViaHiero( outboundTransaction, diff --git a/dlt-connector/src/utils/hiero.ts b/dlt-connector/src/utils/hiero.ts new file mode 100644 index 000000000..9ea62042f --- /dev/null +++ b/dlt-connector/src/utils/hiero.ts @@ -0,0 +1,16 @@ +import { HieroId } from '../schemas/typeGuard.schema' +import { HieroClient } from '../client/hiero/HieroClient' +import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE } from '../config/const' + +/** + * Checks whether the given topic in the Hedera network will remain open + * for sending messages for at least `MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE` milliseconds. + * + * @param {HieroId} hieroTopicId - The topic ID to check. + * @returns {Promise} `true` if the topic is still open long enough, otherwise `false`. + */ +export async function isTopicStillOpen(hieroTopicId: HieroId): Promise { + const hieroClient = HieroClient.getInstance() + const topicInfo = await hieroClient.getTopicInfo(hieroTopicId) + return topicInfo.expirationTime.getTime() > new Date().getTime() + MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE +} \ No newline at end of file From 8983bc52ebf72f9a2cbf7363e770c5e68eced729 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 24 Oct 2025 08:28:53 +0200 Subject: [PATCH 64/72] add config option, if dlt-connector is enabled, write communities list for dlt gradido node server out in its home folder as communities.json on each validate communities run --- backend/src/config/index.ts | 1 + backend/src/config/schema.ts | 4 ++ .../client/1_0/model/PublicCommunityInfo.ts | 1 + backend/src/federation/validateCommunities.ts | 52 +++++++++++++++++++ deployment/bare_metal/.env.dist | 1 + .../1_0/model/GetPublicCommunityInfoResult.ts | 4 ++ 6 files changed, 63 insertions(+) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index aa0a7dbf2..b583156b5 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -43,6 +43,7 @@ const DLT_CONNECTOR_PORT = process.env.DLT_CONNECTOR_PORT ?? 6010 const dltConnector = { DLT_CONNECTOR: process.env.DLT_CONNECTOR === 'true' || false, DLT_CONNECTOR_URL: process.env.DLT_CONNECTOR_URL ?? `${COMMUNITY_URL}:${DLT_CONNECTOR_PORT}`, + DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: process.env.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER ?? '~/.gradido', } const community = { diff --git a/backend/src/config/schema.ts b/backend/src/config/schema.ts index 144608992..f4e6033ea 100644 --- a/backend/src/config/schema.ts +++ b/backend/src/config/schema.ts @@ -79,6 +79,10 @@ export const schema = Joi.object({ .when('DLT_CONNECTOR', { is: true, then: Joi.required() }) .description('The URL for GDT API endpoint'), + DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: Joi.string() + .default('~/.gradido') + .description('The home folder for the gradido dlt node server'), + EMAIL: Joi.boolean() .default(false) .description('Enable or disable email functionality') diff --git a/backend/src/federation/client/1_0/model/PublicCommunityInfo.ts b/backend/src/federation/client/1_0/model/PublicCommunityInfo.ts index 1abbeb9e7..7c228c799 100644 --- a/backend/src/federation/client/1_0/model/PublicCommunityInfo.ts +++ b/backend/src/federation/client/1_0/model/PublicCommunityInfo.ts @@ -4,4 +4,5 @@ export interface PublicCommunityInfo { creationDate: Date publicKey: string publicJwtKey: string + hieroTopicId: string | null } diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 10088cf35..3b910b313 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -2,6 +2,7 @@ import { Community as DbCommunity, FederatedCommunity as DbFederatedCommunity, getHomeCommunity, + getReachableCommunities, } from 'database' import { IsNull } from 'typeorm' @@ -15,6 +16,9 @@ import { getLogger } from 'log4js' import { startCommunityAuthentication } from './authenticateCommunities' import { PublicCommunityInfoLoggingView } from './client/1_0/logging/PublicCommunityInfoLogging.view' import { ApiVersionType } from 'core' +import { CONFIG } from '@/config' +import * as path from 'node:path' +import * as fs from 'node:fs' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.federation.validateCommunities`) @@ -83,6 +87,8 @@ export async function validateCommunities(): Promise { logger.error(`Error:`, err) } } + // export communities for gradido dlt node server + await exportCommunitiesToDltNodeServer() } export async function writeJwtKeyPairInHomeCommunity(): Promise { @@ -138,6 +144,52 @@ async function writeForeignCommunity( com.publicKey = dbCom.publicKey com.publicJwtKey = pubInfo.publicJwtKey com.url = dbCom.endPoint + com.hieroTopicId = pubInfo.hieroTopicId await DbCommunity.save(com) } } + +// prototype, later add api call to gradido dlt node server for adding/updating communities +type CommunityForDltNodeServer = { + communityId: string + hieroTopicId: string + alias: string + folder: string +} +async function exportCommunitiesToDltNodeServer(): Promise { + if (!CONFIG.DLT_CONNECTOR) { + return Promise.resolve() + } + const folder = CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER + try { + fs.accessSync(folder, fs.constants.R_OK | fs.constants.W_OK) + } catch (err) { + logger.error(`Error: home folder for DLT Gradido Node Server ${folder} does not exist`) + return + } + + const dbComs = await getReachableCommunities(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER * 4) + const communitiesForDltNodeServer: CommunityForDltNodeServer[] = [] + // make sure communityName is unique + const communityName = new Set() + dbComs.forEach((com) => { + if (!com.communityUuid || !com.hieroTopicId) { + return + } + let alias = com.name + if (!alias || communityName.has(alias)) { + alias = com.communityUuid + } + communityName.add(alias) + communitiesForDltNodeServer.push({ + communityId: com.communityUuid, + hieroTopicId: com.hieroTopicId, + alias, + // use only alpha-numeric chars for folder name + folder: alias.replace(/[^a-zA-Z0-9]/g, '_') + }) + }) + const dltNodeServerCommunitiesFile = path.join(folder, 'communities.json') + fs.writeFileSync(dltNodeServerCommunitiesFile, JSON.stringify(communitiesForDltNodeServer, null, 2)) + logger.debug(`Written communitiesForDltNodeServer to ${dltNodeServerCommunitiesFile}`) +} diff --git a/deployment/bare_metal/.env.dist b/deployment/bare_metal/.env.dist index 11f5e1d76..729fc84aa 100644 --- a/deployment/bare_metal/.env.dist +++ b/deployment/bare_metal/.env.dist @@ -88,6 +88,7 @@ GDT_ACTIVE=false # DLT-Connector (still in develop) DLT_CONNECTOR=false DLT_CONNECTOR_PORT=6010 +DLT_GRADIDO_NODE_SERVER_HOME_FOLDER=/home/gradido/.gradido # used for combining a newsletter on klicktipp with this gradido community # if used, user will be subscribed on register and can unsubscribe in his account diff --git a/federation/src/graphql/api/1_0/model/GetPublicCommunityInfoResult.ts b/federation/src/graphql/api/1_0/model/GetPublicCommunityInfoResult.ts index 55292cee2..1c7c5587c 100644 --- a/federation/src/graphql/api/1_0/model/GetPublicCommunityInfoResult.ts +++ b/federation/src/graphql/api/1_0/model/GetPublicCommunityInfoResult.ts @@ -12,6 +12,7 @@ export class GetPublicCommunityInfoResult { this.name = dbCom.name this.description = dbCom.description this.creationDate = dbCom.creationDate + this.hieroTopicId = dbCom.hieroTopicId } @Field(() => String) @@ -28,4 +29,7 @@ export class GetPublicCommunityInfoResult { @Field(() => String) publicJwtKey: string + + @Field(() => String) + hieroTopicId: string | null } From b9d51269ca062cd55cf7b3d68d6d7dedd965fa84 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 24 Oct 2025 08:36:07 +0200 Subject: [PATCH 65/72] fix lint --- dlt-connector/src/config/const.ts | 2 +- .../interactions/sendToHiero/SendToHiero.context.ts | 3 ++- dlt-connector/src/utils/hiero.ts | 11 +++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index fa66eb6e7..6b2a3b1a2 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -2,4 +2,4 @@ export const LOG4JS_BASE_CATEGORY = 'dlt' // 7 days export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 // 10 minutes -export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE = 1000 * 60 * 10 \ No newline at end of file +export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE = 1000 * 60 * 10 diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index f510be3bd..14427cacf 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -21,6 +21,7 @@ import { HieroTransactionIdString, hieroTransactionIdStringSchema, } from '../../schemas/typeGuard.schema' +import { isTopicStillOpen } from '../../utils/hiero' import { AbstractTransactionRole } from './AbstractTransaction.role' import { CommunityRootTransactionRole } from './CommunityRootTransaction.role' import { CreationTransactionRole } from './CreationTransaction.role' @@ -28,7 +29,7 @@ import { DeferredTransferTransactionRole } from './DeferredTransferTransaction.r import { RedeemDeferredTransferTransactionRole } from './RedeemDeferredTransferTransaction.role' import { RegisterAddressTransactionRole } from './RegisterAddressTransaction.role' import { TransferTransactionRole } from './TransferTransaction.role' -import { isTopicStillOpen } from '../../utils/hiero' + const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToHiero.SendToHieroContext`) /** diff --git a/dlt-connector/src/utils/hiero.ts b/dlt-connector/src/utils/hiero.ts index 9ea62042f..bd1501e83 100644 --- a/dlt-connector/src/utils/hiero.ts +++ b/dlt-connector/src/utils/hiero.ts @@ -1,9 +1,9 @@ -import { HieroId } from '../schemas/typeGuard.schema' import { HieroClient } from '../client/hiero/HieroClient' import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE } from '../config/const' +import { HieroId } from '../schemas/typeGuard.schema' /** - * Checks whether the given topic in the Hedera network will remain open + * Checks whether the given topic in the Hedera network will remain open * for sending messages for at least `MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE` milliseconds. * * @param {HieroId} hieroTopicId - The topic ID to check. @@ -12,5 +12,8 @@ import { MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE } from '../config/const' export async function isTopicStillOpen(hieroTopicId: HieroId): Promise { const hieroClient = HieroClient.getInstance() const topicInfo = await hieroClient.getTopicInfo(hieroTopicId) - return topicInfo.expirationTime.getTime() > new Date().getTime() + MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE -} \ No newline at end of file + return ( + topicInfo.expirationTime.getTime() > + new Date().getTime() + MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE + ) +} From f962baf1a1be6663200c6b1f2c2ca44acbd7678a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 24 Oct 2025 12:57:16 +0200 Subject: [PATCH 66/72] add process handler for starting and managing GradidoNode as subprocess --- dlt-connector/src/bootstrap/shutdown.ts | 2 + .../client/GradidoNode/GradidoNodeProcess.ts | 117 ++++++++++++++++++ dlt-connector/src/config/const.ts | 7 ++ dlt-connector/src/config/schema.ts | 1 + 4 files changed, 127 insertions(+) create mode 100644 dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts diff --git a/dlt-connector/src/bootstrap/shutdown.ts b/dlt-connector/src/bootstrap/shutdown.ts index 781430008..415742d38 100644 --- a/dlt-connector/src/bootstrap/shutdown.ts +++ b/dlt-connector/src/bootstrap/shutdown.ts @@ -1,4 +1,5 @@ import { Logger } from 'log4js' +import { GradidoNodeProcess } from '../client/GradidoNode/GradidoNodeProcess' import { type AppContextClients } from './appContext' export function setupGracefulShutdown(logger: Logger, clients: AppContextClients) { @@ -25,4 +26,5 @@ export function setupGracefulShutdown(logger: Logger, clients: AppContextClients async function gracefulShutdown(logger: Logger, clients: AppContextClients) { logger.info('graceful shutdown') await clients.hiero.waitForPendingPromises() + await GradidoNodeProcess.getInstance().exit() } diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts new file mode 100644 index 000000000..ad25c2461 --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts @@ -0,0 +1,117 @@ +import { Subprocess, spawn } from 'bun' +import { getLogger, Logger } from 'log4js' +import { CONFIG } from '../../config' +import { + GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS, + GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS, + GRADIDO_NODE_RUNTIME_PATH, + LOG4JS_BASE_CATEGORY, +} from '../../config/const' + +/** + * A Singleton class defines the `getInstance` method that lets clients access + * the unique singleton instance. + * + * Singleton Managing GradidoNode if started as subprocess + * will restart GradidoNode if it exits more than `GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS` milliseconds after start + * if exit was called, it will first try to exit graceful with SIGTERM and then kill with SIGKILL after `GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS` milliseconds + */ +export class GradidoNodeProcess { + private static instance: GradidoNodeProcess | null = null + private proc: Subprocess | null = null + private logger: Logger + private lastStarted: Date | null = null + private exitCalled: boolean = false + + private constructor() { + // constructor is private to prevent instantiation from outside + // of the class except from the static getInstance method. + this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNodeProcess`) + } + + /** + * Static method that returns the singleton instance of the class. + * @returns the singleton instance of the class. + */ + public static getInstance(): GradidoNodeProcess { + if (!GradidoNodeProcess.instance) { + GradidoNodeProcess.instance = new GradidoNodeProcess() + } + return GradidoNodeProcess.instance + } + + public start() { + if (this.proc) { + this.logger.warn('GradidoNodeProcess already running.') + return + } + this.logger.info(`starting GradidoNodeProcess with path: ${GRADIDO_NODE_RUNTIME_PATH}`) + this.lastStarted = new Date() + const logger = this.logger + this.proc = spawn([GRADIDO_NODE_RUNTIME_PATH], { + env: { + CLIENTS_HIERO_NETWORKTYPE: CONFIG.HIERO_HEDERA_NETWORK, + SERVER_JSON_RPC_PORT: CONFIG.DLT_NODE_SERVER_PORT.toString(), + }, + onExit(proc, exitCode, signalCode, error) { + logger.warn(`GradidoNodeProcess exited with code ${exitCode} and signalCode ${signalCode}`) + if (error) { + logger.error(`GradidoNodeProcess exit error: ${error}`) + if (logger.isDebugEnabled() && proc.stderr) { + // print error messages from GradidoNode in our own log if debug is enabled + proc.stderr + .getReader() + .read() + .then((chunk) => { + logger.debug(chunk.value?.toString()) + }) + } + } + logger.debug(`ressource usage: ${proc?.resourceUsage()}`) + const gradidoNodeProcess = GradidoNodeProcess.getInstance() + gradidoNodeProcess.proc = null + if ( + !gradidoNodeProcess.exitCalled && + gradidoNodeProcess.lastStarted && + Date.now() - gradidoNodeProcess.lastStarted.getTime() > + GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS + ) { + // restart only if enough time was passed since last start to prevent restart loop + gradidoNodeProcess.start() + } + }, + stdout: 'ignore', + stderr: logger.isDebugEnabled() ? 'pipe' : 'ignore', + }) + } + + public async restart() { + if (this.proc) { + await this.exit() + this.exitCalled = false + this.start() + } + } + + public async exit(): Promise { + this.exitCalled = true + if (this.proc) { + this.proc.kill('SIGTERM') + const timeout = setTimeout(() => { + this.logger.warn( + `GradidoNode couldn't exit graceful after ${GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS} milliseconds with SIGTERM, killing with SIGKILL`, + ) + this.proc?.kill('SIGKILL') + }, GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS) + try { + await this.proc.exited + } catch (error) { + this.logger.error(`GradidoNodeProcess exit error: ${error}`) + } finally { + clearTimeout(timeout) + } + } else { + return Promise.resolve() + } + } +} diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index 6b2a3b1a2..0547f0c8a 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -1,5 +1,12 @@ +import path from 'node:path' + export const LOG4JS_BASE_CATEGORY = 'dlt' // 7 days export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 // 10 minutes export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE = 1000 * 60 * 10 + +export const GRADIDO_NODE_RUNTIME_PATH = path.join(__dirname, 'gradido_node', 'bin', 'GradidoNode') +// if last start was less than this time, do not restart +export const GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS = 1000 * 30 +export const GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS = 1000 diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index 2ce01dcee..027dfc364 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -78,6 +78,7 @@ export const configSchema = v.object({ ), '8340', ), + DLT_NODE_SERVER_VERSION: v.optional(v.string('The version of the DLT node server'), '0.9.0'), PORT: v.optional( v.pipe( v.string('A valid port on which the backend server is running'), From 3bdc99b203a5d7f0b78518ce76be310e3c4e97ce Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 25 Oct 2025 14:43:47 +0200 Subject: [PATCH 67/72] setup gradido node --- dlt-connector/.gitignore | 1 + dlt-connector/bun.lock | 3 + dlt-connector/package.json | 1 + dlt-connector/src/bootstrap/init.ts | 4 + .../src/bootstrap/initGradidoNode.ts | 89 +++++++++++++++++++ .../client/GradidoNode/GradidoNodeClient.ts | 2 +- .../client/GradidoNode/GradidoNodeProcess.ts | 13 +-- .../src/client/GradidoNode/communities.ts | 84 +++++++++++++++++ .../src/client/backend/BackendClient.ts | 21 ++++- dlt-connector/src/client/backend/graphql.ts | 33 ++++--- dlt-connector/src/client/hiero/HieroClient.ts | 13 +++ dlt-connector/src/config/const.ts | 11 ++- dlt-connector/src/config/schema.ts | 10 ++- .../sendToHiero/SendToHiero.context.ts | 15 +++- dlt-connector/src/server/index.test.ts | 6 ++ dlt-connector/src/server/index.ts | 3 + dlt-connector/src/utils/filesystem.ts | 30 +++++++ 17 files changed, 317 insertions(+), 22 deletions(-) create mode 100644 dlt-connector/src/bootstrap/initGradidoNode.ts create mode 100644 dlt-connector/src/client/GradidoNode/communities.ts create mode 100644 dlt-connector/src/utils/filesystem.ts diff --git a/dlt-connector/.gitignore b/dlt-connector/.gitignore index 5435dd5ff..4c6422640 100644 --- a/dlt-connector/.gitignore +++ b/dlt-connector/.gitignore @@ -7,3 +7,4 @@ package-json.lock coverage # emacs *~ +gradido_node \ No newline at end of file diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index 7ea3a4eab..a60a02798 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -13,6 +13,7 @@ "@sinclair/typemap": "^0.10.1", "@types/bun": "^1.2.17", "@types/uuid": "^8.3.4", + "async-mutex": "^0.5.0", "dotenv": "^10.0.0", "elysia": "1.3.8", "graphql-request": "^7.2.0", @@ -306,6 +307,8 @@ "async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="], + "async-mutex": ["async-mutex@0.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 7dc4e590d..da30cf58d 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -26,6 +26,7 @@ "@sinclair/typemap": "^0.10.1", "@types/bun": "^1.2.17", "@types/uuid": "^8.3.4", + "async-mutex": "^0.5.0", "dotenv": "^10.0.0", "elysia": "1.3.8", "graphql-request": "^7.2.0", diff --git a/dlt-connector/src/bootstrap/init.ts b/dlt-connector/src/bootstrap/init.ts index c41553594..13b77783c 100644 --- a/dlt-connector/src/bootstrap/init.ts +++ b/dlt-connector/src/bootstrap/init.ts @@ -8,6 +8,7 @@ import { SendToHieroContext } from '../interactions/sendToHiero/SendToHiero.cont import { Community, communitySchema } from '../schemas/transaction.schema' import { isPortOpenRetry } from '../utils/network' import { type AppContext, type AppContextClients } from './appContext' +import { initGradidoNode } from './initGradidoNode' export function loadConfig(): Logger { // configure log4js @@ -74,6 +75,9 @@ export async function checkGradidoNode( logger: Logger, homeCommunity: Community, ): Promise { + // check if gradido node is running, if not setup and start it + await initGradidoNode(clients) + // ask gradido node if community blockchain was created try { if ( diff --git a/dlt-connector/src/bootstrap/initGradidoNode.ts b/dlt-connector/src/bootstrap/initGradidoNode.ts new file mode 100644 index 000000000..3be2e130c --- /dev/null +++ b/dlt-connector/src/bootstrap/initGradidoNode.ts @@ -0,0 +1,89 @@ +import { execSync } from 'node:child_process' +import fs from 'node:fs' +import path from 'node:path' +import { gunzipSync } from 'node:zlib' +import { getLogger } from 'log4js' +import { exportCommunities } from '../client/GradidoNode/communities' +import { GradidoNodeProcess } from '../client/GradidoNode/GradidoNodeProcess' +import { HieroClient } from '../client/hiero/HieroClient' +import { CONFIG } from '../config' +import { + GRADIDO_NODE_HOME_FOLDER_NAME, + GRADIDO_NODE_RUNTIME_PATH, + LOG4JS_BASE_CATEGORY, +} from '../config/const' +import { checkFileExist, checkPathExist } from '../utils/filesystem' +import { isPortOpen } from '../utils/network' +import { AppContextClients } from './appContext' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.bootstrap.initGradidoNode`) + +export async function initGradidoNode(clients: AppContextClients): Promise { + const url = `http://localhost:${CONFIG.DLT_NODE_SERVER_PORT}` + const isOpen = await isPortOpen(url) + if (isOpen) { + logger.info(`GradidoNode is already running on ${url}`) + return + } + + const gradidoNodeHomeFolder = path.join( + CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER, + GRADIDO_NODE_HOME_FOLDER_NAME, + ) + // check folder, create when missing + checkPathExist(gradidoNodeHomeFolder, true) + + await Promise.all([ + // write Hedera Address Book + exportHederaAddressbooks(gradidoNodeHomeFolder, clients.hiero), + // check GradidoNode Runtime, download when missing + ensureGradidoNodeRuntimeAvailable(GRADIDO_NODE_RUNTIME_PATH), + // export communities to GradidoNode Folder + exportCommunities(gradidoNodeHomeFolder, clients.backend), + ]) + GradidoNodeProcess.getInstance().start() +} + +async function exportHederaAddressbooks( + homeFolder: string, + hieroClient: HieroClient, +): Promise { + const networkName = CONFIG.HIERO_HEDERA_NETWORK + const addressBook = await hieroClient.downloadAddressBook() + const addressBookPath = path.join(homeFolder, 'addressbook', `${networkName}.pb`) + checkPathExist(path.dirname(addressBookPath), true) + fs.writeFileSync(addressBookPath, addressBook.toBytes()) +} + +async function ensureGradidoNodeRuntimeAvailable(runtimeFileName: string): Promise { + const runtimeFolder = path.dirname(runtimeFileName) + checkPathExist(runtimeFolder, true) + logger.debug(`GradidoNode Runtime: ${runtimeFileName}`) + if (!checkFileExist(runtimeFileName)) { + const runtimeArchiveFilename = createGradidoNodeRuntimeArchiveFilename() + const downloadUrl = new URL( + `https://github.com/gradido/gradido_node/releases/download/v${CONFIG.DLT_GRADIDO_NODE_SERVER_VERSION}/${runtimeArchiveFilename}`, + ) + logger.debug(`download GradidoNode Runtime from ${downloadUrl}`) + const archive = await fetch(downloadUrl) + if (!archive.ok) { + throw new Error(`Failed to download GradidoNode Runtime: ${archive.statusText}`) + } + const compressedBuffer = await archive.arrayBuffer() + if (process.platform === 'win32') { + fs.writeFileSync(runtimeFileName, gunzipSync(Buffer.from(compressedBuffer))) + } else { + const archivePath = path.join(runtimeFolder, runtimeArchiveFilename) + logger.debug(`GradidoNode Runtime Archive: ${archivePath}`) + fs.writeFileSync(archivePath, Buffer.from(compressedBuffer)) + execSync(`tar -xzf ${archivePath}`, { cwd: runtimeFolder }) + } + } +} + +function createGradidoNodeRuntimeArchiveFilename(): string { + const version = CONFIG.DLT_GRADIDO_NODE_SERVER_VERSION + const platform: string = process.platform + const fileEnding = platform === 'win32' ? 'zip' : 'tar.gz' + return `gradido_node-v${version}-${platform}-${process.arch}.${fileEnding}` +} diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts index 3bd3bab51..d66a58887 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeClient.ts @@ -40,7 +40,7 @@ export class GradidoNodeClient { private constructor() { this.logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNodeClient`) - this.urlValue = `http://localhost:${CONFIG.DLT_NODE_SERVER_PORT}` + this.urlValue = `http://localhost:${CONFIG.DLT_NODE_SERVER_PORT}/api` this.logger.addContext('url', this.urlValue) this.client = new JsonRpcClient({ url: this.urlValue, diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts index ad25c2461..d6f5237bf 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts @@ -52,12 +52,13 @@ export class GradidoNodeProcess { env: { CLIENTS_HIERO_NETWORKTYPE: CONFIG.HIERO_HEDERA_NETWORK, SERVER_JSON_RPC_PORT: CONFIG.DLT_NODE_SERVER_PORT.toString(), + HOME: CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER, }, onExit(proc, exitCode, signalCode, error) { logger.warn(`GradidoNodeProcess exited with code ${exitCode} and signalCode ${signalCode}`) if (error) { logger.error(`GradidoNodeProcess exit error: ${error}`) - if (logger.isDebugEnabled() && proc.stderr) { + /*if (logger.isDebugEnabled() && proc.stderr) { // print error messages from GradidoNode in our own log if debug is enabled proc.stderr .getReader() @@ -65,9 +66,9 @@ export class GradidoNodeProcess { .then((chunk) => { logger.debug(chunk.value?.toString()) }) - } + }*/ } - logger.debug(`ressource usage: ${proc?.resourceUsage()}`) + logger.debug(`ressource usage: ${JSON.stringify(proc?.resourceUsage(), null, 2)}`) const gradidoNodeProcess = GradidoNodeProcess.getInstance() gradidoNodeProcess.proc = null if ( @@ -80,8 +81,10 @@ export class GradidoNodeProcess { gradidoNodeProcess.start() } }, - stdout: 'ignore', - stderr: logger.isDebugEnabled() ? 'pipe' : 'ignore', + /*stdout: 'ignore', + stderr: logger.isDebugEnabled() ? 'pipe' : 'ignore',*/ + stdout: 'inherit', + stderr: 'inherit', }) } diff --git a/dlt-connector/src/client/GradidoNode/communities.ts b/dlt-connector/src/client/GradidoNode/communities.ts new file mode 100644 index 000000000..d25ed4dd4 --- /dev/null +++ b/dlt-connector/src/client/GradidoNode/communities.ts @@ -0,0 +1,84 @@ +import fs from 'node:fs' +import path from 'node:path' +import { Mutex } from 'async-mutex' +import { getLogger } from 'log4js' +import { CONFIG } from '../../config' +import { GRADIDO_NODE_HOME_FOLDER_NAME, LOG4JS_BASE_CATEGORY } from '../../config/const' +import { HieroId } from '../../schemas/typeGuard.schema' +import { checkFileExist, checkPathExist } from '../../utils/filesystem' +import { BackendClient } from '../backend/BackendClient' +import { GradidoNodeProcess } from './GradidoNodeProcess' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.client.GradidoNode.communities`) +const ensureCommunitiesAvailableMutex: Mutex = new Mutex() + +// prototype, later add api call to gradido dlt node server for adding/updating communities +type CommunityForDltNodeServer = { + communityId: string + hieroTopicId: string + alias: string + folder: string +} + +export async function ensureCommunitiesAvailable(communityTopicIds: HieroId[]): Promise { + const release = await ensureCommunitiesAvailableMutex.acquire() + try { + const homeFolder = path.join( + CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER, + GRADIDO_NODE_HOME_FOLDER_NAME, + ) + if (!checkCommunityAvailable(communityTopicIds, homeFolder)) { + await exportCommunities(homeFolder, BackendClient.getInstance()) + return GradidoNodeProcess.getInstance().restart() + } + } finally { + release() + } +} + +export async function exportCommunities(homeFolder: string, client: BackendClient): Promise { + const communities = await client.getReachableCommunities() + const communitiesPath = path.join(homeFolder, 'communities.json') + checkPathExist(path.dirname(communitiesPath), true) + // make sure communityName is unique + const communityName = new Set() + const communitiesForDltNodeServer: CommunityForDltNodeServer[] = [] + for (const com of communities) { + if (!com.uuid || !com.hieroTopicId) { + continue + } + // use name as alias if not empty and unique, otherwise use uuid + let alias = com.name + if (!alias || communityName.has(alias)) { + alias = com.uuid + } + communityName.add(alias) + communitiesForDltNodeServer.push({ + communityId: com.uuid, + hieroTopicId: com.hieroTopicId, + alias, + // use only alpha-numeric chars for folder name + folder: alias.replace(/[^a-zA-Z0-9]/g, '_'), + }) + } + fs.writeFileSync(communitiesPath, JSON.stringify(communitiesForDltNodeServer, null, 2)) + logger.info(`exported ${communitiesForDltNodeServer.length} communities to ${communitiesPath}`) +} + +export function checkCommunityAvailable(communityTopicIds: HieroId[], homeFolder: string): boolean { + const communitiesPath = path.join(homeFolder, 'communities.json') + if (!checkFileExist(communitiesPath)) { + return false + } + const communities = JSON.parse(fs.readFileSync(communitiesPath, 'utf-8')) + let foundCount = 0 + for (const community of communities) { + if (communityTopicIds.includes(community.hieroTopicId)) { + foundCount++ + if (foundCount >= communityTopicIds.length) { + return true + } + } + } + return false +} diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index cee82769a..7f779fd73 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -5,7 +5,11 @@ import * as v from 'valibot' import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId, Uuidv4 } from '../../schemas/typeGuard.schema' -import { homeCommunityGraphqlQuery, setHomeCommunityTopicId } from './graphql' +import { + getReachableCommunities, + homeCommunityGraphqlQuery, + setHomeCommunityTopicId, +} from './graphql' import { type Community, communitySchema } from './output.schema' // Source: https://refactoring.guru/design-patterns/singleton/typescript/example @@ -42,7 +46,7 @@ export class BackendClient { } public get url(): string { - return this.url + return this.urlValue } /** @@ -84,6 +88,19 @@ export class BackendClient { return v.parse(communitySchema, data.updateHomeCommunity) } + public async getReachableCommunities(): Promise { + this.logger.info('get reachable communities on backend') + const { data, errors } = await this.client.rawRequest<{ reachableCommunities: Community[] }>( + getReachableCommunities, + {}, + await this.getRequestHeader(), + ) + if (errors) { + throw errors[0] + } + return v.parse(v.array(communitySchema), data.reachableCommunities) + } + private async getRequestHeader(): Promise<{ authorization: string }> { diff --git a/dlt-connector/src/client/backend/graphql.ts b/dlt-connector/src/client/backend/graphql.ts index 11d1eb099..03a4a3544 100644 --- a/dlt-connector/src/client/backend/graphql.ts +++ b/dlt-connector/src/client/backend/graphql.ts @@ -4,27 +4,40 @@ import { gql } from 'graphql-request' * Schema Definitions for graphql requests */ +const communityFragment = gql` + fragment Community_common on Community { + uuid + name + hieroTopicId + foreign + creationDate + } +` + // graphql query for getting home community in tune with community schema export const homeCommunityGraphqlQuery = gql` query { homeCommunity { - uuid - name - hieroTopicId - foreign - creationDate + ...Community_common } } + ${communityFragment} ` export const setHomeCommunityTopicId = gql` mutation ($uuid: String!, $hieroTopicId: String){ updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { - uuid - name - hieroTopicId - foreign - creationDate + ...Community_common } } + ${communityFragment} +` + +export const getReachableCommunities = gql` + query { + reachableCommunities { + ...Community_common + } + } + ${communityFragment} ` diff --git a/dlt-connector/src/client/hiero/HieroClient.ts b/dlt-connector/src/client/hiero/HieroClient.ts index e48eefc92..33a208b78 100644 --- a/dlt-connector/src/client/hiero/HieroClient.ts +++ b/dlt-connector/src/client/hiero/HieroClient.ts @@ -1,8 +1,11 @@ import { AccountBalance, AccountBalanceQuery, + AddressBookQuery, Client, + FileId, LocalProvider, + NodeAddressBook, PrivateKey, TopicCreateTransaction, TopicId, @@ -166,6 +169,16 @@ export class HieroClient { return v.parse(hieroIdSchema, createReceipt.topicId?.toString()) } + public async downloadAddressBook(): Promise { + const query = new AddressBookQuery().setFileId(FileId.ADDRESS_BOOK) + try { + return await query.execute(this.client) + } catch (e) { + this.logger.error(e) + throw e + } + } + public async updateTopic(topicId: HieroId): Promise { this.logger.addContext('topicId', topicId.toString()) let transaction = new TopicUpdateTransaction() diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index 0547f0c8a..9e0b93b46 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -6,7 +6,16 @@ export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_UPDATE = 1000 * 60 * 60 * 24 * 7 // 10 minutes export const MIN_TOPIC_EXPIRE_MILLISECONDS_FOR_SEND_MESSAGE = 1000 * 60 * 10 -export const GRADIDO_NODE_RUNTIME_PATH = path.join(__dirname, 'gradido_node', 'bin', 'GradidoNode') +export const GRADIDO_NODE_RUNTIME_PATH = path.join( + __dirname, + '..', + '..', + 'gradido_node', + 'bin', + 'GradidoNode', +) // if last start was less than this time, do not restart export const GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS = 1000 * 30 export const GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS = 1000 +// currently hard coded in gradido node, update in future +export const GRADIDO_NODE_HOME_FOLDER_NAME = '.gradido' diff --git a/dlt-connector/src/config/schema.ts b/dlt-connector/src/config/schema.ts index 027dfc364..67a43383d 100644 --- a/dlt-connector/src/config/schema.ts +++ b/dlt-connector/src/config/schema.ts @@ -1,3 +1,4 @@ +import path from 'node:path' import { MemoryBlock } from 'gradido-blockchain-js' import * as v from 'valibot' @@ -78,7 +79,14 @@ export const configSchema = v.object({ ), '8340', ), - DLT_NODE_SERVER_VERSION: v.optional(v.string('The version of the DLT node server'), '0.9.0'), + DLT_GRADIDO_NODE_SERVER_VERSION: v.optional( + v.string('The version of the DLT node server'), + '0.9.0', + ), + DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: v.optional( + v.string('The home folder for the gradido dlt node server'), + path.join(__dirname, '..', '..', 'gradido_node'), + ), PORT: v.optional( v.pipe( v.string('A valid port on which the backend server is running'), diff --git a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts index 14427cacf..5b5f1f629 100644 --- a/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts +++ b/dlt-connector/src/interactions/sendToHiero/SendToHiero.context.ts @@ -7,6 +7,7 @@ import { } from 'gradido-blockchain-js' import { getLogger } from 'log4js' import * as v from 'valibot' +import { ensureCommunitiesAvailable } from '../../client/GradidoNode/communities' import { HieroClient } from '../../client/hiero/HieroClient' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { InputTransactionType } from '../../data/InputTransactionType.enum' @@ -40,7 +41,7 @@ const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.interactions.sendToHiero.SendT export async function SendToHieroContext( input: TransactionInput | CommunityInput, ): Promise { - const role = chooseCorrectRole(input) + const role = await chooseCorrectRole(input) const builder = await role.getGradidoTransactionBuilder() if (builder.isCrossCommunityTransaction()) { // build cross group transaction @@ -107,9 +108,13 @@ async function sendViaHiero( } // choose correct role based on transaction type and input type -function chooseCorrectRole(input: TransactionInput | CommunityInput): AbstractTransactionRole { +async function chooseCorrectRole( + input: TransactionInput | CommunityInput, +): Promise { const communityParsingResult = v.safeParse(communitySchema, input) if (communityParsingResult.success) { + // make sure gradido node knows community + await ensureCommunitiesAvailable([communityParsingResult.output.hieroTopicId]) return new CommunityRootTransactionRole(communityParsingResult.output) } @@ -121,6 +126,12 @@ function chooseCorrectRole(input: TransactionInput | CommunityInput): AbstractTr }) throw new Error('invalid input') } + // make sure gradido node knows communities + const communityTopicIds = [ + transactionParsingResult.output.user.communityTopicId, + transactionParsingResult.output.linkedUser?.communityTopicId, + ].filter((id): id is HieroId => id !== undefined) + await ensureCommunitiesAvailable(communityTopicIds) const transaction = transactionParsingResult.output switch (transaction.type) { diff --git a/dlt-connector/src/server/index.test.ts b/dlt-connector/src/server/index.test.ts index 9ec7f236a..4b6b8be76 100644 --- a/dlt-connector/src/server/index.test.ts +++ b/dlt-connector/src/server/index.test.ts @@ -25,6 +25,12 @@ mock.module('../KeyPairCacheManager', () => { } }) +mock.module('../client/GradidoNode/communities', () => ({ + ensureCommunitiesAvailable: () => { + return Promise.resolve() + }, +})) + mock.module('../client/hiero/HieroClient', () => ({ HieroClient: { getInstance: () => ({ diff --git a/dlt-connector/src/server/index.ts b/dlt-connector/src/server/index.ts index 406d04d06..191e990d3 100644 --- a/dlt-connector/src/server/index.ts +++ b/dlt-connector/src/server/index.ts @@ -3,6 +3,7 @@ import { Elysia, status, t } from 'elysia' import { AddressType_NONE } from 'gradido-blockchain-js' import { getLogger } from 'log4js' import * as v from 'valibot' +import { ensureCommunitiesAvailable } from '../client/GradidoNode/communities' import { GradidoNodeClient } from '../client/GradidoNode/GradidoNodeClient' import { LOG4JS_BASE_CATEGORY } from '../config/const' import { KeyPairIdentifierLogic } from '../data/KeyPairIdentifier.logic' @@ -125,6 +126,8 @@ async function isAccountExist(identifierAccount: IdentifierAccountInput): Promis // check and prepare input const startTime = Date.now() const identifierAccountParsed = v.parse(identifierAccountSchema, identifierAccount) + // make sure gradido node knows community + await ensureCommunitiesAvailable([identifierAccountParsed.communityTopicId]) const accountKeyPair = await ResolveKeyPair(new KeyPairIdentifierLogic(identifierAccountParsed)) const publicKey = accountKeyPair.getPublicKey() if (!publicKey) { diff --git a/dlt-connector/src/utils/filesystem.ts b/dlt-connector/src/utils/filesystem.ts new file mode 100644 index 000000000..639c1b8a4 --- /dev/null +++ b/dlt-connector/src/utils/filesystem.ts @@ -0,0 +1,30 @@ +import fs from 'node:fs' +import { getLogger } from 'log4js' +import { LOG4JS_BASE_CATEGORY } from '../config/const' + +const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.utils.filesystem`) + +export function checkFileExist(filePath: string): boolean { + try { + fs.accessSync(filePath, fs.constants.R_OK | fs.constants.W_OK) + return true + } catch (err) { + logger.debug(`file ${filePath} does not exist: ${err}`) + return false + } +} + +export function checkPathExist(path: string, createIfMissing: boolean = false): boolean { + const exists = checkFileExist(path) + if (exists) { + return true + } + if (createIfMissing) { + logger.info(`create folder ${path}`) + fs.mkdirSync(path, { recursive: true }) + if (!checkPathExist(path)) { + throw new Error(`Failed to create path ${path}`) + } + } + return false +} From 04af2ebec9252a563e6ca88308187a255ce7c95c Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 25 Oct 2025 14:48:40 +0200 Subject: [PATCH 68/72] give it more time for gracefull exit --- dlt-connector/src/config/const.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index 9e0b93b46..dc4b0177c 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -16,6 +16,6 @@ export const GRADIDO_NODE_RUNTIME_PATH = path.join( ) // if last start was less than this time, do not restart export const GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS = 1000 * 30 -export const GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS = 1000 +export const GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS = 10000 // currently hard coded in gradido node, update in future export const GRADIDO_NODE_HOME_FOLDER_NAME = '.gradido' From 181c1d28fc4d99312108e5265f591225f4fa744b Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 25 Oct 2025 15:28:21 +0200 Subject: [PATCH 69/72] fix for windows --- dlt-connector/bun.lock | 3 +++ dlt-connector/package.json | 1 + dlt-connector/src/bootstrap/initGradidoNode.ts | 6 +++--- dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts | 1 + dlt-connector/src/client/backend/graphql.ts | 7 +++++-- dlt-connector/src/utils/filesystem.ts | 2 +- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index a60a02798..b1929bed8 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -13,6 +13,7 @@ "@sinclair/typemap": "^0.10.1", "@types/bun": "^1.2.17", "@types/uuid": "^8.3.4", + "adm-zip": "^0.5.16", "async-mutex": "^0.5.0", "dotenv": "^10.0.0", "elysia": "1.3.8", @@ -285,6 +286,8 @@ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "adm-zip": ["adm-zip@0.5.16", "", {}, "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], diff --git a/dlt-connector/package.json b/dlt-connector/package.json index da30cf58d..1271726ec 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -26,6 +26,7 @@ "@sinclair/typemap": "^0.10.1", "@types/bun": "^1.2.17", "@types/uuid": "^8.3.4", + "adm-zip": "^0.5.16", "async-mutex": "^0.5.0", "dotenv": "^10.0.0", "elysia": "1.3.8", diff --git a/dlt-connector/src/bootstrap/initGradidoNode.ts b/dlt-connector/src/bootstrap/initGradidoNode.ts index 3be2e130c..263bed249 100644 --- a/dlt-connector/src/bootstrap/initGradidoNode.ts +++ b/dlt-connector/src/bootstrap/initGradidoNode.ts @@ -1,7 +1,6 @@ import { execSync } from 'node:child_process' import fs from 'node:fs' import path from 'node:path' -import { gunzipSync } from 'node:zlib' import { getLogger } from 'log4js' import { exportCommunities } from '../client/GradidoNode/communities' import { GradidoNodeProcess } from '../client/GradidoNode/GradidoNodeProcess' @@ -15,6 +14,7 @@ import { import { checkFileExist, checkPathExist } from '../utils/filesystem' import { isPortOpen } from '../utils/network' import { AppContextClients } from './appContext' +import AdmZip from 'adm-zip' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.bootstrap.initGradidoNode`) @@ -58,7 +58,6 @@ async function exportHederaAddressbooks( async function ensureGradidoNodeRuntimeAvailable(runtimeFileName: string): Promise { const runtimeFolder = path.dirname(runtimeFileName) checkPathExist(runtimeFolder, true) - logger.debug(`GradidoNode Runtime: ${runtimeFileName}`) if (!checkFileExist(runtimeFileName)) { const runtimeArchiveFilename = createGradidoNodeRuntimeArchiveFilename() const downloadUrl = new URL( @@ -71,7 +70,8 @@ async function ensureGradidoNodeRuntimeAvailable(runtimeFileName: string): Promi } const compressedBuffer = await archive.arrayBuffer() if (process.platform === 'win32') { - fs.writeFileSync(runtimeFileName, gunzipSync(Buffer.from(compressedBuffer))) + const zip = new AdmZip(Buffer.from(compressedBuffer)) + zip.extractAllTo(runtimeFolder, true) } else { const archivePath = path.join(runtimeFolder, runtimeArchiveFilename) logger.debug(`GradidoNode Runtime Archive: ${archivePath}`) diff --git a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts index d6f5237bf..eb2bf6b66 100644 --- a/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts +++ b/dlt-connector/src/client/GradidoNode/GradidoNodeProcess.ts @@ -52,6 +52,7 @@ export class GradidoNodeProcess { env: { CLIENTS_HIERO_NETWORKTYPE: CONFIG.HIERO_HEDERA_NETWORK, SERVER_JSON_RPC_PORT: CONFIG.DLT_NODE_SERVER_PORT.toString(), + USERPROFILE: CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER, HOME: CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER, }, onExit(proc, exitCode, signalCode, error) { diff --git a/dlt-connector/src/client/backend/graphql.ts b/dlt-connector/src/client/backend/graphql.ts index 03a4a3544..fafd77fcd 100644 --- a/dlt-connector/src/client/backend/graphql.ts +++ b/dlt-connector/src/client/backend/graphql.ts @@ -27,10 +27,13 @@ export const homeCommunityGraphqlQuery = gql` export const setHomeCommunityTopicId = gql` mutation ($uuid: String!, $hieroTopicId: String){ updateHomeCommunity(uuid: $uuid, hieroTopicId: $hieroTopicId) { - ...Community_common + uuid + name + hieroTopicId + foreign + creationDate } } - ${communityFragment} ` export const getReachableCommunities = gql` diff --git a/dlt-connector/src/utils/filesystem.ts b/dlt-connector/src/utils/filesystem.ts index 639c1b8a4..29a3a7519 100644 --- a/dlt-connector/src/utils/filesystem.ts +++ b/dlt-connector/src/utils/filesystem.ts @@ -9,7 +9,7 @@ export function checkFileExist(filePath: string): boolean { fs.accessSync(filePath, fs.constants.R_OK | fs.constants.W_OK) return true } catch (err) { - logger.debug(`file ${filePath} does not exist: ${err}`) + // logger.debug(`file ${filePath} does not exist: ${err}`) return false } } From 39ae8966754cd3c716e21a9a54e13cdb7e7d1d82 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 25 Oct 2025 15:31:05 +0200 Subject: [PATCH 70/72] fix lint --- dlt-connector/src/bootstrap/initGradidoNode.ts | 2 +- dlt-connector/src/utils/filesystem.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dlt-connector/src/bootstrap/initGradidoNode.ts b/dlt-connector/src/bootstrap/initGradidoNode.ts index 263bed249..7c652a667 100644 --- a/dlt-connector/src/bootstrap/initGradidoNode.ts +++ b/dlt-connector/src/bootstrap/initGradidoNode.ts @@ -1,6 +1,7 @@ import { execSync } from 'node:child_process' import fs from 'node:fs' import path from 'node:path' +import AdmZip from 'adm-zip' import { getLogger } from 'log4js' import { exportCommunities } from '../client/GradidoNode/communities' import { GradidoNodeProcess } from '../client/GradidoNode/GradidoNodeProcess' @@ -14,7 +15,6 @@ import { import { checkFileExist, checkPathExist } from '../utils/filesystem' import { isPortOpen } from '../utils/network' import { AppContextClients } from './appContext' -import AdmZip from 'adm-zip' const logger = getLogger(`${LOG4JS_BASE_CATEGORY}.bootstrap.initGradidoNode`) diff --git a/dlt-connector/src/utils/filesystem.ts b/dlt-connector/src/utils/filesystem.ts index 29a3a7519..ea2d64e39 100644 --- a/dlt-connector/src/utils/filesystem.ts +++ b/dlt-connector/src/utils/filesystem.ts @@ -8,8 +8,8 @@ export function checkFileExist(filePath: string): boolean { try { fs.accessSync(filePath, fs.constants.R_OK | fs.constants.W_OK) return true - } catch (err) { - // logger.debug(`file ${filePath} does not exist: ${err}`) + } catch (_err) { + // logger.debug(`file ${filePath} does not exist: ${_err}`) return false } } From 49051d4bed523e6f2dbc7696eebca9f40fe7344d Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 25 Oct 2025 15:32:00 +0200 Subject: [PATCH 71/72] add missing type --- dlt-connector/bun.lock | 3 +++ dlt-connector/package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/dlt-connector/bun.lock b/dlt-connector/bun.lock index b1929bed8..46e566b54 100644 --- a/dlt-connector/bun.lock +++ b/dlt-connector/bun.lock @@ -11,6 +11,7 @@ "@hashgraph/sdk": "^2.70.0", "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", + "@types/adm-zip": "^0.5.7", "@types/bun": "^1.2.17", "@types/uuid": "^8.3.4", "adm-zip": "^0.5.16", @@ -250,6 +251,8 @@ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], + "@types/adm-zip": ["@types/adm-zip@0.5.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 1271726ec..e1bef07c9 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -24,6 +24,7 @@ "@hashgraph/sdk": "^2.70.0", "@sinclair/typebox": "^0.34.33", "@sinclair/typemap": "^0.10.1", + "@types/adm-zip": "^0.5.7", "@types/bun": "^1.2.17", "@types/uuid": "^8.3.4", "adm-zip": "^0.5.16", From 09f261c1ebfcaad8e0865b54df291d945fd5df84 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 27 Oct 2025 13:27:49 +0100 Subject: [PATCH 72/72] rollback change, because moved in other pr --- backend/src/federation/validateCommunities.ts | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 3b910b313..ac9334977 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -2,7 +2,6 @@ import { Community as DbCommunity, FederatedCommunity as DbFederatedCommunity, getHomeCommunity, - getReachableCommunities, } from 'database' import { IsNull } from 'typeorm' @@ -16,9 +15,6 @@ import { getLogger } from 'log4js' import { startCommunityAuthentication } from './authenticateCommunities' import { PublicCommunityInfoLoggingView } from './client/1_0/logging/PublicCommunityInfoLogging.view' import { ApiVersionType } from 'core' -import { CONFIG } from '@/config' -import * as path from 'node:path' -import * as fs from 'node:fs' const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.federation.validateCommunities`) @@ -87,8 +83,6 @@ export async function validateCommunities(): Promise { logger.error(`Error:`, err) } } - // export communities for gradido dlt node server - await exportCommunitiesToDltNodeServer() } export async function writeJwtKeyPairInHomeCommunity(): Promise { @@ -148,48 +142,3 @@ async function writeForeignCommunity( await DbCommunity.save(com) } } - -// prototype, later add api call to gradido dlt node server for adding/updating communities -type CommunityForDltNodeServer = { - communityId: string - hieroTopicId: string - alias: string - folder: string -} -async function exportCommunitiesToDltNodeServer(): Promise { - if (!CONFIG.DLT_CONNECTOR) { - return Promise.resolve() - } - const folder = CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER - try { - fs.accessSync(folder, fs.constants.R_OK | fs.constants.W_OK) - } catch (err) { - logger.error(`Error: home folder for DLT Gradido Node Server ${folder} does not exist`) - return - } - - const dbComs = await getReachableCommunities(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER * 4) - const communitiesForDltNodeServer: CommunityForDltNodeServer[] = [] - // make sure communityName is unique - const communityName = new Set() - dbComs.forEach((com) => { - if (!com.communityUuid || !com.hieroTopicId) { - return - } - let alias = com.name - if (!alias || communityName.has(alias)) { - alias = com.communityUuid - } - communityName.add(alias) - communitiesForDltNodeServer.push({ - communityId: com.communityUuid, - hieroTopicId: com.hieroTopicId, - alias, - // use only alpha-numeric chars for folder name - folder: alias.replace(/[^a-zA-Z0-9]/g, '_') - }) - }) - const dltNodeServerCommunitiesFile = path.join(folder, 'communities.json') - fs.writeFileSync(dltNodeServerCommunitiesFile, JSON.stringify(communitiesForDltNodeServer, null, 2)) - logger.debug(`Written communitiesForDltNodeServer to ${dltNodeServerCommunitiesFile}`) -}