diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index d1dca3781..b6098df11 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -15,7 +15,7 @@ if (require.resolve) { } // Use Cypress env or process.env -declare var Cypress: any | undefined +declare let Cypress: any | undefined const env = typeof Cypress !== 'undefined' ? Cypress.env() : process.env // eslint-disable-line no-undef const environment = { @@ -95,6 +95,7 @@ Object.entries(required).map((entry) => { if (!entry[1]) { throw new Error(`ERROR: "${entry[0]}" env variable is missing.`) } + return entry }) export default { diff --git a/backend/src/db/compiler.ts b/backend/src/db/compiler.ts index e01518c3d..8b09ac9c3 100644 --- a/backend/src/db/compiler.ts +++ b/backend/src/db/compiler.ts @@ -1,2 +1,2 @@ -const tsNode = require('ts-node'); -module.exports = tsNode.register; \ No newline at end of file +const tsNode = require('ts-node') +module.exports = tsNode.register diff --git a/backend/src/db/seed.ts b/backend/src/db/seed.ts index 9eb67abbf..67f8a36ad 100644 --- a/backend/src/db/seed.ts +++ b/backend/src/db/seed.ts @@ -278,7 +278,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] await Promise.all( categories.map(({ icon, name }, index) => { - Factory.build('category', { + return Factory.build('category', { id: `cat${index + 1}`, slug: name, name, diff --git a/backend/src/graphql/messages.ts b/backend/src/graphql/messages.ts index c51950cc8..4d2220f18 100644 --- a/backend/src/graphql/messages.ts +++ b/backend/src/graphql/messages.ts @@ -2,14 +2,8 @@ import gql from 'graphql-tag' export const createMessageMutation = () => { return gql` - mutation ( - $roomId: ID! - $content: String! - ) { - CreateMessage( - roomId: $roomId - content: $content - ) { + mutation ($roomId: ID!, $content: String!) { + CreateMessage(roomId: $roomId, content: $content) { id content } @@ -19,7 +13,7 @@ export const createMessageMutation = () => { export const messageQuery = () => { return gql` - query($roomId: ID!) { + query ($roomId: ID!) { Message(roomId: $roomId) { _id id diff --git a/backend/src/graphql/rooms.ts b/backend/src/graphql/rooms.ts index 1c2120fb0..109bf1d55 100644 --- a/backend/src/graphql/rooms.ts +++ b/backend/src/graphql/rooms.ts @@ -2,12 +2,8 @@ import gql from 'graphql-tag' export const createRoomMutation = () => { return gql` - mutation ( - $userId: ID! - ) { - CreateRoom( - userId: $userId - ) { + mutation ($userId: ID!) { + CreateRoom(userId: $userId) { id roomId } diff --git a/backend/src/middleware/notifications/notificationsMiddleware.spec.ts b/backend/src/middleware/notifications/notificationsMiddleware.spec.ts index f0857ee29..6cec5c940 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.spec.ts +++ b/backend/src/middleware/notifications/notificationsMiddleware.spec.ts @@ -50,7 +50,7 @@ beforeAll(async () => { context: () => { return { user: authenticatedUser, - neode: neode, + neode, driver, } }, diff --git a/backend/src/middleware/slugify/uniqueSlug.spec.ts b/backend/src/middleware/slugify/uniqueSlug.spec.ts index d002eae03..659a439c2 100644 --- a/backend/src/middleware/slugify/uniqueSlug.spec.ts +++ b/backend/src/middleware/slugify/uniqueSlug.spec.ts @@ -1,22 +1,22 @@ import uniqueSlug from './uniqueSlug' describe('uniqueSlug', () => { - it('slugifies given string', () => { + it('slugifies given string', async () => { const string = 'Hello World' const isUnique = jest.fn().mockResolvedValue(true) - expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world') + await expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world') }) - it('increments slugified string until unique', () => { + it('increments slugified string until unique', async () => { const string = 'Hello World' const isUnique = jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true) - expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world-1') + await expect(uniqueSlug(string, isUnique)).resolves.toEqual('hello-world-1') }) - it('slugify null string', () => { + it('slugify null string', async () => { const string = null const isUnique = jest.fn().mockResolvedValue(true) - expect(uniqueSlug(string, isUnique)).resolves.toEqual('anonymous') + await expect(uniqueSlug(string, isUnique)).resolves.toEqual('anonymous') }) it('Converts umlaut to a two letter equivalent', async () => { diff --git a/backend/src/models/index.ts b/backend/src/models/index.ts index c75ad31ef..f7d338684 100644 --- a/backend/src/models/index.ts +++ b/backend/src/models/index.ts @@ -1,38 +1,29 @@ // NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm // module that is not browser-compatible. Node's `fs` module is server-side only -declare var Cypress: any | undefined +declare let Cypress: any | undefined export default { Image: typeof Cypress !== 'undefined' ? require('./Image') : require('./Image').default, Badge: typeof Cypress !== 'undefined' ? require('./Badge') : require('./Badge').default, User: typeof Cypress !== 'undefined' ? require('./User') : require('./User').default, Group: typeof Cypress !== 'undefined' ? require('./Group') : require('./Group').default, EmailAddress: - typeof Cypress !== 'undefined' - ? require('./EmailAddress') - : require('./EmailAddress').default, + typeof Cypress !== 'undefined' ? require('./EmailAddress') : require('./EmailAddress').default, UnverifiedEmailAddress: typeof Cypress !== 'undefined' ? require('./UnverifiedEmailAddress') : require('./UnverifiedEmailAddress').default, SocialMedia: - typeof Cypress !== 'undefined' - ? require('./SocialMedia') - : require('./SocialMedia').default, + typeof Cypress !== 'undefined' ? require('./SocialMedia') : require('./SocialMedia').default, Post: typeof Cypress !== 'undefined' ? require('./Post') : require('./Post').default, - Comment: - typeof Cypress !== 'undefined' ? require('./Comment') : require('./Comment').default, - Category: - typeof Cypress !== 'undefined' ? require('./Category') : require('./Category').default, + Comment: typeof Cypress !== 'undefined' ? require('./Comment') : require('./Comment').default, + Category: typeof Cypress !== 'undefined' ? require('./Category') : require('./Category').default, Tag: typeof Cypress !== 'undefined' ? require('./Tag') : require('./Tag').default, - Location: - typeof Cypress !== 'undefined' ? require('./Location') : require('./Location').default, + Location: typeof Cypress !== 'undefined' ? require('./Location') : require('./Location').default, Donations: typeof Cypress !== 'undefined' ? require('./Donations') : require('./Donations').default, Report: typeof Cypress !== 'undefined' ? require('./Report') : require('./Report').default, Migration: typeof Cypress !== 'undefined' ? require('./Migration') : require('./Migration').default, InviteCode: - typeof Cypress !== 'undefined' - ? require('./InviteCode') - : require('./InviteCode').default, + typeof Cypress !== 'undefined' ? require('./InviteCode') : require('./InviteCode').default, } diff --git a/backend/src/schema/resolvers/images/images.spec.ts b/backend/src/schema/resolvers/images/images.spec.ts index b14c59f28..d46972ce0 100644 --- a/backend/src/schema/resolvers/images/images.spec.ts +++ b/backend/src/schema/resolvers/images/images.spec.ts @@ -170,6 +170,7 @@ describe('mergeImage', () => { }) }) + // eslint-disable-next-line jest/no-disabled-tests it.skip('automatically creates different image sizes', async () => { await expect( mergeImage(post, 'HERO_IMAGE', imageInput, { uploadCallback, deleteCallback }), diff --git a/backend/src/schema/resolvers/messages.spec.ts b/backend/src/schema/resolvers/messages.spec.ts index 3ee905be9..45fb10609 100644 --- a/backend/src/schema/resolvers/messages.spec.ts +++ b/backend/src/schema/resolvers/messages.spec.ts @@ -34,43 +34,40 @@ afterAll(async () => { driver.close() }) - describe('Message', () => { let roomId: string beforeAll(async () => { - [chattingUser, otherChattingUser, notChattingUser] = await Promise.all([ - Factory.build( - 'user', - { - id: 'chatting-user', - name: 'Chatting User', - }, - ), - Factory.build( - 'user', - { - id: 'other-chatting-user', - name: 'Other Chatting User', - }, - ), - Factory.build( - 'user', - { - id: 'not-chatting-user', - name: 'Not Chatting User', - }, - ), + ;[chattingUser, otherChattingUser, notChattingUser] = await Promise.all([ + Factory.build('user', { + id: 'chatting-user', + name: 'Chatting User', + }), + Factory.build('user', { + id: 'other-chatting-user', + name: 'Other Chatting User', + }), + Factory.build('user', { + id: 'not-chatting-user', + name: 'Not Chatting User', + }), ]) }) describe('create message', () => { describe('unauthenticated', () => { it('throws authorization error', async () => { - await expect(mutate({ mutation: createMessageMutation(), variables: { - roomId: 'some-id', content: 'Some bla bla bla', } })).resolves.toMatchObject({ - errors: [{ message: 'Not Authorized!' }], - }) + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId: 'some-id', + content: 'Some bla bla bla', + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) }) }) @@ -81,13 +78,20 @@ describe('Message', () => { describe('room does not exist', () => { it('returns null', async () => { - await expect(mutate({ mutation: createMessageMutation(), variables: { - roomId: 'some-id', content: 'Some bla bla bla', } })).resolves.toMatchObject({ - errors: undefined, - data: { - CreateMessage: null, + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId: 'some-id', + content: 'Some bla bla bla', }, - }) + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateMessage: null, + }, + }) }) }) @@ -104,20 +108,23 @@ describe('Message', () => { describe('user chats in room', () => { it('returns the message', async () => { - await expect(mutate({ - mutation: createMessageMutation(), - variables: { - roomId, - content: 'Some nice message to other chatting user', - } })).resolves.toMatchObject({ - errors: undefined, - data: { - CreateMessage: { - id: expect.any(String), - content: 'Some nice message to other chatting user', - }, + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: 'Some nice message to other chatting user', }, - }) + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateMessage: { + id: expect.any(String), + content: 'Some nice message to other chatting user', + }, + }, + }) }) }) @@ -125,19 +132,22 @@ describe('Message', () => { beforeAll(async () => { authenticatedUser = await notChattingUser.toJson() }) - + it('returns null', async () => { - await expect(mutate({ - mutation: createMessageMutation(), - variables: { - roomId, - content: 'I have no access to this room!', - } })).resolves.toMatchObject({ - errors: undefined, - data: { - CreateMessage: null, + await expect( + mutate({ + mutation: createMessageMutation(), + variables: { + roomId, + content: 'I have no access to this room!', }, - }) + }), + ).resolves.toMatchObject({ + errors: undefined, + data: { + CreateMessage: null, + }, + }) }) }) }) @@ -151,14 +161,17 @@ describe('Message', () => { }) it('throws authorization error', async () => { - await expect(query({ - query: messageQuery(), - variables: { - roomId: 'some-id' } - })).resolves.toMatchObject({ + await expect( + query({ + query: messageQuery(), + variables: { + roomId: 'some-id', + }, + }), + ).resolves.toMatchObject({ errors: [{ message: 'Not Authorized!' }], }) - }) + }) }) describe('authenticated', () => { @@ -168,12 +181,14 @@ describe('Message', () => { describe('room does not exists', () => { it('returns null', async () => { - await expect(query({ - query: messageQuery(), - variables: { - roomId: 'some-id' - }, - })).resolves.toMatchObject({ + await expect( + query({ + query: messageQuery(), + variables: { + roomId: 'some-id', + }, + }), + ).resolves.toMatchObject({ errors: undefined, data: { Message: [], @@ -193,15 +208,17 @@ describe('Message', () => { expect(result).toMatchObject({ errors: undefined, data: { - Message: [{ - id: expect.any(String), - _id: result.data.Message[0].id, - content: 'Some nice message to other chatting user', - senderId: 'chatting-user', - username: 'Chatting User', - avatar: expect.any(String), - date: expect.any(String), - }], + Message: [ + { + id: expect.any(String), + _id: result.data.Message[0].id, + content: 'Some nice message to other chatting user', + senderId: 'chatting-user', + username: 'Chatting User', + avatar: expect.any(String), + date: expect.any(String), + }, + ], }, }) }) @@ -213,7 +230,7 @@ describe('Message', () => { variables: { roomId, content: 'A nice response message to chatting user', - } + }, }) authenticatedUser = await chattingUser.toJson() await mutate({ @@ -221,17 +238,19 @@ describe('Message', () => { variables: { roomId, content: 'And another nice message to other chatting user', - } - }) - }) - - it('returns the messages', async () => { - await expect(query({ - query: messageQuery(), - variables: { - roomId, }, - })).resolves.toMatchObject({ + }) + }) + + it('returns the messages', async () => { + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + }, + }), + ).resolves.toMatchObject({ errors: undefined, data: { Message: [ @@ -263,7 +282,7 @@ describe('Message', () => { }, }) }) - }) + }) }) describe('room exists, authenticated user not in room', () => { @@ -272,19 +291,21 @@ describe('Message', () => { }) it('returns null', async () => { - await expect(query({ - query: messageQuery(), - variables: { - roomId, - }, - })).resolves.toMatchObject({ + await expect( + query({ + query: messageQuery(), + variables: { + roomId, + }, + }), + ).resolves.toMatchObject({ errors: undefined, data: { Message: [], }, }) }) - }) + }) }) }) }) diff --git a/backend/src/schema/resolvers/messages.ts b/backend/src/schema/resolvers/messages.ts index 0be0298d1..b93cffe06 100644 --- a/backend/src/schema/resolvers/messages.ts +++ b/backend/src/schema/resolvers/messages.ts @@ -25,7 +25,9 @@ export default { Mutation: { CreateMessage: async (_parent, params, context, _resolveInfo) => { const { roomId, content } = params - const { user: { id: currentUserId } } = context + const { + user: { id: currentUserId }, + } = context const session = context.driver.session() const writeTxResultPromise = session.writeTransaction(async (transaction) => { const createMessageCypher = ` @@ -37,13 +39,14 @@ export default { })-[:INSIDE]->(room) RETURN message { .* } ` - const createMessageTxResponse = await transaction.run( - createMessageCypher, - { currentUserId, roomId, content } - ) + const createMessageTxResponse = await transaction.run(createMessageCypher, { + currentUserId, + roomId, + content, + }) const [message] = await createMessageTxResponse.records.map((record) => - record.get('message'), - ) + record.get('message'), + ) return message }) try { @@ -53,7 +56,7 @@ export default { throw new Error(error) } finally { session.close() - } + } }, }, Message: { @@ -61,7 +64,7 @@ export default { hasOne: { author: '<-[:CREATED]-(related:User)', room: '-[:INSIDE]->(related:Room)', - } + }, }), - } + }, } diff --git a/backend/src/schema/resolvers/notifications.spec.ts b/backend/src/schema/resolvers/notifications.spec.ts index 9deaea457..60539d77f 100644 --- a/backend/src/schema/resolvers/notifications.spec.ts +++ b/backend/src/schema/resolvers/notifications.spec.ts @@ -238,7 +238,7 @@ describe('given some notifications', () => { variables: { ...variables, read: false }, }) await expect(response).toMatchObject(expected) - await expect(response.data.notifications.length).toEqual(2) // double-check + await expect(response.data.notifications).toHaveLength(2) // double-check }) describe('if a resource gets deleted', () => { diff --git a/backend/src/schema/resolvers/posts.spec.ts b/backend/src/schema/resolvers/posts.spec.ts index 87d09e262..7a549449f 100644 --- a/backend/src/schema/resolvers/posts.spec.ts +++ b/backend/src/schema/resolvers/posts.spec.ts @@ -907,6 +907,7 @@ describe('UpdatePost', () => { }) }) + // eslint-disable-next-line jest/no-disabled-tests describe.skip('params.image', () => { describe('is object', () => { beforeEach(() => { diff --git a/backend/src/schema/resolvers/registration.ts b/backend/src/schema/resolvers/registration.ts index c988acfb2..8d5aac346 100644 --- a/backend/src/schema/resolvers/registration.ts +++ b/backend/src/schema/resolvers/registration.ts @@ -28,7 +28,7 @@ export default { }, SignupVerification: async (_parent, args, context) => { const { termsAndConditionsAgreedVersion } = args - const regEx = new RegExp(/^[0-9]+\.[0-9]+\.[0-9]+$/g) + const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g if (!regEx.test(termsAndConditionsAgreedVersion)) { throw new UserInputError('Invalid version format!') } diff --git a/backend/src/schema/resolvers/reports.spec.ts b/backend/src/schema/resolvers/reports.spec.ts index 96ef07d03..4cc39c034 100644 --- a/backend/src/schema/resolvers/reports.spec.ts +++ b/backend/src/schema/resolvers/reports.spec.ts @@ -725,20 +725,20 @@ describe('file a report on a resource', () => { authenticatedUser = null }) - describe('unauthenticated', () => { + describe('unauthenticated', async () => { it('throws authorization error', async () => { authenticatedUser = null - expect(query({ query: reportsQuery })).resolves.toMatchObject({ + await expect(query({ query: reportsQuery })).resolves.toMatchObject({ data: { reports: null }, errors: [{ message: 'Not Authorized!' }], }) }) }) - describe('authenticated', () => { + describe('authenticated', async () => { it('role "user" gets no reports', async () => { authenticatedUser = await currentUser.toJson() - expect(query({ query: reportsQuery })).resolves.toMatchObject({ + await expect(query({ query: reportsQuery })).resolves.toMatchObject({ data: { reports: null }, errors: [{ message: 'Not Authorized!' }], }) diff --git a/backend/src/schema/resolvers/rooms.spec.ts b/backend/src/schema/resolvers/rooms.spec.ts index 945facd05..d27c64e57 100644 --- a/backend/src/schema/resolvers/rooms.spec.ts +++ b/backend/src/schema/resolvers/rooms.spec.ts @@ -35,56 +35,55 @@ afterAll(async () => { describe('Room', () => { beforeAll(async () => { - [chattingUser, otherChattingUser, notChattingUser] = await Promise.all([ - Factory.build( - 'user', - { - id: 'chatting-user', - name: 'Chatting User', - }, - ), - Factory.build( - 'user', - { - id: 'other-chatting-user', - name: 'Other Chatting User', - }, - ), - Factory.build( - 'user', - { - id: 'not-chatting-user', - name: 'Not Chatting User', - }, - ), + ;[chattingUser, otherChattingUser, notChattingUser] = await Promise.all([ + Factory.build('user', { + id: 'chatting-user', + name: 'Chatting User', + }), + Factory.build('user', { + id: 'other-chatting-user', + name: 'Other Chatting User', + }), + Factory.build('user', { + id: 'not-chatting-user', + name: 'Not Chatting User', + }), ]) }) describe('create room', () => { describe('unauthenticated', () => { it('throws authorization error', async () => { - await expect(mutate({ mutation: createRoomMutation(), variables: { - userId: 'some-id' } })).resolves.toMatchObject({ - errors: [{ message: 'Not Authorized!' }], - }) + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'some-id', + }, + }), + ).resolves.toMatchObject({ + errors: [{ message: 'Not Authorized!' }], + }) }) }) describe('authenticated', () => { let roomId: string - + beforeAll(async () => { authenticatedUser = await chattingUser.toJson() }) describe('user id does not exist', () => { it('returns null', async () => { - await expect(mutate({ - mutation: createRoomMutation(), - variables: { - userId: 'not-existing-user', - }, - })).resolves.toMatchObject({ + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'not-existing-user', + }, + }), + ).resolves.toMatchObject({ errors: undefined, data: { CreateRoom: null, @@ -92,7 +91,7 @@ describe('Room', () => { }) }) }) - + describe('user id exists', () => { it('returns the id of the room', async () => { const result = await mutate({ @@ -116,12 +115,14 @@ describe('Room', () => { describe('create room with same user id', () => { it('returns the id of the room', async () => { - await expect(mutate({ - mutation: createRoomMutation(), - variables: { - userId: 'other-chatting-user', - }, - })).resolves.toMatchObject({ + await expect( + mutate({ + mutation: createRoomMutation(), + variables: { + userId: 'other-chatting-user', + }, + }), + ).resolves.toMatchObject({ errors: undefined, data: { CreateRoom: { @@ -130,7 +131,7 @@ describe('Room', () => { }, }) }) - }) + }) }) }) @@ -139,11 +140,11 @@ describe('Room', () => { beforeAll(() => { authenticatedUser = null }) - + it('throws authorization error', async () => { await expect(query({ query: roomQuery() })).resolves.toMatchObject({ - errors: [{ message: 'Not Authorized!' }], - }) + errors: [{ message: 'Not Authorized!' }], + }) }) }) @@ -194,7 +195,7 @@ describe('Room', () => { }) it('returns the room', async () => { - const result = await query({ query: roomQuery() }) + const result = await query({ query: roomQuery() }) expect(result).toMatchObject({ errors: undefined, data: { @@ -241,7 +242,7 @@ describe('Room', () => { }, }) }) - }) + }) }) }) }) diff --git a/backend/src/schema/resolvers/rooms.ts b/backend/src/schema/resolvers/rooms.ts index bf0e6b8a6..2fe621d23 100644 --- a/backend/src/schema/resolvers/rooms.ts +++ b/backend/src/schema/resolvers/rooms.ts @@ -3,7 +3,7 @@ import Resolver from './helpers/Resolver' export default { Query: { - Room: async (object, params, context, resolveInfo) => { + Room: async (object, params, context, resolveInfo) => { if (!params.filter) params.filter = {} params.filter.users_some = { id: context.user.id, @@ -25,7 +25,9 @@ export default { Mutation: { CreateRoom: async (_parent, params, context, _resolveInfo) => { const { userId } = params - const { user: { id: currentUserId } } = context + const { + user: { id: currentUserId }, + } = context const session = context.driver.session() const writeTxResultPromise = session.writeTransaction(async (transaction) => { const createRoomCypher = ` @@ -37,13 +39,11 @@ export default { room.id = apoc.create.uuid() RETURN room { .* } ` - const createRommTxResponse = await transaction.run( - createRoomCypher, - { userId, currentUserId } - ) - const [room] = await createRommTxResponse.records.map((record) => - record.get('room'), - ) + const createRommTxResponse = await transaction.run(createRoomCypher, { + userId, + currentUserId, + }) + const [room] = await createRommTxResponse.records.map((record) => record.get('room')) return room }) try { @@ -56,14 +56,14 @@ export default { throw new Error(error) } finally { session.close() - } + } }, }, Room: { ...Resolver('Room', { hasMany: { users: '<-[:CHATS_IN]-(related:User)', - } + }, }), - } + }, } diff --git a/backend/src/schema/resolvers/users.spec.ts b/backend/src/schema/resolvers/users.spec.ts index f256c6363..bc976fb24 100644 --- a/backend/src/schema/resolvers/users.spec.ts +++ b/backend/src/schema/resolvers/users.spec.ts @@ -590,7 +590,7 @@ describe('save category settings', () => { beforeEach(async () => { await Promise.all( categories.map(({ icon, name }, index) => { - Factory.build('category', { + return Factory.build('category', { id: `cat${index + 1}`, slug: name, name, diff --git a/backend/src/schema/resolvers/users.ts b/backend/src/schema/resolvers/users.ts index 513b1a28f..6f79a4ea9 100644 --- a/backend/src/schema/resolvers/users.ts +++ b/backend/src/schema/resolvers/users.ts @@ -144,7 +144,7 @@ export default { params.locationName = params.locationName === '' ? null : params.locationName const { termsAndConditionsAgreedVersion } = params if (termsAndConditionsAgreedVersion) { - const regEx = new RegExp(/^[0-9]+\.[0-9]+\.[0-9]+$/g) + const regEx = /^[0-9]+\.[0-9]+\.[0-9]+$/g if (!regEx.test(termsAndConditionsAgreedVersion)) { throw new ForbiddenError('Invalid version format!') }