Merge branch 'master' of github.com:Ocelot-Social-Community/Ocelot-Social into brand-reformer-network-first-step

This commit is contained in:
Wolfgang Huß 2025-05-25 17:41:06 +02:00
commit 630abc0241
26 changed files with 1088 additions and 873 deletions

View File

@ -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

View File

@ -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",

View 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
}
}
}
`

View 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
}
}
`

View File

@ -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)
})
})
})
})

View File

@ -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) => {

View File

@ -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) => {

View File

@ -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) => {

View File

@ -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)

View File

@ -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 {

View File

@ -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
View File

@ -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"
},

View File

@ -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",

View File

@ -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({

View File

@ -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

View File

@ -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 } })

View File

@ -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,
})

View File

@ -388,6 +388,11 @@ export const updateUserMutation = () => {
avatar {
url
}
badgeVerification {
id
description
icon
}
}
}
`

View File

@ -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",

View File

@ -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', () => {

View File

@ -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

View File

@ -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,
})
},
})

View File

@ -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

View File

@ -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
View File

@ -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"