mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
Merge branch 'master' into import-no-cycle-refactor-events
This commit is contained in:
commit
e438502d46
@ -56,19 +56,18 @@
|
|||||||
"@types/node": "^16.10.3",
|
"@types/node": "^16.10.3",
|
||||||
"@types/nodemailer": "^6.4.4",
|
"@types/nodemailer": "^6.4.4",
|
||||||
"@types/uuid": "^8.3.4",
|
"@types/uuid": "^8.3.4",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.28.0",
|
"@typescript-eslint/eslint-plugin": "^5.54.1",
|
||||||
"@typescript-eslint/parser": "^4.28.0",
|
"@typescript-eslint/parser": "^5.54.1",
|
||||||
"apollo-server-testing": "^2.25.2",
|
"apollo-server-testing": "^2.25.2",
|
||||||
"eslint": "^7.29.0",
|
"eslint": "^8.36.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-config-standard": "^16.0.3",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-import-resolver-typescript": "^3.5.3",
|
"eslint-import-resolver-typescript": "^3.5.3",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.27.5",
|
||||||
"eslint-plugin-jest": "^27.2.1",
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"eslint-plugin-n": "^15.6.1",
|
"eslint-plugin-n": "^15.6.1",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
|
||||||
"eslint-plugin-prettier": "^3.4.0",
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
"eslint-plugin-promise": "^5.1.0",
|
"eslint-plugin-promise": "^6.1.1",
|
||||||
"eslint-plugin-type-graphql": "^1.0.0",
|
"eslint-plugin-type-graphql": "^1.0.0",
|
||||||
"faker": "^5.5.3",
|
"faker": "^5.5.3",
|
||||||
"graphql-tag": "^2.12.6",
|
"graphql-tag": "^2.12.6",
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import LogError from '@/server/LogError'
|
import LogError from '@/server/LogError'
|
||||||
|
|||||||
@ -35,6 +35,7 @@ export enum RIGHTS {
|
|||||||
CREATE_CONTRIBUTION_MESSAGE = 'CREATE_CONTRIBUTION_MESSAGE',
|
CREATE_CONTRIBUTION_MESSAGE = 'CREATE_CONTRIBUTION_MESSAGE',
|
||||||
LIST_ALL_CONTRIBUTION_MESSAGES = 'LIST_ALL_CONTRIBUTION_MESSAGES',
|
LIST_ALL_CONTRIBUTION_MESSAGES = 'LIST_ALL_CONTRIBUTION_MESSAGES',
|
||||||
OPEN_CREATIONS = 'OPEN_CREATIONS',
|
OPEN_CREATIONS = 'OPEN_CREATIONS',
|
||||||
|
USER = 'USER',
|
||||||
// Admin
|
// Admin
|
||||||
SEARCH_USERS = 'SEARCH_USERS',
|
SEARCH_USERS = 'SEARCH_USERS',
|
||||||
SET_USER_ROLE = 'SET_USER_ROLE',
|
SET_USER_ROLE = 'SET_USER_ROLE',
|
||||||
|
|||||||
@ -34,6 +34,7 @@ export const ROLE_USER = new Role('user', [
|
|||||||
RIGHTS.CREATE_CONTRIBUTION_MESSAGE,
|
RIGHTS.CREATE_CONTRIBUTION_MESSAGE,
|
||||||
RIGHTS.LIST_ALL_CONTRIBUTION_MESSAGES,
|
RIGHTS.LIST_ALL_CONTRIBUTION_MESSAGES,
|
||||||
RIGHTS.OPEN_CREATIONS,
|
RIGHTS.OPEN_CREATIONS,
|
||||||
|
RIGHTS.USER,
|
||||||
])
|
])
|
||||||
export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights
|
export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { ArgsType, Field } from 'type-graphql'
|
|||||||
@ArgsType()
|
@ArgsType()
|
||||||
export default class TransactionSendArgs {
|
export default class TransactionSendArgs {
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
email: string
|
identifier: string
|
||||||
|
|
||||||
@Field(() => Decimal)
|
@Field(() => Decimal)
|
||||||
amount: Decimal
|
amount: Decimal
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
|
|
||||||
import { User } from '@entity/User'
|
import { User } from '@entity/User'
|
||||||
import { AuthChecker } from 'type-graphql'
|
import { AuthChecker } from 'type-graphql'
|
||||||
|
|||||||
@ -47,6 +47,10 @@ export class Transaction {
|
|||||||
this.linkId = transaction.contribution
|
this.linkId = transaction.contribution
|
||||||
? transaction.contribution.contributionLinkId
|
? transaction.contribution.contributionLinkId
|
||||||
: transaction.transactionLinkId || null
|
: transaction.transactionLinkId || null
|
||||||
|
this.previousBalance =
|
||||||
|
(transaction.previousTransaction &&
|
||||||
|
transaction.previousTransaction.balance.toDecimalPlaces(2, Decimal.ROUND_DOWN)) ||
|
||||||
|
new Decimal(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Int)
|
@Field(() => Int)
|
||||||
@ -70,6 +74,9 @@ export class Transaction {
|
|||||||
@Field(() => Date)
|
@Field(() => Date)
|
||||||
balanceDate: Date
|
balanceDate: Date
|
||||||
|
|
||||||
|
@Field(() => Decimal)
|
||||||
|
previousBalance: Decimal
|
||||||
|
|
||||||
@Field(() => Decay)
|
@Field(() => Decay)
|
||||||
decay: Decay
|
decay: Decay
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
|
|
||||||
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
import { Event as DbEvent } from '@entity/Event'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Event as DbEvent } from '@entity/Event'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
import { GraphQLError } from 'graphql'
|
import { GraphQLError } from 'graphql'
|
||||||
|
|
||||||
|
|||||||
@ -87,7 +87,7 @@ export class ContributionMessageResolver {
|
|||||||
.select('cm')
|
.select('cm')
|
||||||
.from(DbContributionMessage, 'cm')
|
.from(DbContributionMessage, 'cm')
|
||||||
.leftJoinAndSelect('cm.user', 'u')
|
.leftJoinAndSelect('cm.user', 'u')
|
||||||
.where({ contributionId: contributionId })
|
.where({ contributionId })
|
||||||
.orderBy('cm.createdAt', order)
|
.orderBy('cm.createdAt', order)
|
||||||
.limit(pageSize)
|
.limit(pageSize)
|
||||||
.offset((currentPage - 1) * pageSize)
|
.offset((currentPage - 1) * pageSize)
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Contribution } from '@entity/Contribution'
|
import { Contribution } from '@entity/Contribution'
|
||||||
import { Event as DbEvent } from '@entity/Event'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
import { Transaction as DbTransaction } from '@entity/Transaction'
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Resolver, Query, Args, Ctx, Authorized, Arg, Int, Float } from 'type-graphql'
|
import { Resolver, Query, Args, Ctx, Authorized, Arg, Int, Float } from 'type-graphql'
|
||||||
|
|
||||||
import Paginated from '@arg/Paginated'
|
import Paginated from '@arg/Paginated'
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { getConnection } from '@dbTools/typeorm'
|
import { getConnection } from '@dbTools/typeorm'
|
||||||
import { Transaction as DbTransaction } from '@entity/Transaction'
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
import { User as DbUser } from '@entity/User'
|
import { User as DbUser } from '@entity/User'
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/unbound-method */
|
/* eslint-disable @typescript-eslint/unbound-method */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
import { Event as DbEvent } from '@entity/Event'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
import { Transaction } from '@entity/Transaction'
|
import { Transaction } from '@entity/Transaction'
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/unbound-method */
|
/* eslint-disable @typescript-eslint/unbound-method */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Event as DbEvent } from '@entity/Event'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
import { Transaction } from '@entity/Transaction'
|
import { Transaction } from '@entity/Transaction'
|
||||||
import { User } from '@entity/User'
|
import { User } from '@entity/User'
|
||||||
@ -27,8 +27,6 @@ import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
|
|||||||
import { peterLustig } from '@/seeds/users/peter-lustig'
|
import { peterLustig } from '@/seeds/users/peter-lustig'
|
||||||
import { stephenHawking } from '@/seeds/users/stephen-hawking'
|
import { stephenHawking } from '@/seeds/users/stephen-hawking'
|
||||||
|
|
||||||
import { findUserByEmail } from './UserResolver'
|
|
||||||
|
|
||||||
let mutate: any, query: any, con: any
|
let mutate: any, query: any, con: any
|
||||||
let testEnv: any
|
let testEnv: any
|
||||||
|
|
||||||
@ -84,7 +82,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'wrong@email.com',
|
identifier: 'wrong@email.com',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'test',
|
memo: 'test',
|
||||||
},
|
},
|
||||||
@ -112,22 +110,20 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'stephen@hawking.uk',
|
identifier: 'stephen@hawking.uk',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'test',
|
memo: 'test',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).toEqual(
|
).toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
errors: [new GraphQLError('The recipient account was deleted')],
|
errors: [new GraphQLError('No user to given contact')],
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('logs the error thrown', async () => {
|
it('logs the error thrown', () => {
|
||||||
// find peter to check the log
|
expect(logger.error).toBeCalledWith('No user to given contact', 'stephen@hawking.uk')
|
||||||
const user = await findUserByEmail('stephen@hawking.uk')
|
|
||||||
expect(logger.error).toBeCalledWith('The recipient account was deleted', user)
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -143,22 +139,23 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'garrick@ollivander.com',
|
identifier: 'garrick@ollivander.com',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'test',
|
memo: 'test',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
).toEqual(
|
).toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
errors: [new GraphQLError('The recipient account is not activated')],
|
errors: [new GraphQLError('No user with this credentials')],
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('logs the error thrown', async () => {
|
it('logs the error thrown', () => {
|
||||||
// find peter to check the log
|
expect(logger.error).toBeCalledWith(
|
||||||
const user = await findUserByEmail('garrick@ollivander.com')
|
'No user with this credentials',
|
||||||
expect(logger.error).toBeCalledWith('The recipient account is not activated', user)
|
'garrick@ollivander.com',
|
||||||
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -178,7 +175,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'bob@baumeister.de',
|
identifier: 'bob@baumeister.de',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'test',
|
memo: 'test',
|
||||||
},
|
},
|
||||||
@ -202,7 +199,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'test',
|
memo: 'test',
|
||||||
},
|
},
|
||||||
@ -226,7 +223,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test t',
|
memo: 'test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test test t',
|
||||||
},
|
},
|
||||||
@ -250,7 +247,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 100,
|
amount: 100,
|
||||||
memo: 'testing',
|
memo: 'testing',
|
||||||
},
|
},
|
||||||
@ -300,7 +297,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: -50,
|
amount: -50,
|
||||||
memo: 'testing negative',
|
memo: 'testing negative',
|
||||||
},
|
},
|
||||||
@ -323,7 +320,7 @@ describe('send coins', () => {
|
|||||||
await mutate({
|
await mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 50,
|
amount: 50,
|
||||||
memo: 'unrepeatable memo',
|
memo: 'unrepeatable memo',
|
||||||
},
|
},
|
||||||
@ -380,7 +377,7 @@ describe('send coins', () => {
|
|||||||
mutate({
|
mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 10,
|
amount: 10,
|
||||||
memo: 'first transaction',
|
memo: 'first transaction',
|
||||||
},
|
},
|
||||||
@ -396,7 +393,7 @@ describe('send coins', () => {
|
|||||||
mutate({
|
mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 20,
|
amount: 20,
|
||||||
memo: 'second transaction',
|
memo: 'second transaction',
|
||||||
},
|
},
|
||||||
@ -412,7 +409,7 @@ describe('send coins', () => {
|
|||||||
mutate({
|
mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 30,
|
amount: 30,
|
||||||
memo: 'third transaction',
|
memo: 'third transaction',
|
||||||
},
|
},
|
||||||
@ -428,7 +425,7 @@ describe('send coins', () => {
|
|||||||
mutate({
|
mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'peter@lustig.de',
|
identifier: 'peter@lustig.de',
|
||||||
amount: 40,
|
amount: 40,
|
||||||
memo: 'fourth transaction',
|
memo: 'fourth transaction',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -16,7 +16,6 @@ import { TransactionTypeId } from '@enum/TransactionTypeId'
|
|||||||
import { Transaction } from '@model/Transaction'
|
import { Transaction } from '@model/Transaction'
|
||||||
import { TransactionList } from '@model/TransactionList'
|
import { TransactionList } from '@model/TransactionList'
|
||||||
import { User } from '@model/User'
|
import { User } from '@model/User'
|
||||||
import { TransactionRepository } from '@repository/Transaction'
|
|
||||||
import { TransactionLinkRepository } from '@repository/TransactionLink'
|
import { TransactionLinkRepository } from '@repository/TransactionLink'
|
||||||
|
|
||||||
import { RIGHTS } from '@/auth/RIGHTS'
|
import { RIGHTS } from '@/auth/RIGHTS'
|
||||||
@ -35,8 +34,9 @@ import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualT
|
|||||||
|
|
||||||
import { BalanceResolver } from './BalanceResolver'
|
import { BalanceResolver } from './BalanceResolver'
|
||||||
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
|
import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const'
|
||||||
import { findUserByEmail } from './UserResolver'
|
import { findUserByIdentifier } from './util/findUserByIdentifier'
|
||||||
import { getLastTransaction } from './util/getLastTransaction'
|
import { getLastTransaction } from './util/getLastTransaction'
|
||||||
|
import { getTransactionList } from './util/getTransactionList'
|
||||||
|
|
||||||
export const executeTransaction = async (
|
export const executeTransaction = async (
|
||||||
amount: Decimal,
|
amount: Decimal,
|
||||||
@ -149,7 +149,6 @@ export const executeTransaction = async (
|
|||||||
} finally {
|
} finally {
|
||||||
await queryRunner.release()
|
await queryRunner.release()
|
||||||
}
|
}
|
||||||
logger.debug(`prepare Email for transaction received...`)
|
|
||||||
await sendTransactionReceivedEmail({
|
await sendTransactionReceivedEmail({
|
||||||
firstName: recipient.firstName,
|
firstName: recipient.firstName,
|
||||||
lastName: recipient.lastName,
|
lastName: recipient.lastName,
|
||||||
@ -210,8 +209,7 @@ export class TransactionResolver {
|
|||||||
// find transactions
|
// find transactions
|
||||||
// first page can contain 26 due to virtual decay transaction
|
// first page can contain 26 due to virtual decay transaction
|
||||||
const offset = (currentPage - 1) * pageSize
|
const offset = (currentPage - 1) * pageSize
|
||||||
const transactionRepository = getCustomRepository(TransactionRepository)
|
const [userTransactions, userTransactionsCount] = await getTransactionList(
|
||||||
const [userTransactions, userTransactionsCount] = await transactionRepository.findByUserPaged(
|
|
||||||
user.id,
|
user.id,
|
||||||
pageSize,
|
pageSize,
|
||||||
offset,
|
offset,
|
||||||
@ -276,6 +274,7 @@ export class TransactionResolver {
|
|||||||
firstDate || now,
|
firstDate || now,
|
||||||
lastDate || now,
|
lastDate || now,
|
||||||
self,
|
self,
|
||||||
|
(userTransactions.length && userTransactions[0].balance) || new Decimal(0),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
logger.debug(`transactions=${transactions}`)
|
logger.debug(`transactions=${transactions}`)
|
||||||
@ -283,7 +282,7 @@ export class TransactionResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// transactions
|
// transactions
|
||||||
userTransactions.forEach((userTransaction) => {
|
userTransactions.forEach((userTransaction: dbTransaction) => {
|
||||||
const linkedUser =
|
const linkedUser =
|
||||||
userTransaction.typeId === TransactionTypeId.CREATION
|
userTransaction.typeId === TransactionTypeId.CREATION
|
||||||
? communityUser
|
? communityUser
|
||||||
@ -292,6 +291,15 @@ export class TransactionResolver {
|
|||||||
})
|
})
|
||||||
logger.debug(`TransactionTypeId.CREATION: transactions=${transactions}`)
|
logger.debug(`TransactionTypeId.CREATION: transactions=${transactions}`)
|
||||||
|
|
||||||
|
transactions.forEach((transaction: Transaction) => {
|
||||||
|
if (transaction.typeId !== TransactionTypeId.DECAY) {
|
||||||
|
const { balance, previousBalance, amount } = transaction
|
||||||
|
transaction.decay.decay = new Decimal(
|
||||||
|
Number(balance) - Number(amount) - Number(previousBalance),
|
||||||
|
).toDecimalPlaces(2, Decimal.ROUND_HALF_UP)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Construct Result
|
// Construct Result
|
||||||
return new TransactionList(await balanceResolver.balance(context), transactions)
|
return new TransactionList(await balanceResolver.balance(context), transactions)
|
||||||
}
|
}
|
||||||
@ -299,10 +307,10 @@ export class TransactionResolver {
|
|||||||
@Authorized([RIGHTS.SEND_COINS])
|
@Authorized([RIGHTS.SEND_COINS])
|
||||||
@Mutation(() => Boolean)
|
@Mutation(() => Boolean)
|
||||||
async sendCoins(
|
async sendCoins(
|
||||||
@Args() { email, amount, memo }: TransactionSendArgs,
|
@Args() { identifier, amount, memo }: TransactionSendArgs,
|
||||||
@Ctx() context: Context,
|
@Ctx() context: Context,
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
logger.info(`sendCoins(email=${email}, amount=${amount}, memo=${memo})`)
|
logger.info(`sendCoins(identifier=${identifier}, amount=${amount}, memo=${memo})`)
|
||||||
if (amount.lte(0)) {
|
if (amount.lte(0)) {
|
||||||
throw new LogError('Amount to send must be positive', amount)
|
throw new LogError('Amount to send must be positive', amount)
|
||||||
}
|
}
|
||||||
@ -311,13 +319,9 @@ export class TransactionResolver {
|
|||||||
const senderUser = getUser(context)
|
const senderUser = getUser(context)
|
||||||
|
|
||||||
// validate recipient user
|
// validate recipient user
|
||||||
const recipientUser = await findUserByEmail(email)
|
const recipientUser = await findUserByIdentifier(identifier)
|
||||||
if (recipientUser.deletedAt) {
|
if (!recipientUser) {
|
||||||
throw new LogError('The recipient account was deleted', recipientUser)
|
throw new LogError('The recipient user was not found', recipientUser)
|
||||||
}
|
|
||||||
const emailContact = recipientUser.emailContact
|
|
||||||
if (!emailContact.emailChecked) {
|
|
||||||
throw new LogError('The recipient account is not activated', recipientUser)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await executeTransaction(amount, memo, senderUser, recipientUser)
|
await executeTransaction(amount, memo, senderUser, recipientUser)
|
||||||
|
|||||||
@ -5,13 +5,13 @@
|
|||||||
/* eslint-disable @typescript-eslint/unbound-method */
|
/* eslint-disable @typescript-eslint/unbound-method */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Event as DbEvent } from '@entity/Event'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
import { TransactionLink } from '@entity/TransactionLink'
|
import { TransactionLink } from '@entity/TransactionLink'
|
||||||
import { User } from '@entity/User'
|
import { User } from '@entity/User'
|
||||||
import { UserContact } from '@entity/UserContact'
|
import { UserContact } from '@entity/UserContact'
|
||||||
import { GraphQLError } from 'graphql'
|
import { GraphQLError } from 'graphql'
|
||||||
import { validate as validateUUID, version as versionUUID } from 'uuid'
|
import { v4 as uuidv4, validate as validateUUID, version as versionUUID } from 'uuid'
|
||||||
|
|
||||||
import { OptInType } from '@enum/OptInType'
|
import { OptInType } from '@enum/OptInType'
|
||||||
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
|
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
|
||||||
@ -46,7 +46,13 @@ import {
|
|||||||
unDeleteUser,
|
unDeleteUser,
|
||||||
sendActivationEmail,
|
sendActivationEmail,
|
||||||
} from '@/seeds/graphql/mutations'
|
} from '@/seeds/graphql/mutations'
|
||||||
import { verifyLogin, queryOptIn, searchAdminUsers, searchUsers } from '@/seeds/graphql/queries'
|
import {
|
||||||
|
verifyLogin,
|
||||||
|
queryOptIn,
|
||||||
|
searchAdminUsers,
|
||||||
|
searchUsers,
|
||||||
|
user as userQuery,
|
||||||
|
} from '@/seeds/graphql/queries'
|
||||||
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
|
import { bibiBloxberg } from '@/seeds/users/bibi-bloxberg'
|
||||||
import { bobBaumeister } from '@/seeds/users/bob-baumeister'
|
import { bobBaumeister } from '@/seeds/users/bob-baumeister'
|
||||||
import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
|
import { garrickOllivander } from '@/seeds/users/garrick-ollivander'
|
||||||
@ -1420,7 +1426,7 @@ describe('UserResolver', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('changes to gradidoID on login', async () => {
|
it('changes to gradidoID on login', async () => {
|
||||||
await mutate({ mutation: login, variables: variables })
|
await mutate({ mutation: login, variables })
|
||||||
|
|
||||||
const usercontact = await UserContact.findOneOrFail(
|
const usercontact = await UserContact.findOneOrFail(
|
||||||
{ email: 'bibi@bloxberg.de' },
|
{ email: 'bibi@bloxberg.de' },
|
||||||
@ -1441,7 +1447,7 @@ describe('UserResolver', () => {
|
|||||||
|
|
||||||
it('can login after password change', async () => {
|
it('can login after password change', async () => {
|
||||||
resetToken()
|
resetToken()
|
||||||
expect(await mutate({ mutation: login, variables: variables })).toEqual(
|
expect(await mutate({ mutation: login, variables })).toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
data: {
|
data: {
|
||||||
login: {
|
login: {
|
||||||
@ -2298,6 +2304,124 @@ describe('UserResolver', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('user', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('unauthenticated', () => {
|
||||||
|
it('throws and logs "401 Unauthorized" error', async () => {
|
||||||
|
await expect(
|
||||||
|
query({
|
||||||
|
query: userQuery,
|
||||||
|
variables: {
|
||||||
|
identifier: 'identifier',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
errors: [new GraphQLError('401 Unauthorized')],
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
expect(logger.error).toBeCalledWith('401 Unauthorized')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('authenticated', () => {
|
||||||
|
const uuid = uuidv4()
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
user = await userFactory(testEnv, bibiBloxberg)
|
||||||
|
await mutate({
|
||||||
|
mutation: login,
|
||||||
|
variables: { email: 'bibi@bloxberg.de', password: 'Aa12345_' },
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('identifier is no gradido ID and no email', () => {
|
||||||
|
it('throws and logs "Unknown identifier type" error', async () => {
|
||||||
|
await expect(
|
||||||
|
query({
|
||||||
|
query: userQuery,
|
||||||
|
variables: {
|
||||||
|
identifier: 'identifier',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
errors: [new GraphQLError('Unknown identifier type')],
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
expect(logger.error).toBeCalledWith('Unknown identifier type', 'identifier')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('identifier is not found', () => {
|
||||||
|
it('throws and logs "No user found to given identifier" error', async () => {
|
||||||
|
await expect(
|
||||||
|
query({
|
||||||
|
query: userQuery,
|
||||||
|
variables: {
|
||||||
|
identifier: uuid,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
errors: [new GraphQLError('No user found to given identifier')],
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
expect(logger.error).toBeCalledWith('No user found to given identifier', uuid)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('identifier is found via email', () => {
|
||||||
|
it('returns user', async () => {
|
||||||
|
await expect(
|
||||||
|
query({
|
||||||
|
query: userQuery,
|
||||||
|
variables: {
|
||||||
|
identifier: 'bibi@bloxberg.de',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
data: {
|
||||||
|
user: {
|
||||||
|
firstName: 'Bibi',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: undefined,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('identifier is found via gradidoID', () => {
|
||||||
|
it('returns user', async () => {
|
||||||
|
await expect(
|
||||||
|
query({
|
||||||
|
query: userQuery,
|
||||||
|
variables: {
|
||||||
|
identifier: user.gradidoID,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
).resolves.toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
data: {
|
||||||
|
user: {
|
||||||
|
firstName: 'Bibi',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errors: undefined,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('printTimeDuration', () => {
|
describe('printTimeDuration', () => {
|
||||||
|
|||||||
@ -72,6 +72,7 @@ import { getTimeDurationObject, printTimeDuration } from '@/util/time'
|
|||||||
|
|
||||||
import { FULL_CREATION_AVAILABLE } from './const/const'
|
import { FULL_CREATION_AVAILABLE } from './const/const'
|
||||||
import { getUserCreations } from './util/creations'
|
import { getUserCreations } from './util/creations'
|
||||||
|
import { findUserByIdentifier } from './util/findUserByIdentifier'
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-commonjs
|
// eslint-disable-next-line @typescript-eslint/no-var-requires, import/no-commonjs
|
||||||
const random = require('random-bigint')
|
const random = require('random-bigint')
|
||||||
@ -97,6 +98,7 @@ const newEmailContact = (email: string, userId: number): DbUserContact => {
|
|||||||
return emailContact
|
return emailContact
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||||
export const activationLink = (verificationCode: BigInt): string => {
|
export const activationLink = (verificationCode: BigInt): string => {
|
||||||
logger.debug(`activationLink(${verificationCode})...`)
|
logger.debug(`activationLink(${verificationCode})...`)
|
||||||
return CONFIG.EMAIL_LINK_SETPASSWORD.replace(/{optin}/g, verificationCode.toString())
|
return CONFIG.EMAIL_LINK_SETPASSWORD.replace(/{optin}/g, verificationCode.toString())
|
||||||
@ -819,11 +821,17 @@ export class UserResolver {
|
|||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Authorized([RIGHTS.USER])
|
||||||
|
@Query(() => User)
|
||||||
|
async user(@Arg('identifier') identifier: string): Promise<User> {
|
||||||
|
return new User(await findUserByIdentifier(identifier))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findUserByEmail(email: string): Promise<DbUser> {
|
export async function findUserByEmail(email: string): Promise<DbUser> {
|
||||||
const dbUserContact = await DbUserContact.findOneOrFail(
|
const dbUserContact = await DbUserContact.findOneOrFail(
|
||||||
{ email: email },
|
{ email },
|
||||||
{ withDeleted: true, relations: ['user'] },
|
{ withDeleted: true, relations: ['user'] },
|
||||||
).catch(() => {
|
).catch(() => {
|
||||||
throw new LogError('No user with this credentials', email)
|
throw new LogError('No user with this credentials', email)
|
||||||
@ -834,7 +842,7 @@ export async function findUserByEmail(email: string): Promise<DbUser> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function checkEmailExists(email: string): Promise<boolean> {
|
async function checkEmailExists(email: string): Promise<boolean> {
|
||||||
const userContact = await DbUserContact.findOne({ email: email }, { withDeleted: true })
|
const userContact = await DbUserContact.findOne({ email }, { withDeleted: true })
|
||||||
if (userContact) {
|
if (userContact) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Decimal } from 'decimal.js-light'
|
import { Decimal } from 'decimal.js-light'
|
||||||
|
|
||||||
import { cleanDB, testEnvironment, contributionDateFormatter } from '@test/helpers'
|
import { cleanDB, testEnvironment, contributionDateFormatter } from '@test/helpers'
|
||||||
@ -152,7 +152,7 @@ describe('semaphore', () => {
|
|||||||
})
|
})
|
||||||
const bibisTransaction = mutate({
|
const bibisTransaction = mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: { email: 'bob@baumeister.de', amount: '50', memo: 'Das ist für dich, Bob' },
|
variables: { identifier: 'bob@baumeister.de', amount: '50', memo: 'Das ist für dich, Bob' },
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: login,
|
mutation: login,
|
||||||
@ -168,7 +168,7 @@ describe('semaphore', () => {
|
|||||||
})
|
})
|
||||||
const bobsTransaction = mutate({
|
const bobsTransaction = mutate({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: { email: 'bibi@bloxberg.de', amount: '50', memo: 'Das ist für dich, Bibi' },
|
variables: { identifier: 'bibi@bloxberg.de', amount: '50', memo: 'Das ist für dich, Bibi' },
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: login,
|
mutation: login,
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Contribution } from '@entity/Contribution'
|
import { Contribution } from '@entity/Contribution'
|
||||||
import { User } from '@entity/User'
|
import { User } from '@entity/User'
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { getConnection } from '@dbTools/typeorm'
|
import { getConnection } from '@dbTools/typeorm'
|
||||||
import { Contribution } from '@entity/Contribution'
|
import { Contribution } from '@entity/Contribution'
|
||||||
import { Decimal } from 'decimal.js-light'
|
import { Decimal } from 'decimal.js-light'
|
||||||
|
|||||||
36
backend/src/graphql/resolver/util/findUserByIdentifier.ts
Normal file
36
backend/src/graphql/resolver/util/findUserByIdentifier.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { UserContact as DbUserContact } from '@entity/UserContact'
|
||||||
|
import { validate, version } from 'uuid'
|
||||||
|
|
||||||
|
import LogError from '@/server/LogError'
|
||||||
|
|
||||||
|
export const findUserByIdentifier = async (identifier: string): Promise<DbUser> => {
|
||||||
|
let user: DbUser | undefined
|
||||||
|
if (validate(identifier) && version(identifier) === 4) {
|
||||||
|
user = await DbUser.findOne({ where: { gradidoID: identifier }, relations: ['emailContact'] })
|
||||||
|
if (!user) {
|
||||||
|
throw new LogError('No user found to given identifier', identifier)
|
||||||
|
}
|
||||||
|
} else if (/^.{2,}@.{2,}\..{2,}$/.exec(identifier)) {
|
||||||
|
const userContact = await DbUserContact.findOne(
|
||||||
|
{
|
||||||
|
email: identifier,
|
||||||
|
emailChecked: true,
|
||||||
|
},
|
||||||
|
{ relations: ['user'] },
|
||||||
|
)
|
||||||
|
if (!userContact) {
|
||||||
|
throw new LogError('No user with this credentials', identifier)
|
||||||
|
}
|
||||||
|
if (!userContact.user) {
|
||||||
|
throw new LogError('No user to given contact', identifier)
|
||||||
|
}
|
||||||
|
user = userContact.user
|
||||||
|
user.emailContact = userContact
|
||||||
|
} else {
|
||||||
|
// last is alias when implemented
|
||||||
|
throw new LogError('Unknown identifier type', identifier)
|
||||||
|
}
|
||||||
|
|
||||||
|
return user
|
||||||
|
}
|
||||||
20
backend/src/graphql/resolver/util/getTransactionList.ts
Normal file
20
backend/src/graphql/resolver/util/getTransactionList.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
|
|
||||||
|
import { Order } from '@enum/Order'
|
||||||
|
|
||||||
|
export const getTransactionList = async (
|
||||||
|
userId: number,
|
||||||
|
limit: number,
|
||||||
|
offset: number,
|
||||||
|
order: Order,
|
||||||
|
): Promise<[DbTransaction[], number]> => {
|
||||||
|
return DbTransaction.findAndCount({
|
||||||
|
where: {
|
||||||
|
userId,
|
||||||
|
},
|
||||||
|
order: { balanceDate: order, id: order },
|
||||||
|
relations: ['previousTransaction'],
|
||||||
|
skip: offset,
|
||||||
|
take: limit,
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Decimal } from 'decimal.js-light'
|
import { Decimal } from 'decimal.js-light'
|
||||||
import { GraphQLScalarType, Kind } from 'graphql'
|
import { GraphQLScalarType, Kind } from 'graphql'
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { MiddlewareFn } from 'type-graphql'
|
import { MiddlewareFn } from 'type-graphql'
|
||||||
|
|
||||||
import { KlickTipp } from '@model/KlickTipp'
|
import { KlickTipp } from '@model/KlickTipp'
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { User } from '@entity/User'
|
import { User } from '@entity/User'
|
||||||
|
|
||||||
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
|
import { PasswordEncryptionType } from '@enum/PasswordEncryptionType'
|
||||||
|
|||||||
@ -75,8 +75,8 @@ export const sendActivationEmail = gql`
|
|||||||
`
|
`
|
||||||
|
|
||||||
export const sendCoins = gql`
|
export const sendCoins = gql`
|
||||||
mutation ($email: String!, $amount: Decimal!, $memo: String!) {
|
mutation ($identifier: String!, $amount: Decimal!, $memo: String!) {
|
||||||
sendCoins(email: $email, amount: $amount, memo: $memo)
|
sendCoins(identifier: $identifier, amount: $amount, memo: $memo)
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|||||||
@ -340,3 +340,12 @@ export const listContributionMessages = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
export const user = gql`
|
||||||
|
query ($identifier: String!) {
|
||||||
|
user(identifier: $identifier) {
|
||||||
|
firstName
|
||||||
|
lastName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { backendLogger as logger } from './logger'
|
import { backendLogger as logger } from './logger'
|
||||||
|
|
||||||
export default class LogError extends Error {
|
export default class LogError extends Error {
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { readFileSync } from 'fs'
|
import { readFileSync } from 'fs'
|
||||||
|
|
||||||
import { configure, getLogger } from 'log4js'
|
import { configure, getLogger } from 'log4js'
|
||||||
|
|||||||
@ -1,36 +0,0 @@
|
|||||||
import { EntityRepository, Repository } from '@dbTools/typeorm'
|
|
||||||
import { Transaction } from '@entity/Transaction'
|
|
||||||
|
|
||||||
import { Order } from '@enum/Order'
|
|
||||||
import { TransactionTypeId } from '@enum/TransactionTypeId'
|
|
||||||
|
|
||||||
@EntityRepository(Transaction)
|
|
||||||
export class TransactionRepository extends Repository<Transaction> {
|
|
||||||
findByUserPaged(
|
|
||||||
userId: number,
|
|
||||||
limit: number,
|
|
||||||
offset: number,
|
|
||||||
order: Order,
|
|
||||||
onlyCreation?: boolean,
|
|
||||||
): Promise<[Transaction[], number]> {
|
|
||||||
const query = this.createQueryBuilder('userTransaction')
|
|
||||||
.leftJoinAndSelect(
|
|
||||||
'userTransaction.contribution',
|
|
||||||
'contribution',
|
|
||||||
'userTransaction.id = contribution.transactionId',
|
|
||||||
)
|
|
||||||
.where('userTransaction.userId = :userId', { userId })
|
|
||||||
|
|
||||||
if (onlyCreation) {
|
|
||||||
query.andWhere('userTransaction.typeId = :typeId', {
|
|
||||||
typeId: TransactionTypeId.CREATION,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return query
|
|
||||||
.orderBy('userTransaction.balanceDate', order)
|
|
||||||
.limit(limit)
|
|
||||||
.offset(offset)
|
|
||||||
.getManyAndCount()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,4 +1,5 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
import { Repository, EntityRepository } from '@dbTools/typeorm'
|
import { Repository, EntityRepository } from '@dbTools/typeorm'
|
||||||
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
||||||
import { Decimal } from 'decimal.js-light'
|
import { Decimal } from 'decimal.js-light'
|
||||||
|
|||||||
@ -38,6 +38,7 @@ const virtualLinkTransaction = (
|
|||||||
createdAt: Date,
|
createdAt: Date,
|
||||||
validUntil: Date,
|
validUntil: Date,
|
||||||
user: User,
|
user: User,
|
||||||
|
previousBalance: Decimal,
|
||||||
): Transaction => {
|
): Transaction => {
|
||||||
const linkDbTransaction: dbTransaction = {
|
const linkDbTransaction: dbTransaction = {
|
||||||
id: -2,
|
id: -2,
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
/*
|
/*
|
||||||
Elopage Webhook
|
Elopage Webhook
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
||||||
/* eslint-disable @typescript-eslint/no-empty-interface */
|
/* eslint-disable @typescript-eslint/no-empty-interface */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
|
|
||||||
import { Decimal } from 'decimal.js-light'
|
import { Decimal } from 'decimal.js-light'
|
||||||
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
/* eslint-disable @typescript-eslint/unbound-method */
|
/* eslint-disable @typescript-eslint/unbound-method */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
|
|
||||||
import { entities } from '@entity/index'
|
import { entities } from '@entity/index'
|
||||||
import { createTestClient } from 'apollo-server-testing'
|
import { createTestClient } from 'apollo-server-testing'
|
||||||
|
|||||||
@ -46,13 +46,6 @@
|
|||||||
http-errors "^1.7.3"
|
http-errors "^1.7.3"
|
||||||
object-path "^0.11.4"
|
object-path "^0.11.4"
|
||||||
|
|
||||||
"@babel/code-frame@7.12.11":
|
|
||||||
version "7.12.11"
|
|
||||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
|
|
||||||
integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
|
|
||||||
dependencies:
|
|
||||||
"@babel/highlight" "^7.10.4"
|
|
||||||
|
|
||||||
"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8":
|
"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8":
|
||||||
version "7.15.8"
|
version "7.15.8"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503"
|
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503"
|
||||||
@ -221,7 +214,7 @@
|
|||||||
"@babel/traverse" "^7.15.4"
|
"@babel/traverse" "^7.15.4"
|
||||||
"@babel/types" "^7.15.4"
|
"@babel/types" "^7.15.4"
|
||||||
|
|
||||||
"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
|
"@babel/highlight@^7.14.5":
|
||||||
version "7.14.5"
|
version "7.14.5"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
|
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
|
||||||
integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
|
integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
|
||||||
@ -389,21 +382,38 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@cspotcode/source-map-consumer" "0.8.0"
|
"@cspotcode/source-map-consumer" "0.8.0"
|
||||||
|
|
||||||
"@eslint/eslintrc@^0.4.3":
|
"@eslint-community/eslint-utils@^4.2.0":
|
||||||
version "0.4.3"
|
version "4.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
|
resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518"
|
||||||
integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
|
integrity sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==
|
||||||
|
dependencies:
|
||||||
|
eslint-visitor-keys "^3.3.0"
|
||||||
|
|
||||||
|
"@eslint-community/regexpp@^4.4.0":
|
||||||
|
version "4.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403"
|
||||||
|
integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==
|
||||||
|
|
||||||
|
"@eslint/eslintrc@^2.0.1":
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d"
|
||||||
|
integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==
|
||||||
dependencies:
|
dependencies:
|
||||||
ajv "^6.12.4"
|
ajv "^6.12.4"
|
||||||
debug "^4.1.1"
|
debug "^4.3.2"
|
||||||
espree "^7.3.0"
|
espree "^9.5.0"
|
||||||
globals "^13.9.0"
|
globals "^13.19.0"
|
||||||
ignore "^4.0.6"
|
ignore "^5.2.0"
|
||||||
import-fresh "^3.2.1"
|
import-fresh "^3.2.1"
|
||||||
js-yaml "^3.13.1"
|
js-yaml "^4.1.0"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.1.2"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
|
"@eslint/js@8.36.0":
|
||||||
|
version "8.36.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe"
|
||||||
|
integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==
|
||||||
|
|
||||||
"@graphql-typed-document-node/core@^3.1.1":
|
"@graphql-typed-document-node/core@^3.1.1":
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052"
|
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052"
|
||||||
@ -421,19 +431,24 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-10.0.1.tgz#ee9da297fabc557e1c040a0f44ee89c266ccc306"
|
resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-10.0.1.tgz#ee9da297fabc557e1c040a0f44ee89c266ccc306"
|
||||||
integrity sha512-CvlW7jmOhWzuqOqiJQ3rQVLMcREh0eel4IBnxDx2FAcK8g7qoJRQK4L1CPBASoCY6y8e6zuCy3f2g+HWdkzcMw==
|
integrity sha512-CvlW7jmOhWzuqOqiJQ3rQVLMcREh0eel4IBnxDx2FAcK8g7qoJRQK4L1CPBASoCY6y8e6zuCy3f2g+HWdkzcMw==
|
||||||
|
|
||||||
"@humanwhocodes/config-array@^0.5.0":
|
"@humanwhocodes/config-array@^0.11.8":
|
||||||
version "0.5.0"
|
version "0.11.8"
|
||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
|
||||||
integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
|
integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@humanwhocodes/object-schema" "^1.2.0"
|
"@humanwhocodes/object-schema" "^1.2.1"
|
||||||
debug "^4.1.1"
|
debug "^4.1.1"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.0.5"
|
||||||
|
|
||||||
"@humanwhocodes/object-schema@^1.2.0":
|
"@humanwhocodes/module-importer@^1.0.1":
|
||||||
version "1.2.0"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
|
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
|
||||||
integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
|
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==
|
||||||
|
|
||||||
"@istanbuljs/load-nyc-config@^1.0.0":
|
"@istanbuljs/load-nyc-config@^1.0.0":
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
@ -704,7 +719,7 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
|
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
|
||||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||||
|
|
||||||
"@nodelib/fs.walk@^1.2.3":
|
"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
|
||||||
version "1.2.8"
|
version "1.2.8"
|
||||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
|
resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
|
||||||
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
|
integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
|
||||||
@ -1026,11 +1041,6 @@
|
|||||||
jest-diff "^27.0.0"
|
jest-diff "^27.0.0"
|
||||||
pretty-format "^27.0.0"
|
pretty-format "^27.0.0"
|
||||||
|
|
||||||
"@types/json-schema@^7.0.7":
|
|
||||||
version "7.0.9"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
|
|
||||||
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
|
|
||||||
|
|
||||||
"@types/json-schema@^7.0.9":
|
"@types/json-schema@^7.0.9":
|
||||||
version "7.0.11"
|
version "7.0.11"
|
||||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||||
@ -1209,32 +1219,22 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3"
|
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3"
|
||||||
integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==
|
integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==
|
||||||
|
|
||||||
"@typescript-eslint/eslint-plugin@^4.28.0":
|
"@typescript-eslint/eslint-plugin@^5.54.1":
|
||||||
version "4.33.0"
|
version "5.54.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz#0c5091289ce28372e38ab8d28e861d2dbe1ab29e"
|
||||||
integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==
|
integrity sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/experimental-utils" "4.33.0"
|
"@typescript-eslint/scope-manager" "5.54.1"
|
||||||
"@typescript-eslint/scope-manager" "4.33.0"
|
"@typescript-eslint/type-utils" "5.54.1"
|
||||||
debug "^4.3.1"
|
"@typescript-eslint/utils" "5.54.1"
|
||||||
functional-red-black-tree "^1.0.1"
|
debug "^4.3.4"
|
||||||
ignore "^5.1.8"
|
grapheme-splitter "^1.0.4"
|
||||||
regexpp "^3.1.0"
|
ignore "^5.2.0"
|
||||||
semver "^7.3.5"
|
natural-compare-lite "^1.4.0"
|
||||||
|
regexpp "^3.2.0"
|
||||||
|
semver "^7.3.7"
|
||||||
tsutils "^3.21.0"
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/experimental-utils@4.33.0":
|
|
||||||
version "4.33.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
|
|
||||||
integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
|
|
||||||
dependencies:
|
|
||||||
"@types/json-schema" "^7.0.7"
|
|
||||||
"@typescript-eslint/scope-manager" "4.33.0"
|
|
||||||
"@typescript-eslint/types" "4.33.0"
|
|
||||||
"@typescript-eslint/typescript-estree" "4.33.0"
|
|
||||||
eslint-scope "^5.1.1"
|
|
||||||
eslint-utils "^3.0.0"
|
|
||||||
|
|
||||||
"@typescript-eslint/experimental-utils@^5.9.0":
|
"@typescript-eslint/experimental-utils@^5.9.0":
|
||||||
version "5.53.0"
|
version "5.53.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.53.0.tgz#e249e3a47ace290ea3d83a5a08c8d90cd7fe2a53"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.53.0.tgz#e249e3a47ace290ea3d83a5a08c8d90cd7fe2a53"
|
||||||
@ -1242,23 +1242,15 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/utils" "5.53.0"
|
"@typescript-eslint/utils" "5.53.0"
|
||||||
|
|
||||||
"@typescript-eslint/parser@^4.28.0":
|
"@typescript-eslint/parser@^5.54.1":
|
||||||
version "4.33.0"
|
version "5.54.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.54.1.tgz#05761d7f777ef1c37c971d3af6631715099b084c"
|
||||||
integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==
|
integrity sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@typescript-eslint/scope-manager" "4.33.0"
|
"@typescript-eslint/scope-manager" "5.54.1"
|
||||||
"@typescript-eslint/types" "4.33.0"
|
"@typescript-eslint/types" "5.54.1"
|
||||||
"@typescript-eslint/typescript-estree" "4.33.0"
|
"@typescript-eslint/typescript-estree" "5.54.1"
|
||||||
debug "^4.3.1"
|
debug "^4.3.4"
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager@4.33.0":
|
|
||||||
version "4.33.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
|
|
||||||
integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==
|
|
||||||
dependencies:
|
|
||||||
"@typescript-eslint/types" "4.33.0"
|
|
||||||
"@typescript-eslint/visitor-keys" "4.33.0"
|
|
||||||
|
|
||||||
"@typescript-eslint/scope-manager@5.53.0":
|
"@typescript-eslint/scope-manager@5.53.0":
|
||||||
version "5.53.0"
|
version "5.53.0"
|
||||||
@ -1276,10 +1268,15 @@
|
|||||||
"@typescript-eslint/types" "5.54.1"
|
"@typescript-eslint/types" "5.54.1"
|
||||||
"@typescript-eslint/visitor-keys" "5.54.1"
|
"@typescript-eslint/visitor-keys" "5.54.1"
|
||||||
|
|
||||||
"@typescript-eslint/types@4.33.0":
|
"@typescript-eslint/type-utils@5.54.1":
|
||||||
version "4.33.0"
|
version "5.54.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz#4825918ec27e55da8bb99cd07ec2a8e5f50ab748"
|
||||||
integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==
|
integrity sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==
|
||||||
|
dependencies:
|
||||||
|
"@typescript-eslint/typescript-estree" "5.54.1"
|
||||||
|
"@typescript-eslint/utils" "5.54.1"
|
||||||
|
debug "^4.3.4"
|
||||||
|
tsutils "^3.21.0"
|
||||||
|
|
||||||
"@typescript-eslint/types@5.53.0":
|
"@typescript-eslint/types@5.53.0":
|
||||||
version "5.53.0"
|
version "5.53.0"
|
||||||
@ -1291,19 +1288,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.54.1.tgz#29fbac29a716d0f08c62fe5de70c9b6735de215c"
|
||||||
integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==
|
integrity sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree@4.33.0":
|
|
||||||
version "4.33.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
|
|
||||||
integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==
|
|
||||||
dependencies:
|
|
||||||
"@typescript-eslint/types" "4.33.0"
|
|
||||||
"@typescript-eslint/visitor-keys" "4.33.0"
|
|
||||||
debug "^4.3.1"
|
|
||||||
globby "^11.0.3"
|
|
||||||
is-glob "^4.0.1"
|
|
||||||
semver "^7.3.5"
|
|
||||||
tsutils "^3.21.0"
|
|
||||||
|
|
||||||
"@typescript-eslint/typescript-estree@5.53.0":
|
"@typescript-eslint/typescript-estree@5.53.0":
|
||||||
version "5.53.0"
|
version "5.53.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.53.0.tgz#bc651dc28cf18ab248ecd18a4c886c744aebd690"
|
||||||
@ -1344,7 +1328,7 @@
|
|||||||
eslint-utils "^3.0.0"
|
eslint-utils "^3.0.0"
|
||||||
semver "^7.3.7"
|
semver "^7.3.7"
|
||||||
|
|
||||||
"@typescript-eslint/utils@^5.10.0":
|
"@typescript-eslint/utils@5.54.1", "@typescript-eslint/utils@^5.10.0":
|
||||||
version "5.54.1"
|
version "5.54.1"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.54.1.tgz#7a3ee47409285387b9d4609ea7e1020d1797ec34"
|
||||||
integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==
|
integrity sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==
|
||||||
@ -1358,14 +1342,6 @@
|
|||||||
eslint-utils "^3.0.0"
|
eslint-utils "^3.0.0"
|
||||||
semver "^7.3.7"
|
semver "^7.3.7"
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys@4.33.0":
|
|
||||||
version "4.33.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
|
|
||||||
integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==
|
|
||||||
dependencies:
|
|
||||||
"@typescript-eslint/types" "4.33.0"
|
|
||||||
eslint-visitor-keys "^2.0.0"
|
|
||||||
|
|
||||||
"@typescript-eslint/visitor-keys@5.53.0":
|
"@typescript-eslint/visitor-keys@5.53.0":
|
||||||
version "5.53.0"
|
version "5.53.0"
|
||||||
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f"
|
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.53.0.tgz#8a5126623937cdd909c30d8fa72f79fa56cc1a9f"
|
||||||
@ -1415,7 +1391,7 @@ acorn-globals@^6.0.0:
|
|||||||
acorn "^7.1.1"
|
acorn "^7.1.1"
|
||||||
acorn-walk "^7.1.1"
|
acorn-walk "^7.1.1"
|
||||||
|
|
||||||
acorn-jsx@^5.3.1:
|
acorn-jsx@^5.3.2:
|
||||||
version "5.3.2"
|
version "5.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||||
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
|
||||||
@ -1430,7 +1406,7 @@ acorn-walk@^8.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
|
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
|
||||||
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
|
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
|
||||||
|
|
||||||
acorn@^7.1.1, acorn@^7.4.0:
|
acorn@^7.1.1:
|
||||||
version "7.4.1"
|
version "7.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
|
||||||
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
|
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
|
||||||
@ -1440,6 +1416,11 @@ acorn@^8.2.4, acorn@^8.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
|
||||||
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
|
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
|
||||||
|
|
||||||
|
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==
|
||||||
|
|
||||||
agent-base@6:
|
agent-base@6:
|
||||||
version "6.0.2"
|
version "6.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||||
@ -1457,16 +1438,6 @@ ajv@^6.10.0, ajv@^6.12.4:
|
|||||||
json-schema-traverse "^0.4.1"
|
json-schema-traverse "^0.4.1"
|
||||||
uri-js "^4.2.2"
|
uri-js "^4.2.2"
|
||||||
|
|
||||||
ajv@^8.0.1:
|
|
||||||
version "8.6.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764"
|
|
||||||
integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==
|
|
||||||
dependencies:
|
|
||||||
fast-deep-equal "^3.1.1"
|
|
||||||
json-schema-traverse "^1.0.0"
|
|
||||||
require-from-string "^2.0.2"
|
|
||||||
uri-js "^4.2.2"
|
|
||||||
|
|
||||||
ansi-align@^3.0.0:
|
ansi-align@^3.0.0:
|
||||||
version "3.0.1"
|
version "3.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
|
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
|
||||||
@ -1763,11 +1734,6 @@ assert-never@^1.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe"
|
resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe"
|
||||||
integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==
|
integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==
|
||||||
|
|
||||||
astral-regex@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
|
|
||||||
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
|
|
||||||
|
|
||||||
async-retry@^1.2.1:
|
async-retry@^1.2.1:
|
||||||
version "1.3.3"
|
version "1.3.3"
|
||||||
resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280"
|
resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280"
|
||||||
@ -2442,7 +2408,7 @@ debug@2.6.9, debug@^2.2.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "2.0.0"
|
ms "2.0.0"
|
||||||
|
|
||||||
debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
|
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
|
||||||
version "4.3.2"
|
version "4.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
|
||||||
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
|
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
|
||||||
@ -2456,7 +2422,7 @@ debug@^3.2.6, debug@^3.2.7:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "^2.1.1"
|
ms "^2.1.1"
|
||||||
|
|
||||||
debug@^4.3.3, debug@^4.3.4:
|
debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
|
||||||
version "4.3.4"
|
version "4.3.4"
|
||||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
||||||
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||||
@ -2743,13 +2709,6 @@ enhanced-resolve@^5.10.0:
|
|||||||
graceful-fs "^4.2.4"
|
graceful-fs "^4.2.4"
|
||||||
tapable "^2.2.0"
|
tapable "^2.2.0"
|
||||||
|
|
||||||
enquirer@^2.3.5:
|
|
||||||
version "2.3.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
|
|
||||||
integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
|
|
||||||
dependencies:
|
|
||||||
ansi-colors "^4.1.1"
|
|
||||||
|
|
||||||
entities@^2.0.0:
|
entities@^2.0.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
|
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
|
||||||
@ -2902,10 +2861,10 @@ eslint-config-prettier@^8.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a"
|
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a"
|
||||||
integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==
|
integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==
|
||||||
|
|
||||||
eslint-config-standard@^16.0.3:
|
eslint-config-standard@^17.0.0:
|
||||||
version "16.0.3"
|
version "17.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516"
|
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf"
|
||||||
integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==
|
integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==
|
||||||
|
|
||||||
eslint-import-resolver-node@^0.3.7:
|
eslint-import-resolver-node@^0.3.7:
|
||||||
version "0.3.7"
|
version "0.3.7"
|
||||||
@ -2936,14 +2895,6 @@ eslint-module-utils@^2.7.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
debug "^3.2.7"
|
debug "^3.2.7"
|
||||||
|
|
||||||
eslint-plugin-es@^3.0.0:
|
|
||||||
version "3.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893"
|
|
||||||
integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==
|
|
||||||
dependencies:
|
|
||||||
eslint-utils "^2.0.0"
|
|
||||||
regexpp "^3.0.0"
|
|
||||||
|
|
||||||
eslint-plugin-es@^4.1.0:
|
eslint-plugin-es@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9"
|
||||||
@ -2994,18 +2945,6 @@ eslint-plugin-n@^15.6.1:
|
|||||||
resolve "^1.22.1"
|
resolve "^1.22.1"
|
||||||
semver "^7.3.8"
|
semver "^7.3.8"
|
||||||
|
|
||||||
eslint-plugin-node@^11.1.0:
|
|
||||||
version "11.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d"
|
|
||||||
integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==
|
|
||||||
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"
|
|
||||||
|
|
||||||
eslint-plugin-prettier@^3.4.0:
|
eslint-plugin-prettier@^3.4.0:
|
||||||
version "3.4.1"
|
version "3.4.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5"
|
||||||
@ -3013,10 +2952,10 @@ eslint-plugin-prettier@^3.4.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prettier-linter-helpers "^1.0.0"
|
prettier-linter-helpers "^1.0.0"
|
||||||
|
|
||||||
eslint-plugin-promise@^5.1.0:
|
eslint-plugin-promise@^6.1.1:
|
||||||
version "5.1.0"
|
version "6.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz#fb2188fb734e4557993733b41aa1a688f46c6f24"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
|
||||||
integrity sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==
|
integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
|
||||||
|
|
||||||
eslint-plugin-type-graphql@^1.0.0:
|
eslint-plugin-type-graphql@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
@ -3033,7 +2972,15 @@ eslint-scope@^5.1.1:
|
|||||||
esrecurse "^4.3.0"
|
esrecurse "^4.3.0"
|
||||||
estraverse "^4.1.1"
|
estraverse "^4.1.1"
|
||||||
|
|
||||||
eslint-utils@^2.0.0, eslint-utils@^2.1.0:
|
eslint-scope@^7.1.1:
|
||||||
|
version "7.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
|
||||||
|
integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
|
||||||
|
dependencies:
|
||||||
|
esrecurse "^4.3.0"
|
||||||
|
estraverse "^5.2.0"
|
||||||
|
|
||||||
|
eslint-utils@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
|
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
|
||||||
integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
|
integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
|
||||||
@ -3047,7 +2994,7 @@ eslint-utils@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint-visitor-keys "^2.0.0"
|
eslint-visitor-keys "^2.0.0"
|
||||||
|
|
||||||
eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
|
eslint-visitor-keys@^1.1.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
|
||||||
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
|
integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
|
||||||
@ -3062,70 +3009,70 @@ eslint-visitor-keys@^3.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
|
||||||
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
|
||||||
|
|
||||||
eslint@^7.29.0:
|
eslint@^8.36.0:
|
||||||
version "7.32.0"
|
version "8.36.0"
|
||||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
|
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf"
|
||||||
integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
|
integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/code-frame" "7.12.11"
|
"@eslint-community/eslint-utils" "^4.2.0"
|
||||||
"@eslint/eslintrc" "^0.4.3"
|
"@eslint-community/regexpp" "^4.4.0"
|
||||||
"@humanwhocodes/config-array" "^0.5.0"
|
"@eslint/eslintrc" "^2.0.1"
|
||||||
|
"@eslint/js" "8.36.0"
|
||||||
|
"@humanwhocodes/config-array" "^0.11.8"
|
||||||
|
"@humanwhocodes/module-importer" "^1.0.1"
|
||||||
|
"@nodelib/fs.walk" "^1.2.8"
|
||||||
ajv "^6.10.0"
|
ajv "^6.10.0"
|
||||||
chalk "^4.0.0"
|
chalk "^4.0.0"
|
||||||
cross-spawn "^7.0.2"
|
cross-spawn "^7.0.2"
|
||||||
debug "^4.0.1"
|
debug "^4.3.2"
|
||||||
doctrine "^3.0.0"
|
doctrine "^3.0.0"
|
||||||
enquirer "^2.3.5"
|
|
||||||
escape-string-regexp "^4.0.0"
|
escape-string-regexp "^4.0.0"
|
||||||
eslint-scope "^5.1.1"
|
eslint-scope "^7.1.1"
|
||||||
eslint-utils "^2.1.0"
|
eslint-visitor-keys "^3.3.0"
|
||||||
eslint-visitor-keys "^2.0.0"
|
espree "^9.5.0"
|
||||||
espree "^7.3.1"
|
esquery "^1.4.2"
|
||||||
esquery "^1.4.0"
|
|
||||||
esutils "^2.0.2"
|
esutils "^2.0.2"
|
||||||
fast-deep-equal "^3.1.3"
|
fast-deep-equal "^3.1.3"
|
||||||
file-entry-cache "^6.0.1"
|
file-entry-cache "^6.0.1"
|
||||||
functional-red-black-tree "^1.0.1"
|
find-up "^5.0.0"
|
||||||
glob-parent "^5.1.2"
|
glob-parent "^6.0.2"
|
||||||
globals "^13.6.0"
|
globals "^13.19.0"
|
||||||
ignore "^4.0.6"
|
grapheme-splitter "^1.0.4"
|
||||||
|
ignore "^5.2.0"
|
||||||
import-fresh "^3.0.0"
|
import-fresh "^3.0.0"
|
||||||
imurmurhash "^0.1.4"
|
imurmurhash "^0.1.4"
|
||||||
is-glob "^4.0.0"
|
is-glob "^4.0.0"
|
||||||
js-yaml "^3.13.1"
|
is-path-inside "^3.0.3"
|
||||||
|
js-sdsl "^4.1.4"
|
||||||
|
js-yaml "^4.1.0"
|
||||||
json-stable-stringify-without-jsonify "^1.0.1"
|
json-stable-stringify-without-jsonify "^1.0.1"
|
||||||
levn "^0.4.1"
|
levn "^0.4.1"
|
||||||
lodash.merge "^4.6.2"
|
lodash.merge "^4.6.2"
|
||||||
minimatch "^3.0.4"
|
minimatch "^3.1.2"
|
||||||
natural-compare "^1.4.0"
|
natural-compare "^1.4.0"
|
||||||
optionator "^0.9.1"
|
optionator "^0.9.1"
|
||||||
progress "^2.0.0"
|
strip-ansi "^6.0.1"
|
||||||
regexpp "^3.1.0"
|
|
||||||
semver "^7.2.1"
|
|
||||||
strip-ansi "^6.0.0"
|
|
||||||
strip-json-comments "^3.1.0"
|
strip-json-comments "^3.1.0"
|
||||||
table "^6.0.9"
|
|
||||||
text-table "^0.2.0"
|
text-table "^0.2.0"
|
||||||
v8-compile-cache "^2.0.3"
|
|
||||||
|
|
||||||
espree@^7.3.0, espree@^7.3.1:
|
espree@^9.5.0:
|
||||||
version "7.3.1"
|
version "9.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
|
resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113"
|
||||||
integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
|
integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==
|
||||||
dependencies:
|
dependencies:
|
||||||
acorn "^7.4.0"
|
acorn "^8.8.0"
|
||||||
acorn-jsx "^5.3.1"
|
acorn-jsx "^5.3.2"
|
||||||
eslint-visitor-keys "^1.3.0"
|
eslint-visitor-keys "^3.3.0"
|
||||||
|
|
||||||
esprima@^4.0.0, esprima@^4.0.1:
|
esprima@^4.0.0, esprima@^4.0.1:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
|
||||||
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
|
||||||
|
|
||||||
esquery@^1.4.0:
|
esquery@^1.4.2:
|
||||||
version "1.4.0"
|
version "1.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
|
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
|
||||||
integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
|
integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
|
||||||
dependencies:
|
dependencies:
|
||||||
estraverse "^5.1.0"
|
estraverse "^5.1.0"
|
||||||
|
|
||||||
@ -3262,17 +3209,6 @@ fast-diff@^1.1.2:
|
|||||||
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
|
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
|
||||||
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
|
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
|
||||||
|
|
||||||
fast-glob@^3.1.1:
|
|
||||||
version "3.2.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
|
|
||||||
integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
|
|
||||||
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-glob@^3.2.11, fast-glob@^3.2.9:
|
fast-glob@^3.2.11, fast-glob@^3.2.9:
|
||||||
version "3.2.12"
|
version "3.2.12"
|
||||||
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
|
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
|
||||||
@ -3350,6 +3286,14 @@ find-up@^4.0.0, find-up@^4.1.0:
|
|||||||
locate-path "^5.0.0"
|
locate-path "^5.0.0"
|
||||||
path-exists "^4.0.0"
|
path-exists "^4.0.0"
|
||||||
|
|
||||||
|
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:
|
flat-cache@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
|
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
|
||||||
@ -3438,11 +3382,6 @@ function.prototype.name@^1.1.5:
|
|||||||
es-abstract "^1.19.0"
|
es-abstract "^1.19.0"
|
||||||
functions-have-names "^1.2.2"
|
functions-have-names "^1.2.2"
|
||||||
|
|
||||||
functional-red-black-tree@^1.0.1:
|
|
||||||
version "1.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
|
|
||||||
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
|
|
||||||
|
|
||||||
functions-have-names@^1.2.2:
|
functions-have-names@^1.2.2:
|
||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
|
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
|
||||||
@ -3544,6 +3483,13 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-glob "^4.0.1"
|
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@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
|
glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
|
||||||
version "7.2.0"
|
version "7.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
|
||||||
@ -3568,10 +3514,10 @@ globals@^11.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
|
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
|
||||||
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
|
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
|
||||||
|
|
||||||
globals@^13.6.0, globals@^13.9.0:
|
globals@^13.19.0:
|
||||||
version "13.11.0"
|
version "13.20.0"
|
||||||
resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7"
|
resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
|
||||||
integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
|
integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
type-fest "^0.20.2"
|
type-fest "^0.20.2"
|
||||||
|
|
||||||
@ -3587,18 +3533,6 @@ globalyzer@0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465"
|
resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465"
|
||||||
integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==
|
integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==
|
||||||
|
|
||||||
globby@^11.0.3:
|
|
||||||
version "11.0.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
|
|
||||||
integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
|
|
||||||
dependencies:
|
|
||||||
array-union "^2.1.0"
|
|
||||||
dir-glob "^3.0.1"
|
|
||||||
fast-glob "^3.1.1"
|
|
||||||
ignore "^5.1.4"
|
|
||||||
merge2 "^1.3.0"
|
|
||||||
slash "^3.0.0"
|
|
||||||
|
|
||||||
globby@^11.1.0:
|
globby@^11.1.0:
|
||||||
version "11.1.0"
|
version "11.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
|
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
|
||||||
@ -3675,6 +3609,11 @@ graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
|||||||
typeorm "^0.2.38"
|
typeorm "^0.2.38"
|
||||||
uuid "^8.3.2"
|
uuid "^8.3.2"
|
||||||
|
|
||||||
|
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==
|
||||||
|
|
||||||
graphql-extensions@^0.15.0:
|
graphql-extensions@^0.15.0:
|
||||||
version "0.15.0"
|
version "0.15.0"
|
||||||
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.15.0.tgz#3f291f9274876b0c289fa4061909a12678bd9817"
|
resolved "https://registry.yarnpkg.com/graphql-extensions/-/graphql-extensions-0.15.0.tgz#3f291f9274876b0c289fa4061909a12678bd9817"
|
||||||
@ -3980,12 +3919,7 @@ ignore-by-default@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
|
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
|
||||||
integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
|
integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
|
||||||
|
|
||||||
ignore@^4.0.6:
|
ignore@^5.1.1:
|
||||||
version "4.0.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
|
|
||||||
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
|
|
||||||
|
|
||||||
ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8:
|
|
||||||
version "5.1.8"
|
version "5.1.8"
|
||||||
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
|
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
|
||||||
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
|
integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
|
||||||
@ -4230,7 +4164,7 @@ is-obj@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
|
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
|
||||||
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
|
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
|
||||||
|
|
||||||
is-path-inside@^3.0.2:
|
is-path-inside@^3.0.2, is-path-inside@^3.0.3:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
|
||||||
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
|
||||||
@ -4803,6 +4737,11 @@ jest@^27.2.4:
|
|||||||
import-local "^3.0.2"
|
import-local "^3.0.2"
|
||||||
jest-cli "^27.2.5"
|
jest-cli "^27.2.5"
|
||||||
|
|
||||||
|
js-sdsl@^4.1.4:
|
||||||
|
version "4.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711"
|
||||||
|
integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
|
||||||
|
|
||||||
js-stringify@^1.0.2:
|
js-stringify@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
|
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
|
||||||
@ -4821,7 +4760,7 @@ js-yaml@^3.13.1:
|
|||||||
argparse "^1.0.7"
|
argparse "^1.0.7"
|
||||||
esprima "^4.0.0"
|
esprima "^4.0.0"
|
||||||
|
|
||||||
js-yaml@^4.0.0:
|
js-yaml@^4.0.0, js-yaml@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
||||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||||
@ -4876,11 +4815,6 @@ json-schema-traverse@^0.4.1:
|
|||||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||||
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
||||||
|
|
||||||
json-schema-traverse@^1.0.0:
|
|
||||||
version "1.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
|
|
||||||
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
|
|
||||||
|
|
||||||
json-stable-stringify-without-jsonify@^1.0.1:
|
json-stable-stringify-without-jsonify@^1.0.1:
|
||||||
version "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"
|
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
||||||
@ -5054,6 +4988,13 @@ locate-path@^5.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-locate "^4.1.0"
|
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.clonedeep@^4.5.0:
|
lodash.clonedeep@^4.5.0:
|
||||||
version "4.5.0"
|
version "4.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
|
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
|
||||||
@ -5109,11 +5050,6 @@ lodash.sortby@^4.7.0:
|
|||||||
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
|
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
|
||||||
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
|
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
|
||||||
|
|
||||||
lodash.truncate@^4.4.2:
|
|
||||||
version "4.4.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
|
|
||||||
integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
|
|
||||||
|
|
||||||
lodash@4.x, lodash@^4.17.21, lodash@^4.7.0:
|
lodash@4.x, lodash@^4.17.21, lodash@^4.7.0:
|
||||||
version "4.17.21"
|
version "4.17.21"
|
||||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||||
@ -5295,7 +5231,7 @@ minimatch@^3.0.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
minimatch@^3.1.2:
|
minimatch@^3.0.5, minimatch@^3.1.2:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||||
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
|
||||||
@ -5398,6 +5334,11 @@ named-placeholders@^1.1.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lru-cache "^4.1.3"
|
lru-cache "^4.1.3"
|
||||||
|
|
||||||
|
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:
|
natural-compare@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||||
@ -5680,6 +5621,13 @@ p-limit@^2.2.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-try "^2.0.0"
|
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:
|
p-locate@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
|
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
|
||||||
@ -5687,6 +5635,13 @@ p-locate@^4.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-limit "^2.2.0"
|
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-timeout@^3.0.0, p-timeout@^3.1.0:
|
p-timeout@^3.0.0, p-timeout@^3.1.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe"
|
resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe"
|
||||||
@ -5881,11 +5836,6 @@ process-nextick-args@~2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
|
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
|
||||||
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
|
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
|
||||||
|
|
||||||
progress@^2.0.0:
|
|
||||||
version "2.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
|
|
||||||
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
|
|
||||||
|
|
||||||
promise@^7.0.1:
|
promise@^7.0.1:
|
||||||
version "7.3.1"
|
version "7.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
|
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
|
||||||
@ -6146,7 +6096,7 @@ regexp.prototype.flags@^1.4.3:
|
|||||||
define-properties "^1.1.3"
|
define-properties "^1.1.3"
|
||||||
functions-have-names "^1.2.2"
|
functions-have-names "^1.2.2"
|
||||||
|
|
||||||
regexpp@^3.0.0, regexpp@^3.1.0:
|
regexpp@^3.0.0, regexpp@^3.2.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
|
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
|
||||||
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
|
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
|
||||||
@ -6170,11 +6120,6 @@ require-directory@^2.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
|
||||||
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
|
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
|
||||||
|
|
||||||
require-from-string@^2.0.2:
|
|
||||||
version "2.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
|
||||||
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
|
||||||
|
|
||||||
resolve-cwd@^3.0.0:
|
resolve-cwd@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
|
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
|
||||||
@ -6192,14 +6137,6 @@ resolve-from@^5.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
|
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
|
||||||
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
|
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
|
||||||
|
|
||||||
resolve@^1.10.1, resolve@^1.20.0:
|
|
||||||
version "1.20.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
|
||||||
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
|
||||||
dependencies:
|
|
||||||
is-core-module "^2.2.0"
|
|
||||||
path-parse "^1.0.6"
|
|
||||||
|
|
||||||
resolve@^1.15.1, resolve@^1.22.1:
|
resolve@^1.15.1, resolve@^1.22.1:
|
||||||
version "1.22.1"
|
version "1.22.1"
|
||||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
|
||||||
@ -6209,6 +6146,14 @@ resolve@^1.15.1, resolve@^1.22.1:
|
|||||||
path-parse "^1.0.7"
|
path-parse "^1.0.7"
|
||||||
supports-preserve-symlinks-flag "^1.0.0"
|
supports-preserve-symlinks-flag "^1.0.0"
|
||||||
|
|
||||||
|
resolve@^1.20.0:
|
||||||
|
version "1.20.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
|
||||||
|
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
|
||||||
|
dependencies:
|
||||||
|
is-core-module "^2.2.0"
|
||||||
|
path-parse "^1.0.6"
|
||||||
|
|
||||||
responselike@^1.0.2:
|
responselike@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
|
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
|
||||||
@ -6312,7 +6257,7 @@ semver-diff@^3.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
semver "^6.3.0"
|
semver "^6.3.0"
|
||||||
|
|
||||||
semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
|
semver@7.x, semver@^7.3.2, semver@^7.3.4:
|
||||||
version "7.3.5"
|
version "7.3.5"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
|
||||||
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
|
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
|
||||||
@ -6324,7 +6269,7 @@ semver@^5.5.0, semver@^5.6.0, semver@^5.7.1:
|
|||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||||
|
|
||||||
semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0:
|
semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
|
||||||
version "6.3.0"
|
version "6.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
||||||
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
||||||
@ -6446,15 +6391,6 @@ slash@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
|
resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
|
||||||
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
|
integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
|
||||||
|
|
||||||
slice-ansi@^4.0.0:
|
|
||||||
version "4.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
|
|
||||||
integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
|
|
||||||
dependencies:
|
|
||||||
ansi-styles "^4.0.0"
|
|
||||||
astral-regex "^2.0.0"
|
|
||||||
is-fullwidth-code-point "^3.0.0"
|
|
||||||
|
|
||||||
slick@^1.12.2:
|
slick@^1.12.2:
|
||||||
version "1.12.2"
|
version "1.12.2"
|
||||||
resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7"
|
resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7"
|
||||||
@ -6689,18 +6625,6 @@ synckit@^0.8.4:
|
|||||||
"@pkgr/utils" "^2.3.1"
|
"@pkgr/utils" "^2.3.1"
|
||||||
tslib "^2.5.0"
|
tslib "^2.5.0"
|
||||||
|
|
||||||
table@^6.0.9:
|
|
||||||
version "6.7.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0"
|
|
||||||
integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==
|
|
||||||
dependencies:
|
|
||||||
ajv "^8.0.1"
|
|
||||||
lodash.clonedeep "^4.5.0"
|
|
||||||
lodash.truncate "^4.4.2"
|
|
||||||
slice-ansi "^4.0.0"
|
|
||||||
string-width "^4.2.3"
|
|
||||||
strip-ansi "^6.0.1"
|
|
||||||
|
|
||||||
tapable@^2.2.0:
|
tapable@^2.2.0:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
|
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
|
||||||
@ -7148,11 +7072,6 @@ uuid@^8.0.0, uuid@^8.3.2:
|
|||||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
|
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
|
||||||
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
|
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
|
||||||
|
|
||||||
v8-compile-cache@^2.0.3:
|
|
||||||
version "2.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
|
|
||||||
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
|
|
||||||
|
|
||||||
v8-to-istanbul@^8.1.0:
|
v8-to-istanbul@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c"
|
resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c"
|
||||||
@ -7439,6 +7358,11 @@ yn@3.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
|
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
|
||||||
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
|
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==
|
||||||
|
|
||||||
zen-observable-ts@^0.8.21:
|
zen-observable-ts@^0.8.21:
|
||||||
version "0.8.21"
|
version "0.8.21"
|
||||||
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
|
resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
|
||||||
|
|||||||
@ -96,4 +96,8 @@ export class Transaction extends BaseEntity {
|
|||||||
@OneToOne(() => Contribution, (contribution) => contribution.transaction)
|
@OneToOne(() => Contribution, (contribution) => contribution.transaction)
|
||||||
@JoinColumn({ name: 'id', referencedColumnName: 'transactionId' })
|
@JoinColumn({ name: 'id', referencedColumnName: 'transactionId' })
|
||||||
contribution?: Contribution | null
|
contribution?: Contribution | null
|
||||||
|
|
||||||
|
@OneToOne(() => Transaction)
|
||||||
|
@JoinColumn({ name: 'previous' })
|
||||||
|
previousTransaction?: Transaction | null
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,18 +26,51 @@ Dies ist ein rein technischer Key und wird nur **innerhalb** der Anwendung zur I
|
|||||||
|
|
||||||
Die GradidoID ist zwar auch ein rein technischer Key, doch wird dieser als eine UUID der Version 4 erstellt. Dies basiert auf einer (pseudo)zufällig generierten Zahl aus 16 Bytes mit einer theoretischen Konfliktfreiheit von  in hexadezimaler Notation nach einem Pattern von fünf Gruppen durch Bindestrich getrennt - z.B. `550e8400-e29b-41d4-a716-446655440000`
|
Die GradidoID ist zwar auch ein rein technischer Key, doch wird dieser als eine UUID der Version 4 erstellt. Dies basiert auf einer (pseudo)zufällig generierten Zahl aus 16 Bytes mit einer theoretischen Konfliktfreiheit von  in hexadezimaler Notation nach einem Pattern von fünf Gruppen durch Bindestrich getrennt - z.B. `550e8400-e29b-41d4-a716-446655440000`
|
||||||
|
|
||||||
Somit kann die GradidoID auch System übergreifend zwischen Communities ausgetauscht werden und bietet dennoch eine weitestgehende eindeutige theoretisch konfliktfreie Identifikation des Users. System intern ist die Eindeutigkeit bei der Erstellung eines neuen Users auf jedenfall sichergestellt. Sollte ein User den Wechsel von einer Community in eine andere gradido-Community wünschen, so soll falls möglich die GradidoID für den User erhalten bleiben und übernommen werden können. Dies muss beim Umzug in der Ziel-Community geprüft werden. Falls diese GradidoID aus der Quell-Community wider erwarten existieren sollte, dann muss doch einen neue GradidoID für den User erzeugt werden.
|
Somit kann die GradidoID auch System übergreifend zwischen Communities ausgetauscht werden und bietet dennoch eine weitestgehende eindeutige theoretisch konfliktfreie Identifikation des Users. System intern ist die Eindeutigkeit bei der Erstellung eines neuen Users auf jedenfall sichergestellt. Sollte ein User den Wechsel von einer Community in eine andere gradido-Community wünschen, so soll falls möglich die GradidoID für den User erhalten bleiben und übernommen werden können. Dies muss beim Umzug in der Ziel-Community geprüft werden. Falls diese GradidoID aus der Quell-Community wider erwarten existieren sollte, dann muss doch einen neue GradidoID für den User in der Ziel-Community erzeugt werden.
|
||||||
|
|
||||||
#### Alias
|
#### Alias
|
||||||
|
|
||||||
Der Alias eines Users ist als rein fachlicher Key ausgelegt, der frei vom User definiert werden kann. Bei der Definition dieses frei definierbaren und menschenlesbaren Schlüsselwertes stellt die Gradido-Anwendung sicher, dass der vom User eingegebene Wert nicht schon von einem anderen User dieser Community verwendet wird. Für die Anlage eines Alias gelten folgende Konventionen:
|
Der Alias eines Users ist als rein fachlicher Key ausgelegt, der frei vom User definiert werden kann. Bei der Definition dieses frei definierbaren und menschenlesbaren Schlüsselwertes stellt die Gradido-Anwendung sicher, dass der vom User eingegebene Wert nicht schon von einem anderen User dieser Community verwendet wird. Für die Anlage eines Alias gelten folgende Konventionen:
|
||||||
|
|
||||||
- mindestens 5 Zeichen
|
* alpha-nummerisch
|
||||||
* alphanumerisch
|
* 2 <= Länge des alias <=20
|
||||||
|
* beginnt mit einem Buchstaben
|
||||||
* keine Umlaute
|
* keine Umlaute
|
||||||
* nach folgender Regel erlaubt (RegEx: [a-zA-Z0-9]-|_[a-zA-Z0-9])
|
* keine Sonderzeichen ausser dem Bindestrich "-" und dem Unterstrich "_"
|
||||||
- Blacklist für Schlüsselworte, die frei definiert werden können
|
* nicht mehr als 2 Wiederholungen des gleichen Zeichens direkt hintereinander
|
||||||
- vordefinierte/reservierte System relevante Namen dürfen maximal aus 4 Zeichen bestehen
|
* kein Unterscheidung von Groß-Kleinschreibung, es findet eine Konvertierung auf Kleinschreibung statt
|
||||||
|
|
||||||
|
Blackliste für nicht vom User verwendbare alias-Definitionen:
|
||||||
|
|
||||||
|
Notation: das %-Zeichen dient als Platzhalter für 0 oder beliebig viele der erlaubten Zeichen
|
||||||
|
|
||||||
|
* %gradido% (= die Sequenz gradido darf nicht enthalten sein)
|
||||||
|
* %community% (= die Sequenz community darf nicht enthalten sein)
|
||||||
|
* %communities% (= die Sequenz communities darf nicht enthalten sein)
|
||||||
|
* %admin% (= die Sequenz admin darf nicht enthalten sein)
|
||||||
|
* %gast% (= die Sequenz gast darf nicht enthalten sein)
|
||||||
|
* %guest% (= die Sequenz guest darf nicht enthalten sein)
|
||||||
|
* support% (= darf nicht mit der Sequenz support beginnen)
|
||||||
|
* user% (= darf nicht mit der Sequenz user beginnen)
|
||||||
|
* usr% (= darf nicht mit der Sequenz usr beginnen)
|
||||||
|
* home% (= darf nicht mit der Sequenz home beginnen)
|
||||||
|
* chief% (= darf nicht mit der Sequenz chief beginnen)
|
||||||
|
* chef% (= darf nicht mit der Sequenz chef beginnen)
|
||||||
|
* master% (= darf nicht mit der Sequenz master beginnen)
|
||||||
|
* email% (= darf nicht mit der Sequenz email beginnen)
|
||||||
|
* mail% (= darf nicht mit der Sequenz mail beginnen)
|
||||||
|
* root% (= darf nicht mit der Sequenz root beginnen)
|
||||||
|
* tmp% (= darf nicht mit der Sequenz tmp beginnen)
|
||||||
|
* temp% (= darf nicht mit der Sequenz temp beginnen)
|
||||||
|
* gdd% (= darf nicht mit der Sequenz gdd beginnen)
|
||||||
|
* gdt% (= darf nicht mit der Sequenz gdt beginnen)
|
||||||
|
* gdb% (= darf nicht mit der Sequenz gdb beginnen)
|
||||||
|
* age (= darf nicht age lauten)
|
||||||
|
* gmw (= darf nicht gmw lauten)
|
||||||
|
* auf (= darf nicht auf lauten)
|
||||||
|
* ...
|
||||||
|
|
||||||
|
Um für die Zukunft für eine Community im Rahmen der Dreifachen-Geldschöpfung und deren Verwaltung bestimmte Alias-Werte nicht an allgemeine User zu verlieren, werden in der Blackliste jetzt schon solche Belegungen reserviert. Damit können diese ggf. später wieder für system relevante User der Community wieder freigegeben werden.
|
||||||
|
|
||||||
#### Email
|
#### Email
|
||||||
|
|
||||||
@ -93,20 +126,8 @@ Der Sprung nach der Login-Seite nach erfolgreichem Login auf die Profil-Seite ö
|
|||||||
Im Eingabe-Modus der Alias-Gruppe hat das Eingabefeld den Fokus und darin wird:
|
Im Eingabe-Modus der Alias-Gruppe hat das Eingabefeld den Fokus und darin wird:
|
||||||
|
|
||||||
* wenn noch kein Alias für den User in der Datenbank vorhanden ist, vom System ein Vorschlag unterbreitet. Der Vorschlag basiert auf dem Vornamen des Users und wird durch folgende Logik ermittelt:
|
* wenn noch kein Alias für den User in der Datenbank vorhanden ist, vom System ein Vorschlag unterbreitet. Der Vorschlag basiert auf dem Vornamen des Users und wird durch folgende Logik ermittelt:
|
||||||
* es wird mit dem Vorname des Users eine Datenbankabfrage durchgeführt, die zählt, wieviele User-Aliase es schon mit diesem Vornamen gibt und falls notwendig direkt mit einer nachfolgenden Nummer als Postfix versehen sind.
|
* es wird mit dem Vorname des Users eine Datenbankabfrage durchgeführt, die zählt, wieviele User-Aliase es schon mit diesem Vornamen gibt und falls notwendig direkt mit einer nachfolgenden Nummer als Postfix versehen.
|
||||||
* Aufgrund der Konvention, dass ein Alias mindestens 5 Zeichen lang sein muss, sind ggf. führende Nullen mitzuberücksichten.
|
* Aufgrund der Konvention für eine Alias-Definition könnte ein Vorname ggf. gegen die Alias-Regeln verstossen oder aber auch evtl. zu kurz oder lang sein. Auch ein mögliches Blockieren durch die Blacklist könnte den Vornamen des Users als alias verhindern. Dann muss der User selbst manuell seinen alias vollständig erfassen ohne, dass das System einen Vorschlag unterbreiten könnte.
|
||||||
* **Beispiel-1**: *Max* als Vorname
|
|
||||||
* in der Datenbank gibt es schon mehrer User mit den Aliasen: *Maximilian*, *Max01*, *Max_M*, *Max-M*, *MaxMu* und *Max02*.
|
|
||||||
* Dann schlägt das System den Alias *Max03* vor, da *Max* nur 3 Zeichen lang ist und es schon zwei Aliase *Max* gefolgt mit einer Nummer gibt (*Max01* und *Max02*)
|
|
||||||
* Die Aliase *Maximilian*, *Max_M*, *Max-M* und *MaxMu* werden nicht mitgezählt, das diese nach *Max* keine direkt folgende Ziffern haben
|
|
||||||
* **Beispiel-2**: *August* als Vorname
|
|
||||||
* in der Datenbank gibt es schon mehrer User mit den Aliasen: *Augusta*, *Augustus*, *Augustinus*
|
|
||||||
* Dann schlägt das System den Alias *August* vor, da *August* schon 6 Zeichen lang ist und es noch keinen anderen User mit Alias *August* gibt
|
|
||||||
* die Aliase *Augusta*, *Augustus* und *Augustinus* werden nicht mit gezählt, da diese länger als 5 Zeichen sind und sich von *August* unterscheiden
|
|
||||||
* **Beispiel-3**: *Nick* als Vorname
|
|
||||||
* in der Datenbank gibt es schon mehrer User mit den Aliasen: *Nicko*, *Nickodemus*
|
|
||||||
* Dann schlägt das System den Alias *Nick1* vor, da *Nick* kürzer als 5 Zeichen ist und es noch keinen anderen User mit dem Alias *Nick1* gibt
|
|
||||||
* die Aliase *Nicko* und *Nickodemus* werden nicht mit gezählt, da diese länger als 5 Zeichen sind und sich von *Nick* unterscheiden
|
|
||||||
* wenn schon ein Alias für den User in der Datenbank vorhanden ist, dann wird dieser unverändert aus der Datenbank und ohne Systemvorschlag einfach angezeigt.
|
* wenn schon ein Alias für den User in der Datenbank vorhanden ist, dann wird dieser unverändert aus der Datenbank und ohne Systemvorschlag einfach angezeigt.
|
||||||
|
|
||||||
Der User kann nun den im Eingabefeld angezeigten Alias verändern, wobei die Alias-Konventionen, wie oben im ersten Kapitel beschrieben einzuhalten und zu validieren sind.
|
Der User kann nun den im Eingabefeld angezeigten Alias verändern, wobei die Alias-Konventionen, wie oben im ersten Kapitel beschrieben einzuhalten und zu validieren sind.
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
</b-col>
|
</b-col>
|
||||||
<b-col offset="1" offset-md="0" offset-lg="0">
|
<b-col offset="1" offset-md="0" offset-lg="0">
|
||||||
<div>
|
<div>
|
||||||
{{ previousBookedBalance | GDD }}
|
{{ previousBalance | GDD }}
|
||||||
{{ decay === '0' ? $t('math.minus') : '' }}
|
{{ decay === '0' ? $t('math.minus') : '' }}
|
||||||
{{ decay | GDD }} {{ $t('math.equal') }}
|
{{ decay | GDD }} {{ $t('math.equal') }}
|
||||||
<b>{{ balance | GDD }}</b>
|
<b>{{ balance | GDD }}</b>
|
||||||
@ -35,7 +35,7 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
previousBookedBalance: {
|
previousBalance: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
<b-col cols="12" lg="4" md="4">
|
<b-col cols="12" lg="4" md="4">
|
||||||
<div>{{ $t('decay.last_transaction') }}</div>
|
<div>{{ $t('decay.last_transaction') }}</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col offset="1" offset-md="0" offset-lg="0">
|
<b-col offset="1" offset-md="0" offset-lg="0" class="text-right mr-5">
|
||||||
<div>
|
<div>
|
||||||
<span>
|
<span>
|
||||||
{{ $d(new Date(decay.start), 'long') }}
|
{{ $d(new Date(decay.start), 'long') }}
|
||||||
@ -24,30 +24,44 @@
|
|||||||
</b-row>
|
</b-row>
|
||||||
<duration-row :decayStart="decay.start" :decayEnd="decay.end" />
|
<duration-row :decayStart="decay.start" :decayEnd="decay.end" />
|
||||||
|
|
||||||
|
<!-- Previous Balance -->
|
||||||
|
<b-row class="mt-2">
|
||||||
|
<b-col cols="12" lg="6" md="3">
|
||||||
|
<div>{{ $t('decay.old_balance') }}</div>
|
||||||
|
</b-col>
|
||||||
|
<b-col offset="1" offset-md="0" offset-lg="0" class="text-right mr-5">
|
||||||
|
{{ previousBalance | GDD }}
|
||||||
|
</b-col>
|
||||||
|
</b-row>
|
||||||
|
|
||||||
<!-- Decay-->
|
<!-- Decay-->
|
||||||
<b-row>
|
<b-row class="mt-0">
|
||||||
<b-col cols="12" lg="4" md="4">
|
<b-col cols="12" lg="3" md="3">
|
||||||
<div>{{ $t('decay.decay') }}</div>
|
<div>{{ $t('decay.decay') }}</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col offset="1" offset-md="0" offset-lg="0">{{ decay.decay | GDD }}</b-col>
|
<b-col offset="1" offset-md="0" offset-lg="0" class="text-right mr-5">
|
||||||
|
{{ decay.decay | GDD }}
|
||||||
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<!-- Type-->
|
<!-- Type-->
|
||||||
<b-row>
|
<b-row>
|
||||||
<b-col>
|
<b-col>
|
||||||
<b-row>
|
<b-row class="mb-2">
|
||||||
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
<!-- eslint-disable-next-line @intlify/vue-i18n/no-dynamic-keys-->
|
||||||
<b-col cols="12" lg="4" md="4">{{ $t(`decay.types.${typeId.toLowerCase()}`) }}</b-col>
|
<b-col cols="12" lg="3" md="3">{{ $t(`decay.types.${typeId.toLowerCase()}`) }}</b-col>
|
||||||
<b-col offset="1" offset-md="0" offset-lg="0">{{ amount | GDD }}</b-col>
|
<b-col offset="1" offset-md="0" offset-lg="0" class="text-right mr-5">
|
||||||
|
{{ amount | GDD }}
|
||||||
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<!-- Total-->
|
<!-- Total-->
|
||||||
<b-row>
|
<b-row class="border-top pt-2">
|
||||||
<b-col cols="12" lg="4" md="4">
|
<b-col cols="12" lg="3" md="3">
|
||||||
<div>{{ $t('decay.total') }}</div>
|
<div>{{ $t('decay.new_balance') }}</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col offset="1" offset-md="0" offset-lg="0">
|
<b-col offset="1" offset-md="0" offset-lg="0" class="text-right mr-5">
|
||||||
<b>{{ (Number(amount) + Number(decay.decay)) | GDD }}</b>
|
<b>{{ balance | GDD }}</b>
|
||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
</b-col>
|
</b-col>
|
||||||
@ -63,6 +77,8 @@ export default {
|
|||||||
DurationRow,
|
DurationRow,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
|
balance: { type: String, default: '0' },
|
||||||
|
previousBalance: { type: String, default: '0' },
|
||||||
amount: { type: String, default: '0' },
|
amount: { type: String, default: '0' },
|
||||||
typeId: { type: String, default: '' },
|
typeId: { type: String, default: '' },
|
||||||
memo: { type: String, default: '' },
|
memo: { type: String, default: '' },
|
||||||
|
|||||||
@ -7,7 +7,15 @@
|
|||||||
:decay="decay"
|
:decay="decay"
|
||||||
:typeId="typeId"
|
:typeId="typeId"
|
||||||
/>
|
/>
|
||||||
<decay-information-long v-else :amount="amount" :decay="decay" :typeId="typeId" :memo="memo" />
|
<decay-information-long
|
||||||
|
v-else
|
||||||
|
:amount="amount"
|
||||||
|
:decay="decay"
|
||||||
|
:typeId="typeId"
|
||||||
|
:memo="memo"
|
||||||
|
:balance="balance"
|
||||||
|
:previousBalance="previousBalance"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
@ -39,6 +47,14 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
balance: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
previousBalance: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isStartBlock() {
|
isStartBlock() {
|
||||||
|
|||||||
@ -5,9 +5,7 @@
|
|||||||
<b-row class="mt-5">
|
<b-row class="mt-5">
|
||||||
<b-col cols="2"></b-col>
|
<b-col cols="2"></b-col>
|
||||||
<b-col>
|
<b-col>
|
||||||
<div class="h4">
|
<div class="h4">{{ userName ? userName : identifier }}</div>
|
||||||
{{ email }}
|
|
||||||
</div>
|
|
||||||
<div class="mt-3 h5">{{ $t('form.memo') }}</div>
|
<div class="mt-3 h5">{{ $t('form.memo') }}</div>
|
||||||
<div>{{ memo }}</div>
|
<div>{{ memo }}</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
@ -64,9 +62,10 @@ export default {
|
|||||||
name: 'TransactionConfirmationSend',
|
name: 'TransactionConfirmationSend',
|
||||||
props: {
|
props: {
|
||||||
balance: { type: Number, required: true },
|
balance: { type: Number, required: true },
|
||||||
email: { type: String, required: false, default: '' },
|
identifier: { type: String, required: false, default: '' },
|
||||||
amount: { type: Number, required: true },
|
amount: { type: Number, required: true },
|
||||||
memo: { type: String, required: true },
|
memo: { type: String, required: true },
|
||||||
|
userName: { type: String, default: '' },
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -2,9 +2,17 @@ import { mount } from '@vue/test-utils'
|
|||||||
import TransactionForm from './TransactionForm'
|
import TransactionForm from './TransactionForm'
|
||||||
import flushPromises from 'flush-promises'
|
import flushPromises from 'flush-promises'
|
||||||
import { SEND_TYPES } from '@/pages/Send'
|
import { SEND_TYPES } from '@/pages/Send'
|
||||||
import DashboardLayout from '@/layouts/DashboardLayout'
|
import { createMockClient } from 'mock-apollo-client'
|
||||||
|
import VueApollo from 'vue-apollo'
|
||||||
|
import { user as userQuery } from '@/graphql/queries'
|
||||||
|
|
||||||
|
const mockClient = createMockClient()
|
||||||
|
const apolloProvider = new VueApollo({
|
||||||
|
defaultClient: mockClient,
|
||||||
|
})
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
localVue.use(VueApollo)
|
||||||
|
|
||||||
describe('TransactionForm', () => {
|
describe('TransactionForm', () => {
|
||||||
let wrapper
|
let wrapper
|
||||||
@ -22,6 +30,7 @@ describe('TransactionForm', () => {
|
|||||||
},
|
},
|
||||||
$route: {
|
$route: {
|
||||||
params: {},
|
params: {},
|
||||||
|
query: {},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,10 +43,24 @@ describe('TransactionForm', () => {
|
|||||||
localVue,
|
localVue,
|
||||||
mocks,
|
mocks,
|
||||||
propsData,
|
propsData,
|
||||||
provide: DashboardLayout.provide,
|
apolloProvider,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const userQueryMock = jest.fn()
|
||||||
|
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
userQuery,
|
||||||
|
userQueryMock.mockRejectedValueOnce({ message: 'Query user name fails!' }).mockResolvedValue({
|
||||||
|
data: {
|
||||||
|
user: {
|
||||||
|
firstName: 'Bibi',
|
||||||
|
lastName: 'Bloxberg',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
describe('mount', () => {
|
describe('mount', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
wrapper = Wrapper()
|
wrapper = Wrapper()
|
||||||
@ -139,7 +162,7 @@ describe('TransactionForm', () => {
|
|||||||
.setValue(' valid@email.com ')
|
.setValue(' valid@email.com ')
|
||||||
await wrapper.find('div[data-test="input-email"]').find('input').trigger('blur')
|
await wrapper.find('div[data-test="input-email"]').find('input').trigger('blur')
|
||||||
await flushPromises()
|
await flushPromises()
|
||||||
expect(wrapper.vm.form.email).toBe('valid@email.com')
|
expect(wrapper.vm.form.identifier).toBe('valid@email.com')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -290,12 +313,12 @@ Die ganze Welt bezwingen.“`)
|
|||||||
.find('textarea')
|
.find('textarea')
|
||||||
.setValue('Long enough')
|
.setValue('Long enough')
|
||||||
await flushPromises()
|
await flushPromises()
|
||||||
expect(wrapper.vm.form.email).toBe('someone@watches.tv')
|
expect(wrapper.vm.form.identifier).toBe('someone@watches.tv')
|
||||||
expect(wrapper.vm.form.amount).toBe('87.23')
|
expect(wrapper.vm.form.amount).toBe('87.23')
|
||||||
expect(wrapper.vm.form.memo).toBe('Long enough')
|
expect(wrapper.vm.form.memo).toBe('Long enough')
|
||||||
await wrapper.find('button[type="reset"]').trigger('click')
|
await wrapper.find('button[type="reset"]').trigger('click')
|
||||||
await flushPromises()
|
await flushPromises()
|
||||||
expect(wrapper.vm.form.email).toBe('')
|
expect(wrapper.vm.form.identifier).toBe('')
|
||||||
expect(wrapper.vm.form.amount).toBe('')
|
expect(wrapper.vm.form.amount).toBe('')
|
||||||
expect(wrapper.vm.form.memo).toBe('')
|
expect(wrapper.vm.form.memo).toBe('')
|
||||||
})
|
})
|
||||||
@ -321,10 +344,11 @@ Die ganze Welt bezwingen.“`)
|
|||||||
expect(wrapper.emitted('set-transaction')).toEqual([
|
expect(wrapper.emitted('set-transaction')).toEqual([
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
email: 'someone@watches.tv',
|
identifier: 'someone@watches.tv',
|
||||||
amount: 87.23,
|
amount: 87.23,
|
||||||
memo: 'Long enough',
|
memo: 'Long enough',
|
||||||
selected: 'send',
|
selected: 'send',
|
||||||
|
userName: '',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
])
|
])
|
||||||
@ -346,5 +370,26 @@ Die ganze Welt bezwingen.“`)
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('with gradido ID', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
mocks.$route.query.gradidoID = 'gradido-ID'
|
||||||
|
wrapper = Wrapper()
|
||||||
|
await wrapper.vm.$nextTick()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('query for username with success', () => {
|
||||||
|
it('has no email input field', () => {
|
||||||
|
expect(wrapper.find('div[data-test="input-email"]').exists()).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('queries the username', () => {
|
||||||
|
expect(userQueryMock).toBeCalledWith({
|
||||||
|
identifier: 'gradido-ID',
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -50,16 +50,24 @@
|
|||||||
<b-col>
|
<b-col>
|
||||||
<b-row>
|
<b-row>
|
||||||
<b-col cols="12">
|
<b-col cols="12">
|
||||||
<div v-if="radioSelected === sendTypes.send">
|
<div v-if="radioSelected === sendTypes.send && !gradidoID">
|
||||||
<input-email
|
<input-email
|
||||||
:name="$t('form.recipient')"
|
:name="$t('form.recipient')"
|
||||||
:label="$t('form.recipient')"
|
:label="$t('form.recipient')"
|
||||||
:placeholder="$t('form.email')"
|
:placeholder="$t('form.email')"
|
||||||
v-model="form.email"
|
v-model="form.identifier"
|
||||||
:disabled="isBalanceDisabled"
|
:disabled="isBalanceDisabled"
|
||||||
@onValidation="onValidation"
|
@onValidation="onValidation"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="gradidoID" class="mb-4">
|
||||||
|
<b-row>
|
||||||
|
<b-col>{{ $t('form.recipient') }}</b-col>
|
||||||
|
</b-row>
|
||||||
|
<b-row>
|
||||||
|
<b-col class="font-weight-bold">{{ userName }}</b-col>
|
||||||
|
</b-row>
|
||||||
|
</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col cols="12" lg="6">
|
<b-col cols="12" lg="6">
|
||||||
<input-amount
|
<input-amount
|
||||||
@ -121,6 +129,7 @@ import { SEND_TYPES } from '@/pages/Send'
|
|||||||
import InputEmail from '@/components/Inputs/InputEmail'
|
import InputEmail from '@/components/Inputs/InputEmail'
|
||||||
import InputAmount from '@/components/Inputs/InputAmount'
|
import InputAmount from '@/components/Inputs/InputAmount'
|
||||||
import InputTextarea from '@/components/Inputs/InputTextarea'
|
import InputTextarea from '@/components/Inputs/InputTextarea'
|
||||||
|
import { user as userQuery } from '@/graphql/queries'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TransactionForm',
|
name: 'TransactionForm',
|
||||||
@ -131,20 +140,20 @@ export default {
|
|||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
balance: { type: Number, default: 0 },
|
balance: { type: Number, default: 0 },
|
||||||
email: { type: String, default: '' },
|
identifier: { type: String, default: '' },
|
||||||
amount: { type: Number, default: 0 },
|
amount: { type: Number, default: 0 },
|
||||||
memo: { type: String, default: '' },
|
memo: { type: String, default: '' },
|
||||||
selected: { type: String, default: 'send' },
|
selected: { type: String, default: 'send' },
|
||||||
},
|
},
|
||||||
inject: ['getTunneledEmail'],
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
form: {
|
form: {
|
||||||
email: this.email,
|
identifier: this.identifier,
|
||||||
amount: this.amount ? String(this.amount) : '',
|
amount: this.amount ? String(this.amount) : '',
|
||||||
memo: this.memo,
|
memo: this.memo,
|
||||||
},
|
},
|
||||||
radioSelected: this.selected,
|
radioSelected: this.selected,
|
||||||
|
userName: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -152,33 +161,48 @@ export default {
|
|||||||
this.$refs.formValidator.validate()
|
this.$refs.formValidator.validate()
|
||||||
},
|
},
|
||||||
onSubmit() {
|
onSubmit() {
|
||||||
|
if (this.gradidoID) this.form.identifier = this.gradidoID
|
||||||
this.$emit('set-transaction', {
|
this.$emit('set-transaction', {
|
||||||
selected: this.radioSelected,
|
selected: this.radioSelected,
|
||||||
email: this.form.email,
|
identifier: this.form.identifier,
|
||||||
amount: Number(this.form.amount.replace(',', '.')),
|
amount: Number(this.form.amount.replace(',', '.')),
|
||||||
memo: this.form.memo,
|
memo: this.form.memo,
|
||||||
|
userName: this.userName,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
onReset(event) {
|
onReset(event) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
this.form.email = ''
|
this.form.identifier = ''
|
||||||
this.form.amount = ''
|
this.form.amount = ''
|
||||||
this.form.memo = ''
|
this.form.memo = ''
|
||||||
this.$refs.formValidator.validate()
|
this.$refs.formValidator.validate()
|
||||||
},
|
if (this.$route.query && !this.$route.query === {}) this.$router.replace({ query: undefined })
|
||||||
setNewRecipientEmail() {
|
|
||||||
this.form.email = this.recipientEmail ? this.recipientEmail : this.form.email
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
apollo: {
|
||||||
recipientEmail() {
|
UserName: {
|
||||||
this.setNewRecipientEmail()
|
query() {
|
||||||
|
return userQuery
|
||||||
|
},
|
||||||
|
fetchPolicy: 'network-only',
|
||||||
|
variables() {
|
||||||
|
return { identifier: this.gradidoID }
|
||||||
|
},
|
||||||
|
skip() {
|
||||||
|
return !this.gradidoID
|
||||||
|
},
|
||||||
|
update({ user }) {
|
||||||
|
this.userName = `${user.firstName} ${user.lastName}`
|
||||||
|
},
|
||||||
|
error({ message }) {
|
||||||
|
this.toastError(message)
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
disabled() {
|
disabled() {
|
||||||
if (
|
if (
|
||||||
this.form.email.length > 5 &&
|
this.form.identifier.length > 5 &&
|
||||||
parseInt(this.form.amount) <= parseInt(this.balance) &&
|
parseInt(this.form.amount) <= parseInt(this.balance) &&
|
||||||
this.form.memo.length > 5 &&
|
this.form.memo.length > 5 &&
|
||||||
this.form.memo.length <= 255
|
this.form.memo.length <= 255
|
||||||
@ -193,15 +217,12 @@ export default {
|
|||||||
sendTypes() {
|
sendTypes() {
|
||||||
return SEND_TYPES
|
return SEND_TYPES
|
||||||
},
|
},
|
||||||
recipientEmail() {
|
gradidoID() {
|
||||||
return this.getTunneledEmail()
|
return this.$route.query && this.$route.query.gradidoID
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
created() {
|
|
||||||
this.setNewRecipientEmail()
|
|
||||||
},
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.form.email !== '') this.$refs.formValidator.validate()
|
if (this.form.identifier !== '') this.$refs.formValidator.validate()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -93,8 +93,9 @@ describe('GddTransactionList', () => {
|
|||||||
{
|
{
|
||||||
id: -1,
|
id: -1,
|
||||||
typeId: 'DECAY',
|
typeId: 'DECAY',
|
||||||
amount: '-0.16778637075575395772595',
|
amount: '-0.16',
|
||||||
balance: '31.59320453982945549519405',
|
balance: '31.59',
|
||||||
|
previousBalance: '31.75',
|
||||||
balanceDate: '2022-03-03T08:54:54',
|
balanceDate: '2022-03-03T08:54:54',
|
||||||
memo: '',
|
memo: '',
|
||||||
linkedUser: null,
|
linkedUser: null,
|
||||||
@ -110,6 +111,7 @@ describe('GddTransactionList', () => {
|
|||||||
typeId: 'SEND',
|
typeId: 'SEND',
|
||||||
amount: '1',
|
amount: '1',
|
||||||
balance: '31.76099091058520945292',
|
balance: '31.76099091058520945292',
|
||||||
|
previousBalance: '30.76',
|
||||||
balanceDate: '2022-02-28T13:55:47',
|
balanceDate: '2022-02-28T13:55:47',
|
||||||
memo:
|
memo:
|
||||||
'Um den Kessel schlingt den Reihn, Werft die Eingeweid‘ hinein. Kröte du, die Nacht und Tag Unterm kalten Steine lag,',
|
'Um den Kessel schlingt den Reihn, Werft die Eingeweid‘ hinein. Kröte du, die Nacht und Tag Unterm kalten Steine lag,',
|
||||||
@ -129,6 +131,7 @@ describe('GddTransactionList', () => {
|
|||||||
typeId: 'RECEIVE',
|
typeId: 'RECEIVE',
|
||||||
amount: '10',
|
amount: '10',
|
||||||
balance: '10',
|
balance: '10',
|
||||||
|
previousBalance: '31.75',
|
||||||
balanceDate: '2022-02-23T10:55:30',
|
balanceDate: '2022-02-23T10:55:30',
|
||||||
memo:
|
memo:
|
||||||
'Monatlanges Gift sog ein, In den Topf zuerst hinein… (William Shakespeare, Die Hexen aus Macbeth)',
|
'Monatlanges Gift sog ein, In den Topf zuerst hinein… (William Shakespeare, Die Hexen aus Macbeth)',
|
||||||
@ -148,6 +151,7 @@ describe('GddTransactionList', () => {
|
|||||||
typeId: 'CREATION',
|
typeId: 'CREATION',
|
||||||
amount: '1000',
|
amount: '1000',
|
||||||
balance: '32.96482231613347376132',
|
balance: '32.96482231613347376132',
|
||||||
|
previousBalance: '31.75',
|
||||||
balanceDate: '2022-02-25T07:29:26',
|
balanceDate: '2022-02-25T07:29:26',
|
||||||
memo: 'Jammern hilft nichts, sondern ich kann selber meinen Teil dazu beitragen.',
|
memo: 'Jammern hilft nichts, sondern ich kann selber meinen Teil dazu beitragen.',
|
||||||
linkedUser: {
|
linkedUser: {
|
||||||
@ -414,6 +418,7 @@ describe('GddTransactionList', () => {
|
|||||||
return {
|
return {
|
||||||
amount: '3.14',
|
amount: '3.14',
|
||||||
balanceDate: '2021-04-29T17:26:40+00:00',
|
balanceDate: '2021-04-29T17:26:40+00:00',
|
||||||
|
previousBalance: '31.75',
|
||||||
decay: {
|
decay: {
|
||||||
decay: '-477.01',
|
decay: '-477.01',
|
||||||
start: '2021-05-13T17:46:31.000Z',
|
start: '2021-05-13T17:46:31.000Z',
|
||||||
|
|||||||
@ -19,10 +19,7 @@
|
|||||||
class="pointer bg-white appBoxShadow gradido-border-radius px-4 pt-2 test-list-group-item"
|
class="pointer bg-white appBoxShadow gradido-border-radius px-4 pt-2 test-list-group-item"
|
||||||
>
|
>
|
||||||
<template #DECAY>
|
<template #DECAY>
|
||||||
<transaction-decay
|
<transaction-decay v-bind="transactions[index]" />
|
||||||
v-bind="transactions[index]"
|
|
||||||
:previousBookedBalance="previousBookedBalance(index)"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
</transaction-list-item>
|
</transaction-list-item>
|
||||||
</div>
|
</div>
|
||||||
@ -34,27 +31,15 @@
|
|||||||
class="pointer mb-3 bg-white appBoxShadow gradido-border-radius p-3 test-list-group-item"
|
class="pointer mb-3 bg-white appBoxShadow gradido-border-radius p-3 test-list-group-item"
|
||||||
>
|
>
|
||||||
<template #SEND>
|
<template #SEND>
|
||||||
<transaction-send
|
<transaction-send v-bind="transactions[index]" />
|
||||||
v-bind="transactions[index]"
|
|
||||||
:previousBookedBalance="previousBookedBalance(index)"
|
|
||||||
v-on="$listeners"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #RECEIVE>
|
<template #RECEIVE>
|
||||||
<transaction-receive
|
<transaction-receive v-bind="transactions[index]" />
|
||||||
v-bind="transactions[index]"
|
|
||||||
:previousBookedBalance="previousBookedBalance(index)"
|
|
||||||
v-on="$listeners"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #CREATION>
|
<template #CREATION>
|
||||||
<transaction-creation
|
<transaction-creation v-bind="transactions[index]" />
|
||||||
v-bind="transactions[index]"
|
|
||||||
:previousBookedBalance="previousBookedBalance(index)"
|
|
||||||
v-on="$listeners"
|
|
||||||
/>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #LINK_SUMMARY>
|
<template #LINK_SUMMARY>
|
||||||
@ -127,10 +112,6 @@ export default {
|
|||||||
})
|
})
|
||||||
window.scrollTo(0, 0)
|
window.scrollTo(0, 0)
|
||||||
},
|
},
|
||||||
previousBookedBalance(idx) {
|
|
||||||
if (this.transactions[idx + 1]) return this.transactions[idx + 1].balance
|
|
||||||
return '0'
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isPaginationVisible() {
|
isPaginationVisible() {
|
||||||
|
|||||||
@ -32,11 +32,7 @@
|
|||||||
<b-row>
|
<b-row>
|
||||||
<b-col>
|
<b-col>
|
||||||
<div class="font-weight-bold">
|
<div class="font-weight-bold">
|
||||||
<name
|
<name :linkedUser="transaction.linkedUser" fontColor="text-dark" />
|
||||||
:linkedUser="transaction.linkedUser"
|
|
||||||
v-on="$listeners"
|
|
||||||
fontColor="text-dark"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex mt-3">
|
<div class="d-flex mt-3">
|
||||||
<div class="small">
|
<div class="small">
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<b-col cols="12" lg="4" md="4">
|
<b-col cols="12" lg="4" md="4">
|
||||||
<div>{{ $t('decay.past_time') }}</div>
|
<div>{{ $t('decay.past_time') }}</div>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col offset="1" offset-md="0" offset-lg="0">
|
<b-col offset="1" offset-md="0" offset-lg="0" class="text-right mr-5">
|
||||||
<span v-if="duration">{{ durationText }}</span>
|
<span v-if="duration">{{ durationText }}</span>
|
||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
|
|||||||
@ -3,9 +3,11 @@ import Name from './Name'
|
|||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
|
||||||
|
const routerPushMock = jest.fn()
|
||||||
|
|
||||||
const mocks = {
|
const mocks = {
|
||||||
$router: {
|
$router: {
|
||||||
push: jest.fn(),
|
push: routerPushMock,
|
||||||
history: {
|
history: {
|
||||||
current: {
|
current: {
|
||||||
fullPath: '/transactions',
|
fullPath: '/transactions',
|
||||||
@ -47,7 +49,7 @@ describe('Name', () => {
|
|||||||
describe('with linked user', () => {
|
describe('with linked user', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await wrapper.setProps({
|
await wrapper.setProps({
|
||||||
linkedUser: { firstName: 'Bibi', lastName: 'Bloxberg', email: 'bibi@bloxberg.de' },
|
linkedUser: { firstName: 'Bibi', lastName: 'Bloxberg', gradidoID: 'gradido-ID' },
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -64,15 +66,19 @@ describe('Name', () => {
|
|||||||
await wrapper.find('div.gdd-transaction-list-item-name').find('a').trigger('click')
|
await wrapper.find('div.gdd-transaction-list-item-name').find('a').trigger('click')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('emits set tunneled email', () => {
|
it('pushes router to send', () => {
|
||||||
expect(wrapper.emitted('set-tunneled-email')).toEqual([['bibi@bloxberg.de']])
|
expect(routerPushMock).toBeCalledWith({
|
||||||
})
|
|
||||||
|
|
||||||
it('pushes the route with query for email', () => {
|
|
||||||
expect(mocks.$router.push).toBeCalledWith({
|
|
||||||
path: '/send',
|
path: '/send',
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('pushes query for gradidoID', () => {
|
||||||
|
expect(routerPushMock).toBeCalledWith({
|
||||||
|
query: {
|
||||||
|
gradidoID: 'gradido-ID',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="name">
|
<div class="name">
|
||||||
<div class="gdd-transaction-list-item-name">
|
<div class="gdd-transaction-list-item-name">
|
||||||
<div v-if="linkedUser && linkedUser.email">
|
<div v-if="linkedUser && linkedUser.gradidoID">
|
||||||
<b-link @click.stop="tunnelEmail" :class="fontColor">
|
<b-link @click.stop="tunnelEmail" :class="fontColor">
|
||||||
{{ itemText }}
|
{{ itemText }}
|
||||||
</b-link>
|
</b-link>
|
||||||
@ -35,8 +35,8 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
tunnelEmail() {
|
tunnelEmail() {
|
||||||
this.$emit('set-tunneled-email', this.linkedUser.email)
|
|
||||||
if (this.$router.history.current.fullPath !== '/send') this.$router.push({ path: '/send' })
|
if (this.$router.history.current.fullPath !== '/send') this.$router.push({ path: '/send' })
|
||||||
|
this.$router.push({ query: { gradidoID: this.linkedUser.gradidoID } })
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|||||||
@ -13,7 +13,8 @@ const mocks = {
|
|||||||
|
|
||||||
const propsData = {
|
const propsData = {
|
||||||
amount: '12.45',
|
amount: '12.45',
|
||||||
balance: '31.76099091058521',
|
balance: '31.76',
|
||||||
|
previousBalance: '19.31',
|
||||||
balanceDate: '2022-02-28T13:55:47.000Z',
|
balanceDate: '2022-02-28T13:55:47.000Z',
|
||||||
decay: {
|
decay: {
|
||||||
decay: '-0.2038314055482643084',
|
decay: '-0.2038314055482643084',
|
||||||
|
|||||||
@ -18,7 +18,14 @@
|
|||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<b-collapse class="pb-4 pt-lg-3" v-model="visible">
|
<b-collapse class="pb-4 pt-lg-3" v-model="visible">
|
||||||
<decay-information :typeId="typeId" :decay="decay" :amount="amount" :memo="memo" />
|
<decay-information
|
||||||
|
:typeId="typeId"
|
||||||
|
:decay="decay"
|
||||||
|
:amount="amount"
|
||||||
|
:memo="memo"
|
||||||
|
:balance="balance"
|
||||||
|
:previousBalance="previousBalance"
|
||||||
|
/>
|
||||||
</b-collapse>
|
</b-collapse>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -61,7 +68,11 @@ export default {
|
|||||||
type: Number,
|
type: Number,
|
||||||
required: false,
|
required: false,
|
||||||
},
|
},
|
||||||
previousBookedBalance: {
|
balance: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
previousBalance: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
<decay-information-decay
|
<decay-information-decay
|
||||||
:balance="balance"
|
:balance="balance"
|
||||||
:decay="decay.decay"
|
:decay="decay.decay"
|
||||||
:previousBookedBalance="previousBookedBalance"
|
:previousBalance="previousBalance"
|
||||||
/>
|
/>
|
||||||
</b-collapse>
|
</b-collapse>
|
||||||
</div>
|
</div>
|
||||||
@ -44,9 +44,10 @@ export default {
|
|||||||
type: Object,
|
type: Object,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
previousBookedBalance: {
|
},
|
||||||
type: String,
|
computed: {
|
||||||
required: true,
|
previousBalance() {
|
||||||
|
return String(Number(this.balance) - Number(this.decay.decay))
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|||||||
@ -13,7 +13,8 @@ const mocks = {
|
|||||||
|
|
||||||
const propsData = {
|
const propsData = {
|
||||||
amount: '12.45',
|
amount: '12.45',
|
||||||
balance: '31.76099091058521',
|
balance: '31.76',
|
||||||
|
previousBalance: '19.31',
|
||||||
balanceDate: '2022-02-28T13:55:47.000Z',
|
balanceDate: '2022-02-28T13:55:47.000Z',
|
||||||
decay: {
|
decay: {
|
||||||
decay: '-0.2038314055482643084',
|
decay: '-0.2038314055482643084',
|
||||||
|
|||||||
@ -14,7 +14,6 @@
|
|||||||
<div>
|
<div>
|
||||||
<name
|
<name
|
||||||
class="font-weight-bold"
|
class="font-weight-bold"
|
||||||
v-on="$listeners"
|
|
||||||
:amount="amount"
|
:amount="amount"
|
||||||
:linkedUser="linkedUser"
|
:linkedUser="linkedUser"
|
||||||
:linkId="linkId"
|
:linkId="linkId"
|
||||||
@ -43,7 +42,14 @@
|
|||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<b-collapse class="pb-4 pt-lg-3" v-model="visible">
|
<b-collapse class="pb-4 pt-lg-3" v-model="visible">
|
||||||
<decay-information :typeId="typeId" :decay="decay" :amount="amount" :memo="memo" />
|
<decay-information
|
||||||
|
:typeId="typeId"
|
||||||
|
:decay="decay"
|
||||||
|
:amount="amount"
|
||||||
|
:memo="memo"
|
||||||
|
:balance="balance"
|
||||||
|
:previousBalance="previousBalance"
|
||||||
|
/>
|
||||||
</b-collapse>
|
</b-collapse>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -85,7 +91,11 @@ export default {
|
|||||||
typeId: {
|
typeId: {
|
||||||
type: String,
|
type: String,
|
||||||
},
|
},
|
||||||
previousBookedBalance: {
|
balance: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
previousBalance: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -13,7 +13,8 @@ const mocks = {
|
|||||||
|
|
||||||
const propsData = {
|
const propsData = {
|
||||||
amount: '12.45',
|
amount: '12.45',
|
||||||
balance: '31.76099091058521',
|
balance: '31.76',
|
||||||
|
previousBalance: '19.31',
|
||||||
balanceDate: '2022-02-28T13:55:47.000Z',
|
balanceDate: '2022-02-28T13:55:47.000Z',
|
||||||
decay: {
|
decay: {
|
||||||
decay: '-0.2038314055482643084',
|
decay: '-0.2038314055482643084',
|
||||||
|
|||||||
@ -13,7 +13,6 @@
|
|||||||
<div>
|
<div>
|
||||||
<name
|
<name
|
||||||
class="font-weight-bold"
|
class="font-weight-bold"
|
||||||
v-on="$listeners"
|
|
||||||
:amount="amount"
|
:amount="amount"
|
||||||
:linkedUser="linkedUser"
|
:linkedUser="linkedUser"
|
||||||
:linkId="linkId"
|
:linkId="linkId"
|
||||||
@ -42,7 +41,14 @@
|
|||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<b-collapse class="pb-4 pt-lg-3" v-model="visible">
|
<b-collapse class="pb-4 pt-lg-3" v-model="visible">
|
||||||
<decay-information :typeId="typeId" :decay="decay" :amount="amount" :memo="memo" />
|
<decay-information
|
||||||
|
:typeId="typeId"
|
||||||
|
:decay="decay"
|
||||||
|
:amount="amount"
|
||||||
|
:memo="memo"
|
||||||
|
:balance="balance"
|
||||||
|
:previousBalance="previousBalance"
|
||||||
|
/>
|
||||||
</b-collapse>
|
</b-collapse>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -85,7 +91,11 @@ export default {
|
|||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
previousBookedBalance: {
|
balance: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
previousBalance: {
|
||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -69,8 +69,8 @@ export const createUser = gql`
|
|||||||
`
|
`
|
||||||
|
|
||||||
export const sendCoins = gql`
|
export const sendCoins = gql`
|
||||||
mutation($email: String!, $amount: Decimal!, $memo: String!) {
|
mutation($identifier: String!, $amount: Decimal!, $memo: String!) {
|
||||||
sendCoins(email: $email, amount: $amount, memo: $memo)
|
sendCoins(identifier: $identifier, amount: $amount, memo: $memo)
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
@ -144,6 +144,7 @@ export const createContributionMessage = gql`
|
|||||||
export const login = gql`
|
export const login = gql`
|
||||||
mutation($email: String!, $password: String!, $publisherId: Int) {
|
mutation($email: String!, $password: String!, $publisherId: Int) {
|
||||||
login(email: $email, password: $password, publisherId: $publisherId) {
|
login(email: $email, password: $password, publisherId: $publisherId) {
|
||||||
|
gradidoID
|
||||||
email
|
email
|
||||||
firstName
|
firstName
|
||||||
lastName
|
lastName
|
||||||
|
|||||||
@ -33,11 +33,13 @@ export const transactionsQuery = gql`
|
|||||||
typeId
|
typeId
|
||||||
amount
|
amount
|
||||||
balance
|
balance
|
||||||
|
previousBalance
|
||||||
balanceDate
|
balanceDate
|
||||||
memo
|
memo
|
||||||
linkedUser {
|
linkedUser {
|
||||||
firstName
|
firstName
|
||||||
lastName
|
lastName
|
||||||
|
gradidoID
|
||||||
email
|
email
|
||||||
}
|
}
|
||||||
decay {
|
decay {
|
||||||
@ -268,3 +270,12 @@ export const openCreations = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
export const user = gql`
|
||||||
|
query($identifier: String!) {
|
||||||
|
user(identifier: $identifier) {
|
||||||
|
firstName
|
||||||
|
lastName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|||||||
@ -174,15 +174,6 @@ describe('DashboardLayout', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('set tunneled email', () => {
|
|
||||||
it('updates tunneled email', async () => {
|
|
||||||
await wrapper
|
|
||||||
.findComponent({ ref: 'router-view' })
|
|
||||||
.vm.$emit('set-tunneled-email', 'bibi@bloxberg.de')
|
|
||||||
expect(wrapper.vm.tunneledEmail).toBe('bibi@bloxberg.de')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('has a component Navbar', () => {
|
it('has a component Navbar', () => {
|
||||||
expect(wrapper.findComponent({ name: 'Navbar' }).exists()).toBe(true)
|
expect(wrapper.findComponent({ name: 'Navbar' }).exists()).toBe(true)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -127,7 +127,6 @@
|
|||||||
:transactions="transactions"
|
:transactions="transactions"
|
||||||
:transactionCount="transactionCount"
|
:transactionCount="transactionCount"
|
||||||
:transactionLinkCount="transactionLinkCount"
|
:transactionLinkCount="transactionLinkCount"
|
||||||
@set-tunneled-email="setTunneledEmail"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #community>
|
<template #community>
|
||||||
@ -149,7 +148,6 @@
|
|||||||
:transactionLinkCount="transactionLinkCount"
|
:transactionLinkCount="transactionLinkCount"
|
||||||
:pending="pending"
|
:pending="pending"
|
||||||
@update-transactions="updateTransactions"
|
@update-transactions="updateTransactions"
|
||||||
@set-tunneled-email="setTunneledEmail"
|
|
||||||
></router-view>
|
></router-view>
|
||||||
</fade-transition>
|
</fade-transition>
|
||||||
</div>
|
</div>
|
||||||
@ -164,7 +162,6 @@
|
|||||||
:transactions="transactions"
|
:transactions="transactions"
|
||||||
:transactionCount="transactionCount"
|
:transactionCount="transactionCount"
|
||||||
:transactionLinkCount="transactionLinkCount"
|
:transactionLinkCount="transactionLinkCount"
|
||||||
@set-tunneled-email="setTunneledEmail"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #empty />
|
<template #empty />
|
||||||
@ -234,18 +231,12 @@ export default {
|
|||||||
transactionLinkCount: 0,
|
transactionLinkCount: 0,
|
||||||
pending: true,
|
pending: true,
|
||||||
visible: false,
|
visible: false,
|
||||||
tunneledEmail: null,
|
|
||||||
hamburger: true,
|
hamburger: true,
|
||||||
darkMode: false,
|
darkMode: false,
|
||||||
skeleton: true,
|
skeleton: true,
|
||||||
totalUsers: null,
|
totalUsers: null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
provide() {
|
|
||||||
return {
|
|
||||||
getTunneledEmail: () => this.tunneledEmail,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created() {
|
created() {
|
||||||
this.updateTransactions(0)
|
this.updateTransactions(0)
|
||||||
this.getCommunityStatistics()
|
this.getCommunityStatistics()
|
||||||
@ -319,9 +310,6 @@ export default {
|
|||||||
setVisible(bool) {
|
setVisible(bool) {
|
||||||
this.visible = bool
|
this.visible = bool
|
||||||
},
|
},
|
||||||
setTunneledEmail(email) {
|
|
||||||
this.tunneledEmail = email
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -89,6 +89,8 @@
|
|||||||
"decay_introduced": "Die Vergänglichkeit wurde eingeführt am:",
|
"decay_introduced": "Die Vergänglichkeit wurde eingeführt am:",
|
||||||
"decay_since_last_transaction": "Vergänglichkeit seit der letzten Transaktion",
|
"decay_since_last_transaction": "Vergänglichkeit seit der letzten Transaktion",
|
||||||
"last_transaction": "Letzte Transaktion",
|
"last_transaction": "Letzte Transaktion",
|
||||||
|
"new_balance": "Neuer Kontostand",
|
||||||
|
"old_balance": "Vorheriger Kontostand",
|
||||||
"past_time": "Vergangene Zeit",
|
"past_time": "Vergangene Zeit",
|
||||||
"Starting_block_decay": "Startblock Vergänglichkeit",
|
"Starting_block_decay": "Startblock Vergänglichkeit",
|
||||||
"total": "Gesamt",
|
"total": "Gesamt",
|
||||||
|
|||||||
@ -89,6 +89,8 @@
|
|||||||
"decay_introduced": "Decay was introduced on:",
|
"decay_introduced": "Decay was introduced on:",
|
||||||
"decay_since_last_transaction": "Decay since the last transaction",
|
"decay_since_last_transaction": "Decay since the last transaction",
|
||||||
"last_transaction": "Last transaction:",
|
"last_transaction": "Last transaction:",
|
||||||
|
"new_balance": "New balance",
|
||||||
|
"old_balance": "Previous balance",
|
||||||
"past_time": "Time passed",
|
"past_time": "Time passed",
|
||||||
"Starting_block_decay": "Starting Block Decay",
|
"Starting_block_decay": "Starting Block Decay",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
|
|||||||
@ -10,6 +10,7 @@ const apolloMutationMock = jest.fn()
|
|||||||
apolloMutationMock.mockResolvedValue('success')
|
apolloMutationMock.mockResolvedValue('success')
|
||||||
|
|
||||||
const navigatorClipboardMock = jest.fn()
|
const navigatorClipboardMock = jest.fn()
|
||||||
|
const routerPushMock = jest.fn()
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
|
||||||
@ -38,6 +39,9 @@ describe('Send', () => {
|
|||||||
$route: {
|
$route: {
|
||||||
query: {},
|
query: {},
|
||||||
},
|
},
|
||||||
|
$router: {
|
||||||
|
push: routerPushMock,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
const Wrapper = () => {
|
const Wrapper = () => {
|
||||||
@ -85,8 +89,8 @@ describe('Send', () => {
|
|||||||
it('shows the transaction formular again', () => {
|
it('shows the transaction formular again', () => {
|
||||||
expect(wrapper.findComponent({ name: 'TransactionForm' }).exists()).toBe(true)
|
expect(wrapper.findComponent({ name: 'TransactionForm' }).exists()).toBe(true)
|
||||||
})
|
})
|
||||||
// TODO:SKIPED at this point, a check must be made in the components ?
|
|
||||||
it.skip('restores the previous data in the formular', () => {
|
it('restores the previous data in the formular', () => {
|
||||||
expect(wrapper.find("input[type='email']").vm.$el.value).toBe('user@example.org')
|
expect(wrapper.find("input[type='email']").vm.$el.value).toBe('user@example.org')
|
||||||
expect(wrapper.find("input[type='text']").vm.$el.value).toBe('23.45')
|
expect(wrapper.find("input[type='text']").vm.$el.value).toBe('23.45')
|
||||||
expect(wrapper.find('textarea').vm.$el.value).toBe('Make the best of it!')
|
expect(wrapper.find('textarea').vm.$el.value).toBe('Make the best of it!')
|
||||||
@ -107,10 +111,11 @@ describe('Send', () => {
|
|||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
mutation: sendCoins,
|
mutation: sendCoins,
|
||||||
variables: {
|
variables: {
|
||||||
email: 'user@example.org',
|
identifier: 'user@example.org',
|
||||||
amount: 23.45,
|
amount: 23.45,
|
||||||
memo: 'Make the best of it!',
|
memo: 'Make the best of it!',
|
||||||
selected: SEND_TYPES.send,
|
selected: SEND_TYPES.send,
|
||||||
|
userName: '',
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
@ -162,6 +167,67 @@ describe('Send', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('with gradidoID query', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
mocks.$route.query.gradidoID = 'gradido-ID'
|
||||||
|
wrapper = Wrapper()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('has no email input field', () => {
|
||||||
|
expect(
|
||||||
|
wrapper.findComponent({ name: 'TransactionForm' }).find('input[type="email"]').exists(),
|
||||||
|
).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('submit form', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
const transactionForm = wrapper.findComponent({ name: 'TransactionForm' })
|
||||||
|
await transactionForm.find('input[type="text"]').setValue('34.56')
|
||||||
|
await transactionForm.find('textarea').setValue('Make the best of it!')
|
||||||
|
await transactionForm.find('form').trigger('submit')
|
||||||
|
await flushPromises()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('steps forward in the dialog', () => {
|
||||||
|
expect(wrapper.findComponent({ name: 'TransactionConfirmationSend' }).exists()).toBe(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('confirm transaction', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
await wrapper
|
||||||
|
.findComponent({ name: 'TransactionConfirmationSend' })
|
||||||
|
.find('button.btn-gradido')
|
||||||
|
.trigger('click')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('calls the API', async () => {
|
||||||
|
expect(apolloMutationMock).toBeCalledWith(
|
||||||
|
expect.objectContaining({
|
||||||
|
mutation: sendCoins,
|
||||||
|
variables: {
|
||||||
|
identifier: 'gradido-ID',
|
||||||
|
amount: 34.56,
|
||||||
|
memo: 'Make the best of it!',
|
||||||
|
selected: SEND_TYPES.send,
|
||||||
|
userName: '',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('resets the gradido ID query in route', () => {
|
||||||
|
expect(routerPushMock).toBeCalledWith({
|
||||||
|
query: {
|
||||||
|
gradidoID: undefined,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('transaction form link', () => {
|
describe('transaction form link', () => {
|
||||||
const now = new Date().toISOString()
|
const now = new Date().toISOString()
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
|||||||
@ -11,9 +11,7 @@
|
|||||||
<template #transactionConfirmationSend>
|
<template #transactionConfirmationSend>
|
||||||
<transaction-confirmation-send
|
<transaction-confirmation-send
|
||||||
:balance="balance"
|
:balance="balance"
|
||||||
:email="transactionData.email"
|
v-bind="transactionData"
|
||||||
:amount="transactionData.amount"
|
|
||||||
:memo="transactionData.memo"
|
|
||||||
@send-transaction="sendTransaction"
|
@send-transaction="sendTransaction"
|
||||||
@on-back="onBack"
|
@on-back="onBack"
|
||||||
></transaction-confirmation-send>
|
></transaction-confirmation-send>
|
||||||
@ -21,7 +19,7 @@
|
|||||||
<template #transactionConfirmationLink>
|
<template #transactionConfirmationLink>
|
||||||
<transaction-confirmation-link
|
<transaction-confirmation-link
|
||||||
:balance="balance"
|
:balance="balance"
|
||||||
:email="transactionData.email"
|
:email="transactionData.identifier"
|
||||||
:amount="transactionData.amount"
|
:amount="transactionData.amount"
|
||||||
:memo="transactionData.memo"
|
:memo="transactionData.memo"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
@ -62,7 +60,7 @@ import TransactionResultLink from '@/components/GddSend/TransactionResultLink'
|
|||||||
import { sendCoins, createTransactionLink } from '@/graphql/mutations.js'
|
import { sendCoins, createTransactionLink } from '@/graphql/mutations.js'
|
||||||
|
|
||||||
const EMPTY_TRANSACTION_DATA = {
|
const EMPTY_TRANSACTION_DATA = {
|
||||||
email: '',
|
identifier: '',
|
||||||
amount: 0,
|
amount: 0,
|
||||||
memo: '',
|
memo: '',
|
||||||
}
|
}
|
||||||
@ -168,6 +166,7 @@ export default {
|
|||||||
throw new Error(`undefined transactionData.selected : ${this.transactionData.selected}`)
|
throw new Error(`undefined transactionData.selected : ${this.transactionData.selected}`)
|
||||||
}
|
}
|
||||||
this.loading = false
|
this.loading = false
|
||||||
|
this.$router.push({ query: { gradidoID: undefined } })
|
||||||
},
|
},
|
||||||
onBack() {
|
onBack() {
|
||||||
this.currentTransactionStep = TRANSACTION_STEPS.transactionForm
|
this.currentTransactionStep = TRANSACTION_STEPS.transactionForm
|
||||||
|
|||||||
@ -17,7 +17,6 @@
|
|||||||
:showPagination="true"
|
:showPagination="true"
|
||||||
:pageSize="pageSize"
|
:pageSize="pageSize"
|
||||||
@update-transactions="updateTransactions"
|
@update-transactions="updateTransactions"
|
||||||
v-on="$listeners"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user