mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
Merge branch 'master' of github.com:Ocelot-Social-Community/Ocelot-Social into brand-reformer-network-first-step
This commit is contained in:
commit
630abc0241
6
.github/workflows/publish.yml
vendored
6
.github/workflows/publish.yml
vendored
@ -64,7 +64,7 @@ jobs:
|
||||
echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||
- run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||
#- name: Repository Dispatch
|
||||
# uses: peter-evans/repository-dispatch@63fb3226c1bffa7d9e09d27eef4ecb0c3cf51143 # v3.0.0
|
||||
# uses: peter-evans/repository-dispatch@342b4dee76f7e22ff463b5e5d632b75319eb411e # v3.0.0
|
||||
# with:
|
||||
# token: ${{ github.token }}
|
||||
# event-type: trigger-ocelot-build-success
|
||||
@ -72,7 +72,7 @@ jobs:
|
||||
# client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
|
||||
|
||||
- name: Repository Dispatch stage.ocelot.social
|
||||
uses: peter-evans/repository-dispatch@63fb3226c1bffa7d9e09d27eef4ecb0c3cf51143 # v3.0.0
|
||||
uses: peter-evans/repository-dispatch@342b4dee76f7e22ff463b5e5d632b75319eb411e # v3.0.0
|
||||
with:
|
||||
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
||||
event-type: trigger-ocelot-build-success
|
||||
@ -80,7 +80,7 @@ jobs:
|
||||
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
|
||||
|
||||
- name: Repository Dispatch stage.yunite.me
|
||||
uses: peter-evans/repository-dispatch@63fb3226c1bffa7d9e09d27eef4ecb0c3cf51143 # v3.0.0
|
||||
uses: peter-evans/repository-dispatch@342b4dee76f7e22ff463b5e5d632b75319eb411e # v3.0.0
|
||||
with:
|
||||
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
||||
event-type: trigger-ocelot-build-success
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
"prod:db:data:categories": "node build/src/db/categories.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.796.0",
|
||||
"@aws-sdk/client-s3": "^3.817.0",
|
||||
"@aws-sdk/lib-storage": "^3.797.0",
|
||||
"@sentry/node": "^5.15.4",
|
||||
"@types/mime-types": "^2.1.4",
|
||||
@ -96,8 +96,8 @@
|
||||
"@faker-js/faker": "9.8.0",
|
||||
"@types/email-templates": "^10.0.4",
|
||||
"@types/jest": "^29.5.14",
|
||||
"@types/lodash": "^4.17.16",
|
||||
"@types/node": "^22.15.18",
|
||||
"@types/lodash": "^4.17.17",
|
||||
"@types/node": "^22.15.21",
|
||||
"@types/slug": "^5.0.9",
|
||||
"@types/uuid": "~9.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
||||
@ -109,7 +109,7 @@
|
||||
"eslint-import-resolver-typescript": "^4.3.4",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-jest": "^28.11.0",
|
||||
"eslint-plugin-jsonc": "^2.20.0",
|
||||
"eslint-plugin-jsonc": "^2.20.1",
|
||||
"eslint-plugin-n": "^17.17.0",
|
||||
"eslint-plugin-no-catch-all": "^1.1.0",
|
||||
"eslint-plugin-prettier": "^5.4.0",
|
||||
|
||||
20
backend/src/graphql/queries/rewardTrophyBadge.ts
Normal file
20
backend/src/graphql/queries/rewardTrophyBadge.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import gql from 'graphql-tag'
|
||||
|
||||
export const rewardTrophyBadge = gql`
|
||||
mutation rewardTrophyBadge($badgeId: ID!, $userId: ID!) {
|
||||
rewardTrophyBadge(badgeId: $badgeId, userId: $userId) {
|
||||
id
|
||||
badgeVerification {
|
||||
id
|
||||
isDefault
|
||||
}
|
||||
badgeTrophiesCount
|
||||
badgeTrophies {
|
||||
id
|
||||
}
|
||||
badgeTrophiesSelected {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
17
backend/src/graphql/queries/setTrophyBadgeSelected.ts
Normal file
17
backend/src/graphql/queries/setTrophyBadgeSelected.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import gql from 'graphql-tag'
|
||||
|
||||
export const setTrophyBadgeSelected = gql`
|
||||
mutation setTrophyBadgeSelected($slot: Int!, $badgeId: ID) {
|
||||
setTrophyBadgeSelected(slot: $slot, badgeId: $badgeId) {
|
||||
badgeTrophiesCount
|
||||
badgeTrophiesSelected {
|
||||
id
|
||||
isDefault
|
||||
}
|
||||
badgeTrophiesUnused {
|
||||
id
|
||||
}
|
||||
badgeTrophiesUnusedCount
|
||||
}
|
||||
}
|
||||
`
|
||||
@ -5,8 +5,11 @@ import { ApolloServer } from 'apollo-server-express'
|
||||
import { createTestClient } from 'apollo-server-testing'
|
||||
import gql from 'graphql-tag'
|
||||
|
||||
import { TROPHY_BADGES_SELECTED_MAX } from '@constants/badges'
|
||||
import databaseContext from '@context/database'
|
||||
import Factory, { cleanDatabase } from '@db/factories'
|
||||
import { rewardTrophyBadge } from '@graphql/queries/rewardTrophyBadge'
|
||||
import { setTrophyBadgeSelected } from '@graphql/queries/setTrophyBadgeSelected'
|
||||
import createServer, { getContext } from '@src/server'
|
||||
|
||||
let regularUser, administrator, moderator, badge, verification
|
||||
@ -295,27 +298,10 @@ describe('Badges', () => {
|
||||
userId: 'regular-user-id',
|
||||
}
|
||||
|
||||
const rewardTrophyBadgeMutation = gql`
|
||||
mutation ($badgeId: ID!, $userId: ID!) {
|
||||
rewardTrophyBadge(badgeId: $badgeId, userId: $userId) {
|
||||
id
|
||||
badgeVerification {
|
||||
id
|
||||
isDefault
|
||||
}
|
||||
badgeTrophies {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
describe('unauthenticated', () => {
|
||||
it('throws authorization error', async () => {
|
||||
authenticatedUser = null
|
||||
await expect(
|
||||
mutate({ mutation: rewardTrophyBadgeMutation, variables }),
|
||||
).resolves.toMatchObject({
|
||||
await expect(mutate({ mutation: rewardTrophyBadge, variables })).resolves.toMatchObject({
|
||||
data: { rewardTrophyBadge: null },
|
||||
errors: [{ message: 'Not Authorized!' }],
|
||||
})
|
||||
@ -329,9 +315,7 @@ describe('Badges', () => {
|
||||
|
||||
describe('rewards badge to user', () => {
|
||||
it('throws authorization error', async () => {
|
||||
await expect(
|
||||
mutate({ mutation: rewardTrophyBadgeMutation, variables }),
|
||||
).resolves.toMatchObject({
|
||||
await expect(mutate({ mutation: rewardTrophyBadge, variables })).resolves.toMatchObject({
|
||||
data: { rewardTrophyBadge: null },
|
||||
errors: [{ message: 'Not Authorized!' }],
|
||||
})
|
||||
@ -348,7 +332,7 @@ describe('Badges', () => {
|
||||
it('rejects with an informative error message', async () => {
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: { userId: 'regular-user-id', badgeId: 'non-existent-badge-id' },
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
@ -356,7 +340,7 @@ describe('Badges', () => {
|
||||
errors: [
|
||||
{
|
||||
message:
|
||||
'Error: Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
'Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
},
|
||||
],
|
||||
})
|
||||
@ -367,7 +351,7 @@ describe('Badges', () => {
|
||||
it('rejects with a telling error message', async () => {
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: { userId: 'non-existent-user-id', badgeId: 'trophy_rhino' },
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
@ -375,7 +359,7 @@ describe('Badges', () => {
|
||||
errors: [
|
||||
{
|
||||
message:
|
||||
'Error: Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
'Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
},
|
||||
],
|
||||
})
|
||||
@ -386,7 +370,7 @@ describe('Badges', () => {
|
||||
it('rejects with a telling error message', async () => {
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: { userId: 'regular-user-id', badgeId: 'verification_moderator' },
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
@ -394,7 +378,7 @@ describe('Badges', () => {
|
||||
errors: [
|
||||
{
|
||||
message:
|
||||
'Error: Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
'Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
},
|
||||
],
|
||||
})
|
||||
@ -402,19 +386,43 @@ describe('Badges', () => {
|
||||
})
|
||||
|
||||
it('rewards a badge to the user', async () => {
|
||||
const expected = {
|
||||
await expect(mutate({ mutation: rewardTrophyBadge, variables })).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-id',
|
||||
badgeVerification: { id: 'default_verification', isDefault: true },
|
||||
badgeTrophies: [{ id: 'trophy_rhino' }],
|
||||
badgeTrophiesSelected: [
|
||||
{ id: 'trophy_rhino' },
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
}
|
||||
await expect(
|
||||
mutate({ mutation: rewardTrophyBadgeMutation, variables }),
|
||||
).resolves.toMatchObject(expected)
|
||||
})
|
||||
})
|
||||
|
||||
it('rewards a second different badge to the same user', async () => {
|
||||
@ -424,44 +432,269 @@ describe('Badges', () => {
|
||||
description: 'You earned a racoon',
|
||||
icon: '/img/badges/trophy_blue_racoon.svg',
|
||||
})
|
||||
const trophies = [{ id: 'trophy_racoon' }, { id: 'trophy_rhino' }]
|
||||
const expected = {
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_racoon',
|
||||
},
|
||||
})
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-id',
|
||||
badgeTrophies: expect.arrayContaining(trophies),
|
||||
badgeTrophies: expect.arrayContaining([
|
||||
{ id: 'trophy_racoon' },
|
||||
{ id: 'trophy_rhino' },
|
||||
]),
|
||||
badgeTrophiesSelected: [
|
||||
{ id: 'trophy_racoon' },
|
||||
{
|
||||
id: 'trophy_rhino',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
it('does not select a badge again when already rewarded and unselected by the user', async () => {
|
||||
await Factory.build('badge', {
|
||||
id: 'trophy_racoon',
|
||||
type: 'trophy',
|
||||
description: 'You earned a racoon',
|
||||
icon: '/img/badges/trophy_blue_racoon.svg',
|
||||
})
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
})
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_racoon',
|
||||
},
|
||||
})
|
||||
authenticatedUser = await regularUser.toJson()
|
||||
await mutate({
|
||||
mutation: setTrophyBadgeSelected,
|
||||
variables: {
|
||||
slot: 0,
|
||||
badgeId: null,
|
||||
},
|
||||
})
|
||||
authenticatedUser = await administrator.toJson()
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-id',
|
||||
badgeTrophies: expect.arrayContaining([
|
||||
{ id: 'trophy_racoon' },
|
||||
{ id: 'trophy_rhino' },
|
||||
]),
|
||||
badgeTrophiesSelected: [
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{ id: 'trophy_racoon' },
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
})
|
||||
})
|
||||
|
||||
it('does fill gaps in the selection array when rewarding new badges', async () => {
|
||||
await Factory.build('badge', {
|
||||
id: 'trophy_racoon',
|
||||
type: 'trophy',
|
||||
description: 'You earned a racoon',
|
||||
icon: '/img/badges/trophy_blue_racoon.svg',
|
||||
})
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
})
|
||||
authenticatedUser = await regularUser.toJson()
|
||||
await mutate({
|
||||
mutation: setTrophyBadgeSelected,
|
||||
variables: {
|
||||
slot: 1,
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
})
|
||||
authenticatedUser = await administrator.toJson()
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_racoon',
|
||||
},
|
||||
}),
|
||||
).resolves.toMatchObject(expected)
|
||||
})
|
||||
|
||||
it('rewards the same badge as well to another user', async () => {
|
||||
const expected = {
|
||||
).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-2-id',
|
||||
badgeTrophies: [{ id: 'trophy_rhino' }],
|
||||
id: 'regular-user-id',
|
||||
badgeTrophies: expect.arrayContaining([
|
||||
{ id: 'trophy_racoon' },
|
||||
{ id: 'trophy_rhino' },
|
||||
]),
|
||||
badgeTrophiesSelected: [
|
||||
{ id: 'trophy_racoon' },
|
||||
{ id: 'trophy_rhino' },
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
})
|
||||
})
|
||||
|
||||
it('does not select badge when maximum selected are already reached', async () => {
|
||||
for (let i = 0; i < TROPHY_BADGES_SELECTED_MAX; i++) {
|
||||
await Factory.build('badge', {
|
||||
id: `trophy_${i}`,
|
||||
type: 'trophy',
|
||||
description: `You earned a ${i}`,
|
||||
icon: `/img/badges/trophy_blue_${i}.svg`,
|
||||
})
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: `trophy_${i}`,
|
||||
},
|
||||
})
|
||||
}
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-id',
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-id',
|
||||
badgeTrophies: expect.arrayContaining([
|
||||
{ id: 'trophy_0' },
|
||||
{ id: 'trophy_1' },
|
||||
{ id: 'trophy_2' },
|
||||
{ id: 'trophy_3' },
|
||||
{ id: 'trophy_4' },
|
||||
{ id: 'trophy_5' },
|
||||
{ id: 'trophy_6' },
|
||||
{ id: 'trophy_7' },
|
||||
{ id: 'trophy_8' },
|
||||
{ id: 'trophy_rhino' },
|
||||
]),
|
||||
badgeTrophiesSelected: [
|
||||
{ id: 'trophy_0' },
|
||||
{ id: 'trophy_1' },
|
||||
{ id: 'trophy_2' },
|
||||
{ id: 'trophy_3' },
|
||||
{ id: 'trophy_4' },
|
||||
{ id: 'trophy_5' },
|
||||
{ id: 'trophy_6' },
|
||||
{ id: 'trophy_7' },
|
||||
{ id: 'trophy_8' },
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
})
|
||||
})
|
||||
|
||||
it('rewards the same badge as well to another user', async () => {
|
||||
await Factory.build(
|
||||
'user',
|
||||
{
|
||||
@ -472,46 +705,102 @@ describe('Badges', () => {
|
||||
},
|
||||
)
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables,
|
||||
})
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables: {
|
||||
userId: 'regular-user-2-id',
|
||||
badgeId: 'trophy_rhino',
|
||||
},
|
||||
}),
|
||||
).resolves.toMatchObject(expected)
|
||||
).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-2-id',
|
||||
badgeTrophies: [{ id: 'trophy_rhino' }],
|
||||
badgeTrophiesSelected: [
|
||||
{ id: 'trophy_rhino' },
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
})
|
||||
})
|
||||
|
||||
it('creates no duplicate reward relationships', async () => {
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
mutation: rewardTrophyBadge,
|
||||
variables,
|
||||
})
|
||||
await mutate({
|
||||
mutation: rewardTrophyBadgeMutation,
|
||||
variables,
|
||||
})
|
||||
|
||||
const userQuery = gql`
|
||||
{
|
||||
User(id: "regular-user-id") {
|
||||
badgeTrophiesCount
|
||||
badgeTrophies {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
const expected = {
|
||||
data: { User: [{ badgeTrophiesCount: 1, badgeTrophies: [{ id: 'trophy_rhino' }] }] },
|
||||
await expect(
|
||||
mutate({
|
||||
mutation: rewardTrophyBadge,
|
||||
variables,
|
||||
}),
|
||||
).resolves.toMatchObject({
|
||||
data: {
|
||||
rewardTrophyBadge: {
|
||||
id: 'regular-user-id',
|
||||
badgeTrophiesCount: 1,
|
||||
badgeTrophies: [{ id: 'trophy_rhino' }],
|
||||
badgeTrophiesSelected: [
|
||||
{ id: 'trophy_rhino' },
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
{
|
||||
id: 'default_trophy',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
errors: undefined,
|
||||
}
|
||||
|
||||
await expect(query({ query: userQuery })).resolves.toMatchObject(expected)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -6,6 +6,9 @@
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||
import { neo4jgraphql } from 'neo4j-graphql-js'
|
||||
|
||||
import { TROPHY_BADGES_SELECTED_MAX } from '@constants/badges'
|
||||
import { Context } from '@src/server'
|
||||
|
||||
export const defaultTrophyBadge = {
|
||||
id: 'default_trophy',
|
||||
type: 'trophy',
|
||||
@ -71,44 +74,63 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
rewardTrophyBadge: async (_object, args, context, _resolveInfo) => {
|
||||
rewardTrophyBadge: async (_object, args, context: Context, _resolveInfo) => {
|
||||
const {
|
||||
user: { id: currentUserId },
|
||||
} = context
|
||||
const { badgeId, userId } = args
|
||||
const session = context.driver.session()
|
||||
|
||||
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
|
||||
const response = await transaction.run(
|
||||
`
|
||||
MATCH (badge:Badge {id: $badgeId, type: 'trophy'}), (user:User {id: $userId})
|
||||
MERGE (badge)-[relation:REWARDED {by: $currentUserId}]->(user)
|
||||
RETURN relation, user {.*}
|
||||
`,
|
||||
{
|
||||
badgeId,
|
||||
userId,
|
||||
currentUserId,
|
||||
},
|
||||
)
|
||||
// Find used slot
|
||||
const userBadges = (
|
||||
await context.database.query({
|
||||
query: `
|
||||
MATCH (rewardedBadge:Badge)-[rewarded:REWARDED]->(user:User {id: $userId})
|
||||
OPTIONAL MATCH (rewardedBadge)<-[selected:SELECTED]-(user)
|
||||
RETURN collect(rewardedBadge {.*}) AS rewardedBadges, collect(toString(selected.slot)) AS usedSlots
|
||||
`,
|
||||
variables: { userId },
|
||||
})
|
||||
).records.map((record) => {
|
||||
return {
|
||||
relation: response.records.map((record) => record.get('relation'))[0],
|
||||
user: response.records.map((record) => record.get('user'))[0],
|
||||
rewardedBadges: record.get('rewardedBadges'),
|
||||
usedSlots: record.get('usedSlots'),
|
||||
}
|
||||
})
|
||||
try {
|
||||
const { relation, user } = await writeTxResultPromise
|
||||
if (!relation) {
|
||||
throw new Error(
|
||||
'Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
)
|
||||
|
||||
const { rewardedBadges, usedSlots } = userBadges[0]
|
||||
|
||||
let slot
|
||||
if (
|
||||
!rewardedBadges.find((item) => item.id === badgeId) && // badge was not rewarded yet
|
||||
usedSlots.length < TROPHY_BADGES_SELECTED_MAX // there is free slots left
|
||||
) {
|
||||
for (slot = 0; slot <= TROPHY_BADGES_SELECTED_MAX; slot++) {
|
||||
if (!usedSlots.find((item) => parseInt(item) === slot)) {
|
||||
break
|
||||
}
|
||||
}
|
||||
return user
|
||||
} catch (error) {
|
||||
throw new Error(error)
|
||||
} finally {
|
||||
session.close()
|
||||
}
|
||||
|
||||
// reward badge and assign slot
|
||||
const users = (
|
||||
await context.database.write({
|
||||
query: `
|
||||
MATCH (badge:Badge {id: $badgeId, type: 'trophy'}), (user:User {id: $userId})
|
||||
MERGE (badge)-[:REWARDED {by: $currentUserId}]->(user)
|
||||
${slot === undefined ? '' : 'MERGE (badge)<-[:SELECTED {slot: $slot}]-(user)'}
|
||||
RETURN user {.*}
|
||||
`,
|
||||
variables: { badgeId, userId, currentUserId, slot },
|
||||
})
|
||||
).records.map((record) => record.get('user'))
|
||||
|
||||
if (users.length !== 1) {
|
||||
throw new Error(
|
||||
'Could not reward badge! Ensure the user and the badge exist and the badge is of the correct type.',
|
||||
)
|
||||
}
|
||||
|
||||
return users[0]
|
||||
},
|
||||
|
||||
revokeBadge: async (_object, args, context, _resolveInfo) => {
|
||||
|
||||
@ -15,6 +15,7 @@ import Resolver from './helpers/Resolver'
|
||||
export default {
|
||||
Query: {
|
||||
VerifyNonce: async (_parent, args, context, _resolveInfo) => {
|
||||
args.email = normalizeEmail(args.email)
|
||||
const session = context.driver.session()
|
||||
const readTxResultPromise = session.readTransaction(async (txc) => {
|
||||
const result = await txc.run(
|
||||
@ -38,7 +39,6 @@ export default {
|
||||
AddEmailAddress: async (_parent, args, context, _resolveInfo) => {
|
||||
let response
|
||||
args.email = normalizeEmail(args.email)
|
||||
|
||||
try {
|
||||
const { neode } = context
|
||||
await new Validator(neode, neode.model('UnverifiedEmailAddress'), args)
|
||||
@ -86,6 +86,7 @@ export default {
|
||||
const {
|
||||
user: { id: userId },
|
||||
} = context
|
||||
args.email = normalizeEmail(args.email)
|
||||
const { nonce, email } = args
|
||||
const session = context.driver.session()
|
||||
const writeTxResultPromise = session.writeTransaction(async (txc) => {
|
||||
|
||||
@ -2,7 +2,10 @@
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||
import normalizeEmail from './normalizeEmail'
|
||||
|
||||
export default async function alreadyExistingMail({ args, context }) {
|
||||
args.email = normalizeEmail(args.email)
|
||||
const session = context.driver.session()
|
||||
try {
|
||||
const existingEmailAddressTxPromise = session.writeTransaction(async (transaction) => {
|
||||
|
||||
@ -10,15 +10,18 @@ import { v4 as uuid } from 'uuid'
|
||||
import registrationConstants from '@constants/registrationBranded'
|
||||
|
||||
import createPasswordReset from './helpers/createPasswordReset'
|
||||
import normalizeEmail from './helpers/normalizeEmail'
|
||||
|
||||
export default {
|
||||
Mutation: {
|
||||
requestPasswordReset: async (_parent, { email }, { driver }) => {
|
||||
email = normalizeEmail(email)
|
||||
// TODO: why this is generated differntly from 'backend/src/schema/resolvers/helpers/generateNonce.js'?
|
||||
const nonce = uuid().substring(0, registrationConstants.NONCE_LENGTH)
|
||||
return createPasswordReset({ driver, nonce, email })
|
||||
},
|
||||
resetPassword: async (_parent, { email, nonce, newPassword }, { driver }) => {
|
||||
email = normalizeEmail(email)
|
||||
const stillValid = new Date()
|
||||
stillValid.setDate(stillValid.getDate() - 1)
|
||||
const encryptedNewPassword = await bcrypt.hash(newPassword, 10)
|
||||
|
||||
@ -12,6 +12,7 @@ import databaseContext from '@context/database'
|
||||
import pubsubContext from '@context/pubsub'
|
||||
import Factory, { cleanDatabase } from '@db/factories'
|
||||
import User from '@db/models/User'
|
||||
import { setTrophyBadgeSelected } from '@graphql/queries/setTrophyBadgeSelected'
|
||||
import createServer, { getContext } from '@src/server'
|
||||
|
||||
const categoryIds = ['cat9']
|
||||
@ -77,22 +78,6 @@ const updateOnlineStatus = gql`
|
||||
}
|
||||
`
|
||||
|
||||
const setTrophyBadgeSelected = gql`
|
||||
mutation ($slot: Int!, $badgeId: ID) {
|
||||
setTrophyBadgeSelected(slot: $slot, badgeId: $badgeId) {
|
||||
badgeTrophiesCount
|
||||
badgeTrophiesSelected {
|
||||
id
|
||||
isDefault
|
||||
}
|
||||
badgeTrophiesUnused {
|
||||
id
|
||||
}
|
||||
badgeTrophiesUnusedCount
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
const resetTrophyBadgesSelected = gql`
|
||||
mutation {
|
||||
resetTrophyBadgesSelected {
|
||||
|
||||
@ -13,6 +13,7 @@ import { getNeode } from '@db/neo4j'
|
||||
import { Context } from '@src/server'
|
||||
|
||||
import { defaultTrophyBadge, defaultVerificationBadge } from './badges'
|
||||
import normalizeEmail from './helpers/normalizeEmail'
|
||||
import Resolver from './helpers/Resolver'
|
||||
import { mergeImage, deleteImage } from './images/images'
|
||||
import { createOrUpdateLocations } from './users/location'
|
||||
@ -66,8 +67,8 @@ export default {
|
||||
}
|
||||
},
|
||||
User: async (object, args, context, resolveInfo) => {
|
||||
const { email } = args
|
||||
if (email) {
|
||||
if (args.email) {
|
||||
args.email = normalizeEmail(args.email)
|
||||
let session
|
||||
try {
|
||||
session = context.driver.session()
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
313
package-lock.json
generated
313
package-lock.json
generated
@ -13,13 +13,13 @@
|
||||
"@babel/preset-env": "^7.27.1",
|
||||
"@babel/register": "^7.27.1",
|
||||
"@badeball/cypress-cucumber-preprocessor": "^22.0.1",
|
||||
"@cucumber/cucumber": "11.2.0",
|
||||
"@cucumber/cucumber": "11.3.0",
|
||||
"@cypress/browserify-preprocessor": "^3.0.2",
|
||||
"@faker-js/faker": "9.8.0",
|
||||
"auto-changelog": "^2.5.0",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"cypress": "^14.3.2",
|
||||
"cypress": "^14.4.0",
|
||||
"cypress-network-idle": "^1.15.0",
|
||||
"date-fns": "^3.6.0",
|
||||
"dotenv": "^16.5.0",
|
||||
@ -1971,9 +1971,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@cucumber/cucumber": {
|
||||
"version": "11.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-11.2.0.tgz",
|
||||
"integrity": "sha512-F69uIPTc7dfgU7/TGAaQaWUz7r/DzoPW39AfJoKQOC7IvBiPQwpvSIo6QEd+63pdpdKNRbtQoVl5vP9IclhhuA==",
|
||||
"version": "11.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-11.3.0.tgz",
|
||||
"integrity": "sha512-1YGsoAzRfDyVOnRMTSZP/EcFsOBElOKa2r+5nin0DJAeK+Mp0mzjcmSllMgApGtck7Ji87wwy3kFONfHUHMn4g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -1981,16 +1981,16 @@
|
||||
"@cucumber/cucumber-expressions": "18.0.1",
|
||||
"@cucumber/gherkin": "30.0.4",
|
||||
"@cucumber/gherkin-streams": "5.0.1",
|
||||
"@cucumber/gherkin-utils": "9.0.0",
|
||||
"@cucumber/html-formatter": "21.7.0",
|
||||
"@cucumber/gherkin-utils": "9.2.0",
|
||||
"@cucumber/html-formatter": "21.10.1",
|
||||
"@cucumber/junit-xml-formatter": "0.7.1",
|
||||
"@cucumber/message-streams": "4.0.1",
|
||||
"@cucumber/messages": "27.0.2",
|
||||
"@cucumber/tag-expressions": "6.1.1",
|
||||
"@cucumber/messages": "27.2.0",
|
||||
"@cucumber/tag-expressions": "6.1.2",
|
||||
"assertion-error-formatter": "^3.0.0",
|
||||
"capital-case": "^1.0.4",
|
||||
"chalk": "^4.1.2",
|
||||
"cli-table3": "0.6.3",
|
||||
"cli-table3": "0.6.5",
|
||||
"commander": "^10.0.0",
|
||||
"debug": "^4.3.4",
|
||||
"error-stack-parser": "^2.1.4",
|
||||
@ -2003,21 +2003,19 @@
|
||||
"knuth-shuffle-seeded": "^1.0.6",
|
||||
"lodash.merge": "^4.6.2",
|
||||
"lodash.mergewith": "^4.6.2",
|
||||
"luxon": "3.2.1",
|
||||
"luxon": "3.6.1",
|
||||
"mime": "^3.0.0",
|
||||
"mkdirp": "^2.1.5",
|
||||
"mz": "^2.7.0",
|
||||
"progress": "^2.0.3",
|
||||
"read-package-up": "^11.0.0",
|
||||
"resolve-pkg": "^2.0.0",
|
||||
"semver": "7.5.3",
|
||||
"semver": "7.7.1",
|
||||
"string-argv": "0.3.1",
|
||||
"supports-color": "^8.1.1",
|
||||
"tmp": "0.2.3",
|
||||
"type-fest": "^4.8.3",
|
||||
"type-fest": "^4.41.0",
|
||||
"util-arity": "^1.1.0",
|
||||
"yaml": "^2.2.2",
|
||||
"yup": "1.2.0"
|
||||
"yup": "1.6.1"
|
||||
},
|
||||
"bin": {
|
||||
"cucumber-js": "bin/cucumber.js"
|
||||
@ -2040,16 +2038,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/@cucumber/messages": {
|
||||
"version": "27.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.0.2.tgz",
|
||||
"integrity": "sha512-jo2B+vYXmpuLOKh6Gc8loHl2E8svCkLvEXLVgFwVHqKWZJWBTa9yTRCPmZIxrz4fnO7Pr3N3vKQCPu73/gjlVQ==",
|
||||
"version": "27.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.2.0.tgz",
|
||||
"integrity": "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/uuid": "10.0.0",
|
||||
"class-transformer": "0.5.1",
|
||||
"reflect-metadata": "0.2.2",
|
||||
"uuid": "10.0.0"
|
||||
"uuid": "11.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/@types/uuid": {
|
||||
@ -2102,18 +2100,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/reflect-metadata": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
|
||||
@ -2122,13 +2108,11 @@
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/semver": {
|
||||
"version": "7.5.3",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz",
|
||||
"integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==",
|
||||
"version": "7.7.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
|
||||
"integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"lru-cache": "^6.0.0"
|
||||
},
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
@ -2137,10 +2121,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/type-fest": {
|
||||
"version": "4.8.3",
|
||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz",
|
||||
"integrity": "sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw==",
|
||||
"version": "4.41.0",
|
||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
|
||||
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
|
||||
"dev": true,
|
||||
"license": "(MIT OR CC0-1.0)",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
@ -2148,26 +2133,6 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/uuid": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
|
||||
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/cucumber/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@cucumber/gherkin": {
|
||||
"version": "30.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-30.0.4.tgz",
|
||||
@ -2205,15 +2170,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils": {
|
||||
"version": "9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-9.0.0.tgz",
|
||||
"integrity": "sha512-clk4q39uj7pztZuZtyI54V8lRsCUz0Y/p8XRjIeHh7ExeEztpWkp4ca9q1FjUOPfQQ8E7OgqFbqoQQXZ1Bx7fw==",
|
||||
"version": "9.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-9.2.0.tgz",
|
||||
"integrity": "sha512-3nmRbG1bUAZP3fAaUBNmqWO0z0OSkykZZotfLjyhc8KWwDSOrOmMJlBTd474lpA8EWh4JFLAX3iXgynBqBvKzw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@cucumber/gherkin": "^28.0.0",
|
||||
"@cucumber/messages": "^24.0.0",
|
||||
"@cucumber/gherkin": "^31.0.0",
|
||||
"@cucumber/messages": "^27.0.0",
|
||||
"@teppeis/multimaps": "3.0.0",
|
||||
"commander": "12.0.0",
|
||||
"commander": "13.1.0",
|
||||
"source-map-support": "^0.5.21"
|
||||
},
|
||||
"bin": {
|
||||
@ -2221,53 +2187,85 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": {
|
||||
"version": "28.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz",
|
||||
"integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==",
|
||||
"version": "31.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-31.0.0.tgz",
|
||||
"integrity": "sha512-wlZfdPif7JpBWJdqvHk1Mkr21L5vl4EfxVUOS4JinWGf3FLRV6IKUekBv5bb5VX79fkDcfDvESzcQ8WQc07Wgw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@cucumber/messages": ">=19.1.4 <=24"
|
||||
"@cucumber/messages": ">=19.1.4 <=26"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": {
|
||||
"version": "26.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-26.0.1.tgz",
|
||||
"integrity": "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/uuid": "10.0.0",
|
||||
"class-transformer": "0.5.1",
|
||||
"reflect-metadata": "0.2.2",
|
||||
"uuid": "10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/uuid": {
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
|
||||
"integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": {
|
||||
"version": "24.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz",
|
||||
"integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==",
|
||||
"version": "27.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.2.0.tgz",
|
||||
"integrity": "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/uuid": "9.0.8",
|
||||
"@types/uuid": "10.0.0",
|
||||
"class-transformer": "0.5.1",
|
||||
"reflect-metadata": "0.2.1",
|
||||
"uuid": "9.0.1"
|
||||
"reflect-metadata": "0.2.2",
|
||||
"uuid": "11.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/@types/uuid": {
|
||||
"version": "9.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
|
||||
"integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
|
||||
"dev": true
|
||||
"version": "10.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
|
||||
"integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/commander": {
|
||||
"version": "12.0.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz",
|
||||
"integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==",
|
||||
"version": "13.1.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
|
||||
"integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/gherkin-utils/node_modules/reflect-metadata": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz",
|
||||
"integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==",
|
||||
"deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.",
|
||||
"dev": true
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
|
||||
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@cucumber/html-formatter": {
|
||||
"version": "21.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.7.0.tgz",
|
||||
"integrity": "sha512-bv211aY8mErp6CdmhN426E+7KIsVIES4fGx5ASMlUzYWiMus6NhSdI9UL3Vswx8JXJMgySeIcJJKfznREUFLNA==",
|
||||
"version": "21.10.1",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.10.1.tgz",
|
||||
"integrity": "sha512-isaaNMNnBYThsvaHy7i+9kkk9V3+rhgdkt0pd6TCY6zY1CSRZQ7tG6ST9pYyRaECyfbCeF7UGH0KpNEnh6UNvQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@cucumber/messages": ">=18"
|
||||
}
|
||||
@ -2288,16 +2286,6 @@
|
||||
"@cucumber/messages": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/junit-xml-formatter/node_modules/luxon": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
|
||||
"integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/message-streams": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz",
|
||||
@ -2358,10 +2346,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@cucumber/tag-expressions": {
|
||||
"version": "6.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.1.tgz",
|
||||
"integrity": "sha512-0oj5KTzf2DsR3DhL3hYeI9fP3nyKzs7TQdpl54uJelJ3W3Hlyyet2Hib+8LK7kNnqJsXENnJg9zahRYyrtvNEg==",
|
||||
"dev": true
|
||||
"version": "6.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.2.tgz",
|
||||
"integrity": "sha512-xa3pER+ntZhGCxRXSguDTKEHTZpUUsp+RzTRNnit+vi5cqnk6abLdSLg5i3HZXU3c74nQ8afQC6IT507EN74oQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@cypress/browserify-preprocessor": {
|
||||
"version": "3.0.2",
|
||||
@ -7315,10 +7304,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cli-table3": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
|
||||
"integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
|
||||
"version": "0.6.5",
|
||||
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
|
||||
"integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"string-width": "^4.2.0"
|
||||
},
|
||||
@ -7825,9 +7815,9 @@
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/cypress": {
|
||||
"version": "14.3.2",
|
||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-14.3.2.tgz",
|
||||
"integrity": "sha512-n+yGD2ZFFKgy7I3YtVpZ7BcFYrrDMcKj713eOZdtxPttpBjCyw/R8dLlFSsJPouneGN7A/HOSRyPJ5+3/gKDoA==",
|
||||
"version": "14.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cypress/-/cypress-14.4.0.tgz",
|
||||
"integrity": "sha512-/I59Fqxo7fqdiDi3IM2QKA65gZ7+PVejXg404/I8ZSq+NOnrmw+2pnMUJzpoNyg7KABcEBmgpkfAqhV98p7wJA==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
@ -7845,7 +7835,7 @@
|
||||
"check-more-types": "^2.24.0",
|
||||
"ci-info": "^4.1.0",
|
||||
"cli-cursor": "^3.1.0",
|
||||
"cli-table3": "~0.6.5",
|
||||
"cli-table3": "0.6.1",
|
||||
"commander": "^6.2.1",
|
||||
"common-tags": "^1.8.0",
|
||||
"dayjs": "^1.10.4",
|
||||
@ -7974,9 +7964,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/cypress/node_modules/cli-table3": {
|
||||
"version": "0.6.5",
|
||||
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
|
||||
"integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
|
||||
"integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@ -7986,7 +7976,18 @@
|
||||
"node": "10.* || >= 12.*"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@colors/colors": "1.5.0"
|
||||
"colors": "1.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cypress/node_modules/colors": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
|
||||
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=0.1.90"
|
||||
}
|
||||
},
|
||||
"node_modules/cypress/node_modules/commander": {
|
||||
@ -11736,10 +11737,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/luxon": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz",
|
||||
"integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==",
|
||||
"version": "3.6.1",
|
||||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz",
|
||||
"integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
@ -12347,30 +12349,6 @@
|
||||
"node": ">=14.14"
|
||||
}
|
||||
},
|
||||
"node_modules/multiple-cucumber-html-reporter/node_modules/luxon": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
|
||||
"integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/multiple-cucumber-html-reporter/node_modules/uuid": {
|
||||
"version": "11.0.5",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz",
|
||||
"integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/esm/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/mz": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
|
||||
@ -13617,7 +13595,8 @@
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
|
||||
"integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/property-information": {
|
||||
"version": "6.5.0",
|
||||
@ -14310,18 +14289,6 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-pkg": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz",
|
||||
"integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"resolve-from": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-pkg-maps": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
|
||||
@ -14331,15 +14298,6 @@
|
||||
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-pkg/node_modules/resolve-from": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
|
||||
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/restore-cursor": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
|
||||
@ -15527,7 +15485,8 @@
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
|
||||
"integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tinyglobby": {
|
||||
"version": "0.2.10",
|
||||
@ -15613,7 +15572,8 @@
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
|
||||
"integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tough-cookie": {
|
||||
"version": "5.1.2",
|
||||
@ -16073,16 +16033,17 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "9.0.1",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
|
||||
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
|
||||
"version": "11.0.5",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz",
|
||||
"integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
"uuid": "dist/esm/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/validate-npm-package-license": {
|
||||
@ -17652,10 +17613,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/yup": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz",
|
||||
"integrity": "sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==",
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/yup/-/yup-1.6.1.tgz",
|
||||
"integrity": "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"property-expr": "^2.0.5",
|
||||
"tiny-case": "^1.0.3",
|
||||
@ -17668,6 +17630,7 @@
|
||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
|
||||
"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
|
||||
"dev": true,
|
||||
"license": "(MIT OR CC0-1.0)",
|
||||
"engines": {
|
||||
"node": ">=12.20"
|
||||
},
|
||||
|
||||
@ -37,13 +37,13 @@
|
||||
"@babel/preset-env": "^7.27.1",
|
||||
"@babel/register": "^7.27.1",
|
||||
"@badeball/cypress-cucumber-preprocessor": "^22.0.1",
|
||||
"@cucumber/cucumber": "11.2.0",
|
||||
"@cucumber/cucumber": "11.3.0",
|
||||
"@cypress/browserify-preprocessor": "^3.0.2",
|
||||
"@faker-js/faker": "9.8.0",
|
||||
"auto-changelog": "^2.5.0",
|
||||
"bcryptjs": "^3.0.2",
|
||||
"cross-env": "^7.0.3",
|
||||
"cypress": "^14.3.2",
|
||||
"cypress": "^14.4.0",
|
||||
"cypress-network-idle": "^1.15.0",
|
||||
"date-fns": "^3.6.0",
|
||||
"dotenv": "^16.5.0",
|
||||
|
||||
@ -89,24 +89,6 @@ describe('Request', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('capital letters in a gmail address', () => {
|
||||
beforeEach(async () => {
|
||||
wrapper = Wrapper()
|
||||
wrapper.find('input#email').setValue('mAiL@gmail.com')
|
||||
await wrapper.find('form').trigger('submit')
|
||||
})
|
||||
|
||||
it('normalizes email to lower case letters', () => {
|
||||
const expected = expect.objectContaining({
|
||||
variables: {
|
||||
email: 'mail@gmail.com',
|
||||
locale: 'en',
|
||||
},
|
||||
})
|
||||
expect(mocks.$apollo.mutate).toHaveBeenCalledWith(expected)
|
||||
})
|
||||
})
|
||||
|
||||
describe('backend throws an error', () => {
|
||||
beforeEach(() => {
|
||||
mocks.$apollo.mutate = jest.fn().mockRejectedValue({
|
||||
|
||||
@ -45,7 +45,6 @@
|
||||
<script>
|
||||
import gql from 'graphql-tag'
|
||||
import { SweetalertIcon } from 'vue-sweetalert-icons'
|
||||
import normalizeEmail from '~/components/utils/NormalizeEmail'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@ -68,11 +67,8 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
email() {
|
||||
return normalizeEmail(this.formData.email)
|
||||
},
|
||||
submitMessage() {
|
||||
const { email } = this
|
||||
const email = this.formData.email
|
||||
return this.$t('components.password-reset.request.form.submitted', { email })
|
||||
},
|
||||
},
|
||||
@ -90,7 +86,7 @@ export default {
|
||||
}
|
||||
`
|
||||
try {
|
||||
const { email } = this
|
||||
const email = this.formData.email
|
||||
await this.$apollo.mutate({ mutation, variables: { email, locale: this.$i18n.locale() } })
|
||||
this.submitted = true
|
||||
|
||||
|
||||
@ -32,7 +32,6 @@
|
||||
import gql from 'graphql-tag'
|
||||
import metadata from '~/constants/metadata'
|
||||
import { isEmail } from 'validator'
|
||||
import normalizeEmail from '~/components/utils/NormalizeEmail'
|
||||
import translateErrorMessage from '~/components/utils/TranslateErrorMessage'
|
||||
|
||||
export const SignupMutation = gql`
|
||||
@ -94,9 +93,6 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
async sendValidation() {
|
||||
if (this.formData.email && isEmail(this.formData.email)) {
|
||||
this.formData.email = normalizeEmail(this.formData.email)
|
||||
}
|
||||
const { email } = this.formData
|
||||
|
||||
this.sliderData.setSliderValuesCallback(this.validInput, { collectedInputData: { email } })
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
import { normalizeEmail } from 'validator'
|
||||
|
||||
export default (email) =>
|
||||
normalizeEmail(email, {
|
||||
// gmail_remove_dots: false, default
|
||||
gmail_remove_subaddress: false,
|
||||
// gmail_convert_googlemaildotcom: true, default
|
||||
outlookdotcom_remove_subaddress: false,
|
||||
yahoo_remove_subaddress: false,
|
||||
icloud_remove_subaddress: false,
|
||||
})
|
||||
@ -388,6 +388,11 @@ export const updateUserMutation = () => {
|
||||
avatar {
|
||||
url
|
||||
}
|
||||
badgeVerification {
|
||||
id
|
||||
description
|
||||
icon
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
@ -38,7 +38,7 @@
|
||||
"cropperjs": "^1.6.2",
|
||||
"cross-env": "~7.0.3",
|
||||
"date-fns": "2.22.1",
|
||||
"graphql": "~15.10.1",
|
||||
"graphql": "14.7.0",
|
||||
"intersection-observer": "^0.12.0",
|
||||
"jest-serializer-vue": "^3.1.0",
|
||||
"linkify-it": "~5.0.0",
|
||||
@ -70,7 +70,7 @@
|
||||
"@babel/core": "^7.25.8",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/preset-env": "^7.25.8",
|
||||
"@faker-js/faker": "9.7.0",
|
||||
"@faker-js/faker": "9.8.0",
|
||||
"@storybook/addon-a11y": "^8.0.8",
|
||||
"@storybook/addon-actions": "^5.3.21",
|
||||
"@storybook/addon-notes": "^5.3.18",
|
||||
|
||||
@ -114,12 +114,6 @@ describe('Users', () => {
|
||||
expect(wrapper.vm.email).toEqual('email@example.org')
|
||||
expect(wrapper.vm.filter).toBe(null)
|
||||
})
|
||||
|
||||
it('email address is case-insensitive', async () => {
|
||||
const wrapper = await searchAction(Wrapper(), { query: 'eMaiL@example.org' })
|
||||
expect(wrapper.vm.email).toEqual('email@example.org')
|
||||
expect(wrapper.vm.filter).toBe(null)
|
||||
})
|
||||
})
|
||||
|
||||
describe('query is just text', () => {
|
||||
|
||||
@ -85,7 +85,6 @@
|
||||
<script>
|
||||
import { mapGetters } from 'vuex'
|
||||
import { isEmail } from 'validator'
|
||||
import normalizeEmail from '~/components/utils/NormalizeEmail'
|
||||
import PaginationButtons from '~/components/_new/generic/PaginationButtons/PaginationButtons'
|
||||
import { adminUserQuery } from '~/graphql/User'
|
||||
import { FetchAllRoles, updateUserRole } from '~/graphql/admin/Roles'
|
||||
@ -193,7 +192,7 @@ export default {
|
||||
this.offset = 0
|
||||
const { query } = formData
|
||||
if (isEmail(query)) {
|
||||
this.email = normalizeEmail(query)
|
||||
this.email = query
|
||||
this.filter = null
|
||||
} else {
|
||||
this.email = null
|
||||
|
||||
@ -106,13 +106,9 @@ export default {
|
||||
about,
|
||||
},
|
||||
update: (store, { data: { UpdateUser } }) => {
|
||||
const { name, slug, locationName, about } = UpdateUser
|
||||
this.setCurrentUser({
|
||||
...this.currentUser,
|
||||
name,
|
||||
slug,
|
||||
locationName,
|
||||
about,
|
||||
...UpdateUser,
|
||||
})
|
||||
},
|
||||
})
|
||||
|
||||
@ -30,7 +30,6 @@
|
||||
import { mapGetters } from 'vuex'
|
||||
import { AddEmailAddressMutation } from '~/graphql/EmailAddress.js'
|
||||
import { SweetalertIcon } from 'vue-sweetalert-icons'
|
||||
import normalizeEmail from '~/components/utils/NormalizeEmail'
|
||||
import scrollToContent from '../scroll-to-content.js'
|
||||
|
||||
export default {
|
||||
@ -62,7 +61,7 @@ export default {
|
||||
},
|
||||
},
|
||||
formSchema() {
|
||||
const currentEmail = normalizeEmail(this.currentUser.email)
|
||||
const currentEmail = this.currentUser.email
|
||||
const sameEmailValidationError = this.$t('settings.email.validation.same-email')
|
||||
return {
|
||||
email: [
|
||||
@ -70,7 +69,7 @@ export default {
|
||||
{
|
||||
validator(rule, value, callback, source, options) {
|
||||
const errors = []
|
||||
if (currentEmail === normalizeEmail(value)) {
|
||||
if (currentEmail === value) {
|
||||
errors.push(sameEmailValidationError)
|
||||
}
|
||||
return errors
|
||||
|
||||
@ -2526,10 +2526,10 @@
|
||||
minimatch "^3.0.4"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@faker-js/faker@9.7.0":
|
||||
version "9.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.7.0.tgz#1cf1fecfcad5e2da2332140bf3b5f23cc1c2a7f4"
|
||||
integrity sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==
|
||||
"@faker-js/faker@9.8.0":
|
||||
version "9.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.8.0.tgz#3344284028d1c9dc98dee2479f82939310370d88"
|
||||
integrity sha512-U9wpuSrJC93jZBxx/Qq2wPjCuYISBueyVUGK7qqdmj7r/nxaxwW8AQDCLeRO7wZnjj94sh3p246cAYjUKuqgfg==
|
||||
|
||||
"@human-connection/styleguide@0.5.22":
|
||||
version "0.5.22"
|
||||
@ -10894,14 +10894,14 @@ graphql-upload@^8.0.2:
|
||||
http-errors "^1.7.3"
|
||||
object-path "^0.11.4"
|
||||
|
||||
"graphql@14.0.2 - 14.2.0 || ^14.3.1", graphql@^14.5.8:
|
||||
"graphql@14.0.2 - 14.2.0 || ^14.3.1", graphql@14.7.0, graphql@^14.5.8:
|
||||
version "14.7.0"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.7.0.tgz#7fa79a80a69be4a31c27dda824dc04dac2035a72"
|
||||
integrity sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==
|
||||
dependencies:
|
||||
iterall "^1.2.2"
|
||||
|
||||
graphql@^15.3.0, graphql@~15.10.1:
|
||||
graphql@^15.3.0:
|
||||
version "15.10.1"
|
||||
resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.10.1.tgz#e9ff3bb928749275477f748b14aa5c30dcad6f2f"
|
||||
integrity sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==
|
||||
|
||||
206
yarn.lock
206
yarn.lock
@ -1090,25 +1090,25 @@
|
||||
dependencies:
|
||||
regexp-match-indices "1.0.2"
|
||||
|
||||
"@cucumber/cucumber@11.2.0", "@cucumber/cucumber@^11.0.0":
|
||||
version "11.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/cucumber/-/cucumber-11.2.0.tgz#6f38ecd0c71717d646b99eb4fe2595f81c8b179a"
|
||||
integrity sha512-F69uIPTc7dfgU7/TGAaQaWUz7r/DzoPW39AfJoKQOC7IvBiPQwpvSIo6QEd+63pdpdKNRbtQoVl5vP9IclhhuA==
|
||||
"@cucumber/cucumber@11.3.0", "@cucumber/cucumber@^11.0.0":
|
||||
version "11.3.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/cucumber/-/cucumber-11.3.0.tgz#56f83e00d76cbc3c8d4d7cef139eaa8f37dc2254"
|
||||
integrity sha512-1YGsoAzRfDyVOnRMTSZP/EcFsOBElOKa2r+5nin0DJAeK+Mp0mzjcmSllMgApGtck7Ji87wwy3kFONfHUHMn4g==
|
||||
dependencies:
|
||||
"@cucumber/ci-environment" "10.0.1"
|
||||
"@cucumber/cucumber-expressions" "18.0.1"
|
||||
"@cucumber/gherkin" "30.0.4"
|
||||
"@cucumber/gherkin-streams" "5.0.1"
|
||||
"@cucumber/gherkin-utils" "9.0.0"
|
||||
"@cucumber/html-formatter" "21.7.0"
|
||||
"@cucumber/gherkin-utils" "9.2.0"
|
||||
"@cucumber/html-formatter" "21.10.1"
|
||||
"@cucumber/junit-xml-formatter" "0.7.1"
|
||||
"@cucumber/message-streams" "4.0.1"
|
||||
"@cucumber/messages" "27.0.2"
|
||||
"@cucumber/tag-expressions" "6.1.1"
|
||||
"@cucumber/messages" "27.2.0"
|
||||
"@cucumber/tag-expressions" "6.1.2"
|
||||
assertion-error-formatter "^3.0.0"
|
||||
capital-case "^1.0.4"
|
||||
chalk "^4.1.2"
|
||||
cli-table3 "0.6.3"
|
||||
cli-table3 "0.6.5"
|
||||
commander "^10.0.0"
|
||||
debug "^4.3.4"
|
||||
error-stack-parser "^2.1.4"
|
||||
@ -1121,21 +1121,19 @@
|
||||
knuth-shuffle-seeded "^1.0.6"
|
||||
lodash.merge "^4.6.2"
|
||||
lodash.mergewith "^4.6.2"
|
||||
luxon "3.2.1"
|
||||
luxon "3.6.1"
|
||||
mime "^3.0.0"
|
||||
mkdirp "^2.1.5"
|
||||
mz "^2.7.0"
|
||||
progress "^2.0.3"
|
||||
read-package-up "^11.0.0"
|
||||
resolve-pkg "^2.0.0"
|
||||
semver "7.5.3"
|
||||
semver "7.7.1"
|
||||
string-argv "0.3.1"
|
||||
supports-color "^8.1.1"
|
||||
tmp "0.2.3"
|
||||
type-fest "^4.8.3"
|
||||
type-fest "^4.41.0"
|
||||
util-arity "^1.1.0"
|
||||
yaml "^2.2.2"
|
||||
yup "1.2.0"
|
||||
yup "1.6.1"
|
||||
|
||||
"@cucumber/gherkin-streams@5.0.1":
|
||||
version "5.0.1"
|
||||
@ -1145,15 +1143,15 @@
|
||||
commander "9.1.0"
|
||||
source-map-support "0.5.21"
|
||||
|
||||
"@cucumber/gherkin-utils@9.0.0":
|
||||
version "9.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/gherkin-utils/-/gherkin-utils-9.0.0.tgz#944c64c458742d8e73b750e5dde2cf56b161d674"
|
||||
integrity sha512-clk4q39uj7pztZuZtyI54V8lRsCUz0Y/p8XRjIeHh7ExeEztpWkp4ca9q1FjUOPfQQ8E7OgqFbqoQQXZ1Bx7fw==
|
||||
"@cucumber/gherkin-utils@9.2.0":
|
||||
version "9.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/gherkin-utils/-/gherkin-utils-9.2.0.tgz#42c50a6232022f5a17ca677a734daa4a15d0b6e1"
|
||||
integrity sha512-3nmRbG1bUAZP3fAaUBNmqWO0z0OSkykZZotfLjyhc8KWwDSOrOmMJlBTd474lpA8EWh4JFLAX3iXgynBqBvKzw==
|
||||
dependencies:
|
||||
"@cucumber/gherkin" "^28.0.0"
|
||||
"@cucumber/messages" "^24.0.0"
|
||||
"@cucumber/gherkin" "^31.0.0"
|
||||
"@cucumber/messages" "^27.0.0"
|
||||
"@teppeis/multimaps" "3.0.0"
|
||||
commander "12.0.0"
|
||||
commander "13.1.0"
|
||||
source-map-support "^0.5.21"
|
||||
|
||||
"@cucumber/gherkin@30.0.4", "@cucumber/gherkin@^30.0.0":
|
||||
@ -1163,17 +1161,17 @@
|
||||
dependencies:
|
||||
"@cucumber/messages" ">=19.1.4 <=26"
|
||||
|
||||
"@cucumber/gherkin@^28.0.0":
|
||||
version "28.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-28.0.0.tgz#91246da622524807b21430c1692bedd319d3d4bb"
|
||||
integrity sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==
|
||||
"@cucumber/gherkin@^31.0.0":
|
||||
version "31.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-31.0.0.tgz#12cff1a6e92b7d30cc5e374e91fbdd2135064aad"
|
||||
integrity sha512-wlZfdPif7JpBWJdqvHk1Mkr21L5vl4EfxVUOS4JinWGf3FLRV6IKUekBv5bb5VX79fkDcfDvESzcQ8WQc07Wgw==
|
||||
dependencies:
|
||||
"@cucumber/messages" ">=19.1.4 <=24"
|
||||
"@cucumber/messages" ">=19.1.4 <=26"
|
||||
|
||||
"@cucumber/html-formatter@21.7.0", "@cucumber/html-formatter@^21.7.0":
|
||||
version "21.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-21.7.0.tgz#a4413738c4476836c9917bf9652aa0a45b93ab81"
|
||||
integrity sha512-bv211aY8mErp6CdmhN426E+7KIsVIES4fGx5ASMlUzYWiMus6NhSdI9UL3Vswx8JXJMgySeIcJJKfznREUFLNA==
|
||||
"@cucumber/html-formatter@21.10.1", "@cucumber/html-formatter@^21.7.0":
|
||||
version "21.10.1"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/html-formatter/-/html-formatter-21.10.1.tgz#53094f349912962b5673c83d995b53ec94f1972a"
|
||||
integrity sha512-isaaNMNnBYThsvaHy7i+9kkk9V3+rhgdkt0pd6TCY6zY1CSRZQ7tG6ST9pYyRaECyfbCeF7UGH0KpNEnh6UNvQ==
|
||||
|
||||
"@cucumber/junit-xml-formatter@0.7.1":
|
||||
version "0.7.1"
|
||||
@ -1190,25 +1188,15 @@
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/message-streams/-/message-streams-4.0.1.tgz#a5339d3504594bb2edb5732aaae94dddb24d0970"
|
||||
integrity sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==
|
||||
|
||||
"@cucumber/messages@27.0.2", "@cucumber/messages@^27.0.0":
|
||||
version "27.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-27.0.2.tgz#9b5ed8b6cf7b95e43576f6af1af9f5205f69e2a1"
|
||||
integrity sha512-jo2B+vYXmpuLOKh6Gc8loHl2E8svCkLvEXLVgFwVHqKWZJWBTa9yTRCPmZIxrz4fnO7Pr3N3vKQCPu73/gjlVQ==
|
||||
"@cucumber/messages@27.2.0", "@cucumber/messages@^27.0.0":
|
||||
version "27.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-27.2.0.tgz#ee0cc006a391568fb668d47a23ac2e5bf901ff3a"
|
||||
integrity sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==
|
||||
dependencies:
|
||||
"@types/uuid" "10.0.0"
|
||||
class-transformer "0.5.1"
|
||||
reflect-metadata "0.2.2"
|
||||
uuid "10.0.0"
|
||||
|
||||
"@cucumber/messages@>=19.1.4 <=24", "@cucumber/messages@^24.0.0":
|
||||
version "24.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-24.1.0.tgz#a212c97b0548144c3ccfae021a96d6c56d3841d3"
|
||||
integrity sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==
|
||||
dependencies:
|
||||
"@types/uuid" "9.0.8"
|
||||
class-transformer "0.5.1"
|
||||
reflect-metadata "0.2.1"
|
||||
uuid "9.0.1"
|
||||
uuid "11.0.5"
|
||||
|
||||
"@cucumber/messages@>=19.1.4 <=26":
|
||||
version "26.0.1"
|
||||
@ -1238,10 +1226,10 @@
|
||||
"@teppeis/multimaps" "3.0.0"
|
||||
assert "^2.1.0"
|
||||
|
||||
"@cucumber/tag-expressions@6.1.1", "@cucumber/tag-expressions@^6.1.0":
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-6.1.1.tgz#36bebd6af0870e03f71b5a34436b95f3c70ef7e8"
|
||||
integrity sha512-0oj5KTzf2DsR3DhL3hYeI9fP3nyKzs7TQdpl54uJelJ3W3Hlyyet2Hib+8LK7kNnqJsXENnJg9zahRYyrtvNEg==
|
||||
"@cucumber/tag-expressions@6.1.2", "@cucumber/tag-expressions@^6.1.0":
|
||||
version "6.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@cucumber/tag-expressions/-/tag-expressions-6.1.2.tgz#7d566bda8e8c5b782e10d5ca24f30218cec47e09"
|
||||
integrity sha512-xa3pER+ntZhGCxRXSguDTKEHTZpUUsp+RzTRNnit+vi5cqnk6abLdSLg5i3HZXU3c74nQ8afQC6IT507EN74oQ==
|
||||
|
||||
"@cypress/browserify-preprocessor@^3.0.2":
|
||||
version "3.0.2"
|
||||
@ -2271,11 +2259,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d"
|
||||
integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==
|
||||
|
||||
"@types/uuid@9.0.8":
|
||||
version "9.0.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba"
|
||||
integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==
|
||||
|
||||
"@types/web-bluetooth@^0.0.20":
|
||||
version "0.0.20"
|
||||
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
|
||||
@ -3725,16 +3708,16 @@ cli-spinners@^2.9.2:
|
||||
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
|
||||
integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
|
||||
|
||||
cli-table3@0.6.3:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2"
|
||||
integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==
|
||||
cli-table3@0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8"
|
||||
integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==
|
||||
dependencies:
|
||||
string-width "^4.2.0"
|
||||
optionalDependencies:
|
||||
"@colors/colors" "1.5.0"
|
||||
colors "1.4.0"
|
||||
|
||||
cli-table3@^0.6.0, cli-table3@~0.6.5:
|
||||
cli-table3@0.6.5, cli-table3@^0.6.0:
|
||||
version "0.6.5"
|
||||
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f"
|
||||
integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==
|
||||
@ -3825,6 +3808,11 @@ colors@1.0.3:
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
|
||||
integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==
|
||||
|
||||
colors@1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
|
||||
integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
|
||||
|
||||
combine-source-map@^0.8.0, combine-source-map@~0.8.0:
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
|
||||
@ -3847,10 +3835,10 @@ comma-separated-tokens@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee"
|
||||
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
|
||||
|
||||
commander@12.0.0:
|
||||
version "12.0.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592"
|
||||
integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==
|
||||
commander@13.1.0:
|
||||
version "13.1.0"
|
||||
resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46"
|
||||
integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==
|
||||
|
||||
commander@9.1.0:
|
||||
version "9.1.0"
|
||||
@ -4073,10 +4061,10 @@ cypress-network-idle@^1.15.0:
|
||||
resolved "https://registry.yarnpkg.com/cypress-network-idle/-/cypress-network-idle-1.15.0.tgz#e249f08695a46f1ddce18a95d5293937f277cbb3"
|
||||
integrity sha512-8zU16zhc7S3nMl1NTEEcNsZYlJy/ZzP2zPTTrngGxyXH32Ipake/xfHLZsgrzeWCieiS2AVhQsakhWqFzO3hpw==
|
||||
|
||||
cypress@^14.3.2:
|
||||
version "14.3.2"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-14.3.2.tgz#04a6ea66c1715119ef41dda5851d75801cc1e226"
|
||||
integrity sha512-n+yGD2ZFFKgy7I3YtVpZ7BcFYrrDMcKj713eOZdtxPttpBjCyw/R8dLlFSsJPouneGN7A/HOSRyPJ5+3/gKDoA==
|
||||
cypress@^14.4.0:
|
||||
version "14.4.0"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-14.4.0.tgz#db7d108400c9481a161f047f1cc34b43b05c48f3"
|
||||
integrity sha512-/I59Fqxo7fqdiDi3IM2QKA65gZ7+PVejXg404/I8ZSq+NOnrmw+2pnMUJzpoNyg7KABcEBmgpkfAqhV98p7wJA==
|
||||
dependencies:
|
||||
"@cypress/request" "^3.0.8"
|
||||
"@cypress/xvfb" "^1.2.4"
|
||||
@ -4091,7 +4079,7 @@ cypress@^14.3.2:
|
||||
check-more-types "^2.24.0"
|
||||
ci-info "^4.1.0"
|
||||
cli-cursor "^3.1.0"
|
||||
cli-table3 "~0.6.5"
|
||||
cli-table3 "0.6.1"
|
||||
commander "^6.2.1"
|
||||
common-tags "^1.8.0"
|
||||
dayjs "^1.10.4"
|
||||
@ -6366,22 +6354,10 @@ lru-cache@^5.1.1:
|
||||
dependencies:
|
||||
yallist "^3.0.2"
|
||||
|
||||
lru-cache@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
|
||||
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
luxon@3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.2.1.tgz#14f1af209188ad61212578ea7e3d518d18cee45f"
|
||||
integrity sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==
|
||||
|
||||
luxon@^3.5.0:
|
||||
version "3.5.0"
|
||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20"
|
||||
integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==
|
||||
luxon@3.6.1, luxon@^3.5.0:
|
||||
version "3.6.1"
|
||||
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.6.1.tgz#d283ffc4c0076cb0db7885ec6da1c49ba97e47b0"
|
||||
integrity sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==
|
||||
|
||||
magic-string@^0.30.11:
|
||||
version "0.30.12"
|
||||
@ -7494,11 +7470,6 @@ rechoir@^0.6.2:
|
||||
dependencies:
|
||||
resolve "^1.1.6"
|
||||
|
||||
reflect-metadata@0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.1.tgz#8d5513c0f5ef2b4b9c3865287f3c0940c1f67f74"
|
||||
integrity sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==
|
||||
|
||||
reflect-metadata@0.2.2:
|
||||
version "0.2.2"
|
||||
resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b"
|
||||
@ -7660,13 +7631,6 @@ resolve-pkg-maps@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f"
|
||||
integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
|
||||
|
||||
resolve-pkg@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-pkg/-/resolve-pkg-2.0.0.tgz#ac06991418a7623edc119084edc98b0e6bf05a41"
|
||||
integrity sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==
|
||||
dependencies:
|
||||
resolve-from "^5.0.0"
|
||||
|
||||
resolve@^1.1.4, resolve@^1.1.6, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.22.8, resolve@^1.4.0:
|
||||
version "1.22.8"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
|
||||
@ -7811,12 +7775,10 @@ seedrandom@^3.0.5:
|
||||
resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
|
||||
integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
|
||||
|
||||
semver@7.5.3:
|
||||
version "7.5.3"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e"
|
||||
integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==
|
||||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
semver@7.7.1, semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1:
|
||||
version "7.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
|
||||
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
|
||||
|
||||
semver@^5.6.0:
|
||||
version "5.7.2"
|
||||
@ -7828,11 +7790,6 @@ semver@^6.3.1:
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
|
||||
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
|
||||
|
||||
semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.7.1:
|
||||
version "7.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
|
||||
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
|
||||
|
||||
serialize-javascript@^6.0.2:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
|
||||
@ -8484,7 +8441,7 @@ tldts@^6.1.32:
|
||||
dependencies:
|
||||
tldts-core "^6.1.57"
|
||||
|
||||
tmp@0.2.3, tmp@~0.2.3:
|
||||
tmp@~0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
|
||||
integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
|
||||
@ -8599,10 +8556,10 @@ type-fest@^2.19.0:
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b"
|
||||
integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==
|
||||
|
||||
type-fest@^4.6.0, type-fest@^4.7.1, type-fest@^4.8.3:
|
||||
version "4.33.0"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.33.0.tgz#2da0c135b9afa76cf8b18ecfd4f260ecd414a432"
|
||||
integrity sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==
|
||||
type-fest@^4.41.0, type-fest@^4.6.0, type-fest@^4.7.1:
|
||||
version "4.41.0"
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58"
|
||||
integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==
|
||||
|
||||
typedarray@^0.0.6:
|
||||
version "0.0.6"
|
||||
@ -8812,10 +8769,10 @@ uuid@10.0.0, uuid@^10.0.0:
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294"
|
||||
integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==
|
||||
|
||||
uuid@9.0.1:
|
||||
version "9.0.1"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
|
||||
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
|
||||
uuid@11.0.5:
|
||||
version "11.0.5"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62"
|
||||
integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==
|
||||
|
||||
uuid@^11.0.5:
|
||||
version "11.1.0"
|
||||
@ -9211,11 +9168,6 @@ yallist@^3.0.2:
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yaml@^2.2.2:
|
||||
version "2.3.4"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2"
|
||||
@ -9292,10 +9244,10 @@ yoctocolors@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/yoctocolors/-/yoctocolors-2.1.1.tgz#e0167474e9fbb9e8b3ecca738deaa61dd12e56fc"
|
||||
integrity sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==
|
||||
|
||||
yup@1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/yup/-/yup-1.2.0.tgz#9e51af0c63bdfc9be0fdc6c10aa0710899d8aff6"
|
||||
integrity sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==
|
||||
yup@1.6.1:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/yup/-/yup-1.6.1.tgz#8defcff9daaf9feac178029c0e13b616563ada4b"
|
||||
integrity sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==
|
||||
dependencies:
|
||||
property-expr "^2.0.5"
|
||||
tiny-case "^1.0.3"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user