diff --git a/backend/package.json b/backend/package.json index d9e534ded..2dd86e456 100644 --- a/backend/package.json +++ b/backend/package.json @@ -72,19 +72,19 @@ "lodash": "~4.17.14", "merge-graphql-schemas": "^1.7.0", "metascraper": "^4.10.3", - "metascraper-audio": "^5.5.0", + "metascraper-audio": "^5.6.5", "metascraper-author": "^5.6.3", "metascraper-clearbit-logo": "^5.3.0", - "metascraper-date": "^5.6.3", - "metascraper-description": "^5.5.0", + "metascraper-date": "^5.6.5", + "metascraper-description": "^5.6.5", "metascraper-image": "^5.6.3", "metascraper-lang": "^5.6.3", "metascraper-lang-detector": "^4.8.5", - "metascraper-logo": "^5.5.0", - "metascraper-publisher": "^5.6.3", - "metascraper-soundcloud": "^5.5.3", + "metascraper-logo": "^5.6.5", + "metascraper-publisher": "^5.6.5", + "metascraper-soundcloud": "^5.6.5", "metascraper-title": "^5.6.3", - "metascraper-url": "^5.5.0", + "metascraper-url": "^5.6.5", "metascraper-video": "^5.6.3", "metascraper-youtube": "^5.6.3", "neo4j-driver": "~1.7.5", @@ -115,7 +115,7 @@ "cucumber": "~5.1.0", "eslint": "~6.1.0", "eslint-config-prettier": "~6.0.0", - "eslint-config-standard": "~12.0.0", + "eslint-config-standard": "~13.0.1", "eslint-plugin-import": "~2.18.2", "eslint-plugin-jest": "~22.14.1", "eslint-plugin-node": "~9.1.0", diff --git a/backend/src/activitypub/ActivityPub.js b/backend/src/activitypub/ActivityPub.js index 12671f330..cd16f620e 100644 --- a/backend/src/activitypub/ActivityPub.js +++ b/backend/src/activitypub/ActivityPub.js @@ -35,8 +35,8 @@ export default class ActivityPub { handleFollowActivity(activity) { debug(`inside FOLLOW ${activity.actor}`) - let toActorName = extractNameFromId(activity.object) - let fromDomain = extractDomainFromUrl(activity.actor) + const toActorName = extractNameFromId(activity.object) + const fromDomain = extractDomainFromUrl(activity.actor) const dataSource = this.dataSource return new Promise((resolve, reject) => { @@ -53,7 +53,7 @@ export default class ActivityPub { toActorObject = JSON.parse(toActorObject) await this.dataSource.addSharedInboxEndpoint(toActorObject.endpoints.sharedInbox) - let followersCollectionPage = await this.dataSource.getFollowersCollectionPage( + const followersCollectionPage = await this.dataSource.getFollowersCollectionPage( activity.object, ) @@ -222,6 +222,7 @@ export default class ActivityPub { }) } } + async trySend(activity, fromName, host, url, tries = 5) { try { return await signAndSend(activity, fromName, host, url) diff --git a/backend/src/activitypub/Collections.js b/backend/src/activitypub/Collections.js index 641db596a..4040468cf 100644 --- a/backend/src/activitypub/Collections.js +++ b/backend/src/activitypub/Collections.js @@ -2,6 +2,7 @@ export default class Collections { constructor(dataSource) { this.dataSource = dataSource } + getFollowersCollection(actorId) { return this.dataSource.getFollowersCollection(actorId) } diff --git a/backend/src/activitypub/NitroDataSource.js b/backend/src/activitypub/NitroDataSource.js index 0900bed6c..dfdbf6c14 100644 --- a/backend/src/activitypub/NitroDataSource.js +++ b/backend/src/activitypub/NitroDataSource.js @@ -303,6 +303,7 @@ export default class NitroDataSource { }), ) } + async saveFollowingCollectionPage(followingCollection, onlyNewestItem = true) { debug('inside saveFollowers') let orderedItems = followingCollection.orderedItems @@ -470,6 +471,7 @@ export default class NitroDataSource { throwErrorIfApolloErrorOccurred(result) return result.data.SharedInboxEnpoint } + async addSharedInboxEndpoint(uri) { try { const result = await this.client.mutate({ diff --git a/backend/src/activitypub/security/index.js b/backend/src/activitypub/security/index.js index 9b48b7ed9..05642ed26 100644 --- a/backend/src/activitypub/security/index.js +++ b/backend/src/activitypub/security/index.js @@ -97,7 +97,7 @@ export function verifySignature(url, headers) { // private: signing function constructSigningString(url, headers) { const urlObj = new URL(url) - let signingString = `(request-target): post ${urlObj.pathname}${ + const signingString = `(request-target): post ${urlObj.pathname}${ urlObj.search !== '' ? urlObj.search : '' }` return Object.keys(headers).reduce((result, key) => { diff --git a/backend/src/activitypub/utils/index.js b/backend/src/activitypub/utils/index.js index 3927f4056..5f26c635f 100644 --- a/backend/src/activitypub/utils/index.js +++ b/backend/src/activitypub/utils/index.js @@ -40,70 +40,72 @@ export function signAndSend(activity, fromName, targetDomain, url) { // fix for development: replace with http url = url.indexOf('localhost') > -1 ? url.replace('https', 'http') : url debug(`passhprase = ${CONFIG.PRIVATE_KEY_PASSPHRASE}`) - return new Promise(async (resolve, reject) => { + return new Promise((resolve, reject) => { debug('inside signAndSend') // get the private key - const result = await activityPub.dataSource.client.query({ - query: gql` + activityPub.dataSource.client + .query({ + query: gql` query { User(slug: "${fromName}") { privateKey } } `, - }) + }) + .then(result => { + if (result.error) { + reject(result.error) + } else { + // add security context + const parsedActivity = JSON.parse(activity) + if (Array.isArray(parsedActivity['@context'])) { + parsedActivity['@context'].push('https://w3id.org/security/v1') + } else { + const context = [parsedActivity['@context']] + context.push('https://w3id.org/security/v1') + parsedActivity['@context'] = context + } - if (result.error) { - reject(result.error) - } else { - // add security context - const parsedActivity = JSON.parse(activity) - if (Array.isArray(parsedActivity['@context'])) { - parsedActivity['@context'].push('https://w3id.org/security/v1') - } else { - const context = [parsedActivity['@context']] - context.push('https://w3id.org/security/v1') - parsedActivity['@context'] = context - } + // deduplicate context strings + parsedActivity['@context'] = [...new Set(parsedActivity['@context'])] + const privateKey = result.data.User[0].privateKey + const date = new Date().toUTCString() - // deduplicate context strings - parsedActivity['@context'] = [...new Set(parsedActivity['@context'])] - const privateKey = result.data.User[0].privateKey - const date = new Date().toUTCString() - - debug(`url = ${url}`) - request( - { - url: url, - headers: { - Host: targetDomain, - Date: date, - Signature: createSignature({ - privateKey, - keyId: `${activityPub.endpoint}/activitypub/users/${fromName}#main-key`, - url, + debug(`url = ${url}`) + request( + { + url: url, headers: { Host: targetDomain, Date: date, + Signature: createSignature({ + privateKey, + keyId: `${activityPub.endpoint}/activitypub/users/${fromName}#main-key`, + url, + headers: { + Host: targetDomain, + Date: date, + 'Content-Type': 'application/activity+json', + }, + }), 'Content-Type': 'application/activity+json', }, - }), - 'Content-Type': 'application/activity+json', - }, - method: 'POST', - body: JSON.stringify(parsedActivity), - }, - (error, response) => { - if (error) { - debug(`Error = ${JSON.stringify(error, null, 2)}`) - reject(error) - } else { - debug('Response Headers:', JSON.stringify(response.headers, null, 2)) - debug('Response Body:', JSON.stringify(response.body, null, 2)) - resolve() - } - }, - ) - } + method: 'POST', + body: JSON.stringify(parsedActivity), + }, + (error, response) => { + if (error) { + debug(`Error = ${JSON.stringify(error, null, 2)}`) + reject(error) + } else { + debug('Response Headers:', JSON.stringify(response.headers, null, 2)) + debug('Response Body:', JSON.stringify(response.body, null, 2)) + resolve() + } + }, + ) + } + }) }) } diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index dc685e20c..52f5a8474 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -103,8 +103,6 @@ const invitationLimitReached = rule({ return record.get('limitReached') }) return limitReached - } catch (e) { - throw e } finally { session.close() } diff --git a/backend/src/middleware/slugify/uniqueSlug.js b/backend/src/middleware/slugify/uniqueSlug.js index 69aef2d1b..ca37cd562 100644 --- a/backend/src/middleware/slugify/uniqueSlug.js +++ b/backend/src/middleware/slugify/uniqueSlug.js @@ -1,6 +1,6 @@ import slugify from 'slug' export default async function uniqueSlug(string, isUnique) { - let slug = slugify(string || 'anonymous', { + const slug = slugify(string || 'anonymous', { lower: true, }) if (await isUnique(slug)) return slug diff --git a/backend/src/middleware/xssMiddleware.js b/backend/src/middleware/xssMiddleware.js index 06aa5b306..6894e8601 100644 --- a/backend/src/middleware/xssMiddleware.js +++ b/backend/src/middleware/xssMiddleware.js @@ -8,8 +8,8 @@ import linkifyHtml from 'linkifyjs/html' const embedToAnchor = content => { const $ = cheerio.load(content) $('div[data-url-embed]').each((i, el) => { - let url = el.attribs['data-url-embed'] - let aTag = $(`${url}`) + const url = el.attribs['data-url-embed'] + const aTag = $(`${url}`) $(el).replaceWith(aTag) }) return $('body').html() @@ -87,7 +87,7 @@ function clean(dirty) { b: 'strong', s: 'strike', img: function(tagName, attribs) { - let src = attribs.src + const src = attribs.src if (!src) { // remove broken images diff --git a/backend/src/schema/resolvers/comments.js b/backend/src/schema/resolvers/comments.js index 31219d6d9..89a2040f4 100644 --- a/backend/src/schema/resolvers/comments.js +++ b/backend/src/schema/resolvers/comments.js @@ -18,7 +18,7 @@ export default { false, ) - let transactionRes = await session.run( + const transactionRes = await session.run( ` MATCH (post:Post {id: $postId}), (comment:Comment {id: $commentId}), (author:User {id: $userId}) MERGE (post)<-[:COMMENTS]-(comment)<-[:WROTE]-(author) diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js index 890ba5feb..e8280bd4b 100644 --- a/backend/src/schema/resolvers/comments.spec.js +++ b/backend/src/schema/resolvers/comments.spec.js @@ -5,7 +5,6 @@ import { host, login, gql } from '../../jest/helpers' const factory = Factory() let client let createCommentVariables -let createPostVariables let createCommentVariablesSansPostId let createCommentVariablesWithNonExistentPost let userParams @@ -26,7 +25,7 @@ const createCommentMutation = gql` } } ` -createPostVariables = { +const createPostVariables = { id: 'p1', title: 'post to comment on', content: 'please comment on me', @@ -325,7 +324,7 @@ describe('ManageComments', () => { } ` - let deleteCommentVariables = { + const deleteCommentVariables = { id: 'c456', } diff --git a/backend/src/schema/resolvers/follow.js b/backend/src/schema/resolvers/follow.js index 4e9a3b27d..730a66cfd 100644 --- a/backend/src/schema/resolvers/follow.js +++ b/backend/src/schema/resolvers/follow.js @@ -4,7 +4,7 @@ export default { const { id, type } = params const session = context.driver.session() - let transactionRes = await session.run( + const transactionRes = await session.run( `MATCH (node {id: $id}), (user:User {id: $userId}) WHERE $type IN labels(node) AND NOT $id = $userId MERGE (user)-[relation:FOLLOWS]->(node) @@ -29,7 +29,7 @@ export default { const { id, type } = params const session = context.driver.session() - let transactionRes = await session.run( + const transactionRes = await session.run( `MATCH (user:User {id: $userId})-[relation:FOLLOWS]->(node {id: $id}) WHERE $type IN labels(node) DELETE relation diff --git a/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js index d29e17938..66be20841 100644 --- a/backend/src/schema/resolvers/follow.spec.js +++ b/backend/src/schema/resolvers/follow.spec.js @@ -41,8 +41,7 @@ describe('follow', () => { describe('follow user', () => { describe('unauthenticated follow', () => { it('throws authorization error', async () => { - let client - client = new GraphQLClient(host) + const client = new GraphQLClient(host) await expect(client.request(mutationFollowUser('u2'))).rejects.toThrow('Not Authorised') }) }) @@ -93,8 +92,7 @@ describe('follow', () => { // follow await clientUser1.request(mutationFollowUser('u2')) // unfollow - let client - client = new GraphQLClient(host) + const client = new GraphQLClient(host) await expect(client.request(mutationUnfollowUser('u2'))).rejects.toThrow('Not Authorised') }) }) diff --git a/backend/src/schema/resolvers/notifications.spec.js b/backend/src/schema/resolvers/notifications.spec.js index 3876a4be3..8d51ebfbb 100644 --- a/backend/src/schema/resolvers/notifications.spec.js +++ b/backend/src/schema/resolvers/notifications.spec.js @@ -4,7 +4,7 @@ import { host, login } from '../../jest/helpers' const factory = Factory() let client -let userParams = { +const userParams = { id: 'you', email: 'test@example.org', password: '1234', @@ -34,7 +34,7 @@ describe('Notification', () => { }) describe('currentUser { notifications }', () => { - let variables = {} + const variables = {} describe('authenticated', () => { let headers @@ -79,7 +79,7 @@ describe('currentUser { notifications }', () => { } } }` - let variables = { read: false } + const variables = { read: false } it('returns only unread notifications of current user', async () => { const expected = { currentUser: { diff --git a/backend/src/schema/resolvers/passwordReset.js b/backend/src/schema/resolvers/passwordReset.js index 88d82846a..d2012c0fd 100644 --- a/backend/src/schema/resolvers/passwordReset.js +++ b/backend/src/schema/resolvers/passwordReset.js @@ -41,7 +41,7 @@ export default { SET u.encryptedPassword = $encryptedNewPassword RETURN pr ` - let transactionRes = await session.run(cypher, { + const transactionRes = await session.run(cypher, { stillValid, email, code, diff --git a/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.js index 545945f51..b54b25a80 100644 --- a/backend/src/schema/resolvers/passwordReset.spec.js +++ b/backend/src/schema/resolvers/passwordReset.spec.js @@ -10,7 +10,7 @@ const driver = getDriver() const getAllPasswordResets = async () => { const session = driver.session() - let transactionRes = await session.run('MATCH (r:PasswordReset) RETURN r') + const transactionRes = await session.run('MATCH (r:PasswordReset) RETURN r') const resets = transactionRes.records.map(record => record.get('r')) session.close() return resets @@ -84,9 +84,9 @@ describe('passwordReset', () => { } const mutation = `mutation($code: String!, $email: String!, $newPassword: String!) { resetPassword(code: $code, email: $email, newPassword: $newPassword) }` - let email = 'user@example.org' - let code = 'abcdef' - let newPassword = 'supersecret' + const email = 'user@example.org' + const code = 'abcdef' + const newPassword = 'supersecret' let variables describe('invalid email', () => { diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js index 68de51e79..8e6c0c303 100644 --- a/backend/src/schema/resolvers/posts.spec.js +++ b/backend/src/schema/resolvers/posts.spec.js @@ -339,7 +339,7 @@ describe('DeletePost', () => { } ` - let variables = { + const variables = { id: 'p1', } diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js index dc2e96348..9f9a171f7 100644 --- a/backend/src/schema/resolvers/registration.spec.js +++ b/backend/src/schema/resolvers/registration.spec.js @@ -300,7 +300,7 @@ describe('SignupVerification', () => { } ` describe('given valid password and email', () => { - let variables = { + const variables = { nonce: '123456', name: 'John Doe', password: '123', diff --git a/backend/src/schema/resolvers/reports.js b/backend/src/schema/resolvers/reports.js index 67c896939..79cae032b 100644 --- a/backend/src/schema/resolvers/reports.js +++ b/backend/src/schema/resolvers/reports.js @@ -60,7 +60,7 @@ export default { if (!dbResponse) return null const { report, submitter, resource, type } = dbResponse - let response = { + const response = { ...report.properties, post: null, comment: null, diff --git a/backend/src/schema/resolvers/rewards.js b/backend/src/schema/resolvers/rewards.js index f7a759aa4..74c7860e4 100644 --- a/backend/src/schema/resolvers/rewards.js +++ b/backend/src/schema/resolvers/rewards.js @@ -4,7 +4,7 @@ import { UserInputError } from 'apollo-server' const instance = neode() const getUserAndBadge = async ({ badgeKey, userId }) => { - let user = await instance.first('User', 'id', userId) + const user = await instance.first('User', 'id', userId) const badge = await instance.first('Badge', 'id', badgeKey) if (!user) throw new UserInputError("Couldn't find a user with that id") if (!badge) throw new UserInputError("Couldn't find a badge with that id") @@ -36,8 +36,6 @@ export default { userId, }, ) - } catch (err) { - throw err } finally { session.close() } diff --git a/backend/src/schema/resolvers/shout.js b/backend/src/schema/resolvers/shout.js index d2d7f652e..398e43d77 100644 --- a/backend/src/schema/resolvers/shout.js +++ b/backend/src/schema/resolvers/shout.js @@ -4,7 +4,7 @@ export default { const { id, type } = params const session = context.driver.session() - let transactionRes = await session.run( + const transactionRes = await session.run( `MATCH (node {id: $id})<-[:WROTE]-(userWritten:User), (user:User {id: $userId}) WHERE $type IN labels(node) AND NOT userWritten.id = $userId MERGE (user)-[relation:SHOUTED]->(node) @@ -29,7 +29,7 @@ export default { const { id, type } = params const session = context.driver.session() - let transactionRes = await session.run( + const transactionRes = await session.run( `MATCH (user:User {id: $userId})-[relation:SHOUTED]->(node {id: $id}) WHERE $type IN labels(node) DELETE relation diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index a94f7ca0b..029e6998c 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -60,8 +60,7 @@ describe('shout', () => { describe('shout foreign post', () => { describe('unauthenticated shout', () => { it('throws authorization error', async () => { - let client - client = new GraphQLClient(host) + const client = new GraphQLClient(host) await expect(client.request(mutationShoutPost('p1'))).rejects.toThrow('Not Authorised') }) }) @@ -109,8 +108,7 @@ describe('shout', () => { // shout await clientUser1.request(mutationShoutPost('p2')) // unshout - let client - client = new GraphQLClient(host) + const client = new GraphQLClient(host) await expect(client.request(mutationUnshoutPost('p2'))).rejects.toThrow('Not Authorised') }) }) diff --git a/backend/src/schema/resolvers/statistics.js b/backend/src/schema/resolvers/statistics.js index f09b7219d..982c2acfa 100644 --- a/backend/src/schema/resolvers/statistics.js +++ b/backend/src/schema/resolvers/statistics.js @@ -1,9 +1,9 @@ export const query = (cypher, session) => { return new Promise((resolve, reject) => { - let data = [] + const data = [] session.run(cypher).subscribe({ onNext: function(record) { - let item = {} + const item = {} record.keys.forEach(key => { item[key] = record.get(key) }) @@ -34,7 +34,7 @@ const queryOne = (cypher, session) => { export default { Query: { statistics: async (parent, args, { driver, user }) => { - return new Promise(async resolve => { + return new Promise(resolve => { const session = driver.session() const queries = { countUsers: @@ -54,18 +54,24 @@ export default { countFollows: 'MATCH (:User)-[r:FOLLOWS]->(:User) RETURN COUNT(r) AS countFollows', countShouts: 'MATCH (:User)-[r:SHOUTED]->(:Post) RETURN COUNT(r) AS countShouts', } - let data = { - countUsers: (await queryOne(queries.countUsers, session)).countUsers.low, - countPosts: (await queryOne(queries.countPosts, session)).countPosts.low, - countComments: (await queryOne(queries.countComments, session)).countComments.low, - countNotifications: (await queryOne(queries.countNotifications, session)) - .countNotifications.low, - countOrganizations: (await queryOne(queries.countOrganizations, session)) - .countOrganizations.low, - countProjects: (await queryOne(queries.countProjects, session)).countProjects.low, - countInvites: (await queryOne(queries.countInvites, session)).countInvites.low, - countFollows: (await queryOne(queries.countFollows, session)).countFollows.low, - countShouts: (await queryOne(queries.countShouts, session)).countShouts.low, + const data = { + countUsers: queryOne(queries.countUsers, session).then(res => res.countUsers.low), + countPosts: queryOne(queries.countPosts, session).then(res => res.countPosts.low), + countComments: queryOne(queries.countComments, session).then( + res => res.countComments.low, + ), + countNotifications: queryOne(queries.countNotifications, session).then( + res => res.countNotifications.low, + ), + countOrganizations: queryOne(queries.countOrganizations, session).then( + res => res.countOrganizations.low, + ), + countProjects: queryOne(queries.countProjects, session).then( + res => res.countProjects.low, + ), + countInvites: queryOne(queries.countInvites, session).then(res => res.countInvites.low), + countFollows: queryOne(queries.countFollows, session).then(res => res.countFollows.low), + countShouts: queryOne(queries.countShouts, session).then(res => res.countShouts.low), } resolve(data) }) diff --git a/backend/src/schema/resolvers/user_management.js b/backend/src/schema/resolvers/user_management.js index 7ed84586b..be790ca3a 100644 --- a/backend/src/schema/resolvers/user_management.js +++ b/backend/src/schema/resolvers/user_management.js @@ -49,7 +49,7 @@ export default { } }, changePassword: async (_, { oldPassword, newPassword }, { driver, user }) => { - let currentUser = await instance.find('User', user.id) + const currentUser = await instance.find('User', user.id) const encryptedPassword = currentUser.get('encryptedPassword') if (!(await bcrypt.compareSync(oldPassword, encryptedPassword))) { diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js index 50b5896b3..ff0c0db4e 100644 --- a/backend/src/schema/resolvers/user_management.spec.js +++ b/backend/src/schema/resolvers/user_management.spec.js @@ -296,7 +296,7 @@ describe('change password', () => { describe('correct password', () => { it('changes the password if given correct credentials "', async () => { - let response = await client.request( + const response = await client.request( mutation({ oldPassword: '1234', newPassword: '12345', diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index c0826c6c8..77e4ae2aa 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -23,7 +23,7 @@ export default { UpdateUser: async (object, args, context, resolveInfo) => { args = await fileUpload(args, { file: 'avatarUpload', url: 'avatar' }) try { - let user = await instance.find('User', args.id) + const user = await instance.find('User', args.id) if (!user) return null await user.update(args) return user.toJson() @@ -60,7 +60,7 @@ export default { const { id } = parent const statement = `MATCH(u:User {id: {id}})-[:PRIMARY_EMAIL]->(e:EmailAddress) RETURN e` const result = await instance.cypher(statement, { id }) - let [{ email }] = result.records.map(r => r.get('e').properties) + const [{ email }] = result.records.map(r => r.get('e').properties) return email }, ...Resolver('User', { diff --git a/backend/src/schema/types/index.js b/backend/src/schema/types/index.js index bcdceed44..068af64da 100644 --- a/backend/src/schema/types/index.js +++ b/backend/src/schema/types/index.js @@ -21,7 +21,7 @@ const findGqlFiles = dir => { return results } -let typeDefs = [] +const typeDefs = [] findGqlFiles(__dirname).forEach(file => { typeDefs.push(fs.readFileSync(file).toString('utf-8')) diff --git a/backend/src/seed/factories/index.js b/backend/src/seed/factories/index.js index 6dd04f64b..87d99faab 100644 --- a/backend/src/seed/factories/index.js +++ b/backend/src/seed/factories/index.js @@ -40,15 +40,13 @@ export const cleanDatabase = async (options = {}) => { const cypher = 'MATCH (n) DETACH DELETE n' try { return await session.run(cypher) - } catch (error) { - throw error } finally { session.close() } } export default function Factory(options = {}) { - let { + const { seedServerHost = 'http://127.0.0.1:4001', neo4jDriver = getDriver(), neodeInstance = neode(), diff --git a/backend/src/seed/seed-helpers.js b/backend/src/seed/seed-helpers.js index 399d06670..913ca1d54 100644 --- a/backend/src/seed/seed-helpers.js +++ b/backend/src/seed/seed-helpers.js @@ -37,17 +37,17 @@ const difficulties = ['easy', 'medium', 'hard'] export default { randomItem: (items, filter) => { - let ids = filter + const ids = filter ? Object.keys(items).filter(id => { return filter(items[id]) }) : _.keys(items) - let randomIds = _.shuffle(ids) + const randomIds = _.shuffle(ids) return items[randomIds.pop()] }, randomItems: (items, key = 'id', min = 1, max = 1) => { - let randomIds = _.shuffle(_.keys(items)) - let res = [] + const randomIds = _.shuffle(_.keys(items)) + const res = [] const count = _.random(min, max) @@ -86,8 +86,8 @@ export default { if (allowEmpty === false && count === 0) { count = 1 } - let categorieIds = _.shuffle(_.keys(seederstore.categories)) - let ids = [] + const categorieIds = _.shuffle(_.keys(seederstore.categories)) + const ids = [] for (let i = 0; i < count; i++) { ids.push(categorieIds.pop()) } @@ -95,7 +95,7 @@ export default { }, randomAddresses: () => { const count = Math.round(Math.random() * 3) - let addresses = [] + const addresses = [] for (let i = 0; i < count; i++) { addresses.push({ city: faker.address.city(), @@ -116,7 +116,7 @@ export default { * @param key the field key that is represented in the values (slug, name, etc.) */ mapIdsByKey: (items, values, key) => { - let res = [] + const res = [] values.forEach(value => { res.push(_.find(items, [key, value]).id.toString()) }) diff --git a/backend/yarn.lock b/backend/yarn.lock index 657998472..10d7c1b28 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -972,33 +972,7 @@ url-regex "~4.1.1" video-extensions "~1.1.0" -"@metascraper/helpers@^5.6.3": - version "5.6.3" - resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.6.3.tgz#88d3d3a174f94ccb617145cb9f60c999b57d9b60" - integrity sha512-FWqQmh+sZI5JRxJHVPPzBjilgZCqKWDFSo/eqRIgLLW/5kB79uuX4aseSTep1JpXUAcD5F/Z0KZYQl4JTbTopA== - dependencies: - audio-extensions "0.0.0" - chrono-node "~1.3.11" - condense-whitespace "~2.0.0" - entities "~2.0.0" - file-extension "~4.0.5" - has-values "~2.0.1" - image-extensions "~1.1.0" - is-relative-url "~3.0.0" - is-uri "~1.2.0" - iso-639-3 "~1.2.0" - isostring "0.0.1" - lodash "~4.17.15" - mem "~5.1.1" - mime-types "~2.1.24" - normalize-url "~4.3.0" - smartquotes "~2.3.1" - title "~3.4.1" - truncate "~2.1.0" - url-regex "~5.0.0" - video-extensions "~1.1.0" - -"@metascraper/helpers@^5.6.5": +"@metascraper/helpers@^5.6.3", "@metascraper/helpers@^5.6.5": version "5.6.5" resolved "https://registry.yarnpkg.com/@metascraper/helpers/-/helpers-5.6.5.tgz#6f42bd1a8e3243e051e7bb067145125cd6b37e09" integrity sha512-j9qxXqZ9k/uNkABlsVjNN2Z5pVtukDmZMZ0ACsob+m5o8/yo87GvRf/UJfTPtog9vZ/QwkLav5Hhl+10NC7QLw== @@ -3272,10 +3246,10 @@ eslint-config-prettier@~6.0.0: dependencies: get-stdin "^6.0.0" -eslint-config-standard@~12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9" - integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== +eslint-config-standard@~13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz#c9c6ffe0cfb8a51535bc5c7ec9f70eafb8c6b2c0" + integrity sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw== eslint-import-resolver-node@^0.3.2: version "0.3.2" @@ -5828,12 +5802,12 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" -metascraper-audio@^5.5.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.6.3.tgz#f84f4e19960c698df2e14cd98212b004bac66bb9" - integrity sha512-XxO9iHVQzGa+Z7wzmnHl3dmFdBdmYfO/ozeMWH0fp/4YbU1GU3l+OlYzPaVhCEfArqzzuwf1iq8uGKdU/DOZnw== +metascraper-audio@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-audio/-/metascraper-audio-5.6.5.tgz#8937d369f37d43f8668eb87013ea4fe8309a9451" + integrity sha512-EF9IMscv9HLy3Mks8Vhv0ftzwjV36tvNpSwPnmibDGDy25ssf6nB7ldeP5YPij4TNjLeUsrdh6v10aYrh8Z5fQ== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" metascraper-author@^5.6.3: version "5.6.3" @@ -5850,19 +5824,19 @@ metascraper-clearbit-logo@^5.3.0: dependencies: got "~9.6.0" -metascraper-date@^5.6.3: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.6.3.tgz#516fad38391a45137a58430f639a57037eee96f2" - integrity sha512-sdbY0IOu1BcZHocwVIJ8/CPkguVR8oDho13apIGNsZjyItIdMMLrziDqzOSGcJI++AXGmS3MNHW8M+bdYHVj1g== +metascraper-date@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-date/-/metascraper-date-5.6.5.tgz#802a19eaf9dc2874352ec4401fa360347225197b" + integrity sha512-IuKpi5z3S1/qlLhfQbLVv5hitfly/UEGKBxD4dYbn+5xbcsPcNlM+AE7DeDEct390nuZs7+fbSqgPKFtt5fPRg== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" -metascraper-description@^5.5.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.6.3.tgz#1abfde848e8002c606e5741b9523b61ca592bb34" - integrity sha512-ATfsUS6t912hSYKEOyVUX+GrwRMcUltOcvEXtD/5ER26z3h1ab83w4UvQ7imo9F6yueQX2dB6QfqTkWF92X6Vw== +metascraper-description@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-description/-/metascraper-description-5.6.5.tgz#b0e47bedf9aed151e085ff3a8a499be5f4779dc3" + integrity sha512-rYHMRrLnYPdt1ZCiObRtl7MP8i+2q9MfgeeiwACd65ElC+wgnfyQBIgxBp/gEnKuUsehWgpDXCZKFkjv+W4zNQ== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" metascraper-image@^5.6.3: version "5.6.3" @@ -5887,28 +5861,28 @@ metascraper-lang@^5.6.3: dependencies: "@metascraper/helpers" "^5.6.3" -metascraper-logo@^5.5.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.6.3.tgz#bb18449e872815ba6199e2aa78078259c2677b98" - integrity sha512-xeqjSuTAiudXiUczj7F0+VvXdgFvL5rqyW3D+BPXrNHOUqDyyYNlHTEhambj3HbMP6EjQyoMDEvqCF5qUezmXg== +metascraper-logo@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-logo/-/metascraper-logo-5.6.5.tgz#82a6e77da2df91fbbf233dfa49fd0a99475968ff" + integrity sha512-MKzunTRaD0HO7NdyzIhL/wpfpluCGLaBXFAYdvaY+FxiA9ZbpIV+9TdaoF3uzmoZAE09dKbQEmxeKOrbWHr4Zw== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" -metascraper-publisher@^5.6.3: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.6.3.tgz#3729cd7dac117c94f92020ff3a8397a1b965a27e" - integrity sha512-1Z+bwrTn6j4Tf85DatYL0zDmqBfoJCfYa0nNlZ9HWfjM+QWDxBeIu1v/85N3AYGYPwk5G38IdvEYBb4MpMEQvQ== +metascraper-publisher@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-publisher/-/metascraper-publisher-5.6.5.tgz#c23e93b766d3d0d64116422fa76a8da1145d2f98" + integrity sha512-XKaksI7gjPuuYNJyiowrE2DsrdhXeaoDEoK3/0vV3RfYBxXFgBtRUoFQiDiad+cUN/5lhMhYs0BKRiC+Q3XiZg== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" -metascraper-soundcloud@^5.5.3: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.6.3.tgz#c2bb5904857d079a44c0d1e1511dfaf4d0f19945" - integrity sha512-v44pktX4I7pnUjThGs11YZLNpuQbuB6iY2RcYnODjasgor8t7ZHPwrJqy01b0mkTmHoRbQ84Vheq1SkAD0Vz8g== +metascraper-soundcloud@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-soundcloud/-/metascraper-soundcloud-5.6.5.tgz#4447e24f919a57551bc672f1aa1d86ff3d54f602" + integrity sha512-dSr7rUi0ag+siqfPbSNRxSnQG187NsT8vMplI//NXMtKE6WLxxoOxJMETnFn56IozhIwb3FfC0suyThr9ZaGCg== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" memoize-one "~5.0.5" - tldts "~5.3.1" + tldts "~5.3.2" metascraper-title@^5.6.3: version "5.6.3" @@ -5918,12 +5892,12 @@ metascraper-title@^5.6.3: "@metascraper/helpers" "^5.6.3" lodash "~4.17.15" -metascraper-url@^5.5.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.6.3.tgz#7e756f79ed2a5e1591682e29b665551855ddda5d" - integrity sha512-hFHff2AsWuW552CkktWR9ViVp2poZufP1YUAVJWRe7UaHC67vx2mE5hjNZkVBSi1rOoPIbNN+jPVvcKwT6tkAw== +metascraper-url@^5.6.5: + version "5.6.5" + resolved "https://registry.yarnpkg.com/metascraper-url/-/metascraper-url-5.6.5.tgz#1afaa8688c53e7b9d37d81f9302d06b4d42d8656" + integrity sha512-BjzWpLLezCAg4pexWB63OdN7sNcJXRGlw8Cv+k5JCMUH/JV+rA+8l5wwWJFISxgOUpHsnbGlAkFT45viVxuawg== dependencies: - "@metascraper/helpers" "^5.6.3" + "@metascraper/helpers" "^5.6.5" metascraper-video@^5.6.3: version "5.6.3" @@ -8182,17 +8156,17 @@ tlds@^1.187.0, tlds@^1.203.0: resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.203.1.tgz#4dc9b02f53de3315bc98b80665e13de3edfc1dfc" integrity sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw== -tldts-core@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.3.1.tgz#040450d7148107880ba9020e77b3b28a6cc5d9db" - integrity sha512-z8C2wcT2XvSgk5p0HWapXPkvvKG7E8Jei71N+9Mpp9Eoh2/wjtQPhDeENSuzHNmjTdRz6KFIcM7aWTB+7g0OyA== +tldts-core@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-5.3.2.tgz#3823653310c2dc6e51d00998098a72a3cc203ea9" + integrity sha512-bGI7MvrFXnbNhSkKEKAjiRo+eoIuIsuzF/hOtpI7HLMLWamIGtrLuNv2nlBOdN/h6iB6B32B4MxmwPWTZ70TaQ== -tldts@~5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.3.1.tgz#39b2164b71777e69b3d05e5db5a30b5e1a5df6b7" - integrity sha512-JHG3Gonv+17qi1gyskY0KwdpjVkQfQK4pMHm52vpdKXV3y9AzEhhinDT/GfLF8w7kRLpIHhcViZ0rEsFla81lA== +tldts@~5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-5.3.2.tgz#d7e9b31b70b7d7687a16fe31a18ec2ca8a33f852" + integrity sha512-R96Q0sJoD1vMYZ5YI0om32AZW2SYDxWfcg0111gnJYIvfyVgHOwyYj2dLFhpkPCSH7AwwUe0MmewmUrQhJXRjQ== dependencies: - tldts-core "^5.3.1" + tldts-core "^5.3.2" tmp@^0.0.33: version "0.0.33" diff --git a/package.json b/package.json index 6d5381424..0a0484126 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "cross-env": "^5.2.0", "cypress": "^3.4.1", "cypress-cucumber-preprocessor": "^1.13.0", - "cypress-file-upload": "^3.3.2", + "cypress-file-upload": "^3.3.3", "cypress-plugin-retries": "^1.2.2", "dotenv": "^8.0.0", "faker": "Marak/faker.js#master", diff --git a/webapp/components/ContributionForm/ContributionForm.spec.js b/webapp/components/ContributionForm/ContributionForm.spec.js index 3f9384d27..199d6ab18 100644 --- a/webapp/components/ContributionForm/ContributionForm.spec.js +++ b/webapp/components/ContributionForm/ContributionForm.spec.js @@ -6,6 +6,9 @@ import PostMutations from '~/graphql/PostMutations.js' import CategoriesSelect from '~/components/CategoriesSelect/CategoriesSelect' import Filters from '~/plugins/vue-filters' import TeaserImage from '~/components/TeaserImage/TeaserImage' +import MutationObserver from 'mutation-observer' + +global.MutationObserver = MutationObserver const localVue = createLocalVue() diff --git a/webapp/components/Editor/Editor.spec.js b/webapp/components/Editor/Editor.spec.js index d457609bd..866b96aba 100644 --- a/webapp/components/Editor/Editor.spec.js +++ b/webapp/components/Editor/Editor.spec.js @@ -1,8 +1,10 @@ import { mount, createLocalVue } from '@vue/test-utils' import Editor from './Editor' import Vuex from 'vuex' - import Styleguide from '@human-connection/styleguide' +import MutationObserver from 'mutation-observer' + +global.MutationObserver = MutationObserver const localVue = createLocalVue() localVue.use(Vuex) diff --git a/webapp/components/comments/CommentForm/spec.js b/webapp/components/comments/CommentForm/spec.js index 8420c97ba..2d212c91d 100644 --- a/webapp/components/comments/CommentForm/spec.js +++ b/webapp/components/comments/CommentForm/spec.js @@ -2,6 +2,9 @@ import { mount, createLocalVue } from '@vue/test-utils' import CommentForm from './index.vue' import Styleguide from '@human-connection/styleguide' import Vuex from 'vuex' +import MutationObserver from 'mutation-observer' + +global.MutationObserver = MutationObserver const localVue = createLocalVue() localVue.use(Vuex) diff --git a/webapp/package.json b/webapp/package.json index 6d9f5bc04..a8fda5905 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -70,8 +70,8 @@ "nuxt-env": "~0.1.0", "stack-utils": "^1.0.2", "string-hash": "^1.1.3", - "tiptap": "1.21.0", - "tiptap-extensions": "1.22.2", + "tiptap": "~1.24.0", + "tiptap-extensions": "~1.26.0", "v-tooltip": "~2.0.2", "vue-count-to": "~1.0.13", "vue-izitoast": "1.1.2", @@ -104,11 +104,12 @@ "flush-promises": "^1.0.2", "fuse.js": "^3.4.5", "jest": "~24.8.0", + "mutation-observer": "^1.0.3", "node-sass": "~4.12.0", "nodemon": "~1.19.1", "prettier": "~1.18.2", "sass-loader": "~7.1.0", - "tippy.js": "^4.3.4", + "tippy.js": "^4.3.5", "vue-jest": "~3.0.4", "vue-svg-loader": "~0.12.0" } diff --git a/webapp/yarn.lock b/webapp/yarn.lock index c98f125a2..596fdc05f 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -8472,6 +8472,11 @@ mustache@^2.3.0: resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== +mutation-observer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mutation-observer/-/mutation-observer-1.0.3.tgz#42e9222b101bca82e5ba9d5a7acf4a14c0f263d0" + integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -10237,10 +10242,10 @@ prosemirror-dropcursor@^1.1.1: prosemirror-transform "^1.1.0" prosemirror-view "^1.1.0" -prosemirror-gapcursor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.3.tgz#acc6537fc5a35e9b38966f91a199a382dfc715c4" - integrity sha512-X+hJhr42PcHWiSWL+lI5f/UeOhXCxlBFb8M6O8aG1hssmaRrW7sS2/Fjg5jFV+pTdS1REFkmm1occh01FMdDIQ== +prosemirror-gapcursor@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.0.4.tgz#4ba663fb8511616e18ad222c904403cfbf6866dc" + integrity sha512-k021MtJibWs3NaJI6S9tCXfTZ/kaugFZBndHkkWx3Zfk0QDUO6JfVATpflxADN6DUkRwJ7qWyHlLDWu71hxHFQ== dependencies: prosemirror-keymap "^1.0.0" prosemirror-model "^1.0.0" @@ -10272,7 +10277,7 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.0.1: prosemirror-state "^1.0.0" w3c-keyname "^1.1.8" -prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.7.0, prosemirror-model@^1.7.1: +prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.7.1: version "1.7.1" resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.7.1.tgz#f140a6e366e1e283aa7a94dbb8c2c7d13139689e" integrity sha512-hYrZPbJvdo2QWERmkCuS80BEf5Rcf3+S28ETr4xu8XKPYjmU6aeQn23G1Fu/2rwqUmk5ZyWYo2nyEsN+Cdv2Qg== @@ -10313,12 +10318,12 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor dependencies: prosemirror-model "^1.0.0" -prosemirror-utils@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.9.0.tgz#3ab616c94ccd61fcb18968f0d5aa273a9f1f28e4" - integrity sha512-YcvmHcq7phbn+OagJSvmne92qZG9dOVfb3zfuA1HuyWUif3hUDt2Yfu299BHqVkEkUCF6FN7Gi9folDQntMhxA== +prosemirror-utils@^0.9.4: + version "0.9.5" + resolved "https://registry.yarnpkg.com/prosemirror-utils/-/prosemirror-utils-0.9.5.tgz#34d7e5bc12f3e6774261cc664bac9499899663d4" + integrity sha512-JT3H//Cq2ljNhWadMYRMdlNj2gylFA7L4RC0zmUF9l0IgDpc/gTpPRCmfcDUomDgCrciz57C3MCnZ+058hSTaA== -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.9.8: +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0: version "1.9.8" resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.9.8.tgz#47b961204a0b2e8ff87370c270d4f82598e81273" integrity sha512-yS4yrqxydvi7ddz9VFLeJgbfVd5g3/bMcRxb1PbWtG0i9OrPSsiHaEBJHLVeTbraGqRlAu+tbNLakO7RhUhp1w== @@ -10327,6 +10332,15 @@ prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.9.8: prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" +prosemirror-view@^1.9.12: + version "1.9.13" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.9.13.tgz#8f146038e776fd0aa6d7811c8b9cb11813b9e319" + integrity sha512-afJxCZR4EH04u4thl7xYHSIgyQiGALstLi+5SW9t3868ghrgcFhpQvbJAN17Yb9nwtnltD64t15Msk2UlXkPeQ== + dependencies: + prosemirror-model "^1.1.0" + prosemirror-state "^1.0.0" + prosemirror-transform "^1.1.0" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -11940,17 +11954,17 @@ timsort@^0.3.0: resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= -tippy.js@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-4.3.4.tgz#9a91fd5ce8c401f181b7adaa6b2c27f3d105f3ba" - integrity sha512-O2ukxHOJTLVYZ/TfHjNd8WgAWoefX9uk5QiWRdHfX2PR2lBpUU4BJQLl7U2Ykc8K7o16gTeHEElpuRfgD5b0aA== +tippy.js@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-4.3.5.tgz#882bff8d92f09bb0546d2826d5668c0560006f54" + integrity sha512-NDq3efte8nGK6BOJ1dDN1/WelAwfmh3UtIYXXck6+SxLzbIQNZE/cmRSnwScZ/FyiKdIcvFHvYUgqmoGx8CcyA== dependencies: popper.js "^1.14.7" -tiptap-commands@^1.10.6, tiptap-commands@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.10.7.tgz#c177f875e8a90e05171fdd441190b4b7a769bd27" - integrity sha512-Ij62dHkYvOFUcaj+xlbahhoqcY8bFIEho6fXKrxcjjtGzS2DyJnvXmWN6Ow65uZWXkf5Zf8ae6XnYNaKqP3Pyg== +tiptap-commands@^1.10.11: + version "1.10.11" + resolved "https://registry.yarnpkg.com/tiptap-commands/-/tiptap-commands-1.10.11.tgz#9df1ef7b553e601598892074f9faa6d836fd8238" + integrity sha512-SD1Ep18qKGiCOodUttQrJtOfEC4/sx1pQWfROc4t8xeuxS5FLcrXZ+u9mELRSHkBJ+nDAJsn/ewG+yo58T1+Xg== dependencies: prosemirror-commands "^1.0.8" prosemirror-inputrules "^1.0.4" @@ -11958,13 +11972,13 @@ tiptap-commands@^1.10.6, tiptap-commands@^1.10.7: prosemirror-schema-list "^1.0.3" prosemirror-state "^1.2.3" prosemirror-tables "^0.8.1" - prosemirror-utils "^0.9.0" - tiptap-utils "^1.5.5" + prosemirror-utils "^0.9.4" + tiptap-utils "^1.6.0" -tiptap-extensions@1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.22.2.tgz#66b24ef63653481da16419efdf6459c7a9f518f7" - integrity sha512-JJe2yAnbaKBWO/16+lfFphePphG9UYhp3wAUkzhSefJx3dtIdDfCmp5jBzZ6NLahUHNT/Z9WeYdhQmngAeVhoA== +tiptap-extensions@~1.26.0: + version "1.26.0" + resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.26.0.tgz#d3ee033d121c7243a7e8648c69ec6343a2853ccc" + integrity sha512-icQYbfl6Cu3XkAoz9y+4x1URuB/EzryF2rZT6GsURghcelaxpjIPoMDBMyi00zlSIKJUvkS14NbnjJ2eT0CG6w== dependencies: lowlight "^1.12.1" prosemirror-collab "^1.1.2" @@ -11973,52 +11987,36 @@ tiptap-extensions@1.22.2: prosemirror-state "^1.2.3" prosemirror-tables "^0.8.1" prosemirror-transform "^1.1.3" - prosemirror-utils "^0.9.0" - prosemirror-view "^1.9.8" - tiptap "^1.22.2" - tiptap-commands "^1.10.7" + prosemirror-utils "^0.9.4" + prosemirror-view "^1.9.12" + tiptap "^1.24.0" + tiptap-commands "^1.10.11" -tiptap-utils@^1.5.4, tiptap-utils@^1.5.5: - version "1.5.5" - resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.5.5.tgz#f06c70f0319d9215433b3466b6ece369a078de0f" - integrity sha512-lnaCmIIkyK050qfsPeMDjoTW0sTqBHxfw1h2GXaX5Nr6JF4VQe0izgf2MI6LCd3PKecJBoW4ce5lNkDpV99+WA== +tiptap-utils@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/tiptap-utils/-/tiptap-utils-1.6.0.tgz#6af0bf52f93b291b9be5f6adb92c9afc35dd8d62" + integrity sha512-8ehQyNCe1CJvgBBqS3rKM58MFqcwlJQXS6XtZyhOjJDGQbUKNVR/GbAXTPlHnuVBm0kKKTjTqnrEt/PS4d2aXg== dependencies: prosemirror-model "^1.7.1" prosemirror-state "^1.2.3" prosemirror-tables "^0.8.1" - prosemirror-utils "^0.9.0" + prosemirror-utils "^0.9.4" -tiptap@1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.21.0.tgz#4d8c1365c611e41c8d4f3d7aa195ddaf891e605b" - integrity sha512-MoOj/8OPMlmoAotIZjAIlUZ59yMMR83xReOw2rGjqbFOooncoY1rLEBp0xz5oe5FLYqoe8dKb+kzOoFERqckVQ== +tiptap@^1.24.0, tiptap@~1.24.0: + version "1.24.0" + resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.24.0.tgz#f386c8fca71275a4794a0e95eca2ea37267d370d" + integrity sha512-izw0FM5bbOQRtNczqEgo9/EoUI7X/TAj1LEsteMuDqxaZKmYn6so482UnnQUv13+4DtXHYGj5U+60lVNuZlWJw== dependencies: prosemirror-commands "^1.0.8" prosemirror-dropcursor "^1.1.1" - prosemirror-gapcursor "^1.0.3" - prosemirror-inputrules "^1.0.4" - prosemirror-keymap "^1.0.1" - prosemirror-model "^1.7.0" - prosemirror-state "^1.2.3" - prosemirror-view "^1.9.8" - tiptap-commands "^1.10.6" - tiptap-utils "^1.5.4" - -tiptap@^1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.22.2.tgz#f3f2b822d9ed087a853520c86593b2e6bd822bdd" - integrity sha512-qMFQJ358Ga8gXzUAMaHGrZDab/IqZf28N8BYYo4hyFIMoEYQVWmBGWuSBHOgpxiueXpC9zMuCoIgrNWN3VpoNQ== - dependencies: - prosemirror-commands "^1.0.8" - prosemirror-dropcursor "^1.1.1" - prosemirror-gapcursor "^1.0.3" + prosemirror-gapcursor "^1.0.4" prosemirror-inputrules "^1.0.4" prosemirror-keymap "^1.0.1" prosemirror-model "^1.7.1" prosemirror-state "^1.2.3" - prosemirror-view "^1.9.8" - tiptap-commands "^1.10.7" - tiptap-utils "^1.5.5" + prosemirror-view "^1.9.12" + tiptap-commands "^1.10.11" + tiptap-utils "^1.6.0" title-case@^2.1.0: version "2.1.1" diff --git a/yarn.lock b/yarn.lock index cbc232977..3e522d060 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1864,10 +1864,10 @@ cypress-cucumber-preprocessor@^1.13.0: glob "^7.1.2" through "^2.3.8" -cypress-file-upload@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-3.3.2.tgz#d9bb00cac756fd4b5f68079f19745fe40d97fdd4" - integrity sha512-39CW6/rTmn7AGa+ZrD37R+ANnnWAesbUj2RpBfbpRzV+KTAlF+m9Djbd2f325w0JGY0A2eO0w6TYYo+NvBTnoA== +cypress-file-upload@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-3.3.3.tgz#119188fa78e9cfc00904c52d76d4ca56d34950df" + integrity sha512-CmXGRMHonoyCa8EcF6jomxqMAe56HvKfnW7S69EmTga8ecYmvQUI6gYttcHO+5UTmFQOFl7xbABV3+AbnI4btA== cypress-plugin-retries@^1.2.2: version "1.2.2"