From b1df209b20a9df7a7a16b83b7c4e5b5b29ca2cfb Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sun, 3 Jan 2021 23:50:48 -0500 Subject: [PATCH 01/31] docs: update sponsors ***NO_CI*** --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 89185df4..cb1b8c1a 100644 --- a/README.md +++ b/README.md @@ -283,3 +283,6 @@ This project exists thanks to all the people who contribute. [[Contribute]](http ![Netlify](https://wiki.js.org/legacy/logo_netlify.png) [Netlify](https://www.netlify.com) for providing hosting for landings and blog websites. + +![Porkbun](https://static.requarks.io/logo/porkbun.svg) +[Porkbun](https://www.porkbun.com) for providing domain registration services. From 88bae01ab791a48968175ec2ea18b58ce19249bf Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sun, 3 Jan 2021 23:52:22 -0500 Subject: [PATCH 02/31] docs: update sponsors ***NO_CI*** --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb1b8c1a..f41c9a44 100644 --- a/README.md +++ b/README.md @@ -284,5 +284,5 @@ This project exists thanks to all the people who contribute. [[Contribute]](http ![Netlify](https://wiki.js.org/legacy/logo_netlify.png) [Netlify](https://www.netlify.com) for providing hosting for landings and blog websites. -![Porkbun](https://static.requarks.io/logo/porkbun.svg) +![Porkbun](https://static.requarks.io/logo/porkbun.png) [Porkbun](https://www.porkbun.com) for providing domain registration services. From 188b315cdce0f29a754651517bb512f30a8217f5 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Mon, 4 Jan 2021 19:29:22 -0500 Subject: [PATCH 03/31] docs: update newsletter link ***NO_CI*** --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f41c9a44..f8726f2d 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ [![Standard - JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/) [![Chat on Slack](https://img.shields.io/badge/slack-requarks-CC2B5E.svg?style=flat&logo=slack)](https://wiki.requarks.io/slack) [![Twitter Follow](https://img.shields.io/badge/follow-%40requarks-blue.svg?style=flat&logo=twitter)](https://twitter.com/requarks) -[![Subscribe to Newsletter](https://img.shields.io/badge/newsletter-subscribe-yellow.svg?style=flat&logo=mailchimp)](https://wiki.js.org/newsletter) +[![Subscribe to Newsletter](https://img.shields.io/badge/newsletter-subscribe-yellow.svg?style=flat&logo=mailchimp)](https://blog.js.wiki/subscribe) ##### A modern, lightweight and powerful wiki app built on NodeJS From 6567415a0dcb9ab4879f8c6afb3d2f65fa8cf751 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Tue, 5 Jan 2021 15:42:03 -0500 Subject: [PATCH 04/31] docs: update BACKERS ***NO_CI*** --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f8726f2d..69d232ec 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,7 @@ Thank you to all our patrons! 🙏 [[Become a patron](https://www.patreon.com/re - Ian - Iskander Callos - Josh Stewart +- Justin Dunsworth - Keir - Loïc CRAMPON - Ludgeir Ibanez From 1f1a3700ca559643311e52225db2c0474912c0f4 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Thu, 21 Jan 2021 14:12:17 -0500 Subject: [PATCH 05/31] docs: update BACKERS ***NO_CI*** --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 69d232ec..caab3a32 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ Support this project by becoming a sponsor. Your name will show up in the Contri - aniketpanjwani ([@aniketpanjwani](https://github.com/aniketpanjwani)) - aytaa ([@aytaa](https://github.com/aytaa)) - magicpotato ([@fortheday](https://github.com/fortheday)) +- scorpion ([@scorpion](https://github.com/scorpion)) - valantien ([@valantien](https://github.com/valantien))

OpenCollective Sponsors

From 804ed9d1146f9a074f8aa37238f7eb77e4a57e2e Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Fri, 22 Jan 2021 16:28:10 -0500 Subject: [PATCH 06/31] docs: update BACKERS ***NO_CI*** --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index caab3a32..c5d85954 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ This project exists thanks to all the people who contribute. [[Contribute]](http ![DigitalOcean](https://wiki.js.org/legacy/logo_digitalocean.png) [DigitalOcean](https://m.do.co/c/5f7445bfa4d0) for providing hosting of the Wiki.js documentation site. -![Icons8](https://static.requarks.io/logo/icons8.svg) +![Icons8](https://static.requarks.io/logo/icons8-text.svg) [Icons8](https://icons8.com/) for providing beautiful icon sets. ![Lokalise](https://static.requarks.io/logo/lokalise-text-h40.png) From 0eba20128064a4a4d9e091b923b5a0de8d68be54 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Fri, 22 Jan 2021 16:30:11 -0500 Subject: [PATCH 07/31] docs: update BACKERS ***NO_CI*** --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5d85954..6a55c2cd 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ This project exists thanks to all the people who contribute. [[Contribute]](http ![DigitalOcean](https://wiki.js.org/legacy/logo_digitalocean.png) [DigitalOcean](https://m.do.co/c/5f7445bfa4d0) for providing hosting of the Wiki.js documentation site. -![Icons8](https://static.requarks.io/logo/icons8-text.svg) +![Icons8](https://static.requarks.io/logo/icons8-text-h40.png) [Icons8](https://icons8.com/) for providing beautiful icon sets. ![Lokalise](https://static.requarks.io/logo/lokalise-text-h40.png) From a7b9be3bf7fd508a18cf6a6d663092f6cff5a27b Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Mon, 25 Jan 2021 11:40:01 -0500 Subject: [PATCH 08/31] docs: update BACKERS ***NO_CI*** --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6a55c2cd..baa5b5f5 100644 --- a/README.md +++ b/README.md @@ -249,6 +249,7 @@ Thank you to all our patrons! 🙏 [[Become a patron](https://www.patreon.com/re - Richeir - SmartNET.works - Stepan Sokolovskyi +- Zach Maynard - 张白驹 From e3fd967ad7781a622c895b8e0c8cfb79b09b7741 Mon Sep 17 00:00:00 2001 From: Guillaume Hanotel Date: Fri, 29 Jan 2021 20:14:27 +0100 Subject: [PATCH 09/31] feat: ability to open search result in new tab with middle-click (#2919) --- client/components/common/search-results.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/components/common/search-results.vue b/client/components/common/search-results.vue index b96e5989..a71fd133 100644 --- a/client/components/common/search-results.vue +++ b/client/components/common/search-results.vue @@ -18,7 +18,7 @@ v-subheader.white--text {{$t('common:header.searchResultsCount', { total: response.totalHits })}} v-list.search-results-items.radius-7.py-0(two-line, dense) template(v-for='(item, idx) of results') - v-list-item(@click='goToPage(item)', :key='item.id', :class='idx === cursor ? `highlighted` : ``') + v-list-item(@click='goToPage(item)', @click.middle="goToPageInNewTab(item)", :key='item.id', :class='idx === cursor ? `highlighted` : ``') v-list-item-avatar(tile) img(src='/_assets/svg/icon-selective-highlighting.svg') v-list-item-content @@ -136,6 +136,9 @@ export default { }, goToPage(item) { window.location.assign(`/${item.locale}/${item.path}`) + }, + goToPageInNewTab(item) { + window.open(`/${item.locale}/${item.path}`, '_blank') } }, apollo: { From 52304a8149d781dae9706347bf81c6f7df61dfb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Mart=C3=ADnez=20Interactiv4?= Date: Fri, 29 Jan 2021 20:15:22 +0100 Subject: [PATCH 10/31] fix: update storage.js to match pageHelper.injectPageMetadata (#2832) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update storage.js to match pageHelper.injectPageMetadata At pageHelper.injectPageMetadata references editorKey and tags to build metadata, but this data seems not to be supplied to this function, since page object is only built from specified columns. As a result, tags are always empty when exporting pages, and editor key appears as undefined. It happens also with git storage, but may happen with another storage providers. I run into this issue running Wiki.js 2.5.170 with the following Docker stack: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 39373979b693 requarks/wiki:2 "docker-entrypoint.s…" 44 minutes ago Up 9 minutes 0.0.0.0:80->3000/tcp, 0.0.0.0:443->3443/tcp wiki 608de6278aaa requarks/wiki-update-companion:latest "dotnet wiki-update-…" 5 months ago Up 6 hours 80/tcp wiki-update-companion 12c7b35ba295 postgres:11 "docker-entrypoint.s…" 5 months ago Up 6 hours 5432/tcp db * Provide id to allow to query for tags * Update git storage to provide editorKey and tags --- server/modules/storage/disk/storage.js | 5 ++++- server/modules/storage/git/storage.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/server/modules/storage/disk/storage.js b/server/modules/storage/disk/storage.js index 8f4edce6..1c3a7c40 100644 --- a/server/modules/storage/disk/storage.js +++ b/server/modules/storage/disk/storage.js @@ -127,12 +127,15 @@ module.exports = { // -> Pages await pipeline( - WIKI.models.knex.column('path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt').select().from('pages').where({ + WIKI.models.knex.column('id', 'path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt', 'editorKey').select().from('pages').where({ isPrivate: false }).stream(), new stream.Transform({ objectMode: true, transform: async (page, enc, cb) => { + const pageObject = await WIKI.models.pages.query().findById(page.id) + page.tags = await pageObject.$relatedQuery('tags') + let fileName = `${page.path}.${pageHelper.getFileExtension(page.contentType)}` if (WIKI.config.lang.code !== page.localeCode) { fileName = `${page.localeCode}/${fileName}` diff --git a/server/modules/storage/git/storage.js b/server/modules/storage/git/storage.js index e9cf0b46..c023c7e8 100644 --- a/server/modules/storage/git/storage.js +++ b/server/modules/storage/git/storage.js @@ -411,12 +411,15 @@ module.exports = { // -> Pages await pipeline( - WIKI.models.knex.column('path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt').select().from('pages').where({ + WIKI.models.knex.column('id', 'path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt', 'editorKey').select().from('pages').where({ isPrivate: false }).stream(), new stream.Transform({ objectMode: true, transform: async (page, enc, cb) => { + const pageObject = await WIKI.models.pages.query().findById(page.id) + page.tags = await pageObject.$relatedQuery('tags') + let fileName = `${page.path}.${pageHelper.getFileExtension(page.contentType)}` if (WIKI.config.lang.namespacing && WIKI.config.lang.code !== page.localeCode) { fileName = `${page.localeCode}/${fileName}` From 4b80bab88ef15fc68c93585a21bd04c2b6c46177 Mon Sep 17 00:00:00 2001 From: scienceasdf Date: Sat, 30 Jan 2021 03:16:33 +0800 Subject: [PATCH 11/31] fix: rebuilding tree error when the page number is large enough in sqlite (#2830) When the total page number is large enough (usually about 80+), sqlite will throw error: "Too many variables". This commit reduces the chunk size for sqlite configuration. --- server/jobs/rebuild-tree.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/jobs/rebuild-tree.js b/server/jobs/rebuild-tree.js index 270586f1..a91e7e40 100644 --- a/server/jobs/rebuild-tree.js +++ b/server/jobs/rebuild-tree.js @@ -57,8 +57,14 @@ module.exports = async (pageId) => { await WIKI.models.knex.table('pageTree').truncate() if (tree.length > 0) { // -> Save in chunks, because of per query max parameters (35k Postgres, 2k MSSQL, 1k for SQLite) - for (const chunk of _.chunk(tree, 100)) { - await WIKI.models.knex.table('pageTree').insert(chunk) + if ((WIKI.config.db.type !== 'sqlite')) + for (const chunk of _.chunk(tree, 100)) { + await WIKI.models.knex.table('pageTree').insert(chunk) + } + } else { + for (const chunk of _.chunk(tree, 60)) { + await WIKI.models.knex.table('pageTree').insert(chunk) + } } } From cfbd3dca004444626664da57d13fa13e94d70002 Mon Sep 17 00:00:00 2001 From: scienceasdf Date: Sat, 30 Jan 2021 03:17:30 +0800 Subject: [PATCH 12/31] Fix: in group edit rules, write scripts permission and write styles permission can be configured. (#2829) At present, the user that are not in the administrator group have no access to edit scripts and styles in page editor panel. This commit add configuration in group rule manage webpage so that users' permission on writing styles and writing scripts can be modified. --- client/components/admin/admin-groups-edit-rules.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/components/admin/admin-groups-edit-rules.vue b/client/components/admin/admin-groups-edit-rules.vue index 41364db6..89d97db4 100644 --- a/client/components/admin/admin-groups-edit-rules.vue +++ b/client/components/admin/admin-groups-edit-rules.vue @@ -222,6 +222,8 @@ export default { { text: 'Read / Use Assets', value: 'read:assets', icon: 'mdi-image-search-outline' }, { text: 'Upload Assets', value: 'write:assets', icon: 'mdi-image-plus' }, { text: 'Edit + Delete Assets', value: 'manage:assets', icon: 'mdi-image-size-select-large' }, + { text: 'Edit Scripts', value: 'write:scripts', icon: 'mdi-language-javascript' }, + { text: 'Edit Styles', value: 'write:styles', icon: 'mdi-language-css3' }, { text: 'Read Comments', value: 'read:comments', icon: 'mdi-comment-search-outline' }, { text: 'Create Comments', value: 'write:comments', icon: 'mdi-comment-plus-outline' }, { text: 'Edit + Delete Comments', value: 'manage:comments', icon: 'mdi-comment-remove-outline' } From b106018029683804d0b5152243dee19c0f4710ef Mon Sep 17 00:00:00 2001 From: Kevyn Bruyere Date: Sun, 31 Jan 2021 07:03:24 +0100 Subject: [PATCH 13/31] fix: LDAP - avoid reading empty tls cert file (#2980) Co-authored-by: Kevyn Bruyere --- .../authentication/ldap/authentication.js | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/server/modules/authentication/ldap/authentication.js b/server/modules/authentication/ldap/authentication.js index 2daeeb36..d1bff88e 100644 --- a/server/modules/authentication/ldap/authentication.js +++ b/server/modules/authentication/ldap/authentication.js @@ -18,12 +18,7 @@ module.exports = { bindCredentials: conf.bindCredentials, searchBase: conf.searchBase, searchFilter: conf.searchFilter, - tlsOptions: (conf.tlsEnabled) ? { - rejectUnauthorized: conf.verifyTLSCertificate, - ca: [ - fs.readFileSync(conf.tlsCertPath) - ] - } : {}, + tlsOptions: getTlsOptions(conf), includeRaw: true }, usernameField: 'email', @@ -56,3 +51,25 @@ module.exports = { )) } } + +function getTlsOptions(conf) { + if (!conf.tlsEnabled) { + return {} + } + + if (!conf.tlsCertPath) { + return { + rejectUnauthorized: conf.verifyTLSCertificate, + } + } + + const caList = [] + if (conf.verifyTLSCertificate) { + caList.push(fs.readFileSync(conf.tlsCertPath)) + } + + return { + rejectUnauthorized: conf.verifyTLSCertificate, + ca: caList + } +} From 806e4e8f1193348ec846f5b2f5b40238f1a9af5a Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 1 Feb 2021 23:45:34 +0100 Subject: [PATCH 14/31] fix: get syncInterval from model instead of module data (#3003) --- server/graph/resolvers/storage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/graph/resolvers/storage.js b/server/graph/resolvers/storage.js index 4effb6a5..b9de96a5 100644 --- a/server/graph/resolvers/storage.js +++ b/server/graph/resolvers/storage.js @@ -19,7 +19,7 @@ module.exports = { ...targetInfo, ...tgt, hasSchedule: (targetInfo.schedule !== false), - syncInterval: targetInfo.syncInterval || targetInfo.schedule || 'P0D', + syncInterval: tgt.syncInterval || targetInfo.schedule || 'P0D', syncIntervalDefault: targetInfo.schedule, config: _.sortBy(_.transform(tgt.config, (res, value, key) => { const configData = _.get(targetInfo.props, key, false) From 5123c3f77befb64682bd2119b09e6e6ac0d87cc0 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Mon, 1 Feb 2021 23:17:38 -0500 Subject: [PATCH 15/31] docs: update BACKERS ***NO_CI*** --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index baa5b5f5..76a80c00 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,7 @@ Support this project by becoming a sponsor. Your name will show up in the Contri - Sam Martin ([@winkelement](https://github.com/ABitMoreDepth)) - Sean Coffey ([@seanecoffey](https://github.com/seanecoffey)) - Victor Bilgin ([@vbilgin](https://github.com/vbilgin)) +- VMO Solutions ([@vmosolutions](https://github.com/vmosolutions)) - aniketpanjwani ([@aniketpanjwani](https://github.com/aniketpanjwani)) - aytaa ([@aytaa](https://github.com/aytaa)) - magicpotato ([@fortheday](https://github.com/fortheday)) From 2de0a74c8ed7de1bcd9d41b6ea2566e710b0467d Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Wed, 3 Feb 2021 19:24:40 -0500 Subject: [PATCH 16/31] docs: update BACKERS ***NO_CI*** --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 76a80c00..13e4ad02 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ Support this project by becoming a sponsor. Your name will show up in the Contri - Mattias Johnson ([@mattiasJohnson](https://github.com/mattiasJohnson)) - Mitchell Rowton ([@mrowton](https://github.com/mrowton)) - M. Scott Ford ([@mscottford](https://github.com/mscottford)) +- Nick Halase ([@nhalase](https://github.com/nhalase)) - Nina Reynolds ([@cutecycle](https://github.com/cutecycle)) - Noel Cower ([@nilium](https://github.com/nilium)) - Philipp Schmitt ([@pschmitt](https://github.com/pschmitt)) From 5e0236ca2dd55f794fa156888a2f1aabfd9a3f03 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Fri, 5 Feb 2021 22:47:05 -0500 Subject: [PATCH 17/31] docs: clarify helm postgres deploy ***NO_CI*** --- dev/helm/README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dev/helm/README.md b/dev/helm/README.md index 63c829c3..21cc9c44 100644 --- a/dev/helm/README.md +++ b/dev/helm/README.md @@ -131,7 +131,22 @@ $ helm install --name my-release -f values.yaml . ## PostgresSQL -By default, PostgreSQL is installed as part of the chart. To use an external PostgreSQL server set `postgresql.enabled` to `false` and then set `postgresql.postgresqlHost` and `postgresql.postgresqlPassword`. The other options (`postgresql.postgresqlDatabase`, `postgresql.postgresqlUser` and `postgresql.postgresqlPort`) may also want changing from their default values. +By default, PostgreSQL is installed as part of the chart. + +### Using an external PostgreSQL server + +To use an external PostgreSQL server, set `postgresql.enabled` to `false` and then set `postgresql.postgresqlHost` and `postgresql.postgresqlPassword`. The other options (`postgresql.postgresqlDatabase`, `postgresql.postgresqlUser` and `postgresql.postgresqlPort`) may also want changing from their default values. + +You also need to add the follow Helm template to your deployment: + +```yaml +kind: Secret +apiVersion: v1 +metadata: + name: {{ template "wiki.postgresql.secret" . }} +data: + {{ template "wiki.postgresql.secretKey" . }}: "{{ .Values.postgresql.postgresqlPassword | b64enc }}" +``` ## Persistence From 919d7c12a1c77d6e458f184586933e4212747676 Mon Sep 17 00:00:00 2001 From: Thomas Nilefalk Date: Mon, 8 Feb 2021 17:26:55 +0100 Subject: [PATCH 18/31] fix: syntax error in rebuild-tree.js (#3048) --- server/jobs/rebuild-tree.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/jobs/rebuild-tree.js b/server/jobs/rebuild-tree.js index a91e7e40..53d3898a 100644 --- a/server/jobs/rebuild-tree.js +++ b/server/jobs/rebuild-tree.js @@ -57,7 +57,7 @@ module.exports = async (pageId) => { await WIKI.models.knex.table('pageTree').truncate() if (tree.length > 0) { // -> Save in chunks, because of per query max parameters (35k Postgres, 2k MSSQL, 1k for SQLite) - if ((WIKI.config.db.type !== 'sqlite')) + if ((WIKI.config.db.type !== 'sqlite')) { for (const chunk of _.chunk(tree, 100)) { await WIKI.models.knex.table('pageTree').insert(chunk) } From 5ffa189383dd716f12b56b8cae2ba0d075996cf1 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 11 Mar 2021 19:23:24 -0500 Subject: [PATCH 19/31] fix: add v-pre to pre tags at render time --- server/modules/rendering/html-core/renderer.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/modules/rendering/html-core/renderer.js b/server/modules/rendering/html-core/renderer.js index 33cf949e..1c618781 100644 --- a/server/modules/rendering/html-core/renderer.js +++ b/server/modules/rendering/html-core/renderer.js @@ -261,6 +261,10 @@ module.exports = { } iterateMustacheNode($.root()) + $('pre').each((idx, elm) => { + $(elm).attr('v-pre', true) + }) + // -------------------------------- // STEP: POST // -------------------------------- From e87d5119789686ed2ace11385ac79dc33a4e8fa5 Mon Sep 17 00:00:00 2001 From: pylr Date: Fri, 19 Mar 2021 02:53:55 +0100 Subject: [PATCH 20/31] fix: HSTS header max-age value (#3225) --- server/middlewares/security.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/middlewares/security.js b/server/middlewares/security.js index 7b5fb40a..4f2e4e8f 100644 --- a/server/middlewares/security.js +++ b/server/middlewares/security.js @@ -33,7 +33,7 @@ module.exports = function (req, res, next) { // -> Enforce HSTS if (WIKI.config.security.securityHSTS) { - res.set('Strict-Transport-Security', `max-age=${WIKI.config.securityHSTSDuration}; includeSubDomains`) + res.set('Strict-Transport-Security', `max-age=${WIKI.config.security.securityHSTSDuration}; includeSubDomains`) } // -> Prevent Open Redirect from user provided URL From 3f001dca2c8a4cffc6db28708c32c983908d691a Mon Sep 17 00:00:00 2001 From: PaulD987 <73899671+PaulD987@users.noreply.github.com> Date: Fri, 19 Mar 2021 01:56:59 +0000 Subject: [PATCH 21/31] fix: loginRedirect doesn't work for non local strategies (#3222) --- server/controllers/auth.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 037652d4..9d691087 100644 --- a/server/controllers/auth.js +++ b/server/controllers/auth.js @@ -71,7 +71,19 @@ router.all('/login/:strategy/callback', async (req, res, next) => { strategy: req.params.strategy }, { req, res }) res.cookie('jwt', authResult.jwt, { expires: moment().add(1, 'y').toDate() }) - res.redirect(authResult.redirect) + + const loginRedirect = req.cookies['loginRedirect'] + if (loginRedirect === '/' && authResult.redirect) { + res.clearCookie('loginRedirect') + res.redirect(authResult.redirect) + } else if (loginRedirect) { + res.clearCookie('loginRedirect') + res.redirect(loginRedirect) + } else if (authResult.redirect) { + res.redirect(authResult.redirect) + } else { + res.redirect('/') + } } catch (err) { next(err) } From 36e7b8b919762ac9b9a52346dc446c18c623d169 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Thu, 18 Mar 2021 22:16:00 -0400 Subject: [PATCH 22/31] misc: change gh issue types ***NO_CI*** --- .github/ISSUE_TEMPLATE/bug_report.md | 32 ---------------------------- 1 file changed, 32 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index c5837a35..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve Wiki.js -title: '' -labels: '' -assignees: NGPixel - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Host Info (please complete the following information):** - - OS: [e.g. Ubuntu 18.04, Docker] - - Wiki.js version: [e.g. 2.0.1] - - Database engine: [e.g. postgres 9.7, mysql 5.7] - -**Additional context** -Add any other context about the problem here. From c9f4d238eb64f4b251bbad99440611d0e16f54c3 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Thu, 18 Mar 2021 22:24:21 -0400 Subject: [PATCH 23/31] misc: update issue templates ***NO_CI*** --- .github/ISSUE_TEMPLATE/config.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index d672bf53..680ec362 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,14 @@ blank_issues_enabled: false contact_links: - name: Help / Questions - url: https://github.com/Requarks/wiki/discussions?discussions_q=category%3A%22Help+%2F+Questions%22 - about: Please ask and answer questions here. + url: https://github.com/Requarks/wiki/discussions/categories/help-questions + about: Ask the community for help on using or setting up Wiki.js + - name: Report a Security Issue + url: https://github.com/Requarks/wiki/security/policy + about: Privately report security issues so they can be addressed quickly. + - name: Errors / Bug Reports + url: https://github.com/Requarks/wiki/discussions/categories/error-bug-report + about: Create a discussion around the bug / error you're getting. If validated, a proper GitHub issue will be created so that it can be worked on. - name: Request a new feature / improvement - url: https://requarks.canny.io/wiki + url: https://feedback.js.wiki/wiki about: Submit ideas for new features or improvements. From 9c3cb1aa907838ab847270309ed19fec994f6dc1 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sat, 20 Mar 2021 20:56:15 -0400 Subject: [PATCH 24/31] docs: update readme links ***NO_CI*** --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13e4ad02..725ecfe0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ - [Installation](https://docs.requarks.io/install) - [Demo](https://docs.requarks.io/demo) - [Change Log](https://docs.requarks.io/releases) -- [Feature Requests](https://wiki.js.org/feedback) +- [Feature Requests](https://feedback.js.wiki/wiki) - [Chat with us on Slack](https://wiki.requarks.io/slack) - [Translations](https://docs.requarks.io/dev/translations) *(We need your help!)* - [E2E Testing Results](https://dashboard.cypress.io/projects/r7qxah/runs) From 033b8e6b21c9a818cf7a62e851fede71cb5bb33b Mon Sep 17 00:00:00 2001 From: Max <33969759+MaXeraph@users.noreply.github.com> Date: Tue, 23 Mar 2021 11:14:29 -0400 Subject: [PATCH 25/31] fix: S3 copyObject usage - Missing bucket name (#3745) * Fix copyObject usage: supply bucket name * No semicolon * Assign empty string on initialization * Remove empty line --- server/modules/storage/s3/common.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/modules/storage/s3/common.js b/server/modules/storage/s3/common.js index c34e2451..fa1bc5dc 100644 --- a/server/modules/storage/s3/common.js +++ b/server/modules/storage/s3/common.js @@ -22,6 +22,7 @@ const getFilePath = (page, pathKey) => { module.exports = class S3CompatibleStorage { constructor(storageName) { this.storageName = storageName + this.bucketName = "" } async activated() { // not used @@ -56,6 +57,7 @@ module.exports = class S3CompatibleStorage { } this.s3 = new S3(s3Config) + this.bucketName = bucket // determine if a bucket exists and you have permission to access it await this.s3.headBucket().promise() @@ -89,7 +91,7 @@ module.exports = class S3CompatibleStorage { destinationFilePath = `${page.destinationLocaleCode}/${destinationFilePath}` } } - await this.s3.copyObject({ CopySource: sourceFilePath, Key: destinationFilePath }).promise() + await this.s3.copyObject({ CopySource: `${this.bucketName}/${sourceFilePath}`, Key: destinationFilePath }).promise() await this.s3.deleteObject({ Key: sourceFilePath }).promise() } /** @@ -117,7 +119,7 @@ module.exports = class S3CompatibleStorage { */ async assetRenamed (asset) { WIKI.logger.info(`(STORAGE/${this.storageName}) Renaming file from ${asset.path} to ${asset.destinationPath}...`) - await this.s3.copyObject({ CopySource: asset.path, Key: asset.destinationPath }).promise() + await this.s3.copyObject({ CopySource: `${this.bucketName}/${asset.path}`, Key: asset.destinationPath }).promise() await this.s3.deleteObject({ Key: asset.path }).promise() } async getLocalLocation () { From 05aad5b9c6ac42494ff0d3b2273a2db4f20e3686 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 23 Mar 2021 13:47:57 -0500 Subject: [PATCH 26/31] docs: added DB_SSL and DB_SSL_CA to helm chart (#2492) ***NO_CI*** * Update deployment.yaml added DB_SSL option for postgres * Update README.md added note about `postgresql.ssl` * added DB_SSL_CA * added postgressql.ca note * Update values.yaml added more PostgresSQL details to values.yml * Update values.yaml * Update values.yaml removed whitespace * Update README.md added ssl and ca notes * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * docs: update README Co-authored-by: Nicolas Giard --- dev/helm/README.md | 4 ++++ dev/helm/templates/deployment.yaml | 4 ++++ dev/helm/values.yaml | 16 ++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/dev/helm/README.md b/dev/helm/README.md index 21cc9c44..7d45fba1 100644 --- a/dev/helm/README.md +++ b/dev/helm/README.md @@ -108,6 +108,8 @@ The following table lists the configurable parameters of the Wiki.js chart and t | `postgresql.postgresqlHost` | External postgres host | `nil` | | `postgresql.postgresqlPassword` | External postgres password | `nil` | | `postgresql.postgresqlPort` | External postgres port | `5432` | +| `postgresql.ssl` | Enable external postgres SSL connection | `false` | +| `postgresql.ca` | Certificate of Authority path for postgres | `nil` | | `postgresql.persistence.enabled` | Enable postgres persistence using PVC | `true` | | `postgresql.persistence.existingClaim` | Provide an existing `PersistentVolumeClaim` for postgres | `nil` | | `postgresql.persistence.storageClass` | Postgres PVC Storage Class (example: `nfs`) | `nil` | @@ -137,6 +139,8 @@ By default, PostgreSQL is installed as part of the chart. To use an external PostgreSQL server, set `postgresql.enabled` to `false` and then set `postgresql.postgresqlHost` and `postgresql.postgresqlPassword`. The other options (`postgresql.postgresqlDatabase`, `postgresql.postgresqlUser` and `postgresql.postgresqlPort`) may also want changing from their default values. +To use an SSL connection you can set `postgresql.ssl` to `true` and if needed the path to a Certificate of Authority can be set using `postgresql.ca` to `/path/to/ca`. Default `postgresql.ssl` value is `false`. + You also need to add the follow Helm template to your deployment: ```yaml diff --git a/dev/helm/templates/deployment.yaml b/dev/helm/templates/deployment.yaml index 41b8805e..0c728770 100644 --- a/dev/helm/templates/deployment.yaml +++ b/dev/helm/templates/deployment.yaml @@ -38,6 +38,10 @@ spec: value: {{ default "wiki" .Values.postgresql.postgresqlDatabase }} - name: DB_USER value: {{ default "wiki" .Values.postgresql.postgresqlUser }} + - name: DB_SSL + value: "{{ default "false" .Values.postgresql.ssl }}" + - name: DB_SSL_CA + value: "{{ default "" .Values.postgresql.ca }}" - name: DB_PASS valueFrom: secretKeyRef: diff --git a/dev/helm/values.yaml b/dev/helm/values.yaml index 2d0859c0..87701fb2 100644 --- a/dev/helm/values.yaml +++ b/dev/helm/values.yaml @@ -80,6 +80,22 @@ postgresql: ## Set to false if bringing your own PostgreSQL, and set secret value postgresql-uri. ## enabled: true + ## ssl enforce SSL communication with PostgresSQL + ## Default to false + ## + # ssl: false + ## ca Certificate of Authority + ## Default to empty, point to location of CA + ## + # ca: "path to ca" + ## postgresqlHost override postgres database host + ## Default to postgres + ## + # postgresqlHost: postgres + ## postgresqlPort port for postgres + ## Default to 5432 + ## + # postgresqlPort: 5432 ## PostgreSQL fullname Override ## Default to wiki-postgresql unless fullname override is set for Chart ## From c57c9d901807c6cb88f7f4e443925332eccaea1f Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 25 Mar 2021 21:19:32 -0400 Subject: [PATCH 27/31] fix: disable cors --- server/core/servers.js | 2 +- server/master.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/core/servers.js b/server/core/servers.js index 92cd903a..95046e65 100644 --- a/server/core/servers.js +++ b/server/core/servers.js @@ -130,7 +130,7 @@ module.exports = { path: '/graphql-subscriptions' } }) - this.servers.graph.applyMiddleware({ app: WIKI.app }) + this.servers.graph.applyMiddleware({ app: WIKI.app, cors: false }) }, /** * Close all active connections diff --git a/server/master.js b/server/master.js index 84192611..fea5e34a 100644 --- a/server/master.js +++ b/server/master.js @@ -42,8 +42,8 @@ module.exports = async () => { // ---------------------------------------- app.use(mw.security) - app.use(cors(WIKI.config.cors)) - app.options('*', cors(WIKI.config.cors)) + app.use(cors({ origin: false })) + app.options('*', cors({ origin: false })) if (WIKI.config.security.securityTrustProxy) { app.enable('trust proxy') } From d75c5532d1cde5e20f39c165b39539bdc25bc355 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 25 Mar 2021 23:50:59 -0400 Subject: [PATCH 28/31] fix: handle raw mustache expressions over multiple lines --- server/modules/rendering/html-core/renderer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/modules/rendering/html-core/renderer.js b/server/modules/rendering/html-core/renderer.js index 1c618781..faa3549a 100644 --- a/server/modules/rendering/html-core/renderer.js +++ b/server/modules/rendering/html-core/renderer.js @@ -250,7 +250,7 @@ module.exports = { const list = $(node).contents().toArray() list.forEach(item => { if (item.type === 'text') { - const rawText = $(item).text() + const rawText = $(item).text().replace(/\r?\n|\r/g, '') if (mustacheRegExp.test(rawText)) { $(item).parent().attr('v-pre', true) } From 26f1c0f372673800b3ee5958c4b8ff8684b74154 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Fri, 2 Apr 2021 00:39:11 -0400 Subject: [PATCH 29/31] feat: convert page --- client/components/common/nav-header.vue | 14 ++- client/components/common/page-convert.vue | 122 ++++++++++++++++++++ client/store/page.js | 1 + client/themes/default/components/page.vue | 22 +++- package.json | 2 + server/graph/resolvers/page.js | 16 +++ server/graph/schemas/page.graphql | 5 + server/models/pages.js | 133 ++++++++++++++++++++++ server/views/page.pug | 1 + yarn.lock | 17 +++ 10 files changed, 331 insertions(+), 2 deletions(-) create mode 100644 client/components/common/page-convert.vue diff --git a/client/components/common/nav-header.vue b/client/components/common/nav-header.vue index f1b6e687..d8fc3c80 100644 --- a/client/components/common/nav-header.vue +++ b/client/components/common/nav-header.vue @@ -150,6 +150,9 @@ v-list-item.pl-4(@click='pageSource', v-if='mode !== `source` && hasReadSourcePermission') v-list-item-avatar(size='24', tile): v-icon(color='indigo') mdi-code-tags v-list-item-title.body-2 {{$t('common:header.viewSource')}} + v-list-item.pl-4(@click='pageConvert', v-if='hasWritePagesPermission') + v-list-item-avatar(size='24', tile): v-icon(color='indigo') mdi-lightning-bolt + v-list-item-title.body-2 {{$t('common:header.convert')}} v-list-item.pl-4(@click='pageDuplicate', v-if='hasWritePagesPermission') v-list-item-avatar(size='24', tile): v-icon(color='indigo') mdi-content-duplicate v-list-item-title.body-2 {{$t('common:header.duplicate')}} @@ -237,6 +240,7 @@ page-selector(mode='move', v-model='movePageModal', :open-handler='pageMoveRename', :path='path', :locale='locale') page-selector(mode='create', v-model='duplicateOpts.modal', :open-handler='pageDuplicateHandle', :path='duplicateOpts.path', :locale='duplicateOpts.locale') page-delete(v-model='deletePageModal', v-if='path && path.length') + page-convert(v-model='convertPageModal', v-if='path && path.length') .nav-header-dev(v-if='isDevMode') v-icon mdi-alert @@ -255,7 +259,8 @@ import movePageMutation from 'gql/common/common-pages-mutation-move.gql' export default { components: { - PageDelete: () => import('./page-delete.vue') + PageDelete: () => import('./page-delete.vue'), + PageConvert: () => import('./page-convert.vue') }, props: { dense: { @@ -274,6 +279,7 @@ export default { searchAdvMenuShown: false, newPageModal: false, movePageModal: false, + convertPageModal: false, deletePageModal: false, locales: siteLangs, isDevMode: false, @@ -354,6 +360,9 @@ export default { this.$root.$on('pageMove', () => { this.pageMove() }) + this.$root.$on('pageConvert', () => { + this.pageConvert() + }) this.$root.$on('pageDuplicate', () => { this.pageDuplicate() }) @@ -416,6 +425,9 @@ export default { pageDuplicateHandle ({ locale, path }) { window.location.assign(`/e/${locale}/${path}?from=${this.$store.get('page/id')}`) }, + pageConvert () { + this.convertPageModal = true + }, pageMove () { this.movePageModal = true }, diff --git a/client/components/common/page-convert.vue b/client/components/common/page-convert.vue new file mode 100644 index 00000000..94db317c --- /dev/null +++ b/client/components/common/page-convert.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/client/store/page.js b/client/store/page.js index e6b0992e..0a72798e 100644 --- a/client/store/page.js +++ b/client/store/page.js @@ -14,6 +14,7 @@ const state = { tags: [], title: '', updatedAt: '', + editor: '', mode: '', scriptJs: '', scriptCss: '', diff --git a/client/themes/default/components/page.vue b/client/themes/default/components/page.vue index 8d5b222d..b02c40e8 100644 --- a/client/themes/default/components/page.vue +++ b/client/themes/default/components/page.vue @@ -234,6 +234,18 @@ ) v-icon(size='20') mdi-code-tags span {{$t('common:header.viewSource')}} + v-tooltip(:right='$vuetify.rtl', :left='!$vuetify.rtl', v-if='hasWritePagesPermission') + template(v-slot:activator='{ on }') + v-btn( + fab + small + color='white' + light + v-on='on' + @click='pageConvert' + ) + v-icon(size='20') mdi-lightning-bolt + span {{$t('common:header.convert')}} v-tooltip(:right='$vuetify.rtl', :left='!$vuetify.rtl', v-if='hasWritePagesPermission') template(v-slot:activator='{ on }') v-btn( @@ -314,7 +326,7 @@ import _ from 'lodash' import ClipboardJS from 'clipboard' import Vue from 'vue' -Vue.component('tabset', Tabset) +Vue.component('Tabset', Tabset) Prism.plugins.autoloader.languages_path = '/_assets/js/prism/' Prism.plugins.NormalizeWhitespace.setDefaults({ @@ -397,6 +409,10 @@ export default { type: Number, default: 0 }, + editor: { + type: String, + default: '' + }, isPublished: { type: Boolean, default: false @@ -516,6 +532,7 @@ export default { this.$store.set('page/path', this.path) this.$store.set('page/tags', this.tags) this.$store.set('page/title', this.title) + this.$store.set('page/editor', this.editor) this.$store.set('page/updatedAt', this.updatedAt) if (this.effectivePermissions) { this.$store.set('page/effectivePermissions', JSON.parse(Buffer.from(this.effectivePermissions, 'base64').toString())) @@ -597,6 +614,9 @@ export default { pageSource () { this.$root.$emit('pageSource') }, + pageConvert () { + this.$root.$emit('pageConvert') + }, pageDuplicate () { this.$root.$emit('pageDuplicate') }, diff --git a/package.json b/package.json index add282ae..afa3bf1b 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@aoberoi/passport-slack": "1.0.5", "@azure/storage-blob": "12.2.1", "@exlinc/keycloak-passport": "1.0.2", + "@joplin/turndown-plugin-gfm": "1.0.27", "@root/csr": "0.8.1", "@root/keypairs": "0.10.1", "@root/pem": "1.0.4", @@ -176,6 +177,7 @@ "striptags": "3.1.1", "subscriptions-transport-ws": "0.9.18", "tar-fs": "2.1.0", + "turndown": "7.0.0", "twemoji": "13.0.1", "uslug": "1.0.4", "uuid": "8.3.1", diff --git a/server/graph/resolvers/page.js b/server/graph/resolvers/page.js index d1e60121..e356ac0f 100644 --- a/server/graph/resolvers/page.js +++ b/server/graph/resolvers/page.js @@ -398,6 +398,22 @@ module.exports = { return graphHelper.generateError(err) } }, + /** + * CONVERT PAGE + */ + async convert(obj, args, context) { + try { + await WIKI.models.pages.convertPage({ + ...args, + user: context.req.user + }) + return { + responseResult: graphHelper.generateSuccess('Page has been converted.') + } + } catch (err) { + return graphHelper.generateError(err) + } + }, /** * MOVE PAGE */ diff --git a/server/graph/schemas/page.graphql b/server/graph/schemas/page.graphql index a230185c..10eebc85 100644 --- a/server/graph/schemas/page.graphql +++ b/server/graph/schemas/page.graphql @@ -112,6 +112,11 @@ type PageMutation { title: String ): PageResponse @auth(requires: ["write:pages", "manage:pages", "manage:system"]) + convert( + id: Int! + editor: String! + ): DefaultResponse @auth(requires: ["write:pages", "manage:pages", "manage:system"]) + move( id: Int! destinationPath: String! diff --git a/server/models/pages.js b/server/models/pages.js index 16f5b2f1..681bba08 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -9,6 +9,9 @@ const striptags = require('striptags') const emojiRegex = require('emoji-regex') const he = require('he') const CleanCSS = require('clean-css') +const TurndownService = require('turndown') +const turndownPluginGfm = require('@joplin/turndown-plugin-gfm').gfm +const cheerio = require('cheerio') /* global WIKI */ @@ -140,6 +143,7 @@ module.exports = class Page extends Model { creatorId: 'uint', creatorName: 'string', description: 'string', + editorKey: 'string', isPrivate: 'boolean', isPublished: 'boolean', publishEndDate: 'string', @@ -471,6 +475,134 @@ module.exports = class Page extends Model { return page } + /** + * Convert an Existing Page + * + * @param {Object} opts Page Properties + * @returns {Promise} Promise of the Page Model Instance + */ + static async convertPage(opts) { + // -> Fetch original page + const ogPage = await WIKI.models.pages.query().findById(opts.id) + if (!ogPage) { + throw new Error('Invalid Page Id') + } + + // -> Check for page access + if (!WIKI.auth.checkAccess(opts.user, ['write:pages'], { + locale: ogPage.localeCode, + path: ogPage.path + })) { + throw new WIKI.Error.PageUpdateForbidden() + } + + // -> Check content type + const sourceContentType = ogPage.contentType + const targetContentType = _.get(_.find(WIKI.data.editors, ['key', opts.editor]), `contentType`, 'text') + const shouldConvert = sourceContentType !== targetContentType + let convertedContent = null + + // -> Convert content + if (shouldConvert) { + // -> Markdown => HTML + if (sourceContentType === 'markdown' && targetContentType === 'html') { + if (!ogPage.render) { + throw new Error('Aborted conversion because rendered page content is empty!') + } + convertedContent = ogPage.render + + const $ = cheerio.load(convertedContent, { + decodeEntities: true + }) + + if ($.root().children().length > 0) { + $('.toc-anchor').remove() + + convertedContent = $.html('body').replace('', '').replace('', '').replace(/&#x([0-9a-f]{1,6});/ig, (entity, code) => { + code = parseInt(code, 16) + + // Don't unescape ASCII characters, assuming they're encoded for a good reason + if (code < 0x80) return entity + + return String.fromCodePoint(code) + }) + } + + // -> HTML => Markdown + } else if (sourceContentType === 'html' && targetContentType === 'markdown') { + const td = new TurndownService({ + bulletListMarker: '-', + codeBlockStyle: 'fenced', + emDelimiter: '*', + fence: '```', + headingStyle: 'atx', + hr: '---', + linkStyle: 'inlined', + preformattedCode: true, + strongDelimiter: '**' + }) + + td.use(turndownPluginGfm) + + td.keep(['kbd']) + + td.addRule('subscript', { + filter: ['sub'], + replacement: c => `~${c}~` + }) + + td.addRule('superscript', { + filter: ['sup'], + replacement: c => `^${c}^` + }) + + td.addRule('underline', { + filter: ['u'], + replacement: c => `_${c}_` + }) + + td.addRule('removeTocAnchors', { + filter: (n, o) => { + return n.nodeName === 'A' && n.classList.contains('toc-anchor') + }, + replacement: c => '' + }) + + convertedContent = td.turndown(ogPage.content) + // -> Unsupported + } else { + throw new Error('Unsupported source / destination content types combination.') + } + } + + // -> Create version snapshot + if (shouldConvert) { + await WIKI.models.pageHistory.addVersion({ + ...ogPage, + isPublished: ogPage.isPublished === true || ogPage.isPublished === 1, + action: 'updated', + versionDate: ogPage.updatedAt + }) + } + + // -> Update page + await WIKI.models.pages.query().patch({ + contentType: targetContentType, + editorKey: opts.editor, + ...(convertedContent ? { content: convertedContent } : {}) + }).where('id', ogPage.id) + const page = await WIKI.models.pages.getPageFromDb(ogPage.id) + + await WIKI.models.pages.deletePageFromCache(page.hash) + WIKI.events.outbound.emit('deletePageFromCache', page.hash) + + // -> Update on Storage + await WIKI.models.storage.pageEvent({ + event: 'updated', + page + }) + } + /** * Move a Page * @@ -872,6 +1004,7 @@ module.exports = class Page extends Model { creatorId: page.creatorId, creatorName: page.creatorName, description: page.description, + editorKey: page.editorKey, extra: { css: _.get(page, 'extra.css', ''), js: _.get(page, 'extra.js', '') diff --git a/server/views/page.pug b/server/views/page.pug index 2096a7c8..cc19fbae 100644 --- a/server/views/page.pug +++ b/server/views/page.pug @@ -20,6 +20,7 @@ block body updated-at=page.updatedAt author-name=page.authorName :author-id=page.authorId + editor=page.editorKey :is-published=page.isPublished.toString() toc=Buffer.from(page.toc).toString('base64') :page-id=page.id diff --git a/yarn.lock b/yarn.lock index 9f4edca1..5058d061 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3220,6 +3220,11 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@joplin/turndown-plugin-gfm@1.0.27": + version "1.0.27" + resolved "https://registry.yarnpkg.com/@joplin/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.27.tgz#15ae15c169b88a355647065e7502f6619f0ace46" + integrity sha512-4BPgTSkhvxPI3tbjG4BPiBq0VuNZji1Y77DRWHb09GnzsrgwBI+gpo3EI6obkyIeRuN/03wzf98W5u1iau2vpQ== + "@kwsites/file-exists@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" @@ -8277,6 +8282,11 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domino@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" + integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== + dompurify@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.0.tgz#51d34e76faa38b5d6b4e83a0678530f27fe3965c" @@ -18405,6 +18415,13 @@ tunnel@0.0.6, tunnel@^0.0.6: resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== +turndown@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.0.0.tgz#19b2a6a2d1d700387a1e07665414e4af4fec5225" + integrity sha512-G1FfxfR0mUNMeGjszLYl3kxtopC4O9DRRiMlMDDVHvU1jaBkGFg4qxIyjIk2aiKLHyDyZvZyu4qBO2guuYBy3Q== + dependencies: + domino "^2.1.6" + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" From 84b927915e30f91331c552bc3f2c12bc471213d5 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Fri, 2 Apr 2021 15:15:35 -0400 Subject: [PATCH 30/31] fix: convert page - task list + UI fixes --- client/components/common/page-convert.vue | 4 +--- .../components/editor/editor-modal-editorselect.vue | 2 +- server/models/pages.js | 13 +++++++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/client/components/common/page-convert.vue b/client/components/common/page-convert.vue index 94db317c..51dc94b7 100644 --- a/client/components/common/page-convert.vue +++ b/client/components/common/page-convert.vue @@ -100,9 +100,7 @@ export default { }) if (_.get(resp, 'data.pages.convert.responseResult.succeeded', false)) { this.isShown = false - _.delay(() => { - window.location.assign(`/e/${this.pageLocale}/${this.pagePath}`) - }, 400) + window.location.assign(`/e/${this.pageLocale}/${this.pagePath}`) } else { throw new Error(_.get(resp, 'data.pages.convert.responseResult.message', this.$t('common:error.unexpected'))) } diff --git a/client/components/editor/editor-modal-editorselect.vue b/client/components/editor/editor-modal-editorselect.vue index edb2ab24..b5ce35f5 100644 --- a/client/components/editor/editor-modal-editorselect.vue +++ b/client/components/editor/editor-modal-editorselect.vue @@ -96,7 +96,7 @@ img(src='/_assets/svg/editor-icon-ckeditor.svg', alt='Visual Editor', style='width: 36px;') .body-2.mt-2.primary--text Visual Editor .caption.grey--text Rich-text WYSIWYG - .caption.blue--text.text--lighten-2 {{$t('editor:select.cannotChange')}} + //- .caption.blue--text.text--lighten-2 {{$t('editor:select.cannotChange')}} v-card.radius-7.mt-2(color='teal darken-3', dark) v-card-text.text-center.py-4 diff --git a/server/models/pages.js b/server/models/pages.js index 681bba08..084577a3 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -488,6 +488,10 @@ module.exports = class Page extends Model { throw new Error('Invalid Page Id') } + if (ogPage.editorKey === opts.editor) { + throw new Error('Page is already using this editor. Nothing to convert.') + } + // -> Check for page access if (!WIKI.auth.checkAccess(opts.user, ['write:pages'], { locale: ogPage.localeCode, @@ -561,6 +565,15 @@ module.exports = class Page extends Model { replacement: c => `_${c}_` }) + td.addRule('taskList', { + filter: (n, o) => { + return n.nodeName === 'INPUT' && n.getAttribute('type') === 'checkbox' + }, + replacement: (c, n) => { + return n.getAttribute('checked') ? '[x] ' : '[ ] ' + } + }) + td.addRule('removeTocAnchors', { filter: (n, o) => { return n.nodeName === 'A' && n.classList.contains('toc-anchor') From f55caab359ca7715012e3f9a3b9e31f16cccf399 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Fri, 2 Apr 2021 17:30:04 -0400 Subject: [PATCH 31/31] fix: convert page - handle tabsets --- package.json | 40 ++--- server/models/pages.js | 27 +++ yarn.lock | 382 ++++++++++++++++++++++++++++------------- 3 files changed, 307 insertions(+), 142 deletions(-) diff --git a/package.json b/package.json index afa3bf1b..a3f26cc1 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "bluebird": "3.7.2", "body-parser": "1.19.0", "chalk": "4.1.0", - "cheerio": "1.0.0-rc.3", + "cheerio": "1.0.0-rc.5", "chokidar": "3.4.3", "chromium-pickle-js": "0.2.0", "clean-css": "4.2.3", @@ -70,12 +70,12 @@ "dependency-graph": "0.9.0", "diff": "4.0.2", "diff2html": "3.1.14", - "dompurify": "2.2.0", + "dompurify": "2.2.7", "dotize": "0.3.0", "elasticsearch6": "npm:@elastic/elasticsearch@6", "elasticsearch7": "npm:@elastic/elasticsearch@7", - "emoji-regex": "9.2.0", - "eventemitter2": "6.4.3", + "emoji-regex": "9.2.2", + "eventemitter2": "6.4.4", "express": "4.17.1", "express-brute": "1.0.1", "express-session": "1.17.1", @@ -102,7 +102,7 @@ "katex": "0.12.0", "klaw": "3.0.0", "knex": "0.21.7", - "lodash": "4.17.20", + "lodash": "4.17.21", "luxon": "1.25.0", "markdown-it": "11.0.1", "markdown-it-abbr": "1.0.4", @@ -112,22 +112,22 @@ "markdown-it-external-links": "0.0.6", "markdown-it-footnote": "3.0.2", "markdown-it-imsize": "2.0.1", - "markdown-it-mark": "3.0.0", + "markdown-it-mark": "3.0.1", "markdown-it-mathjax": "2.0.0", "markdown-it-multimd-table": "4.0.3", "markdown-it-sub": "1.0.0", "markdown-it-sup": "1.0.0", "markdown-it-task-lists": "2.1.1", "mathjax": "3.1.2", - "mime-types": "2.1.27", + "mime-types": "2.1.30", "moment": "2.29.1", "moment-timezone": "0.5.31", - "mongodb": "3.6.2", - "ms": "2.1.2", + "mongodb": "3.6.5", + "ms": "2.1.3", "mssql": "6.2.3", "multer": "1.4.2", "mysql2": "2.2.5", - "nanoid": "3.1.15", + "nanoid": "3.1.22", "node-2fa": "1.1.2", "node-cache": "5.1.2", "nodemailer": "6.4.14", @@ -157,7 +157,7 @@ "pg-pubsub": "0.5.0", "pg-query-stream": "3.3.1", "pg-tsquery": "8.1.0", - "pug": "3.0.0", + "pug": "3.0.2", "punycode": "2.1.1", "qr-image": "3.2.0", "raven": "2.6.4", @@ -167,20 +167,20 @@ "safe-regex": "2.1.1", "sanitize-filename": "1.6.3", "scim-query-filter-parser": "2.0.4", - "semver": "7.3.2", + "semver": "7.3.5", "serve-favicon": "2.5.0", "simple-git": "2.21.0", "solr-node": "1.2.1", - "sqlite3": "5.0.0", + "sqlite3": "5.0.2", "ssh2": "0.8.9", "ssh2-promise": "0.1.7", "striptags": "3.1.1", "subscriptions-transport-ws": "0.9.18", - "tar-fs": "2.1.0", + "tar-fs": "2.1.1", "turndown": "7.0.0", - "twemoji": "13.0.1", + "twemoji": "13.0.2", "uslug": "1.0.4", - "uuid": "8.3.1", + "uuid": "8.3.2", "validate.js": "0.13.1", "winston": "3.3.3", "xss": "1.0.8", @@ -228,7 +228,7 @@ "cash-dom": "8.1.0", "chart.js": "2.9.4", "clean-webpack-plugin": "3.0.0", - "clipboard": "2.0.6", + "clipboard": "2.0.8", "codemirror": "5.58.2", "copy-webpack-plugin": "6.2.1", "core-js": "3.6.5", @@ -262,7 +262,7 @@ "i18next-xhr-backend": "3.2.2", "ignore-loader": "0.1.2", "jest": "26.6.1", - "js-beautify": "1.13.0", + "js-beautify": "1.13.5", "js-cookie": "2.2.1", "mermaid": "8.8.2", "mini-css-extract-plugin": "0.11.3", @@ -301,7 +301,7 @@ "vue-clipboards": "1.3.0", "vue-filepond": "6.0.3", "vue-hot-reload-api": "2.3.4", - "vue-loader": "15.9.3", + "vue-loader": "15.9.6", "vue-moment": "4.1.0", "vue-router": "3.4.7", "vue-status-indicator": "1.2.1", @@ -312,7 +312,7 @@ "vuetify": "2.3.15", "vuetify-loader": "1.6.0", "vuex": "3.5.1", - "vuex-pathify": "1.4.1", + "vuex-pathify": "1.4.5", "vuex-persistedstate": "3.1.0", "webpack": "4.44.2", "webpack-bundle-analyzer": "3.9.0", diff --git a/server/models/pages.js b/server/models/pages.js index 084577a3..abe2bc6e 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -520,8 +520,35 @@ module.exports = class Page extends Model { }) if ($.root().children().length > 0) { + // Remove header anchors $('.toc-anchor').remove() + // Attempt to convert tabsets + $('tabset').each((tabI, tabElm) => { + const tabHeaders = [] + // -> Extract templates + $(tabElm).children('template').each((tmplI, tmplElm) => { + if ($(tmplElm).attr('v-slot:tabs') === '') { + $(tabElm).before('
    ' + $(tmplElm).html() + '
') + } else { + $(tabElm).after('
' + $(tmplElm).html() + '
') + } + }) + // -> Parse tab headers + $(tabElm).prev('.tabset-headers').children((i, elm) => { + tabHeaders.push($(elm).html()) + }) + $(tabElm).prev('.tabset-headers').remove() + // -> Inject tab headers + $(tabElm).next('.markdown-tabset').children((i, elm) => { + if (tabHeaders.length > i) { + $(elm).prepend(`

${tabHeaders[i]}

`) + } + }) + $(tabElm).next('.markdown-tabset').prepend('

Tabset

') + $(tabElm).remove() + }) + convertedContent = $.html('body').replace('', '').replace('', '').replace(/&#x([0-9a-f]{1,6});/ig, (entity, code) => { code = parseInt(code, 16) diff --git a/yarn.lock b/yarn.lock index 5058d061..858f674b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5544,6 +5544,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base64url@3.x.x, base64url@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" @@ -5627,6 +5632,15 @@ bl@^3.0.0: dependencies: readable-stream "^3.0.1" +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blob-util@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" @@ -5890,6 +5904,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + bufferutil@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" @@ -6254,17 +6276,29 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== -cheerio@1.0.0-rc.3: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" +cheerio-select-tmp@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz#55bbef02a4771710195ad736d5e346763ca4e646" + integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ== + dependencies: + css-select "^3.1.2" + css-what "^4.0.0" + domelementtype "^2.1.0" + domhandler "^4.0.0" + domutils "^2.4.4" + +cheerio@1.0.0-rc.5: + version "1.0.0-rc.5" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.5.tgz#88907e1828674e8f9fee375188b27dadd4f0fa2f" + integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw== + dependencies: + cheerio-select-tmp "^0.1.0" + dom-serializer "~1.2.0" + domhandler "^4.0.0" + entities "~2.1.0" + htmlparser2 "^6.0.0" + parse5 "^6.0.0" + parse5-htmlparser2-tree-adapter "^6.0.0" chokidar@2.1.8, chokidar@^2.1.8: version "2.1.8" @@ -6444,10 +6478,10 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" -clipboard@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.6.tgz#52921296eec0fdf77ead1749421b21c968647376" - integrity sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg== +clipboard@2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" + integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== dependencies: good-listener "^1.2.2" select "^1.1.2" @@ -7170,7 +7204,7 @@ css-select-base-adapter@^0.1.1: resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== -css-select@^1.1.0, css-select@~1.2.0: +css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= @@ -7190,6 +7224,17 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" +css-select@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" + integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== + dependencies: + boolbase "^1.0.0" + css-what "^4.0.0" + domhandler "^4.0.0" + domutils "^2.4.3" + nth-check "^2.0.0" + css-selector-parser@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.3.0.tgz#5f1ad43e2d8eefbfdc304fcd39a521664943e3eb" @@ -7221,6 +7266,11 @@ css-what@2.1, css-what@^2.1.2: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" + integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== + css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" @@ -8245,20 +8295,21 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" -dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== +dom-serializer@^1.0.1, dom-serializer@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" + integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + entities "^2.0.0" domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: +domelementtype@1, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== @@ -8268,6 +8319,11 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== +domelementtype@^2.1.0, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -8282,15 +8338,22 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domhandler@^4.0.0, domhandler@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43" + integrity sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ== + dependencies: + domelementtype "^2.2.0" + domino@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== -dompurify@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.0.tgz#51d34e76faa38b5d6b4e83a0678530f27fe3965c" - integrity sha512-bqFOQ7XRmmozp0VsKdIEe8UwZYxj0yttz7l80GBtBqdVRY48cOpXH2J/CVO7AEkV51qY0EBVXfilec18mdmQ/w== +dompurify@2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.7.tgz#a5f055a2a471638680e779bd08fc334962d11fd8" + integrity sha512-jdtDffdGNY+C76jvodNTu9jt5yYj59vuTUyx+wXdzcSwAGTYZDAQkQ7Iwx9zcGrA4ixC1syU4H3RZROqRxokxg== domutils@1.5.1: version "1.5.1" @@ -8308,6 +8371,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.4.3, domutils@^2.4.4: + version "2.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.1.tgz#9b8e84b5d9f788499ae77506ea832e9b4f9aa1c0" + integrity sha512-hO1XwHMGAthA/1KL7c83oip/6UWo3FlUNIuWiWKltoiQ5oCOiqths8KknvY2jpOohUoUgnwa/+Rm7UpwpSbY/Q== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.1.0" + dot-case@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" @@ -8480,10 +8552,10 @@ emittery@^0.7.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" integrity sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ== -emoji-regex@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.0.tgz#a26da8e832b16a9753309f25e35e3c0efb9a066a" - integrity sha512-DNc3KFPK18bPdElMJnf/Pkv5TXhxFU3YFDEuGLDRtPmV4rkmCjBkCSEp22u6rBHdSN9Vlp/GK7k98prmE1Jgug== +emoji-regex@9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emoji-regex@^7.0.1: version "7.0.3" @@ -8561,7 +8633,7 @@ enquirer@^2.3.5: dependencies: ansi-colors "^3.2.1" -entities@^1.1.1, entities@~1.1.1: +entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== @@ -8571,6 +8643,11 @@ entities@^2.0.0, entities@~2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + entity-decode@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/entity-decode/-/entity-decode-2.0.2.tgz#e4f807e52c3294246e9347d1f2b02b07fd5f92e7" @@ -9004,7 +9081,12 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eventemitter2@6.4.3, eventemitter2@^6.4.2: +eventemitter2@6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b" + integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw== + +eventemitter2@^6.4.2: version "6.4.3" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.3.tgz#35c563619b13f3681e7eb05cbdaf50f56ba58820" integrity sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ== @@ -10415,7 +10497,7 @@ html-webpack-pug-plugin@2.0.0: pug-source-gen "0.0.2" pug-walk "^1.1.7" -htmlparser2@^3.3.0, htmlparser2@^3.9.1: +htmlparser2@^3.3.0: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -10427,6 +10509,16 @@ htmlparser2@^3.3.0, htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.1.tgz#422521231ef6d42e56bd411da8ba40aa36e91446" + integrity sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.4.4" + entities "^2.0.0" + http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -10690,7 +10782,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -11661,10 +11753,10 @@ js-base64@3.5.2: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.5.2.tgz#3cc800e4f10812b55fb5ec53e7cabaef35dc6d3c" integrity sha512-VG2qfvV5rEQIVxq9UmAVyWIaOdZGt9M16BLu8vFkyWyhv709Hyg4nKUb5T+Ru+HmAr9RHdF+kQDKAhbJlcdKeQ== -js-beautify@1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.0.tgz#a056d5d3acfd4918549aae3ab039f9f3c51eebb2" - integrity sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA== +js-beautify@1.13.5: + version "1.13.5" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.5.tgz#a08a97890cae55daf1d758d3f6577bd4a64d7014" + integrity sha512-MsXlH6Z/BiRYSkSRW3clNDqDjSpiSNOiG8xYVUBXt4k0LnGvDhlTGOlHX1VFtAdoLmtwjxMG5qiWKy/g+Ipv5w== dependencies: config-chain "^1.1.12" editorconfig "^0.15.3" @@ -12367,7 +12459,12 @@ lodash@4.17.20, lodash@^4.17.20: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.11.2, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: +lodash@4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lodash@^4.11.2, lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -12565,10 +12662,10 @@ markdown-it-imsize@2.0.1: resolved "https://registry.yarnpkg.com/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz#cca0427905d05338a247cb9ca9d968c5cddd5170" integrity sha1-zKBCeQXQUziiR8ucqdloxc3dUXA= -markdown-it-mark@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/markdown-it-mark/-/markdown-it-mark-3.0.0.tgz#27c3e39ef3cc310b2dde5375082c9fa912983cda" - integrity sha512-HqMWeKfMMOu4zBO0emmxsoMWmbf2cPKZY1wP6FsTbKmicFfp5y4L3KXAsNeO1rM6NTJVOrNlLKMPjWzriBGspw== +markdown-it-mark@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/markdown-it-mark/-/markdown-it-mark-3.0.1.tgz#51257db58787d78aaf46dc13418d99a9f3f0ebd3" + integrity sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A== markdown-it-mathjax@2.0.0: version "2.0.0" @@ -12789,17 +12886,22 @@ mime-db@1.44.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== + "mime-db@>= 1.40.0 < 2": version "1.41.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.41.0.tgz#9110408e1f6aa1b34aef51f2c9df3caddf46b6a0" integrity sha512-B5gxBI+2K431XW8C2rcc/lhppbuji67nf9v39eH8pkWoZDxnAL0PxdpH32KYRScniF8qDHBDlI+ipgg5WrCUYw== -mime-types@2.1.27, mime-types@^2.1.27: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== +mime-types@2.1.30: + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.44.0" + mime-db "1.47.0" mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.24" @@ -12808,6 +12910,13 @@ mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: dependencies: mime-db "1.40.0" +mime-types@^2.1.27: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -13050,10 +13159,10 @@ moment@^2.19.3, moment@^2.27.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== -mongodb@3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.2.tgz#1154a4ac107bf1375112d83a29c5cf97704e96b6" - integrity sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA== +mongodb@3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.5.tgz#c27d786fd4d3c83dc19302483707d12a9d2aee5f" + integrity sha512-mQlYKw1iGbvJJejcPuyTaytq0xxlYbIoVDm2FODR+OHxyEiMR021vc32bTvamgBjCswsD54XIRwhg3yBaWqJjg== dependencies: bl "^2.2.1" bson "^1.1.4" @@ -13090,6 +13199,11 @@ ms@2.1.2, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mssql@6.2.3: version "6.2.3" resolved "https://registry.yarnpkg.com/mssql/-/mssql-6.2.3.tgz#1d15bbe8c3057e32ee6e98596b6c323b097a6cba" @@ -13148,10 +13262,10 @@ nan@^2.12.1, nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== -nanoid@3.1.15: - version "3.1.15" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.15.tgz#28e7c4ce56aff2d0c2d37814c7aef9d6c5b3e6f3" - integrity sha512-n8rXUZ8UU3lV6+43atPrSizqzh25n1/f00Wx1sCiE7R1sSHytZLTTiQl8DjC4IDLOnEZDlgJhy0yO4VsIpMxow== +nanoid@3.1.22: + version "3.1.22" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" + integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== nanomatch@^1.2.9: version "1.2.13" @@ -13250,10 +13364,10 @@ node-2fa@1.1.2: notp "^2.0.3" thirty-two "0.0.2" -node-addon-api@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.0.tgz#f9afb8d777a91525244b01775ea0ddbe1125483b" - integrity sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA== +node-addon-api@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" + integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== node-cache@5.1.2: version "5.1.2" @@ -13547,6 +13661,13 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== + dependencies: + boolbase "^1.0.0" + nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" @@ -14012,17 +14133,22 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== - dependencies: - "@types/node" "*" +parse5@^6.0.0, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseurl@^1.3.2, parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" @@ -15784,10 +15910,10 @@ pug-attrs@^3.0.0: js-stringify "^1.0.2" pug-runtime "^3.0.0" -pug-code-gen@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.1.tgz#ff3b337b100c494ea63ef766091d27f7d73acb7e" - integrity sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ== +pug-code-gen@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" + integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== dependencies: constantinople "^4.0.1" doctypes "^1.1.0" @@ -15828,10 +15954,10 @@ pug-lexer@^4.0.0: is-expression "^3.0.0" pug-error "^1.3.3" -pug-lexer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.0.tgz#0b779e7d8cbf0f103803675be96351942fd9a727" - integrity sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A== +pug-lexer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" + integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== dependencies: character-parser "^2.2.0" is-expression "^4.0.0" @@ -15914,6 +16040,11 @@ pug-runtime@^3.0.0: resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.0.tgz#d523025fdc0a1efe70929d1fd3a2d24121ffffb6" integrity sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA== +pug-runtime@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" + integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== + pug-source-gen@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/pug-source-gen/-/pug-source-gen-0.0.2.tgz#76d7753d89693c6846578c80da1628b8c6fc6fdb" @@ -15946,18 +16077,18 @@ pug-walk@^2.0.0: resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== -pug@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.0.tgz#101eecd7a236cd9906e420e17799d4d57f2b7d93" - integrity sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw== +pug@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" + integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== dependencies: - pug-code-gen "^3.0.0" + pug-code-gen "^3.0.2" pug-filters "^4.0.0" - pug-lexer "^5.0.0" + pug-lexer "^5.0.1" pug-linker "^4.0.0" pug-load "^3.0.0" pug-parser "^6.0.0" - pug-runtime "^3.0.0" + pug-runtime "^3.0.1" pug-strip-comments "^2.0.0" pump@^2.0.0: @@ -17085,16 +17216,23 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2, semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -17472,12 +17610,12 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sqlite3@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.0.tgz#1bfef2151c6bc48a3ab1a6c126088bb8dd233566" - integrity sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw== +sqlite3@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.2.tgz#00924adcc001c17686e0a6643b6cbbc2d3965083" + integrity sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA== dependencies: - node-addon-api "2.0.0" + node-addon-api "^3.0.0" node-pre-gyp "^0.11.0" optionalDependencies: node-gyp "3.x" @@ -17982,22 +18120,22 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar-fs@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" - integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" - tar-stream "^2.0.0" + tar-stream "^2.1.4" -tar-stream@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" - integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: - bl "^3.0.0" + bl "^4.0.3" end-of-stream "^1.4.1" fs-constants "^1.0.0" inherits "^2.0.3" @@ -18437,10 +18575,10 @@ twemoji-parser@13.0.0: resolved "https://registry.yarnpkg.com/twemoji-parser/-/twemoji-parser-13.0.0.tgz#bd9d1b98474f1651dc174696b45cabefdfa405af" integrity sha512-zMaGdskpH8yKjT2RSE/HwE340R4Fm+fbie4AaqjDa4H/l07YUmAvxkSfNl6awVWNRRQ0zdzLQ8SAJZuY5MgstQ== -twemoji@13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/twemoji/-/twemoji-13.0.1.tgz#57ddc8bd86c8175c11376f5f9ab322a02e739c2d" - integrity sha512-mrTBq+XpCLM4zm76NJOjLHoQNV9mHdBt3Cba/T5lS1rxn8ArwpqE47mqTocupNlkvcLxoeZJjYSUW0DU5ZwqZg== +twemoji@13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/twemoji/-/twemoji-13.0.2.tgz#e7ee8d26fd0ccc23a0afe68c7b7e61bd8d14ad24" + integrity sha512-R9tDS4pEVczjVYM5SvoAJ0AcZ4EgG1h3yw1oi1m/yrXOH17OOjaaRxZU4r5TIHEy3xYbuZQLB/tJZyC6rpQVmA== dependencies: fs-extra "^8.0.1" jsonfile "^5.0.0" @@ -18784,10 +18922,10 @@ uuid@3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -uuid@8.3.1: - version "8.3.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" - integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: version "3.3.3" @@ -18932,10 +19070,10 @@ vue-chartjs@3.5.1: dependencies: "@types/chart.js" "^2.7.55" -vue-class-component@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.1.0.tgz#b33efcb10e17236d684f70b1e96f1946ec793e87" - integrity sha512-G9152NzUkz0i0xTfhk0Afc8vzdXxDR1pfN4dTwE72cskkgJtdXfrKBkMfGvDuxUh35U500g5Ve4xL8PEGdWeHg== +vue-class-component@^7.2.6: + version "7.2.6" + resolved "https://registry.yarnpkg.com/vue-class-component/-/vue-class-component-7.2.6.tgz#8471e037b8e4762f5a464686e19e5afc708502e4" + integrity sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w== vue-clipboards@1.3.0: version "1.3.0" @@ -18971,10 +19109,10 @@ vue-hot-reload-api@^2.3.0: resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" integrity sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g== -vue-loader@15.9.3: - version "15.9.3" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.3.tgz#0de35d9e555d3ed53969516cac5ce25531299dda" - integrity sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA== +vue-loader@15.9.6: + version "15.9.6" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.6.tgz#f4bb9ae20c3a8370af3ecf09b8126d38ffdb6b8b" + integrity sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg== dependencies: "@vue/component-compiler-utils" "^3.1.0" hash-sum "^1.0.2" @@ -19062,12 +19200,12 @@ vuetify@2.3.15: resolved "https://registry.yarnpkg.com/vuetify/-/vuetify-2.3.15.tgz#ea148acce8f5bc272f64f03a0d2ace09e58e092c" integrity sha512-YVJN/ld60S2mmFCKxoVFkB8X2kmuLT0E28ql4kr8HQUeCYdK8axoca/N8ZIP1hFH4NIz392f0nVpZKS4ZFZBVA== -vuex-pathify@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/vuex-pathify/-/vuex-pathify-1.4.1.tgz#ae0bbe2eac548f5027f67494f73e273b061085b1" - integrity sha512-i4CsRrOW9r67su8YiVrthTvNfjACUMTjVne6Gxsa+tAxyNhGdKLOXhlDyi3e536gDrgHFU7Uon1TfaKoErfAuA== +vuex-pathify@1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/vuex-pathify/-/vuex-pathify-1.4.5.tgz#9a98e84d4e41dc236495568f65dec7de721ff395" + integrity sha512-i21nW9cEt3Qx3ieTk9lLxDfBkOEEB1nL9tQDRsSOkOYWZuJ+KiX/1RL+/Yb85EODsuKS9tHWJ5EHI5MImThmgg== dependencies: - vue-class-component "^7.1.0" + vue-class-component "^7.2.6" vuex-persistedstate@3.1.0: version "3.1.0"