From 07855ab329fc08b2e0428a0d8ceae72327d4439d Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Mon, 28 Jul 2025 13:11:47 -0400 Subject: [PATCH 01/46] docs: Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5a25b9c2e..07c7b5ef2 100644 --- a/README.md +++ b/README.md @@ -144,13 +144,13 @@ Support this project by becoming a sponsor. Your name will show up in the Contri - - + + Shane Kearney
(@shanekearney)
- - - + + + From 86abfea7f6a9659a6b325e1a6b980c9c7ffbb696 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Wed, 13 Aug 2025 02:52:46 -0400 Subject: [PATCH 02/46] fix: update dompurify dependency + add cross-env --- package.json | 9 +++++---- yarn.lock | 37 +++++++++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 64c1c4d51..51ba5b581 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "dev": true, "scripts": { "start": "node server", - "dev": "NODE_OPTIONS=--openssl-legacy-provider node dev", - "build": "NODE_OPTIONS=--openssl-legacy-provider webpack --profile --config dev/webpack/webpack.prod.js", - "watch": "NODE_OPTIONS=--openssl-legacy-provider webpack --config dev/webpack/webpack.dev.js", + "dev": "cross-env NODE_OPTIONS=--openssl-legacy-provider node dev", + "build": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --profile --config dev/webpack/webpack.prod.js", + "watch": "cross-env NODE_OPTIONS=--openssl-legacy-provider webpack --config dev/webpack/webpack.dev.js", "test": "eslint --format codeframe --ext .js,.vue . && pug-lint server/views && jest", "cypress:open": "cypress open", "postinstall": "patch-package" @@ -71,7 +71,7 @@ "dependency-graph": "0.11.0", "diff": "4.0.2", "diff2html": "3.1.14", - "dompurify": "2.4.3", + "dompurify": "3.2.6", "dotize": "0.3.0", "elasticsearch6": "npm:@elastic/elasticsearch@6", "elasticsearch7": "npm:@elastic/elasticsearch@7", @@ -240,6 +240,7 @@ "codemirror-asciidoc": "1.0.4", "copy-webpack-plugin": "6.2.1", "core-js": "3.6.5", + "cross-env": "10.0.0", "css-loader": "4.3.0", "cssnano": "4.1.10", "cypress": "5.3.0", diff --git a/yarn.lock b/yarn.lock index 17e8fbd59..5193952ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2795,6 +2795,11 @@ tslib "^2.4.0" undici "^6.12.0" +"@epic-web/invariant@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@epic-web/invariant/-/invariant-1.0.0.tgz#1073e5dee6dd540410784990eb73e4acd25c9813" + integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== + "@eslint/eslintrc@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.0.tgz#bc7e3c4304d4c8720968ccaee793087dfb5fe6b4" @@ -3954,6 +3959,11 @@ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/tunnel@0.0.0": version "0.0.0" resolved "https://registry.yarnpkg.com/@types/tunnel/-/tunnel-0.0.0.tgz#c2a42943ee63c90652a5557b8c4e56cda77f944e" @@ -7304,6 +7314,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-env@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-10.0.0.tgz#ba25823cfa1ed6af293dcded8796fa16cd162456" + integrity sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q== + dependencies: + "@epic-web/invariant" "^1.0.0" + cross-spawn "^7.0.6" + cross-fetch@3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" @@ -7357,6 +7375,15 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -8635,10 +8662,12 @@ domino@^2.1.6: resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== -dompurify@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" - integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== +dompurify@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" domutils@1.5.1: version "1.5.1" From c093423307c9a24e89bb55088043e694fe31dbd8 Mon Sep 17 00:00:00 2001 From: Ole Christian Tvedt Date: Wed, 13 Aug 2025 08:53:19 +0200 Subject: [PATCH 03/46] feat: set groups based on Azure groups (#7736) Co-authored-by: Ole Christian Tvedt --- .../modules/authentication/azure/authentication.js | 13 +++++++++++++ server/modules/authentication/azure/definition.yml | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/server/modules/authentication/azure/authentication.js b/server/modules/authentication/azure/authentication.js index a983d1486..ec2164a31 100644 --- a/server/modules/authentication/azure/authentication.js +++ b/server/modules/authentication/azure/authentication.js @@ -48,6 +48,19 @@ module.exports = { picture: '' } }) + if (conf.mapGroups) { + const groups = _.get(profile, '_json.groups') + if (groups && _.isArray(groups)) { + const currentGroups = (await user.$relatedQuery('groups').select('groups.id')).map(g => g.id) + const expectedGroups = Object.values(WIKI.auth.groups).filter(g => groups.includes(g.name)).map(g => g.id) + for (const groupId of _.difference(expectedGroups, currentGroups)) { + await user.$relatedQuery('groups').relate(groupId) + } + for (const groupId of _.difference(currentGroups, expectedGroups)) { + await user.$relatedQuery('groups').unrelate().where('groupId', groupId) + } + } + } cb(null, user) } catch (err) { cb(err, null) diff --git a/server/modules/authentication/azure/definition.yml b/server/modules/authentication/azure/definition.yml index ad7d41ebc..5c22d7279 100644 --- a/server/modules/authentication/azure/definition.yml +++ b/server/modules/authentication/azure/definition.yml @@ -27,3 +27,9 @@ props: title: Cookie Encryption Key String hint: Random string with 44-character length. Setting this enables workaround for Chrome's SameSite cookies. order: 3 + mapGroups: + type: Boolean + title: Map Groups + hint: Map groups matching names from the groups claim value + default: false + order: 4 From 1b6c67ee77b3ad3bf1b2cb3380c2a3eda28aa3f2 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Wed, 13 Aug 2025 03:03:35 -0400 Subject: [PATCH 04/46] fix: force wrap for code blocks in print view --- client/themes/default/scss/app.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/themes/default/scss/app.scss b/client/themes/default/scss/app.scss index c01faf124..ef18b5354 100644 --- a/client/themes/default/scss/app.scss +++ b/client/themes/default/scss/app.scss @@ -685,7 +685,7 @@ display:inline-block; vertical-align:top; padding-top:0; - + &:first-child { width: 100%; } @@ -1275,6 +1275,8 @@ color: #000; box-shadow: none; text-shadow: none; + white-space: pre-wrap !important; + overflow-wrap: break-word !important; } } } From cd77f361205a72efb47aa0d6d46c3646d1387484 Mon Sep 17 00:00:00 2001 From: Craig Reyenga Date: Mon, 18 Aug 2025 21:38:20 -0400 Subject: [PATCH 05/46] fix: requests without user-agent causing error 500 (#7749) --- server/controllers/auth.js | 3 +-- server/controllers/common.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 9d691087f..524d3f032 100644 --- a/server/controllers/auth.js +++ b/server/controllers/auth.js @@ -94,8 +94,7 @@ router.all('/login/:strategy/callback', async (req, res, next) => { */ router.post('/login', bruteforce.prevent, async (req, res, next) => { _.set(res.locals, 'pageMeta.title', 'Login') - - if (req.query.legacy || req.get('user-agent').indexOf('Trident') >= 0) { + if (req.query.legacy || (req.get('user-agent') && req.get('user-agent').indexOf('Trident') >= 0)) { try { const authResult = await WIKI.models.users.login({ strategy: req.body.strategy, diff --git a/server/controllers/common.js b/server/controllers/common.js index 55cc4d333..8fb93dfbf 100644 --- a/server/controllers/common.js +++ b/server/controllers/common.js @@ -507,7 +507,7 @@ router.get('/*', async (req, res, next) => { injectCode.body = `${injectCode.body}\n${page.extra.js}` } - if (req.query.legacy || req.get('user-agent').indexOf('Trident') >= 0) { + if (req.query.legacy || (req.get('user-agent') && req.get('user-agent').indexOf('Trident') >= 0)) { // -> Convert page TOC if (_.isString(page.toc)) { page.toc = JSON.parse(page.toc) From 9f481221ab9b87eb0e1aa726f991ef0beba70fac Mon Sep 17 00:00:00 2001 From: Lyz Date: Thu, 11 Sep 2025 16:58:59 +0000 Subject: [PATCH 06/46] ci(helm): add custom environment variables to the deployment (#7784) Co-authored-by: jmp --- dev/helm/templates/deployment.yaml | 3 +++ dev/helm/values.yaml | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/dev/helm/templates/deployment.yaml b/dev/helm/templates/deployment.yaml index 4a7e3b8a6..e4d1d1975 100644 --- a/dev/helm/templates/deployment.yaml +++ b/dev/helm/templates/deployment.yaml @@ -81,6 +81,9 @@ spec: {{- end }} - name: HA_ACTIVE value: {{ .Values.replicaCount | int | le 2 | quote }} + {{- with .Values.extraEnvVars }} + {{- toYaml . | nindent 12 }} + {{- end }} {{- with .Values.volumeMounts }} volumeMounts: {{- toYaml . | nindent 12 }} diff --git a/dev/helm/values.yaml b/dev/helm/values.yaml index 8e5e36670..db5496c04 100644 --- a/dev/helm/values.yaml +++ b/dev/helm/values.yaml @@ -138,6 +138,17 @@ sideload: ## Append extra trusted certificates for node process from extra volume via NODE_EXTRA_CA_CERTS variable # nodeExtraCaCerts: "/path/to/certs.pem" +## Additional environment variables to set +extraEnvVars: [] +# extraEnvVars: +# - name: CUSTOM_VAR +# value: "custom_value" +# - name: SECRET_VAR +# valueFrom: +# secretKeyRef: +# name: my-secret +# key: secret-key + ## This will override the postgresql chart values # externalPostgresql: # # note: ?sslmode=require => ?ssl=true From b49c00226c3fa5837b955a7764ad0dd62cdb5955 Mon Sep 17 00:00:00 2001 From: dhulripos <137174121+dhulripos@users.noreply.github.com> Date: Wed, 24 Sep 2025 13:06:37 +0900 Subject: [PATCH 07/46] fix: Add missing status code on unauthorized access (#7785) * fix status code on unauthorized * Remove unnecessary line breaks --- server/controllers/common.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/server/controllers/common.js b/server/controllers/common.js index 8fb93dfbf..dec6fa3aa 100644 --- a/server/controllers/common.js +++ b/server/controllers/common.js @@ -75,12 +75,12 @@ router.get(['/d', '/d/*'], async (req, res, next) => { if (versionId > 0) { if (!WIKI.auth.checkAccess(req.user, ['read:history'], pageArgs)) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'downloadVersion' }) + return res.status(403).render('unauthorized', { action: 'downloadVersion' }) } } else { if (!WIKI.auth.checkAccess(req.user, ['read:source'], pageArgs)) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'download' }) + return res.status(403).render('unauthorized', { action: 'download' }) } } @@ -142,7 +142,7 @@ router.get(['/e', '/e/*'], async (req, res, next) => { // -> EDIT MODE if (!(effectivePermissions.pages.write || effectivePermissions.pages.manage)) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'edit' }) + return res.status(403).render('unauthorized', { action: 'edit' }) } // -> Get page tags @@ -166,7 +166,7 @@ router.get(['/e', '/e/*'], async (req, res, next) => { // -> CREATE MODE if (!effectivePermissions.pages.write) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'create' }) + return res.status(403).render('unauthorized', { action: 'create' }) } _.set(res.locals, 'pageMeta.title', `New Page`) @@ -206,7 +206,7 @@ router.get(['/e', '/e/*'], async (req, res, next) => { } if (!WIKI.auth.checkAccess(req.user, ['read:history'], { path: pageVersion.path, locale: pageVersion.locale })) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'sourceVersion' }) + return res.status(403).render('unauthorized', { action: 'sourceVersion' }) } page.content = Buffer.from(pageVersion.content).toString('base64') page.editorKey = pageVersion.editor @@ -221,7 +221,7 @@ router.get(['/e', '/e/*'], async (req, res, next) => { } if (!WIKI.auth.checkAccess(req.user, ['read:source'], { path: pageOriginal.path, locale: pageOriginal.locale })) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'source' }) + return res.status(403).render('unauthorized', { action: 'source' }) } page.content = Buffer.from(pageOriginal.content).toString('base64') page.editorKey = pageOriginal.editorKey @@ -304,7 +304,7 @@ router.get(['/i', '/i/:id'], async (req, res, next) => { tags: page.tags })) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'view' }) + return res.status(403).render('unauthorized', { action: 'view' }) } if (WIKI.config.lang.namespacing) { @@ -319,7 +319,7 @@ router.get(['/i', '/i/:id'], async (req, res, next) => { */ router.get(['/p', '/p/*'], (req, res, next) => { if (!req.user || req.user.id < 1 || req.user.id === 2) { - return res.render('unauthorized', { action: 'view' }) + return res.status(403).render('unauthorized', { action: 'view' }) } _.set(res.locals, 'pageMeta.title', 'User Profile') @@ -355,12 +355,12 @@ router.get(['/s', '/s/*'], async (req, res, next) => { if (versionId > 0) { if (!effectivePermissions.history.read) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'sourceVersion' }) + return res.status(403).render('unauthorized', { action: 'sourceVersion' }) } } else { if (!effectivePermissions.source.read) { _.set(res.locals, 'pageMeta.title', 'Unauthorized') - return res.render('unauthorized', { action: 'source' }) + return res.status(403).render('unauthorized', { action: 'source' }) } } From dd48f288272b42f74fcbbabc3becf714334fb277 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Thu, 9 Oct 2025 00:19:29 -0400 Subject: [PATCH 08/46] docs: update README --- README.md | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 07c7b5ef2..f00f2c560 100644 --- a/README.md +++ b/README.md @@ -91,68 +91,74 @@ Support this project by becoming a sponsor. Your name will show up in the Contri - - - - - + - - - - - - - +
+ + Alexander Casassovici
(@alexksso)
+ Broxen
(@broxen)
+ Dacon
(@xDacon)
+ + + Maxime Pierre
(@DonNabla) +
+
+
+ Jay Daley
(@JayDaley)
+ Oleksii
(@idokka)
+ + + Shane Kearney
(@shanekearney)
+
From 54d21ae53827733f13d2d382ccf08e613bfcb2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20des=20Ligneris?= Date: Tue, 28 Oct 2025 13:39:14 -0400 Subject: [PATCH 09/46] fix: add tor1 region to DigitalOcean spaces list (#7832) --- server/modules/storage/digitalocean/definition.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/server/modules/storage/digitalocean/definition.yml b/server/modules/storage/digitalocean/definition.yml index 8d900783e..2b5ec8378 100644 --- a/server/modules/storage/digitalocean/definition.yml +++ b/server/modules/storage/digitalocean/definition.yml @@ -22,6 +22,7 @@ props: - sfo2.digitaloceanspaces.com - sfo3.digitaloceanspaces.com - sgp1.digitaloceanspaces.com + - tor1.digitaloceanspaces.com order: 1 bucket: type: String From 407aacfa19021f4b9b4cbaa24fc9524e359b876f Mon Sep 17 00:00:00 2001 From: scottnursten-22 Date: Thu, 13 Nov 2025 20:27:26 +0000 Subject: [PATCH 10/46] fix(search): always ensure pg_trgm extension availability for PostgreSQL search (#7845) * fix(search): ensure pg_trgm extension availability for PostgreSQL search - Move pg_trgm extension creation to initialization phase to ensure availability - Add error handling for similarity search queries that depend on pg_trgm - Add proper logging for debugging search-related issues Fixes issues where PostgreSQL search suggestions fail due to missing or improperly initialized pg_trgm extension, particularly in containerized environments where extension creation timing matters. * fix: Simplify error handling in search suggestion logic Refactor error handling for search suggestions to simplify code. --------- Co-authored-by: Nicolas Giard --- server/modules/search/postgres/engine.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server/modules/search/postgres/engine.js b/server/modules/search/postgres/engine.js index c0abee175..33204b848 100644 --- a/server/modules/search/postgres/engine.js +++ b/server/modules/search/postgres/engine.js @@ -23,6 +23,9 @@ module.exports = { async init() { WIKI.logger.info(`(SEARCH/POSTGRES) Initializing...`) + // -> Ensure pg_trgm extension is available (required for similarity search) + await WIKI.models.knex.raw('CREATE EXTENSION IF NOT EXISTS pg_trgm') + // -> Create Search Index const indexExists = await WIKI.models.knex.schema.hasTable('pagesVector') if (!indexExists) { @@ -45,7 +48,6 @@ module.exports = { CREATE TABLE "pagesWords" AS SELECT word FROM ts_stat( 'SELECT to_tsvector(''simple'', "title") || to_tsvector(''simple'', "description") || to_tsvector(''simple'', "content") FROM "pagesVector"' )`) - await WIKI.models.knex.raw('CREATE EXTENSION IF NOT EXISTS pg_trgm') await WIKI.models.knex.raw(`CREATE INDEX "pageWords_idx" ON "pagesWords" USING GIN (word gin_trgm_ops)`) } @@ -81,8 +83,12 @@ module.exports = { ${qryEnd} `, qryParams) if (results.rows.length < 5) { - const suggestResults = await WIKI.models.knex.raw(`SELECT word, word <-> ? AS rank FROM "pagesWords" WHERE similarity(word, ?) > 0.2 ORDER BY rank LIMIT 5;`, [q, q]) - suggestions = suggestResults.rows.map(r => r.word) + try { + const suggestResults = await WIKI.models.knex.raw(`SELECT word, word <-> ? AS rank FROM "pagesWords" WHERE similarity(word, ?) > 0.2 ORDER BY rank LIMIT 5;`, [q, q]) + suggestions = suggestResults.rows.map(r => r.word) + } catch (err) { + WIKI.logger.warn(`Search Engine Suggestion Error (pg_trgm extension may be missing): ${err.message}`) + } } return { results: results.rows, From a02e0131c1e2b8d77b11235846fd05d97b627c30 Mon Sep 17 00:00:00 2001 From: ss033 <155379841+ssk033@users.noreply.github.com> Date: Thu, 1 Jan 2026 07:14:14 +0530 Subject: [PATCH 11/46] fix: enhance logging for Google and GitHub OAuth2 authentication (#7848) Co-authored-by: Nicolas Giard --- .../authentication/github/authentication.js | 20 ++++++++++++++++- .../authentication/google/authentication.js | 22 ++++++++++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/server/modules/authentication/github/authentication.js b/server/modules/authentication/github/authentication.js index 49ac76093..aa0fee0e1 100644 --- a/server/modules/authentication/github/authentication.js +++ b/server/modules/authentication/github/authentication.js @@ -27,6 +27,14 @@ module.exports = { passport.use(conf.key, new GitHubStrategy(githubConfig, async (req, accessToken, refreshToken, profile, cb) => { try { + WIKI.logger.info(`GitHub OAuth: Processing profile for user ${profile.id || profile.username}`) + + // Ensure email is available - passport-github2 should fetch it automatically with user:email scope + // but we'll log a warning if it's missing + if (!profile.emails || (Array.isArray(profile.emails) && profile.emails.length === 0)) { + WIKI.logger.warn(`GitHub OAuth: No email found in profile for user ${profile.id || profile.username}. Make sure 'user:email' scope is granted.`) + } + const user = await WIKI.models.users.processProfile({ providerKey: req.params.strategy, profile: { @@ -34,9 +42,19 @@ module.exports = { picture: _.get(profile, 'photos[0].value', '') } }) + + WIKI.logger.info(`GitHub OAuth: Successfully authenticated user ${user.email}`) cb(null, user) } catch (err) { - cb(err, null) + WIKI.logger.warn(`GitHub OAuth: Authentication failed for strategy ${req.params.strategy}:`, err) + // Provide more user-friendly error messages + if (err.message && err.message.includes('email')) { + cb(new Error('GitHub authentication failed: Email address is required but not available. Please ensure your GitHub account has a verified email address and grant email access permissions.'), null) + } else if (err instanceof WIKI.Error.AuthAccountBanned) { + cb(err, null) + } else { + cb(new Error(`GitHub authentication failed: ${err.message || 'Unknown error'}`), null) + } } } )) diff --git a/server/modules/authentication/google/authentication.js b/server/modules/authentication/google/authentication.js index 3af03cb2c..3c8b17f71 100644 --- a/server/modules/authentication/google/authentication.js +++ b/server/modules/authentication/google/authentication.js @@ -16,9 +16,13 @@ module.exports = { passReqToCallback: true }, async (req, accessToken, refreshToken, profile, cb) => { try { - if (conf.hostedDomain && conf.hostedDomain != profile._json.hd) { - throw new Error('Google authentication should have been performed with domain ' + conf.hostedDomain) + WIKI.logger.info(`Google OAuth: Processing profile for user ${profile.id || profile.displayName}`) + + // Validate hosted domain if configured + if (conf.hostedDomain && profile._json.hd !== conf.hostedDomain) { + throw new Error(`Google authentication failed: User must be from domain ${conf.hostedDomain}, but got ${profile._json.hd || 'unknown'}`) } + const user = await WIKI.models.users.processProfile({ providerKey: req.params.strategy, profile: { @@ -26,9 +30,21 @@ module.exports = { picture: _.get(profile, 'photos[0].value', '') } }) + + WIKI.logger.info(`Google OAuth: Successfully authenticated user ${user.email}`) cb(null, user) } catch (err) { - cb(err, null) + WIKI.logger.warn(`Google OAuth: Authentication failed for strategy ${req.params.strategy}:`, err) + // Provide more user-friendly error messages + if (err.message && err.message.includes('domain')) { + cb(new Error(`Google authentication failed: ${err.message}`), null) + } else if (err.message && err.message.includes('email')) { + cb(new Error('Google authentication failed: Email address is required but not available. Please ensure your Google account has a verified email address.'), null) + } else if (err instanceof WIKI.Error.AuthAccountBanned) { + cb(err, null) + } else { + cb(new Error(`Google authentication failed: ${err.message || 'Unknown error'}`), null) + } } }) From 5c80184a1d5fff13a6b1026aebb2752b8d7aa655 Mon Sep 17 00:00:00 2001 From: Karl Berggren Date: Thu, 1 Jan 2026 02:53:47 +0100 Subject: [PATCH 12/46] feat: add support for database connection via socketPath when using mysql2 driver (#7839) * Added support for database socketPath in configure file when using dbClient mysql2 (mysql or mariadb) * refactor: mysql dbConfig to conditionally set socketPath Updated database configuration to conditionally include socketPath from WIKI.config. * fix: socketPath assignment typo --------- Co-authored-by: Nicolas Giard --- server/core/db.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/core/db.js b/server/core/db.js index b729282a4..3ce2e8bfb 100644 --- a/server/core/db.js +++ b/server/core/db.js @@ -91,6 +91,13 @@ module.exports = { dbConfig.ssl = sslOptions } + // Prune host and port if socketPath is configured + if (WIKI.config.db.socketPath) { + const { host, port, ...prunedConfig} = dbConfig + dbConfig = prunedConfig + dbConfig.socketPath = WIKI.config.db.socketPath.toString() + } + // Fix mysql boolean handling... dbConfig.typeCast = (field, next) => { if (field.type === 'TINY' && field.length === 1) { From 326974cdd5c7689e39ce2d9494f5144cb47f670e Mon Sep 17 00:00:00 2001 From: Wingqvist <67349855+Wingqvist@users.noreply.github.com> Date: Thu, 1 Jan 2026 03:00:06 +0100 Subject: [PATCH 13/46] fix(profile): Prevent autofill on header search bar (#7688) This commit resolves the recurring issue where password managers incorrectly autofill the header search bar when viewing the user profile page. This is achieved by wrapping the password change fields in a
element, properly scoping them for browser autofill logic, and using modern, standard `autocomplete` attributes. This addresses the root cause of the issue, whereas previous attempts tried to mitigate the symptom in the search bar. Fixes #2324 Closes #3327 --- client/components/common/nav-header.vue | 4 +- client/components/profile/profile.vue | 68 +++++++++++++------------ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/client/components/common/nav-header.vue b/client/components/common/nav-header.vue index d8fc3c806..ead24f945 100644 --- a/client/components/common/nav-header.vue +++ b/client/components/common/nav-header.vue @@ -15,7 +15,7 @@ prepend-inner-icon='mdi-magnify' :loading='searchIsLoading' @keyup.enter='searchEnter' - autocomplete='none' + autocomplete='off' ) v-layout(row) v-flex(xs5, md4) @@ -68,7 +68,7 @@ @blur='searchBlur' @keyup.down='searchMove(`down`)' @keyup.up='searchMove(`up`)' - autocomplete='none' + autocomplete='off' ) v-tooltip(bottom) template(v-slot:activator='{ on }') diff --git a/client/components/profile/profile.vue b/client/components/profile/profile.vue index 345476d27..5817df91c 100644 --- a/client/components/profile/profile.vue +++ b/client/components/profile/profile.vue @@ -129,41 +129,43 @@ //- v-btn(color='purple darken-4', disabled).ml-0 Enable 2FA //- v-btn(color='purple darken-4', dark, depressed, disabled).ml-0 Disable 2FA template(v-if='user.providerKey === `local`') - v-divider.mt-3 - v-subheader.pl-0: span.subtitle-2 {{$t('profile:auth.changePassword')}} - v-text-field( - ref='iptCurrentPass' - v-model='currentPass' - outlined - :label='$t(`profile:auth.currentPassword`)' - type='password' - prepend-inner-icon='mdi-form-textbox-password' - ) - v-text-field( - ref='iptNewPass' - v-model='newPass' - outlined - :label='$t(`profile:auth.newPassword`)' - type='password' - prepend-inner-icon='mdi-form-textbox-password' - autocomplete='off' - counter='255' - loading - ) - password-strength(slot='progress', v-model='newPass') - v-text-field( - ref='iptVerifyPass' - v-model='verifyPass' - outlined - :label='$t(`profile:auth.verifyPassword`)' - type='password' - prepend-inner-icon='mdi-form-textbox-password' - autocomplete='off' - hide-details - ) + form#change-password-form(@submit.prevent='changePassword') + v-divider.mt-3 + v-subheader.pl-0: span.subtitle-2 {{$t('profile:auth.changePassword')}} + v-text-field( + ref='iptCurrentPass' + v-model='currentPass' + outlined + :label='$t(`profile:auth.currentPassword`)' + type='password' + prepend-inner-icon='mdi-form-textbox-password' + autocomplete='current-password' + ) + v-text-field( + ref='iptNewPass' + v-model='newPass' + outlined + :label='$t(`profile:auth.newPassword`)' + type='password' + prepend-inner-icon='mdi-form-textbox-password' + autocomplete='off' + counter='255' + loading + ) + password-strength(slot='progress', v-model='newPass') + v-text-field( + ref='iptVerifyPass' + v-model='verifyPass' + outlined + :label='$t(`profile:auth.verifyPassword`)' + type='password' + prepend-inner-icon='mdi-form-textbox-password' + autocomplete='off' + hide-details + ) v-card-chin(v-if='user.providerKey === `local`') v-spacer - v-btn.px-4(color='purple darken-4', dark, depressed, @click='changePassword', :loading='changePassLoading') + v-btn.px-4(color='purple darken-4', dark, depressed, :loading='changePassLoading', type='submit', form='change-password-form') v-icon(left) mdi-progress-check span {{$t('profile:auth.changePassword')}} v-flex(lg6 xs12) From 8b358fc264d32d9efcfd3edf5d2fe090bcd59058 Mon Sep 17 00:00:00 2001 From: Mia Moir <63592337+archessmn@users.noreply.github.com> Date: Thu, 1 Jan 2026 02:02:42 +0000 Subject: [PATCH 14/46] fix: Update keycloak authentication definition hints (#7809) Update keycloak authentication definition to match endpoints recommended by keycloak at https://www.keycloak.org/securing-apps/oidc-layers --- server/modules/authentication/keycloak/definition.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/modules/authentication/keycloak/definition.yml b/server/modules/authentication/keycloak/definition.yml index 97453b840..b3f1d0df7 100644 --- a/server/modules/authentication/keycloak/definition.yml +++ b/server/modules/authentication/keycloak/definition.yml @@ -35,17 +35,17 @@ props: authorizationURL: type: String title: Authorization Endpoint URL - hint: e.g. https://KEYCLOAK-HOST/auth/realms/YOUR-REALM/protocol/openid-connect/auth + hint: e.g. https://KEYCLOAK-HOST/realms/YOUR-REALM/protocol/openid-connect/auth order: 5 tokenURL: type: String title: Token Endpoint URL - hint: e.g. https://KEYCLOAK-HOST/auth/realms/YOUR-REALM/protocol/openid-connect/token + hint: e.g. https://KEYCLOAK-HOST/realms/YOUR-REALM/protocol/openid-connect/token order: 6 userInfoURL: type: String title: User Info Endpoint URL - hint: e.g. https://KEYCLOAK-HOST/auth/realms/YOUR-REALM/protocol/openid-connect/userinfo + hint: e.g. https://KEYCLOAK-HOST/realms/YOUR-REALM/protocol/openid-connect/userinfo order: 7 logoutUpstream: type: Boolean @@ -55,7 +55,7 @@ props: logoutURL: type: String title: Logout Endpoint URL - hint: e.g. https://KEYCLOAK-HOST/auth/realms/YOUR-REALM/protocol/openid-connect/logout + hint: e.g. https://KEYCLOAK-HOST/realms/YOUR-REALM/protocol/openid-connect/logout order: 9 logoutUpstreamRedirectLegacy: type: Boolean From 077ac97b2dc9824f09410d18494c60c7673bfe53 Mon Sep 17 00:00:00 2001 From: StofnerP Date: Thu, 1 Jan 2026 03:09:21 +0100 Subject: [PATCH 15/46] fix: add locale to home icon breadcrumb nav (#7825) --- client/themes/default/components/page.vue | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/client/themes/default/components/page.vue b/client/themes/default/components/page.vue index 0d1f6473f..76eb00be8 100644 --- a/client/themes/default/components/page.vue +++ b/client/themes/default/components/page.vue @@ -537,13 +537,14 @@ export default { } }, breadcrumbs() { - return [{ path: '/', name: 'Home' }].concat(_.reduce(this.path.split('/'), (result, value, key) => { - result.push({ - path: _.get(_.last(result), 'path', `/${this.locale}`) + `/${value}`, - name: value - }) - return result - }, [])) + return [{ path: `/${this.locale}`, name: 'Home' }].concat( + _.reduce(this.path.split('/'), (result, value) => { + result.push({ + path: _.get(_.last(result), 'path') + `/${value}`, + name: value + }) + return result + }, [])) }, pageUrl () { return window.location.href }, upBtnPosition () { From f68d1f60caeeecd77eaddf869d80dcb553a25482 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sat, 3 Jan 2026 02:30:55 -0500 Subject: [PATCH 16/46] fix: hide unfinished features --- client/components/admin/admin-pages-edit.vue | 32 ++++---- client/components/admin/admin-pages.vue | 6 +- .../components/admin/admin-users-create.vue | 14 ++-- client/components/admin/admin-users-edit.vue | 12 +-- .../components/editor/editor-modal-media.vue | 80 +++++++++---------- .../editor/editor-modal-properties.vue | 74 ++++++++--------- 6 files changed, 109 insertions(+), 109 deletions(-) diff --git a/client/components/admin/admin-pages-edit.vue b/client/components/admin/admin-pages-edit.vue index cd43533bf..aef5126c8 100644 --- a/client/components/admin/admin-pages-edit.vue +++ b/client/components/admin/admin-pages-edit.vue @@ -39,14 +39,14 @@ v-list-item-icon v-icon(color='indigo') mdi-pencil v-list-item-title Edit - v-list-item(@click='', disabled) - v-list-item-icon - v-icon(color='grey') mdi-cube-scan - v-list-item-title Re-Render - v-list-item(@click='', disabled) - v-list-item-icon - v-icon(color='grey') mdi-earth-remove - v-list-item-title Unpublish + //- v-list-item(@click='', disabled) + //- v-list-item-icon + //- v-icon(color='grey') mdi-cube-scan + //- v-list-item-title Re-Render + //- v-list-item(@click='', disabled) + //- v-list-item-icon + //- v-icon(color='grey') mdi-earth-remove + //- v-list-item-title Unpublish v-list-item(:href='`/s/` + page.locale + `/` + page.path') v-list-item-icon v-icon(color='indigo') mdi-code-tags @@ -55,14 +55,14 @@ v-list-item-icon v-icon(color='indigo') mdi-history v-list-item-title View History - v-list-item(@click='', disabled) - v-list-item-icon - v-icon(color='grey') mdi-content-duplicate - v-list-item-title Duplicate - v-list-item(@click='', disabled) - v-list-item-icon - v-icon(color='grey') mdi-content-save-move-outline - v-list-item-title Move / Rename + //- v-list-item(@click='', disabled) + //- v-list-item-icon + //- v-icon(color='grey') mdi-content-duplicate + //- v-list-item-title Duplicate + //- v-list-item(@click='', disabled) + //- v-list-item-icon + //- v-icon(color='grey') mdi-content-save-move-outline + //- v-list-item-title Move / Rename v-dialog(v-model='deletePageDialog', max-width='500') template(v-slot:activator='{ on }') v-list-item(v-on='on') diff --git a/client/components/admin/admin-pages.vue b/client/components/admin/admin-pages.vue index 0ca26de1b..3f056eef3 100644 --- a/client/components/admin/admin-pages.vue +++ b/client/components/admin/admin-pages.vue @@ -10,9 +10,9 @@ v-spacer v-btn.animated.fadeInDown.wait-p1s(icon, color='grey', outlined, @click='refresh') v-icon.grey--text mdi-refresh - v-btn.animated.fadeInDown.mx-3(color='primary', outlined, @click='recyclebin', disabled) - v-icon(left) mdi-delete-outline - span Recycle Bin + //- v-btn.animated.fadeInDown.mx-3(color='primary', outlined, @click='recyclebin', disabled) + //- v-icon(left) mdi-delete-outline + //- span Recycle Bin v-btn.animated.fadeInDown(color='primary', depressed, large, to='pages/visualize') v-icon(left) mdi-graph span Visualize diff --git a/client/components/admin/admin-users-create.vue b/client/components/admin/admin-users-create.vue index 7128149e7..a03500678 100644 --- a/client/components/admin/admin-users-create.vue +++ b/client/components/admin/admin-users-create.vue @@ -70,13 +70,13 @@ v-model='mustChangePwd' hide-details ) - v-checkbox( - color='primary' - label='Send a welcome email' - hide-details - v-model='sendWelcomeEmail' - disabled - ) + //- v-checkbox( + //- color='primary' + //- label='Send a welcome email' + //- hide-details + //- v-model='sendWelcomeEmail' + //- disabled + //- ) v-card-chin v-spacer v-btn(text, @click='isShown = false') Cancel diff --git a/client/components/admin/admin-users-edit.vue b/client/components/admin/admin-users-edit.vue index a9e200706..fb224fbd2 100644 --- a/client/components/admin/admin-users-edit.vue +++ b/client/components/admin/admin-users-edit.vue @@ -337,12 +337,12 @@ .caption.grey--text.mt-3 {{$t('profile:activity.lastLoginOn')}} .body-2: strong {{ user.lastLoginAt | moment('LLLL') }} - v-card.mt-3.animated.fadeInUp.wait-p6s - v-toolbar(color='teal', dense, dark, flat) - v-icon.mr-2 mdi-file-document-box-multiple-outline - span Content - v-card-text - em.caption.grey--text Coming soon + //- v-card.mt-3.animated.fadeInUp.wait-p6s + //- v-toolbar(color='teal', dense, dark, flat) + //- v-icon.mr-2 mdi-file-document-box-multiple-outline + //- span Content + //- v-card-text + //- em.caption.grey--text Coming soon v-dialog(v-model='deleteUserDialog', max-width='500') v-card diff --git a/client/components/editor/editor-modal-media.vue b/client/components/editor/editor-modal-media.vue index 100a36df8..67efe1222 100644 --- a/client/components/editor/editor-modal-media.vue +++ b/client/components/editor/editor-modal-media.vue @@ -83,31 +83,31 @@ v-btn(icon, v-on='on', tile, small, @click.left='currentFileId = props.item.id') v-icon(color='grey darken-2') mdi-dots-horizontal v-list(nav, style='border-top: 5px solid #444;') - v-list-item(@click='', disabled) - v-list-item-avatar(size='24') - v-icon(color='teal') mdi-text-short - v-list-item-content {{$t('common:actions.properties')}} - template(v-if='props.item.kind === `IMAGE`') - v-list-item(@click='previewDialog = true', disabled) - v-list-item-avatar(size='24') - v-icon(color='green') mdi-image-search-outline - v-list-item-content {{$t('common:actions.preview')}} - v-list-item(@click='', disabled) - v-list-item-avatar(size='24') - v-icon(color='indigo') mdi-crop-rotate - v-list-item-content {{$t('common:actions.edit')}} - v-list-item(@click='', disabled) - v-list-item-avatar(size='24') - v-icon(color='purple') mdi-flash-circle - v-list-item-content {{$t('common:actions.optimize')}} + //- v-list-item(@click='', disabled) + //- v-list-item-avatar(size='24') + //- v-icon(color='teal') mdi-text-short + //- v-list-item-content {{$t('common:actions.properties')}} + //- template(v-if='props.item.kind === `IMAGE`') + //- v-list-item(@click='previewDialog = true', disabled) + //- v-list-item-avatar(size='24') + //- v-icon(color='green') mdi-image-search-outline + //- v-list-item-content {{$t('common:actions.preview')}} + //- v-list-item(@click='', disabled) + //- v-list-item-avatar(size='24') + //- v-icon(color='indigo') mdi-crop-rotate + //- v-list-item-content {{$t('common:actions.edit')}} + //- v-list-item(@click='', disabled) + //- v-list-item-avatar(size='24') + //- v-icon(color='purple') mdi-flash-circle + //- v-list-item-content {{$t('common:actions.optimize')}} v-list-item(@click='openRenameDialog') v-list-item-avatar(size='24') v-icon(color='orange') mdi-keyboard-outline v-list-item-content {{$t('common:actions.rename')}} - v-list-item(@click='', disabled) - v-list-item-avatar(size='24') - v-icon(color='blue') mdi-file-move - v-list-item-content {{$t('common:actions.move')}} + //- v-list-item(@click='', disabled) + //- v-list-item-avatar(size='24') + //- v-icon(color='blue') mdi-file-move + //- v-list-item-content {{$t('common:actions.move')}} v-list-item(@click='deleteDialog = true') v-list-item-avatar(size='24') v-icon(color='red') mdi-file-hidden @@ -154,25 +154,25 @@ v-spacer v-btn.px-4(color='teal', dark, @click='upload') {{$t('common:actions.upload')}} - v-card.mt-3.radius-7.animated.fadeInRight.wait-p4s(:light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark') - v-card-text.pb-0 - v-toolbar.radius-7(:color='$vuetify.theme.dark ? `teal` : `teal lighten-5`', dense, flat) - v-icon.mr-3(:color='$vuetify.theme.dark ? `white` : `teal`') mdi-cloud-download - .body-2(:class='$vuetify.theme.dark ? `white--text` : `teal--text`') {{$t('editor:assets.fetchImage')}} - v-spacer - v-chip(label, color='white', small).teal--text coming soon - v-text-field.mt-3( - v-model='remoteImageUrl' - outlined - color='teal' - single-line - placeholder='https://example.com/image.jpg' - ) - v-divider - v-card-actions.pa-3 - .caption.grey--text.text-darken-2 Max 5 MB - v-spacer - v-btn.px-4(color='teal', disabled) {{$t('common:actions.fetch')}} + //- v-card.mt-3.radius-7.animated.fadeInRight.wait-p4s(:light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark') + //- v-card-text.pb-0 + //- v-toolbar.radius-7(:color='$vuetify.theme.dark ? `teal` : `teal lighten-5`', dense, flat) + //- v-icon.mr-3(:color='$vuetify.theme.dark ? `white` : `teal`') mdi-cloud-download + //- .body-2(:class='$vuetify.theme.dark ? `white--text` : `teal--text`') {{$t('editor:assets.fetchImage')}} + //- v-spacer + //- v-chip(label, color='white', small).teal--text coming soon + //- v-text-field.mt-3( + //- v-model='remoteImageUrl' + //- outlined + //- color='teal' + //- single-line + //- placeholder='https://example.com/image.jpg' + //- ) + //- v-divider + //- v-card-actions.pa-3 + //- .caption.grey--text.text-darken-2 Max 5 MB + //- v-spacer + //- v-btn.px-4(color='teal', disabled) {{$t('common:actions.fetch')}} v-card.mt-3.radius-7.animated.fadeInRight.wait-p4s(:light='!$vuetify.theme.dark', :dark='$vuetify.theme.dark') v-card-text.pb-0 diff --git a/client/components/editor/editor-modal-properties.vue b/client/components/editor/editor-modal-properties.vue index 0738b333f..1b7d4aa5d 100644 --- a/client/components/editor/editor-modal-properties.vue +++ b/client/components/editor/editor-modal-properties.vue @@ -21,7 +21,7 @@ v-tab {{$t('editor:props.info')}} v-tab {{$t('editor:props.scheduling')}} v-tab(:disabled='!hasScriptPermission') {{$t('editor:props.scripts')}} - v-tab(disabled) {{$t('editor:props.social')}} + //- v-tab(disabled) {{$t('editor:props.social')}} v-tab(:disabled='!hasStylePermission') {{$t('editor:props.styles')}} v-tab-item(transition='fade-transition', reverse-transition='fade-transition') v-card-text.pt-5 @@ -196,42 +196,42 @@ .editor-props-codeeditor-hint .caption {{$t('editor:props.htmlHint')}} - v-tab-item(transition='fade-transition', reverse-transition='fade-transition') - v-card-text - .overline {{$t('editor:props.socialFeatures')}} - v-switch( - :label='$t(`editor:props.allowComments`)' - v-model='isPublished' - color='primary' - :hint='$t(`editor:props.allowCommentsHint`)' - persistent-hint - inset - ) - v-switch( - :label='$t(`editor:props.allowRatings`)' - v-model='isPublished' - color='primary' - :hint='$t(`editor:props.allowRatingsHint`)' - persistent-hint - disabled - inset - ) - v-switch( - :label='$t(`editor:props.displayAuthor`)' - v-model='isPublished' - color='primary' - :hint='$t(`editor:props.displayAuthorHint`)' - persistent-hint - inset - ) - v-switch( - :label='$t(`editor:props.displaySharingBar`)' - v-model='isPublished' - color='primary' - :hint='$t(`editor:props.displaySharingBarHint`)' - persistent-hint - inset - ) + //- v-tab-item(transition='fade-transition', reverse-transition='fade-transition') + //- v-card-text + //- .overline {{$t('editor:props.socialFeatures')}} + //- v-switch( + //- :label='$t(`editor:props.allowComments`)' + //- v-model='isPublished' + //- color='primary' + //- :hint='$t(`editor:props.allowCommentsHint`)' + //- persistent-hint + //- inset + //- ) + //- v-switch( + //- :label='$t(`editor:props.allowRatings`)' + //- v-model='isPublished' + //- color='primary' + //- :hint='$t(`editor:props.allowRatingsHint`)' + //- persistent-hint + //- disabled + //- inset + //- ) + //- v-switch( + //- :label='$t(`editor:props.displayAuthor`)' + //- v-model='isPublished' + //- color='primary' + //- :hint='$t(`editor:props.displayAuthorHint`)' + //- persistent-hint + //- inset + //- ) + //- v-switch( + //- :label='$t(`editor:props.displaySharingBar`)' + //- v-model='isPublished' + //- color='primary' + //- :hint='$t(`editor:props.displaySharingBarHint`)' + //- persistent-hint + //- inset + //- ) v-tab-item(:transition='false', :reverse-transition='false') .editor-props-codeeditor-title From 4eb9dabb63ff8aaea45fe5516040a123e8884dc1 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sat, 3 Jan 2026 03:03:15 -0500 Subject: [PATCH 17/46] refactor: update docker images to Node 24 and fix promisify calls --- .nvmrc | 2 +- dev/build/Dockerfile | 6 +++--- dev/containers/Dockerfile | 2 +- dev/containers/docker-compose.yml | 2 +- package.json | 4 ++-- server/core/auth.js | 8 +++---- server/core/db.js | 6 +++--- server/core/system.js | 21 +++++++++---------- server/graph/resolvers/system.js | 7 ++++--- server/modules/search/algolia/engine.js | 6 ++---- server/modules/search/aws/engine.js | 6 ++---- server/modules/search/azure/engine.js | 6 ++---- server/modules/search/elasticsearch/engine.js | 8 +++---- server/modules/search/postgres/engine.js | 6 ++---- server/modules/storage/azure/storage.js | 8 +++---- server/modules/storage/disk/common.js | 6 ++---- server/modules/storage/disk/storage.js | 8 +++---- server/modules/storage/git/storage.js | 10 ++++----- server/modules/storage/s3/common.js | 10 ++++----- server/modules/storage/sftp/storage.js | 8 +++---- server/setup.js | 7 ++++--- 21 files changed, 63 insertions(+), 84 deletions(-) diff --git a/.nvmrc b/.nvmrc index 860cc5000..821e3957b 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.17.1 +v24.12.0 diff --git a/dev/build/Dockerfile b/dev/build/Dockerfile index fa95ac991..072fad818 100644 --- a/dev/build/Dockerfile +++ b/dev/build/Dockerfile @@ -1,7 +1,7 @@ # ==================== # --- Build Assets --- # ==================== -FROM node:20-alpine AS assets +FROM node:24-alpine AS assets RUN apk add yarn g++ make cmake python3 --no-cache @@ -25,7 +25,7 @@ RUN yarn patch-package # =============== # --- Release --- # =============== -FROM node:20-alpine +FROM node:24-alpine LABEL maintainer="requarks.io" RUN apk add bash curl git openssh gnupg sqlite --no-cache && \ @@ -53,4 +53,4 @@ EXPOSE 3443 # HEALTHCHECK --interval=30s --timeout=30s --start-period=30s --retries=3 CMD curl -f http://localhost:3000/healthz -CMD ["node", "server"] +CMD ["node", "--no-deprecation", "server"] diff --git a/dev/containers/Dockerfile b/dev/containers/Dockerfile index 5d4048802..148edc6dc 100644 --- a/dev/containers/Dockerfile +++ b/dev/containers/Dockerfile @@ -1,7 +1,7 @@ # -- DEV DOCKERFILE -- # -- DO NOT USE IN PRODUCTION! -- -FROM node:18 +FROM node:24 LABEL maintainer "requarks.io" RUN apt-get update && \ diff --git a/dev/containers/docker-compose.yml b/dev/containers/docker-compose.yml index 147d81aef..9fe1fa619 100644 --- a/dev/containers/docker-compose.yml +++ b/dev/containers/docker-compose.yml @@ -5,7 +5,7 @@ version: "3" services: db: container_name: wiki-db - image: postgres:15-alpine + image: postgres:17-alpine environment: POSTGRES_DB: wiki POSTGRES_PASSWORD: wikijsrocks diff --git a/package.json b/package.json index 51ba5b581..ed7d73e85 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wiki", "version": "2.0.0", - "releaseDate": "2019-01-01T01:01:01.000Z", + "releaseDate": "2026-01-01T01:01:01.000Z", "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown", "main": "wiki.js", "dev": true, @@ -34,7 +34,7 @@ }, "homepage": "https://github.com/Requarks/wiki#readme", "engines": { - "node": ">=10.12" + "node": ">=20" }, "dependencies": { "@azure/storage-blob": "12.12.0", diff --git a/server/core/auth.js b/server/core/auth.js index 91ef21016..6eb06b085 100644 --- a/server/core/auth.js +++ b/server/core/auth.js @@ -4,9 +4,9 @@ const _ = require('lodash') const jwt = require('jsonwebtoken') const ms = require('ms') const { DateTime } = require('luxon') -const Promise = require('bluebird') -const crypto = Promise.promisifyAll(require('crypto')) +const crypto = require('crypto') const pem2jwk = require('pem-jwk').pem2jwk +const randomBytesAsync = require('util').promisify(crypto.randomBytes) const securityHelper = require('../helpers/security') @@ -82,7 +82,7 @@ module.exports = { const strategy = require(`../modules/authentication/${stg.strategyKey}/authentication.js`) stg.config.callbackURL = `${WIKI.config.host}/login/${stg.key}/callback` - stg.config.key = stg.key; + stg.config.key = stg.key strategy.init(passport, stg.config) strategy.config = stg.config @@ -366,7 +366,7 @@ module.exports = { async regenerateCertificates () { WIKI.logger.info('Regenerating certificates...') - _.set(WIKI.config, 'sessionSecret', (await crypto.randomBytesAsync(32)).toString('hex')) + _.set(WIKI.config, 'sessionSecret', (await randomBytesAsync(32)).toString('hex')) const certs = crypto.generateKeyPairSync('rsa', { modulusLength: 2048, publicKeyEncoding: { diff --git a/server/core/db.js b/server/core/db.js index 3ce2e8bfb..f6a9d7080 100644 --- a/server/core/db.js +++ b/server/core/db.js @@ -93,9 +93,9 @@ module.exports = { // Prune host and port if socketPath is configured if (WIKI.config.db.socketPath) { - const { host, port, ...prunedConfig} = dbConfig - dbConfig = prunedConfig - dbConfig.socketPath = WIKI.config.db.socketPath.toString() + const { host, port, ...prunedConfig } = dbConfig + dbConfig = prunedConfig + dbConfig.socketPath = WIKI.config.db.socketPath.toString() } // Fix mysql boolean handling... diff --git a/server/core/system.js b/server/core/system.js index 5d606fc7d..e3fbf1ddf 100644 --- a/server/core/system.js +++ b/server/core/system.js @@ -4,8 +4,7 @@ const Promise = require('bluebird') const fs = require('fs-extra') const path = require('path') const zlib = require('zlib') -const stream = require('stream') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Readable, Transform } = require('stream') /* global WIKI */ @@ -121,7 +120,7 @@ module.exports = { await pipeline( WIKI.models.knex.select('filename', 'folderId', 'data').from('assets').join('assetData', 'assets.id', '=', 'assetData.id').stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (asset, enc, cb) => { const filename = (asset.folderId && asset.folderId > 0) ? `${_.get(assetFolders, asset.folderId)}/${asset.filename}` : asset.filename @@ -150,7 +149,7 @@ module.exports = { const commentsProgressMultiplier = progressMultiplier / Math.ceil(commentsCount / 50) WIKI.logger.info(`Found ${commentsCount} comments to export. Streaming to file...`) - const rs = stream.Readable({ objectMode: true }) + const rs = Readable({ objectMode: true }) rs._read = () => {} const fetchCommentsBatch = async (offset) => { @@ -177,7 +176,7 @@ module.exports = { let marker = 0 await pipeline( rs, - new stream.Transform({ + new Transform({ objectMode: true, transform (chunk, encoding, callback) { marker++ @@ -225,7 +224,7 @@ module.exports = { const pagesProgressMultiplier = progressMultiplier / Math.ceil(pagesCount / 10) WIKI.logger.info(`Found ${pagesCount} pages history to export. Streaming to file...`) - const rs = stream.Readable({ objectMode: true }) + const rs = Readable({ objectMode: true }) rs._read = () => {} const fetchPagesBatch = async (offset) => { @@ -255,7 +254,7 @@ module.exports = { let marker = 0 await pipeline( rs, - new stream.Transform({ + new Transform({ objectMode: true, transform (chunk, encoding, callback) { marker++ @@ -307,7 +306,7 @@ module.exports = { const pagesProgressMultiplier = progressMultiplier / Math.ceil(pagesCount / 10) WIKI.logger.info(`Found ${pagesCount} pages to export. Streaming to file...`) - const rs = stream.Readable({ objectMode: true }) + const rs = Readable({ objectMode: true }) rs._read = () => {} const fetchPagesBatch = async (offset) => { @@ -337,7 +336,7 @@ module.exports = { let marker = 0 await pipeline( rs, - new stream.Transform({ + new Transform({ objectMode: true, transform (chunk, encoding, callback) { marker++ @@ -400,7 +399,7 @@ module.exports = { const usersProgressMultiplier = progressMultiplier / Math.ceil(usersCount / 50) WIKI.logger.info(`Found ${usersCount} users to export. Streaming to file...`) - const rs = stream.Readable({ objectMode: true }) + const rs = Readable({ objectMode: true }) rs._read = () => {} const fetchUsersBatch = async (offset) => { @@ -427,7 +426,7 @@ module.exports = { let marker = 0 await pipeline( rs, - new stream.Transform({ + new Transform({ objectMode: true, transform (chunk, encoding, callback) { marker++ diff --git a/server/graph/resolvers/system.js b/server/graph/resolvers/system.js index 51e57637b..d28ab04cf 100644 --- a/server/graph/resolvers/system.js +++ b/server/graph/resolvers/system.js @@ -1,6 +1,5 @@ const _ = require('lodash') -const Promise = require('bluebird') -const getos = Promise.promisify(require('getos')) +const getos = require('getos') const os = require('os') const filesize = require('filesize') const path = require('path') @@ -11,6 +10,8 @@ const request = require('request-promise') const crypto = require('crypto') const nanoid = require('nanoid/non-secure').customAlphabet('1234567890abcdef', 10) +const getosAsync = require('util').promisify(getos) + /* global WIKI */ const dbTypes = { @@ -371,7 +372,7 @@ module.exports = { async operatingSystem () { let osLabel = `${os.type()} (${os.platform()}) ${os.release()} ${os.arch()}` if (os.platform() === 'linux') { - const osInfo = await getos() + const osInfo = await getosAsync() osLabel = `${os.type()} - ${osInfo.dist} (${osInfo.codename || os.platform()}) ${osInfo.release || os.release()} ${os.arch()}` } return osLabel diff --git a/server/modules/search/algolia/engine.js b/server/modules/search/algolia/engine.js index e13b3c4a5..ead51a8fd 100644 --- a/server/modules/search/algolia/engine.js +++ b/server/modules/search/algolia/engine.js @@ -1,8 +1,6 @@ const _ = require('lodash') const algoliasearch = require('algoliasearch') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') /* global WIKI */ @@ -192,7 +190,7 @@ module.exports = { isPublished: true, isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (chunk, enc, cb) => processDocument(cb, chunk), flush: async (cb) => processDocument(cb) diff --git a/server/modules/search/aws/engine.js b/server/modules/search/aws/engine.js index e703e5c36..b1ec23aeb 100644 --- a/server/modules/search/aws/engine.js +++ b/server/modules/search/aws/engine.js @@ -1,8 +1,6 @@ const _ = require('lodash') const AWS = require('aws-sdk') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') /* global WIKI */ @@ -353,7 +351,7 @@ module.exports = { isPublished: true, isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (chunk, enc, cb) => processDocument(cb, chunk), flush: async (cb) => processDocument(cb) diff --git a/server/modules/search/azure/engine.js b/server/modules/search/azure/engine.js index 7dffcd075..8d2547022 100644 --- a/server/modules/search/azure/engine.js +++ b/server/modules/search/azure/engine.js @@ -1,9 +1,7 @@ const _ = require('lodash') const { SearchService, QueryType } = require('azure-search-client') const request = require('request-promise') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') /* global WIKI */ @@ -215,7 +213,7 @@ module.exports = { isPublished: true, isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: (chunk, enc, cb) => { cb(null, { diff --git a/server/modules/search/elasticsearch/engine.js b/server/modules/search/elasticsearch/engine.js index 0daf00374..6d72ee5f9 100644 --- a/server/modules/search/elasticsearch/engine.js +++ b/server/modules/search/elasticsearch/engine.js @@ -1,8 +1,6 @@ const _ = require('lodash') -const stream = require('stream') -const Promise = require('bluebird') const fs = require('fs') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') /* global WIKI */ @@ -135,7 +133,7 @@ module.exports = { } catch (err) { WIKI.logger.error(`(SEARCH/ELASTICSEARCH) Create Index Error: `, _.get(err, 'meta.body.error', err)) } - } + } } catch (err) { WIKI.logger.error(`(SEARCH/ELASTICSEARCH) Index Check Error: `, _.get(err, 'meta.body.error', err)) } @@ -392,7 +390,7 @@ module.exports = { isPublished: true, isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (chunk, enc, cb) => processDocument(cb, chunk), flush: async (cb) => processDocument(cb) diff --git a/server/modules/search/postgres/engine.js b/server/modules/search/postgres/engine.js index 33204b848..397afdd65 100644 --- a/server/modules/search/postgres/engine.js +++ b/server/modules/search/postgres/engine.js @@ -1,7 +1,5 @@ const tsquery = require('pg-tsquery')() -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') /* global WIKI */ @@ -166,7 +164,7 @@ module.exports = { isPublished: true, isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (page, enc, cb) => { const content = WIKI.models.pages.cleanHTML(page.render) diff --git a/server/modules/storage/azure/storage.js b/server/modules/storage/azure/storage.js index f7320146f..9ad955e3b 100644 --- a/server/modules/storage/azure/storage.js +++ b/server/modules/storage/azure/storage.js @@ -1,7 +1,5 @@ const { BlobServiceClient, StorageSharedKeyCredential } = require('@azure/storage-blob') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') const pageHelper = require('../../../helpers/page.js') const _ = require('lodash') @@ -129,7 +127,7 @@ module.exports = { WIKI.models.knex.column('path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt').select().from('pages').where({ isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (page, enc, cb) => { const filePath = getFilePath(page, 'path') @@ -147,7 +145,7 @@ module.exports = { await pipeline( WIKI.models.knex.column('filename', 'folderId', 'data').select().from('assets').join('assetData', 'assets.id', '=', 'assetData.id').stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (asset, enc, cb) => { const filename = (asset.folderId && asset.folderId > 0) ? `${_.get(assetFolders, asset.folderId)}/${asset.filename}` : asset.filename diff --git a/server/modules/storage/disk/common.js b/server/modules/storage/disk/common.js index 9ed0b9863..38dd5b89a 100644 --- a/server/modules/storage/disk/common.js +++ b/server/modules/storage/disk/common.js @@ -1,8 +1,6 @@ const fs = require('fs-extra') const path = require('path') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') const klaw = require('klaw') const mime = require('mime-types').lookup const _ = require('lodash') @@ -22,7 +20,7 @@ module.exports = { return !_.includes(f, '.git') } }), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (file, enc, cb) => { const relPath = file.path.substr(fullPath.length + 1) diff --git a/server/modules/storage/disk/storage.js b/server/modules/storage/disk/storage.js index 8e4e46616..c50069886 100644 --- a/server/modules/storage/disk/storage.js +++ b/server/modules/storage/disk/storage.js @@ -2,10 +2,8 @@ const fs = require('fs-extra') const path = require('path') const tar = require('tar-fs') const zlib = require('zlib') -const stream = require('stream') const _ = require('lodash') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') const moment = require('moment') const pageHelper = require('../../../helpers/page') @@ -130,7 +128,7 @@ module.exports = { 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({ + new Transform({ objectMode: true, transform: async (page, enc, cb) => { const pageObject = await WIKI.models.pages.query().findById(page.id) @@ -153,7 +151,7 @@ module.exports = { await pipeline( WIKI.models.knex.column('filename', 'folderId', 'data').select().from('assets').join('assetData', 'assets.id', '=', 'assetData.id').stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (asset, enc, cb) => { const filename = (asset.folderId && asset.folderId > 0) ? `${_.get(assetFolders, asset.folderId)}/${asset.filename}` : asset.filename diff --git a/server/modules/storage/git/storage.js b/server/modules/storage/git/storage.js index fcb197bc0..5429d4c55 100644 --- a/server/modules/storage/git/storage.js +++ b/server/modules/storage/git/storage.js @@ -2,9 +2,7 @@ const path = require('path') const sgit = require('simple-git') const fs = require('fs-extra') const _ = require('lodash') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') const klaw = require('klaw') const os = require('os') @@ -441,7 +439,7 @@ module.exports = { return !_.includes(f, '.git') } }), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (file, enc, cb) => { const relPath = file.path.substr(this.repoPath.length + 1) @@ -476,7 +474,7 @@ module.exports = { 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({ + new Transform({ objectMode: true, transform: async (page, enc, cb) => { const pageObject = await WIKI.models.pages.query().findById(page.id) @@ -500,7 +498,7 @@ module.exports = { await pipeline( WIKI.models.knex.column('filename', 'folderId', 'data').select().from('assets').join('assetData', 'assets.id', '=', 'assetData.id').stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (asset, enc, cb) => { const filename = (asset.folderId && asset.folderId > 0) ? `${_.get(assetFolders, asset.folderId)}/${asset.filename}` : asset.filename diff --git a/server/modules/storage/s3/common.js b/server/modules/storage/s3/common.js index fa1bc5dcd..b436a6658 100644 --- a/server/modules/storage/s3/common.js +++ b/server/modules/storage/s3/common.js @@ -1,7 +1,5 @@ const S3 = require('aws-sdk/clients/s3') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') const _ = require('lodash') const pageHelper = require('../../../helpers/page.js') @@ -22,7 +20,7 @@ const getFilePath = (page, pathKey) => { module.exports = class S3CompatibleStorage { constructor(storageName) { this.storageName = storageName - this.bucketName = "" + this.bucketName = '' } async activated() { // not used @@ -136,7 +134,7 @@ module.exports = class S3CompatibleStorage { WIKI.models.knex.column('path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt').select().from('pages').where({ isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (page, enc, cb) => { const filePath = getFilePath(page, 'path') @@ -152,7 +150,7 @@ module.exports = class S3CompatibleStorage { await pipeline( WIKI.models.knex.column('filename', 'folderId', 'data').select().from('assets').join('assetData', 'assets.id', '=', 'assetData.id').stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (asset, enc, cb) => { const filename = (asset.folderId && asset.folderId > 0) ? `${_.get(assetFolders, asset.folderId)}/${asset.filename}` : asset.filename diff --git a/server/modules/storage/sftp/storage.js b/server/modules/storage/sftp/storage.js index 49d5ae1d9..07a9bbb47 100644 --- a/server/modules/storage/sftp/storage.js +++ b/server/modules/storage/sftp/storage.js @@ -1,9 +1,7 @@ const SSH2Promise = require('ssh2-promise') const _ = require('lodash') const path = require('path') -const stream = require('stream') -const Promise = require('bluebird') -const pipeline = Promise.promisify(stream.pipeline) +const { pipeline, Transform } = require('stream') const pageHelper = require('../../../helpers/page.js') /* global WIKI */ @@ -118,7 +116,7 @@ module.exports = { WIKI.models.knex.column('path', 'localeCode', 'title', 'description', 'contentType', 'content', 'isPublished', 'updatedAt', 'createdAt').select().from('pages').where({ isPrivate: false }).stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (page, enc, cb) => { const filePath = getFilePath(page, 'path') @@ -135,7 +133,7 @@ module.exports = { await pipeline( WIKI.models.knex.column('filename', 'folderId', 'data').select().from('assets').join('assetData', 'assets.id', '=', 'assetData.id').stream(), - new stream.Transform({ + new Transform({ objectMode: true, transform: async (asset, enc, cb) => { const filename = (asset.folderId && asset.folderId > 0) ? `${_.get(assetFolders, asset.folderId)}/${asset.filename}` : asset.filename diff --git a/server/setup.js b/server/setup.js index 44da308b6..9763fc038 100644 --- a/server/setup.js +++ b/server/setup.js @@ -5,13 +5,14 @@ const compression = require('compression') const express = require('express') const favicon = require('serve-favicon') const http = require('http') -const Promise = require('bluebird') const fs = require('fs-extra') const _ = require('lodash') -const crypto = Promise.promisifyAll(require('crypto')) +const crypto = require('crypto') const pem2jwk = require('pem-jwk').pem2jwk const semver = require('semver') +const randomBytesAsync = require('util').promisify(crypto.randomBytes) + /* global WIKI */ module.exports = () => { @@ -119,7 +120,7 @@ module.exports = () => { analyticsService: '', analyticsId: '' }) - _.set(WIKI.config, 'sessionSecret', (await crypto.randomBytesAsync(32)).toString('hex')) + _.set(WIKI.config, 'sessionSecret', (await randomBytesAsync(32)).toString('hex')) _.set(WIKI.config, 'telemetry', { isEnabled: req.body.telemetry === true, clientId: uuid() From af839795ae405450571ea412a8007aa216cf53ac Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sat, 3 Jan 2026 03:27:51 -0500 Subject: [PATCH 18/46] chore: update dependencies --- package.json | 62 +-- yarn.lock | 1355 +++++++++++++++++++++++++++++++------------------- 2 files changed, 869 insertions(+), 548 deletions(-) diff --git a/package.json b/package.json index ed7d73e85..10ede3a37 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "node": ">=20" }, "dependencies": { - "@azure/storage-blob": "12.12.0", + "@azure/storage-blob": "12.29.1", "@exlinc/keycloak-passport": "1.0.2", "@joplin/turndown-plugin-gfm": "1.0.45", "@root/csr": "0.8.1", @@ -51,7 +51,7 @@ "apollo-server-express": "2.25.2", "asciidoctor": "2.2.6", "auto-load": "3.0.4", - "aws-sdk": "2.1309.0", + "aws-sdk": "2.1693.0", "azure-search-client": "3.1.5", "bcryptjs-then": "1.0.1", "bluebird": "3.7.2", @@ -60,18 +60,18 @@ "cheerio": "1.0.0-rc.5", "chokidar": "3.5.3", "chromium-pickle-js": "0.2.0", - "clean-css": "5.3.2", + "clean-css": "5.3.3", "command-exists": "1.2.9", - "compression": "1.7.4", + "compression": "1.8.1", "connect-session-knex": "2.0.0", - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cors": "2.8.5", "cuint": "0.2.2", "custom-error-instance": "2.1.2", "dependency-graph": "0.11.0", "diff": "4.0.2", "diff2html": "3.1.14", - "dompurify": "3.2.6", + "dompurify": "3.3.1", "dotize": "0.3.0", "elasticsearch6": "npm:@elastic/elasticsearch@6", "elasticsearch7": "npm:@elastic/elasticsearch@7", @@ -80,7 +80,7 @@ "eventemitter2": "6.4.9", "express": "4.18.2", "express-brute": "1.0.1", - "express-session": "1.17.3", + "express-session": "1.18.2", "file-type": "15.0.1", "filesize": "6.1.0", "fs-extra": "9.0.1", @@ -96,11 +96,11 @@ "i18next-express-middleware": "2.0.0", "i18next-node-fs-backend": "2.1.3", "image-size": "0.9.2", - "js-base64": "3.7.4", + "js-base64": "3.7.8", "js-binary": "1.2.0", "js-yaml": "3.14.0", "jsdom": "16.4.0", - "jsonwebtoken": "9.0.0", + "jsonwebtoken": "9.0.3", "katex": "0.12.0", "klaw": "3.0.0", "knex": "0.21.7", @@ -124,21 +124,21 @@ "markdown-it-task-lists": "2.1.1", "mathjax": "3.2.2", "mime-types": "2.1.35", - "moment": "2.29.4", - "moment-timezone": "0.5.40", + "moment": "2.30.1", + "moment-timezone": "0.6.0", "mongodb": "3.6.5", "ms": "2.1.3", "mssql": "6.2.3", "multer": "1.4.4", - "mysql2": "3.1.0", + "mysql2": "3.16.0", "nanoid": "3.2.0", "node-2fa": "1.1.2", "node-cache": "5.1.2", "nodemailer": "6.9.1", "objection": "2.2.18", "passport": "0.4.1", - "passport-auth0": "1.4.3", - "passport-azure-ad": "4.3.4", + "passport-auth0": "1.4.5", + "passport-azure-ad": "4.3.5", "passport-cas": "0.1.1", "passport-discord": "0.1.4", "passport-dropbox-oauth2": "1.1.0", @@ -150,47 +150,47 @@ "passport-ldapauth": "3.0.1", "passport-local": "1.0.0", "passport-microsoft": "0.1.0", - "passport-oauth2": "1.6.1", + "passport-oauth2": "1.8.0", "passport-okta-oauth": "0.0.1", - "passport-openidconnect": "0.1.1", + "passport-openidconnect": "0.1.2", "passport-saml": "3.2.4", - "passport-slack-oauth2": "1.1.1", + "passport-slack-oauth2": "1.2.0", "passport-twitch-strategy": "2.2.0", - "patch-package": "8.0.0", + "patch-package": "8.0.1", "pem-jwk": "2.0.0", - "pg": "8.9.0", + "pg": "8.16.3", "pg-hstore": "2.3.4", - "pg-pubsub": "0.5.0", - "pg-query-stream": "4.3.0", - "pg-tsquery": "8.4.1", + "pg-pubsub": "0.8.1", + "pg-query-stream": "4.10.3", + "pg-tsquery": "8.4.2", "postinstall-postinstall": "2.1.0", - "pug": "3.0.2", - "punycode": "2.3.0", + "pug": "3.0.3", + "punycode": "2.3.1", "qr-image": "3.2.0", "raven": "2.6.4", - "remove-markdown": "0.5.0", + "remove-markdown": "0.6.2", "request": "2.88.2", "request-promise": "4.2.6", "safe-regex": "2.1.1", "sanitize-filename": "1.6.3", "scim-query-filter-parser": "2.0.4", - "semver": "7.3.8", - "serve-favicon": "2.5.0", - "simple-git": "3.16.0", + "semver": "7.7.3", + "serve-favicon": "2.5.1", + "simple-git": "3.30.0", "solr-node": "1.2.1", - "sqlite3": "5.1.4", + "sqlite3": "5.1.7", "ssh2": "1.11.0", "ssh2-promise": "1.0.3", "striptags": "3.2.0", "subscriptions-transport-ws": "0.9.18", "tar-fs": "2.1.1", - "turndown": "7.1.1", + "turndown": "7.2.2", "twemoji": "14.0.2", "uslug": "1.0.4", "uuid": "9.0.0", "validate.js": "0.13.1", "winston": "3.8.2", - "xss": "1.0.14", + "xss": "1.0.15", "yargs": "17.6.2" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 5193952ab..8414feb3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -199,39 +199,43 @@ dependencies: tslib "^1.9.3" -"@azure/core-asynciterator-polyfill@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz#dcccebb88406e5c76e0e1d52e8cc4c43a68b3ee7" - integrity sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg== - -"@azure/core-auth@^1.3.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.3.2.tgz#6a2c248576c26df365f6c7881ca04b7f6d08e3d0" - integrity sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA== - dependencies: - "@azure/abort-controller" "^1.0.0" - tslib "^2.2.0" - -"@azure/core-http@^2.0.0": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-2.2.4.tgz#df5a5b4138dbbc4299879f2fc6f257d0a5f0401e" - integrity sha512-QmmJmexXKtPyc3/rsZR/YTLDvMatzbzAypJmLzvlfxgz/SkgnqV/D4f6F2LsK6tBj1qhyp8BoXiOebiej0zz3A== +"@azure/abort-controller@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" + integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== + dependencies: + tslib "^2.6.2" + +"@azure/core-auth@^1.10.0", "@azure/core-auth@^1.9.0": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.10.1.tgz#68a17fa861ebd14f6fd314055798355ef6bedf1b" + integrity sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-util" "^1.13.0" + tslib "^2.6.2" + +"@azure/core-client@^1.10.0", "@azure/core-client@^1.9.3": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.10.1.tgz#83d78f97d647ab22e6811a7a68bb4223e7a1d019" + integrity sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.10.0" + "@azure/core-rest-pipeline" "^1.22.0" + "@azure/core-tracing" "^1.3.0" + "@azure/core-util" "^1.13.0" + "@azure/logger" "^1.3.0" + tslib "^2.6.2" + +"@azure/core-http-compat@^2.2.0": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz#2182e39a31c062800d4e3ad69bcf0109d87713dc" + integrity sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g== dependencies: - "@azure/abort-controller" "^1.0.0" - "@azure/core-asynciterator-polyfill" "^1.0.0" - "@azure/core-auth" "^1.3.0" - "@azure/core-tracing" "1.0.0-preview.13" - "@azure/logger" "^1.0.0" - "@types/node-fetch" "^2.5.0" - "@types/tunnel" "^0.0.3" - form-data "^4.0.0" - node-fetch "^2.6.7" - process "^0.11.10" - tough-cookie "^4.0.0" - tslib "^2.2.0" - tunnel "^0.0.6" - uuid "^8.3.0" - xml2js "^0.4.19" + "@azure/abort-controller" "^2.1.2" + "@azure/core-client" "^1.10.0" + "@azure/core-rest-pipeline" "^1.22.0" "@azure/core-lro@^2.2.0": version "2.2.4" @@ -243,12 +247,25 @@ "@azure/logger" "^1.0.0" tslib "^2.2.0" -"@azure/core-paging@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.1.1.tgz#9639d2d5b6631d481d81040504e0e26c003f47b1" - integrity sha512-hqEJBEGKan4YdOaL9ZG/GRG6PXaFd/Wb3SSjQW4LWotZzgl6xqG00h6wmkrpd2NNkbBkD1erLHBO3lPHApv+iQ== +"@azure/core-paging@^1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.6.2.tgz#40d3860dc2df7f291d66350b2cfd9171526433e7" + integrity sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA== dependencies: - "@azure/core-asynciterator-polyfill" "^1.0.0" + tslib "^2.6.2" + +"@azure/core-rest-pipeline@^1.19.1", "@azure/core-rest-pipeline@^1.22.0": + version "1.22.2" + resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.2.tgz#7e14f21d25ab627cd07676adb5d9aacd8e2e95cc" + integrity sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.10.0" + "@azure/core-tracing" "^1.3.0" + "@azure/core-util" "^1.13.0" + "@azure/logger" "^1.3.0" + "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" "@azure/core-tracing@1.0.0-preview.13": version "1.0.0-preview.13" @@ -258,6 +275,30 @@ "@opentelemetry/api" "^1.0.1" tslib "^2.2.0" +"@azure/core-tracing@^1.2.0", "@azure/core-tracing@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz#e971045c901ea9c110616b0e1db272507781d5f6" + integrity sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ== + dependencies: + tslib "^2.6.2" + +"@azure/core-util@^1.11.0", "@azure/core-util@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.13.1.tgz#6dff2ff6d3c9c6430c6f4d3b3e65de531f10bafe" + integrity sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" + +"@azure/core-xml@^1.4.5": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@azure/core-xml/-/core-xml-1.5.0.tgz#cd82d511d7bcc548d206f5627c39724c5d5a4434" + integrity sha512-D/sdlJBMJfx7gqoj66PKVmhDDaU6TKA49ptcolxdas29X7AfvLTmfAGLjAcIMBK7UZ2o4lygHIqVckOlQU3xWw== + dependencies: + fast-xml-parser "^5.0.7" + tslib "^2.8.1" + "@azure/logger@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.0.0.tgz#48b371dfb34288c8797e5c104f6c4fb45bf1772c" @@ -265,6 +306,14 @@ dependencies: tslib "^1.9.3" +"@azure/logger@^1.1.4", "@azure/logger@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.3.0.tgz#5501cf85d4f52630602a8cc75df76568c969a827" + integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA== + dependencies: + "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" + "@azure/ms-rest-azure-env@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@azure/ms-rest-azure-env/-/ms-rest-azure-env-1.1.2.tgz#8505873afd4a1227ec040894a64fdd736b4a101f" @@ -293,19 +342,40 @@ "@azure/ms-rest-js" "^1.8.7" adal-node "^0.1.28" -"@azure/storage-blob@12.12.0": - version "12.12.0" - resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.12.0.tgz#25e277c885692d5adcd8c2a949789b2837a74c59" - integrity sha512-o/Mf6lkyYG/eBW4/hXB9864RxVNmAkcKHjsGR6Inlp5hupa3exjSyH2KjO3tLO//YGA+tS+17hM2bxRl9Sn16g== +"@azure/storage-blob@12.29.1": + version "12.29.1" + resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.29.1.tgz#d9588b3f56f3621f92936fa3e7f268e00a34548a" + integrity sha512-7ktyY0rfTM0vo7HvtK6E3UvYnI9qfd6Oz6z/+92VhGRveWng3kJwMKeUpqmW/NmwcDNbxHpSlldG+vsUnRFnBg== dependencies: - "@azure/abort-controller" "^1.0.0" - "@azure/core-http" "^2.0.0" + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.9.0" + "@azure/core-client" "^1.9.3" + "@azure/core-http-compat" "^2.2.0" "@azure/core-lro" "^2.2.0" - "@azure/core-paging" "^1.1.1" - "@azure/core-tracing" "1.0.0-preview.13" - "@azure/logger" "^1.0.0" + "@azure/core-paging" "^1.6.2" + "@azure/core-rest-pipeline" "^1.19.1" + "@azure/core-tracing" "^1.2.0" + "@azure/core-util" "^1.11.0" + "@azure/core-xml" "^1.4.5" + "@azure/logger" "^1.1.4" + "@azure/storage-common" "^12.1.1" events "^3.0.0" - tslib "^2.2.0" + tslib "^2.8.1" + +"@azure/storage-common@^12.1.1": + version "12.1.1" + resolved "https://registry.yarnpkg.com/@azure/storage-common/-/storage-common-12.1.1.tgz#cd0768188f7cf8ea7202d584067ad5f3eba89744" + integrity sha512-eIOH1pqFwI6UmVNnDQvmFeSg0XppuzDLFeUNO/Xht7ODAzRLgGDh7h550pSxoA+lPDxBl1+D2m/KG3jWzCUjTg== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.9.0" + "@azure/core-http-compat" "^2.2.0" + "@azure/core-rest-pipeline" "^1.19.1" + "@azure/core-tracing" "^1.2.0" + "@azure/core-util" "^1.11.0" + "@azure/logger" "^1.1.4" + events "^3.3.0" + tslib "^2.8.1" "@babel/cli@^7.12.1": version "7.12.1" @@ -3294,26 +3364,16 @@ resolved "https://registry.yarnpkg.com/@log4js-node/log4js-api/-/log4js-api-1.0.2.tgz#7a8143fb33f077df3e579dca7f18fea74a02ec8b" integrity sha512-6SJfx949YEWooh/CUPpJ+F491y4BYJmknz4hUN1+RHvKoUEynKbRmhnwbk/VLmh4OthLLDNCyWXfbh4DG1cTXA== -"@mapbox/node-pre-gyp@^1.0.0": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz#09a8781a3a036151cdebbe8719d6f8b25d4058bc" - integrity sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw== - dependencies: - detect-libc "^2.0.0" - https-proxy-agent "^5.0.0" - make-dir "^3.1.0" - node-fetch "^2.6.7" - nopt "^5.0.0" - npmlog "^5.0.1" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.11" - "@mdi/font@5.8.55": version "5.8.55" resolved "https://registry.yarnpkg.com/@mdi/font/-/font-5.8.55.tgz#1464155bcbc8a6e4af6dffd611fe8e38e09af285" integrity sha512-8mrwfFBsmj+D67ZiGQSe5TU/lcWCtDyli2eshQ2fvLCZGRPqFMM23YQp4+JMOTpk5yMZKTeAwNWIYfITy76OHA== +"@mixmark-io/domino@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@mixmark-io/domino/-/domino-2.2.0.tgz#4e8ec69bf1afeb7a14f0628b7e2c0f35bdb336c3" + integrity sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw== + "@nicolo-ribaudo/chokidar-2@^2.1.8": version "2.1.8" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8.tgz#eef8d9b47e8dc589499f14d656e8d2dd978c3d14" @@ -3840,13 +3900,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node-fetch@^2.5.0": - version "2.5.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.4.tgz#5245b6d8841fc3a6208b82291119bc11c4e0ce44" - integrity sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ== - dependencies: - "@types/node" "*" - "@types/node@*", "@types/node@>=6": version "12.7.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.4.tgz#64db61e0359eb5a8d99b55e05c729f130a678b04" @@ -3872,19 +3925,6 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -"@types/pg-types@*": - version "1.11.5" - resolved "https://registry.yarnpkg.com/@types/pg-types/-/pg-types-1.11.5.tgz#1eebbe62b6772fcc75c18957a90f933d155e005b" - integrity sha512-L8ogeT6vDzT1vxlW3KITTCt+BVXXVkLXfZ/XNm6UqbcJgxf+KPO7yjWx7dQQE8RW07KopL10x2gNMs41+IkMGQ== - -"@types/pg@^7.4.14": - version "7.14.1" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-7.14.1.tgz#40358b57c34970f750f6a26e2a5463c9f4758136" - integrity sha512-gQgg4bLuykokypx4O1fwEzl5e6UjjyaBtN3znn5zhm0YB9BnKyHDw+e4cQY9rAPzpdM2qpJbn9TNzUazbmTsdw== - dependencies: - "@types/node" "*" - "@types/pg-types" "*" - "@types/prettier@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.0.tgz#dc85454b953178cc6043df5208b9e949b54a3bc4" @@ -3971,13 +4011,6 @@ dependencies: "@types/node" "*" -"@types/tunnel@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/tunnel/-/tunnel-0.0.3.tgz#f109e730b072b3136347561fc558c9358bb8c6e9" - integrity sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA== - dependencies: - "@types/node" "*" - "@types/uglify-js@*": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" @@ -4049,6 +4082,15 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== +"@typespec/ts-http-runtime@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.2.tgz#1048df6182b02bec8962a9cffd1c5ee1a129541f" + integrity sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg== + dependencies: + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + tslib "^2.6.2" + "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz#31624a7a505fb14da1d58023725a4c5f270e6a81" @@ -4405,7 +4447,7 @@ abstract-logging@^2.0.0: resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== -accepts@^1.3.5, accepts@~1.3.5, accepts@~1.3.7: +accepts@^1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== @@ -4496,6 +4538,11 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== + agentkeepalive@^4.1.3: version "4.2.1" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" @@ -5116,14 +5163,6 @@ arch@^2.1.2: resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz#0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf" integrity sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ== -are-we-there-yet@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" - integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - are-we-there-yet@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d" @@ -5402,10 +5441,10 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-sdk@2.1309.0: - version "2.1309.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1309.0.tgz#2bc6e25af6da39a6c9c48080a43b35596a58a2c5" - integrity sha512-EC/EtDDWDoJnovvmNlJqvojNJMbFZ78HESzgFiond5vzPS+FIWnWgGJ1ZVvIWU9O4X5I8cEMckwHCTfVYNcZxA== +aws-sdk@2.1693.0: + version "2.1693.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1693.0.tgz#fda38671af3dc5fa8117e9aa09cf6ce37e34010e" + integrity sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ== dependencies: buffer "4.9.2" events "1.1.1" @@ -5416,13 +5455,18 @@ aws-sdk@2.1309.0: url "0.10.3" util "^0.12.4" uuid "8.0.0" - xml2js "0.4.19" + xml2js "0.6.2" aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= +aws-ssl-profiles@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz#157dd77e9f19b1d123678e93f120e6f193022641" + integrity sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== + aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" @@ -5436,13 +5480,14 @@ axios@^0.19.0: follow-redirects "1.5.10" is-buffer "^2.0.2" -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== +axios@^1.7.4: + version "1.13.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.2.tgz#9ada120b7b5ab24509553ec3e40123521117f687" + integrity sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA== dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" + follow-redirects "^1.15.6" + form-data "^4.0.4" + proxy-from-env "^1.1.0" azure-search-client@3.1.5: version "3.1.5" @@ -5766,6 +5811,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bl@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" @@ -6021,7 +6073,7 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-equal-constant-time@1.0.1: +buffer-equal-constant-time@1.0.1, buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= @@ -6036,11 +6088,6 @@ buffer-json@^2.0.0: resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== -buffer-writer@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" - integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -6072,6 +6119,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + bufferutil@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" @@ -6114,11 +6169,6 @@ busboy@^0.3.1: dependencies: dicer "0.3.0" -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - bytes@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" @@ -6238,6 +6288,14 @@ cachedir@^2.3.0: resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -6614,10 +6672,10 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== +clean-css@5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== dependencies: source-map "~0.6.0" @@ -6857,7 +6915,7 @@ color-string@^1.4.0, color-string@^1.5.2: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.2, color-support@^1.1.3: +color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -6985,24 +7043,24 @@ compose-function@3.0.3: dependencies: arity-n "^1.0.4" -compressible@~2.0.16: - version "2.0.17" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" - integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: - mime-db ">= 1.40.0 < 2" + mime-db ">= 1.43.0 < 2" -compression@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== +compression@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" + negotiator "~0.6.4" + on-headers "~1.1.0" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -7126,12 +7184,12 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0: dependencies: safe-buffer "~5.1.1" -cookie-parser@1.4.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" - integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== +cookie-parser@1.4.7: + version "1.4.7" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.7.tgz#e2125635dfd766888ffe90d60c286404fa0e7b26" + integrity sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw== dependencies: - cookie "0.4.1" + cookie "0.7.2" cookie-signature "1.0.6" cookie-signature@1.0.6: @@ -7139,6 +7197,11 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= +cookie-signature@1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" @@ -7149,21 +7212,16 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookie@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - cookie@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + cookiejar@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" @@ -8336,6 +8394,13 @@ debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: dependencies: ms "2.1.2" +debug@^4.4.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -8358,6 +8423,13 @@ decompress-response@^4.2.0: dependencies: mimic-response "^2.0.0" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-extend@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" @@ -8657,15 +8729,10 @@ domhandler@^4.0.0, domhandler@^4.1.0: 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@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" - integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== +dompurify@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.3.1.tgz#c7e1ddebfe3301eacd6c0c12a4af284936dbbb86" + integrity sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q== optionalDependencies: "@types/trusted-types" "^2.0.7" @@ -8721,6 +8788,15 @@ dtrace-provider@~0.8: dependencies: nan "^2.14.0" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -9050,6 +9126,33 @@ es-abstract@^1.17.0-next.1: string.prototype.trimleft "^2.1.0" string.prototype.trimright "^2.1.0" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" @@ -9425,6 +9528,11 @@ events@^3.0.0: resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -9511,6 +9619,11 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -9538,16 +9651,16 @@ express-brute@1.0.1: long-timeout "~0.1.1" underscore "~1.8.3" -express-session@1.17.3: - version "1.17.3" - resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.17.3.tgz#14b997a15ed43e5949cb1d073725675dd2777f36" - integrity sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== +express-session@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.18.2.tgz#34db6252611b57055e877036eea09b4453dec5d8" + integrity sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A== dependencies: - cookie "0.4.2" - cookie-signature "1.0.6" + cookie "0.7.2" + cookie-signature "1.0.7" debug "2.6.9" depd "~2.0.0" - on-headers "~1.0.2" + on-headers "~1.1.0" parseurl "~1.3.3" safe-buffer "5.2.1" uid-safe "~2.1.5" @@ -9733,6 +9846,13 @@ fast-safe-stringify@^2.1.1: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-xml-parser@^5.0.7: + version "5.3.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.3.3.tgz#84b678e44eb81207c8585795152b4b1c94738b4d" + integrity sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA== + dependencies: + strnum "^2.1.0" + fastq@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" @@ -9838,6 +9958,11 @@ file-type@15.0.1: token-types "^2.0.0" typedarray-to-buffer "^3.1.5" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + file@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/file/-/file-0.2.2.tgz#c3dfd8f8cf3535ae455c2b423c2e52635d76b4d3" @@ -10050,10 +10175,10 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" -follow-redirects@^1.14.9: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.6: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== for-each@^0.3.3: version "0.3.3" @@ -10106,6 +10231,17 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -10147,7 +10283,7 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fresh@0.5.2: +fresh@0.5.2, fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= @@ -10180,6 +10316,15 @@ fs-extra@9.0.1, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -10189,16 +10334,6 @@ fs-extra@^8.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -10261,26 +10396,16 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -gauge@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" - integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.2" - console-control-strings "^1.0.0" - has-unicode "^2.0.1" - object-assign "^4.1.1" - signal-exit "^3.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.2" - gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -10349,6 +10474,30 @@ get-intrinsic@^1.1.3: has "^1.0.3" has-symbols "^1.0.3" +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -10387,6 +10536,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -10562,6 +10716,11 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" @@ -10765,6 +10924,11 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -10772,6 +10936,13 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -10836,6 +11007,13 @@ hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@1.2.0, he@^1.1.0, he@^1.1.1, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -11080,6 +11258,14 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -11102,6 +11288,14 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.0: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -11171,13 +11365,20 @@ iconv-lite@^0.5.0: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2, iconv-lite@^0.6.3: +iconv-lite@^0.6.2: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +iconv-lite@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.1.tgz#d4af1d2092f2bb05aab6296e5e7cd286d2f15432" + integrity sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -11190,6 +11391,11 @@ ieee754@1.1.13, ieee754@^1.1.13, ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" @@ -12340,10 +12546,10 @@ jmespath@0.16.0: resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076" integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== -js-base64@3.7.4: - version "3.7.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.4.tgz#af95b20f23efc8034afd2d1cc5b9d0adf7419037" - integrity sha512-wpM/wi20Tl+3ifTyi0RdDckS4YTD4Lf953mBRrpG8547T7hInHNPEj8+ck4gB8VDcGyeAWFK++Wb/fU1BeavKQ== +js-base64@3.7.8: + version "3.7.8" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.8.tgz#af44496bc09fa178ed9c4adf67eb2b46f5c6d2a4" + integrity sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow== js-beautify@1.13.5: version "1.13.5" @@ -12544,7 +12750,23 @@ jsonify@^0.0.1: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== -jsonwebtoken@9.0.0, jsonwebtoken@^9.0.0: +jsonwebtoken@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2" + integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== + dependencies: + jws "^4.0.1" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +jsonwebtoken@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== @@ -12581,6 +12803,15 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" +jwa@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" + integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== + dependencies: + buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + jws@3.x.x, jws@^3.1.3, jws@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" @@ -12589,6 +12820,14 @@ jws@3.x.x, jws@^3.1.3, jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +jws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690" + integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== + dependencies: + jwa "^2.0.1" + safe-buffer "^5.0.1" + katex@0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" @@ -12956,6 +13195,36 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -12966,7 +13235,7 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.once@^4.1.1: +lodash.once@^4.0.0, lodash.once@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= @@ -13070,6 +13339,11 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== + long@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" @@ -13121,6 +13395,11 @@ lru-cache@^7.14.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== +lru.min@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.3.tgz#c8c3d001dfb4cbe5b8d1f4bea207d4a320e5d76f" + integrity sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q== + luxon@1.25.0: version "1.25.0" resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.25.0.tgz#d86219e90bc0102c0eb299d65b2f5e95efe1fe72" @@ -13141,7 +13420,7 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" -make-dir@^3.0.2, make-dir@^3.1.0: +make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -13306,6 +13585,11 @@ math-expression-evaluator@^1.2.14: resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mathjax@3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/mathjax/-/mathjax-3.2.2.tgz#c754d7b46a679d7f3fa03543d6b8bf124ddf9f6b" @@ -13465,10 +13749,10 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -"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-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== mime-types@2.1.35, mime-types@~2.1.34: version "2.1.35" @@ -13521,6 +13805,11 @@ mimic-response@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + mini-css-extract-plugin@0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" @@ -13571,16 +13860,16 @@ minimist@^1.1.1, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.3, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - minipass-collect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" @@ -13701,6 +13990,11 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz#54c441ce4c96cd7790e10b41a87aa51068ecab2b" integrity sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g== +mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" @@ -13756,19 +14050,19 @@ moment-timezone-data-webpack-plugin@1.3.0: find-cache-dir "^3.0.0" make-dir "^3.0.0" -moment-timezone@0.5.40: - version "0.5.40" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.40.tgz#c148f5149fd91dd3e29bf481abc8830ecba16b89" - integrity sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg== +moment-timezone@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.6.0.tgz#c5a6519171f31a64739ea75d33f5c136c08ff608" + integrity sha512-ldA5lRNm3iJCWZcBCab4pnNL3HSZYXVb/3TYr75/1WCTWYuTqYUb5f/S384pncYjJ88lbO8Z4uPDvmoluHJc8Q== dependencies: - moment ">= 2.9.0" + moment "^2.29.4" -moment@2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== +moment@2.30.1, moment@^2.29.4: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -"moment@>= 2.9.0", moment@^2.10.2, moment@^2.19.2, moment@^2.22.1: +moment@^2.10.2, moment@^2.19.2, moment@^2.22.1: version "2.24.0" resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== @@ -13818,7 +14112,7 @@ 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, ms@^2.0.0, ms@^2.1.3: +ms@2.1.3, ms@^2.0.0, ms@^2.1.3, 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== @@ -13855,16 +14149,17 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -mysql2@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.1.0.tgz#7d7b6c9e368bd5f74a82ce150edc32401a05d756" - integrity sha512-woMeIog21X72RcFLhE/xajhUdnwRMd6Oq16S7/O2qJ5lPUDfFwgSW+xhx7TjzcM8PU3q+dVsryIaDi+HyQR/0A== +mysql2@3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.16.0.tgz#f296336b3ddba00fe061c7ca7ada2ddf8689c17e" + integrity sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA== dependencies: + aws-ssl-profiles "^1.1.1" denque "^2.1.0" generate-function "^2.3.1" - iconv-lite "^0.6.3" + iconv-lite "^0.7.0" long "^5.2.1" - lru-cache "^7.14.1" + lru.min "^1.0.0" named-placeholders "^1.1.3" seq-queue "^0.0.5" sqlstring "^2.3.2" @@ -13913,6 +14208,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + native-duplexpair@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/native-duplexpair/-/native-duplexpair-1.0.0.tgz#7899078e64bf3c8a3d732601b3d40ff05db58fa0" @@ -13952,6 +14252,11 @@ negotiator@0.6.3, negotiator@^0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -13995,10 +14300,17 @@ node-2fa@1.1.2: notp "^2.0.3" thirty-two "0.0.2" -node-addon-api@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" - integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== +node-abi@^3.3.0: + version "3.85.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.85.0.tgz#b115d575e52b2495ef08372b058e13d202875a7d" + integrity sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== node-cache@5.1.2: version "5.1.2" @@ -14032,17 +14344,10 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.3.tgz#0ad80f6333b3a0045e827ac20b7f735f93716751" + integrity sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg== node-gyp-build@~3.7.0: version "3.7.0" @@ -14070,20 +14375,20 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-jose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-jose/-/node-jose-2.0.0.tgz#541c6b52c387a3f18fc06cd502baad759af9c470" - integrity sha512-j8zoFze1gijl8+DK/dSXXqX7+o2lMYv1XS+ptnXgGV/eloQaqq1YjNtieepbKs9jBS4WTnMOqyKSaQuunJzx0A== +node-jose@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-jose/-/node-jose-2.2.0.tgz#b64f3225ad6bec328509a420800de597ba2bf3ed" + integrity sha512-XPCvJRr94SjLrSIm4pbYHKLEaOsDvJCpyFw/6V/KK/IXmyZ6SFBzAUDO9HQf4DB/nTEFcRGH87mNciOP23kFjw== dependencies: base64url "^3.0.1" - buffer "^5.5.0" + buffer "^6.0.3" es6-promise "^4.2.8" - lodash "^4.17.15" - long "^4.0.0" - node-forge "^0.10.0" - pako "^1.0.11" + lodash "^4.17.21" + long "^5.2.0" + node-forge "^1.2.1" + pako "^2.0.4" process "^0.11.10" - uuid "^3.3.3" + uuid "^9.0.0" node-libs-browser@^2.2.1: version "2.2.1" @@ -14289,16 +14594,6 @@ npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" -npmlog@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" - integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== - dependencies: - are-we-there-yet "^2.0.0" - console-control-strings "^1.1.0" - gauge "^3.0.0" - set-blocking "^2.0.0" - npmlog@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" @@ -14348,6 +14643,11 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +oauth@0.10.x: + version "0.10.2" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.10.2.tgz#fd7139b0ce1a1037bd11fa4e236afc588132418c" + integrity sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q== + oauth@0.9.15, oauth@0.9.x: version "0.9.15" resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" @@ -14495,10 +14795,10 @@ on-finished@^2.3.0, on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== +on-headers@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -14614,7 +14914,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -14711,16 +15011,16 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -packet-reader@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" - integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== - -pako@1.0.11, pako@^1.0.11: +pako@1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +pako@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + pako@~1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" @@ -14843,19 +15143,19 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -passport-auth0@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/passport-auth0/-/passport-auth0-1.4.3.tgz#8034b5fbf75706e95b1b97627c4caa18af6f96c5" - integrity sha512-jTOY8xV0OZfhZ32gs74p64CCkOSdVohMFIqLE46/ji3qUkA5mBzfOr5FMGXnraLpVzl6Phkn0TbxYbUIll3dxA== +passport-auth0@1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/passport-auth0/-/passport-auth0-1.4.5.tgz#83e3b7f9cdd8a5d3231985573d89ea6e6c894bea" + integrity sha512-pfAvcAoR1HjKFygq0gGEHCy+9eqXr1CnfN3yD4kuUj1p4ek7P3s4bMn13+Q1FajqDNA8lD0Vvy6j8Od1oqF9Dg== dependencies: - axios "^0.27.2" + axios "^1.7.4" passport-oauth "^1.0.0" passport-oauth2 "^1.6.0" -passport-azure-ad@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/passport-azure-ad/-/passport-azure-ad-4.3.4.tgz#2f1c3f64003df974b60390ece70d106336336f46" - integrity sha512-veG3IT/ovfFaMK3IREcVGLYa8nx/91s10eeMcfJmvofHG7Uv6FVElrnDA2E1CgQdE6hdWzG28UV8ITw6Qhocxg== +passport-azure-ad@4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/passport-azure-ad/-/passport-azure-ad-4.3.5.tgz#107d709409170478d1a66ec1efb4c094dd3d321b" + integrity sha512-LBpXEght7hCMuMNFK4oegdN0uPBa3lpDMy71zQoB0zPg1RrGwdzpjwTiN1WzN0hY77fLyjz9tBr3TGAxnSgtEg== dependencies: async "^3.2.3" base64url "^3.0.0" @@ -14864,7 +15164,7 @@ passport-azure-ad@4.3.4: https-proxy-agent "^5.0.0" jws "^3.1.3" lodash "^4.11.2" - node-jose "^2.0.0" + node-jose "^2.2.0" oauth "0.9.15" passport "^0.6.0" valid-url "^1.0.6" @@ -14970,13 +15270,13 @@ passport-oauth2@1.2.0: passport-strategy "1.x.x" uid2 "0.0.x" -passport-oauth2@1.6.1, passport-oauth2@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b" - integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ== +passport-oauth2@1.8.0, passport-oauth2@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.8.0.tgz#55725771d160f09bbb191828d5e3d559eee079c8" + integrity sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA== dependencies: base64url "3.x.x" - oauth "0.9.x" + oauth "0.10.x" passport-strategy "1.x.x" uid2 "0.0.x" utils-merge "1.x.x" @@ -14992,6 +15292,17 @@ passport-oauth2@1.x.x, passport-oauth2@^1.4.0, passport-oauth2@^1.5.0: uid2 "0.0.x" utils-merge "1.x.x" +passport-oauth2@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b" + integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ== + dependencies: + base64url "3.x.x" + oauth "0.9.x" + passport-strategy "1.x.x" + uid2 "0.0.x" + utils-merge "1.x.x" + passport-oauth@1.0.0, passport-oauth@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/passport-oauth/-/passport-oauth-1.0.0.tgz#90aff63387540f02089af28cdad39ea7f80d77df" @@ -15009,12 +15320,12 @@ passport-okta-oauth@0.0.1: pkginfo "0.2.x" uid2 "0.0.3" -passport-openidconnect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/passport-openidconnect/-/passport-openidconnect-0.1.1.tgz#83921ff5f87f634079f65262dada834af1972244" - integrity sha512-r0QJiWEzwCg2MeCIXVP5G6YxVRqnEsZ2HpgKRthZ9AiQHJrgGUytXpsdcGF9BRwd3yMrEesb/uG/Yxb86rrY0g== +passport-openidconnect@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/passport-openidconnect/-/passport-openidconnect-0.1.2.tgz#86c830a96cfc2cf7e0273d3eba2828ab6abb3166" + integrity sha512-JX3rTyW+KFZ/E9OF/IpXJPbyLO9vGzcmXB5FgSP2jfL3LGKJPdV7zUE8rWeKeeI/iueQggOeFa3onrCmhxXZTg== dependencies: - oauth "0.9.x" + oauth "0.10.x" passport-strategy "1.x.x" passport-saml@3.2.4: @@ -15030,13 +15341,12 @@ passport-saml@3.2.4: xml2js "^0.4.23" xmlbuilder "^15.1.1" -passport-slack-oauth2@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/passport-slack-oauth2/-/passport-slack-oauth2-1.1.1.tgz#d831ffc3f1e968fcc3622e6ecf41643c8d8f9cbc" - integrity sha512-xC+yMKFXximP5TzSNt4lr9TP78MMos5B+acC7bJNCxBAVNyL9e02AEpVpVtyMIqHv4nNZnv1vyoOb50J8VCcZQ== +passport-slack-oauth2@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/passport-slack-oauth2/-/passport-slack-oauth2-1.2.0.tgz#d214a698b55a137393636a26827747f6c436dab4" + integrity sha512-SeQl8uPoi4ajhzgIvwQM7gW/6yPrKH0hPFjxcP/426SOZ0M9ZNDOfSa32q3NTw7KcwYOTjyWX/2xdJndQE7Rkg== dependencies: - passport-oauth2 "^1.5.0" - pkginfo "^0.4.1" + passport-oauth2 "^1.7.0" passport-strategy@1.x.x, passport-strategy@^1.0.0: version "1.0.0" @@ -15068,25 +15378,24 @@ passport@^0.6.0: pause "0.0.1" utils-merge "^1.0.1" -patch-package@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" - integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== +patch-package@8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" + integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== dependencies: "@yarnpkg/lockfile" "^1.1.0" chalk "^4.1.2" ci-info "^3.7.0" cross-spawn "^7.0.3" find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" + fs-extra "^10.0.0" json-stable-stringify "^1.0.2" klaw-sync "^6.0.0" minimist "^1.2.6" open "^7.4.2" - rimraf "^2.6.3" semver "^7.5.3" slash "^2.0.0" - tmp "^0.0.33" + tmp "^0.2.4" yaml "^2.2.2" path-browserify@0.0.1: @@ -15232,25 +15541,25 @@ persistgraphql@^0.3.11: "@types/graphql" "^0.9.0" "@types/isomorphic-fetch" "0.0.34" -pg-connection-string@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" - integrity sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= +pg-cloudflare@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz#a1f3d226bab2c45ae75ea54d65ec05ac6cfafbef" + integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg== pg-connection-string@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.3.0.tgz#c13fcb84c298d0bfa9ba12b40dd6c23d946f55d6" integrity sha512-ukMTJXLI7/hZIwTW7hGMZJ0Lj0S2XQBCJ4Shv4y1zgQ/vqVea+FLhzywvPj0ujSuofu+yA4MYHGZPTsgjBgJ+w== -pg-connection-string@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" - integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== +pg-connection-string@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.9.1.tgz#bb1fd0011e2eb76ac17360dc8fa183b2d3465238" + integrity sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w== -pg-cursor@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/pg-cursor/-/pg-cursor-2.8.0.tgz#7cb0929ad33ea68fe15d25b0de34acd611e189d5" - integrity sha512-LrOaEHK+R1C40e+xeri3FTRY/VKp9uTOCVsKtGB7LJ57qbeaphYvWjbVly8AesdT1GfHXYcAnVdExKhW7DKOvA== +pg-cursor@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/pg-cursor/-/pg-cursor-2.15.3.tgz#19f05739ff95366eed28e80191a6321d0e036395" + integrity sha512-eHw63TsiGtFEfAd7tOTZ+TLy+i/2ePKS20H84qCQ+aQ60pve05Okon9tKMC+YN3j6XyeFoHnaim7Lt9WVafQsA== pg-format@^1.0.2: version "1.0.4" @@ -15269,50 +15578,39 @@ pg-int8@1.0.1: resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== -pg-packet-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz#e45c3ae678b901a2873af1e17b92d787962ef914" - integrity sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg== - -pg-pool@^2.0.10: - version "2.0.10" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.10.tgz#842ee23b04e86824ce9d786430f8365082d81c4a" - integrity sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg== - -pg-pool@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.5.2.tgz#ed1bed1fb8d79f1c6fd5fb1c99e990fbf9ddf178" - integrity sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w== +pg-pool@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.10.1.tgz#481047c720be2d624792100cac1816f8850d31b2" + integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg== -pg-protocol@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" - integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== +pg-protocol@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.10.3.tgz#ac9e4778ad3f84d0c5670583bab976ea0a34f69f" + integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ== -pg-pubsub@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/pg-pubsub/-/pg-pubsub-0.5.0.tgz#5469737af32ac6d13fc3153dc3944f55da3d8840" - integrity sha512-lfNMbiVt6d8yomYOWV9+smMdrdUUj3Q8Uq9SiNL+3q2G+jjjjaT9+FKDudw9VEN94pYmCtJzhXz/BlaD4LgyZg== +pg-pubsub@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/pg-pubsub/-/pg-pubsub-0.8.1.tgz#aaa07f630cb75000975bb4881883d4cc33f51b5d" + integrity sha512-b/EHOwCrag4isghc4XgRipeAjfgyNg1DiL3Dwwh1Ojp91Lriltn5eg2nSWjBe4pzcFzhTM6HiB7LOG9NN1nx5g== dependencies: - "@types/pg" "^7.4.14" - pg "^7.4.3" + pg "^8.7.3" pg-format "^1.0.2" - promised-retry "^0.3.0" - verror "^1.10.0" + pony-cause "^2.1.8" + promised-retry "^0.5.0" -pg-query-stream@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/pg-query-stream/-/pg-query-stream-4.3.0.tgz#93deb1732b655d328496abe191ca33fdc1e144e6" - integrity sha512-+Eer4Y1e43rAaphFNu9/VJKn9nKTApFKCSwVtDjXYnuO4QYqWHOEkApmGJv8gvaU5T6fcuEtjsN24gk+Rx7X9A== +pg-query-stream@4.10.3: + version "4.10.3" + resolved "https://registry.yarnpkg.com/pg-query-stream/-/pg-query-stream-4.10.3.tgz#ed4461c76a1115a36581614ed1897ef4ecee375a" + integrity sha512-h2utrzpOIzeT9JfaqfvBbVuvCfBjH86jNfVrGGTbyepKAIOyTfDew0lAt8bbJjs9n/I5bGDl7S2sx6h5hPyJxw== dependencies: - pg-cursor "^2.8.0" + pg-cursor "^2.15.3" -pg-tsquery@8.4.1: - version "8.4.1" - resolved "https://registry.yarnpkg.com/pg-tsquery/-/pg-tsquery-8.4.1.tgz#7346aefd90983f321c59382e1468f192b1b10894" - integrity sha512-GoeRhw6o4Bpt7awdUwHq6ITOw40IWSrb5IC2qR6dF9ZECtHFGdSpnjHOl9Rumd8Rx12kLI2T9TGV0gvxD5pFgA== +pg-tsquery@8.4.2: + version "8.4.2" + resolved "https://registry.yarnpkg.com/pg-tsquery/-/pg-tsquery-8.4.2.tgz#f28e6242f15f4d8535ac08a0f9083ce04e42e1e4" + integrity sha512-waJSlBIKE+shDhuDpuQglTH6dG5zakDhnrnxu8XB8V5c7yoDSuy4pOxY6t2dyoxTjaKMcMmlByJN7n9jx9eqMA== -pg-types@^2.1.0: +pg-types@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== @@ -15323,39 +15621,25 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@8.9.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.9.0.tgz#73c5d77a854d36b0e185450dacb8b90c669e040b" - integrity sha512-ZJM+qkEbtOHRuXjmvBtOgNOXOtLSbxiMiUVMgE4rV6Zwocy03RicCVvDXgx8l4Biwo8/qORUnEqn2fdQzV7KCg== - dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "^2.5.0" - pg-pool "^3.5.2" - pg-protocol "^1.6.0" - pg-types "^2.1.0" - pgpass "1.x" - -pg@^7.4.3: - version "7.18.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-7.18.1.tgz#67f59c47a99456fcb34f9fe53662b79d4a992f6d" - integrity sha512-1KtKBKg/zWrjEEv//klBbVOPGucuc7HHeJf6OEMueVcUeyF3yueHf+DvhVwBjIAe9/97RAydO/lWjkcMwssuEw== - dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "0.1.3" - pg-packet-stream "^1.1.0" - pg-pool "^2.0.10" - pg-types "^2.1.0" - pgpass "1.x" - semver "4.3.2" - -pgpass@1.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" - integrity sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= +pg@8.16.3, pg@^8.7.3: + version "8.16.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.16.3.tgz#160741d0b44fdf64680e45374b06d632e86c99fd" + integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw== dependencies: - split "^1.0.0" + pg-connection-string "^2.9.1" + pg-pool "^3.10.1" + pg-protocol "^1.10.3" + pg-types "2.2.0" + pgpass "1.0.5" + optionalDependencies: + pg-cloudflare "^1.2.7" + +pgpass@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" picomatch@^2.0.4: version "2.0.7" @@ -15443,11 +15727,6 @@ pkginfo@0.2.x, pkginfo@^0.2.3: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.2.3.tgz#7239c42a5ef6c30b8f328439d9b9ff71042490f8" integrity sha1-cjnEKl72wwuPMoQ52bn/cQQkkPg= -pkginfo@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= - pleeease-filters@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pleeease-filters/-/pleeease-filters-4.0.0.tgz#6632b2fb05648d2758d865384fbced79e1ccaec7" @@ -15456,6 +15735,16 @@ pleeease-filters@^4.0.0: onecolor "^3.0.4" postcss "^6.0.1" +pony-cause@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-1.1.1.tgz#f795524f83bebbf1878bd3587b45f69143cbf3f9" + integrity sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g== + +pony-cause@^2.1.8: + version "2.1.11" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.11.tgz#d69a20aaccdb3bdb8f74dd59e5c68d8e6772e4bd" + integrity sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -16452,6 +16741,24 @@ postinstall-postinstall@2.1.0: resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" @@ -16552,10 +16859,12 @@ promise@^7.0.1, promise@^7.1.1: dependencies: asap "~2.0.3" -promised-retry@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/promised-retry/-/promised-retry-0.3.0.tgz#fc3930ca1f76c4d1e559b7368b1f7e953ae0d6ad" - integrity sha512-oj7GS7q3g381QuIR8mMJeJe5GSKm16xXL7Q+7/+5MH2mlWBHXn7dUYmS/BBjGkoBm9M8h2KcVifj3vRZ62AB5A== +promised-retry@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/promised-retry/-/promised-retry-0.5.0.tgz#e80f221c4a55410c98c751289e114f7cc28aa472" + integrity sha512-jbYvN6UGE+/3E1g0JmgDPchUc+4VI4cBaPjdr2Lso22xfFqut2warEf6IhWuhPJKbJYVOQAyCt2Jx+01ORCItg== + dependencies: + pony-cause "^1.1.1" prompts@^2.0.1: version "2.2.1" @@ -16595,6 +16904,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -16610,11 +16924,6 @@ psl@^1.1.24, psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.4.0.tgz#5dd26156cdb69fa1fdb8ab1991667d3f80ced7c2" integrity sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -16645,17 +16954,17 @@ pug-attrs@^3.0.0: js-stringify "^1.0.2" pug-runtime "^3.0.0" -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== +pug-code-gen@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.3.tgz#58133178cb423fe1716aece1c1da392a75251520" + integrity sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw== dependencies: constantinople "^4.0.1" doctypes "^1.1.0" js-stringify "^1.0.2" pug-attrs "^3.0.0" - pug-error "^2.0.0" - pug-runtime "^3.0.0" + pug-error "^2.1.0" + pug-runtime "^3.0.1" void-elements "^3.1.0" with "^7.0.0" @@ -16669,6 +16978,11 @@ pug-error@^2.0.0: resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== +pug-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.1.0.tgz#17ea37b587b6443d4b8f148374ec27b54b406e55" + integrity sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg== + pug-filters@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" @@ -16812,12 +17126,12 @@ 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.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" - integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== +pug@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.3.tgz#e18324a314cd022883b1e0372b8af3a1a99f7597" + integrity sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g== dependencies: - pug-code-gen "^3.0.2" + pug-code-gen "^3.0.3" pug-filters "^4.0.0" pug-lexer "^5.0.1" pug-linker "^4.0.0" @@ -16856,10 +17170,10 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" @@ -17396,10 +17710,10 @@ relay-runtime@10.0.1: "@babel/runtime" "^7.0.0" fbjs "^1.0.0" -remove-markdown@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/remove-markdown/-/remove-markdown-0.5.0.tgz#a596264bbd60b9ceab2e2ae86e5789eee91aee32" - integrity sha512-x917M80K97K5IN1L8lUvFehsfhR8cYjGQ/yAMRI9E7JIKivtl5Emo5iD13DhMr+VojzMCiYk8V2byNPwT/oapg== +remove-markdown@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/remove-markdown/-/remove-markdown-0.6.2.tgz#8e6a8d1b148569cc4df0404b60b0a42fb49840b5" + integrity sha512-EijDXJZbzpGbQBd852ViUzcqgpMujthM+SAEHiWCMcZonRbZ+xViWKLJA/vrwbDwYdxrs1aFDjpBhcGrZoJRGA== remove-trailing-separator@^1.0.1: version "1.1.0" @@ -17778,17 +18092,12 @@ safe-buffer@*, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== -safe-buffer@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@~5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -17987,22 +18296,15 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" - integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.8, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@7.7.3, semver@^7.5.4: + version "7.7.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: version "6.3.0" @@ -18021,6 +18323,13 @@ semver@^7.3.5, semver@^7.3.7: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -18090,16 +18399,16 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serve-favicon@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" - integrity sha1-k10kDN/g9YBTB/3+ln2IlCosvPA= +serve-favicon@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.1.tgz#b6482e81801707d5ed40fa547066e7e44fee47cc" + integrity sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ== dependencies: etag "~1.8.1" - fresh "0.5.2" - ms "2.1.1" + fresh "~0.5.2" + ms "~2.1.3" parseurl "~1.3.2" - safe-buffer "5.1.1" + safe-buffer "~5.2.1" serve-static@1.14.1: version "1.14.1" @@ -18229,14 +18538,28 @@ signedsource@^1.0.0: resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo= -simple-git@3.16.0: - version "3.16.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.16.0.tgz#421773e24680f5716999cc4a1d60127b4b6a9dec" - integrity sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-git@3.30.0: + version "3.30.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.30.0.tgz#260b816f369c298b60a509a319b4f0b9fadbd7e0" + integrity sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.4" + debug "^4.4.0" simple-progress-webpack-plugin@1.1.2: version "1.1.2" @@ -18453,12 +18776,10 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@1.1.2, sprintf-js@^1.1.2: version "1.1.2" @@ -18470,13 +18791,14 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sqlite3@5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.4.tgz#35f83d368963168b324ad2f0fffce09f3b8723a7" - integrity sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA== +sqlite3@5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7" + integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog== dependencies: - "@mapbox/node-pre-gyp" "^1.0.0" - node-addon-api "^4.2.0" + bindings "^1.5.0" + node-addon-api "^7.0.0" + prebuild-install "^7.1.1" tar "^6.1.11" optionalDependencies: node-gyp "8.x" @@ -18834,6 +19156,11 @@ striptags@3.2.0: resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== +strnum@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" + integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== + strtok3@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.3.tgz#bc81e225c19a909eab86538ff3348c4b3b0553d3" @@ -19019,6 +19346,16 @@ tar-fs@2.1.1: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" + integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -19214,11 +19551,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - tildify@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" @@ -19246,12 +19578,10 @@ tiny-emitter@^2.0.0: resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" +tmp@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== tmp@~0.2.1: version "0.2.1" @@ -19364,15 +19694,6 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -19457,6 +19778,11 @@ tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== +tslib@^2.6.2, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" @@ -19474,17 +19800,17 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel@0.0.6, tunnel@^0.0.6: +tunnel@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -turndown@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.1.1.tgz#96992f2d9b40a1a03d3ea61ad31b5a5c751ef77f" - integrity sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA== +turndown@7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.2.2.tgz#9557642b54046c5912b3d433f34dd588de455a43" + integrity sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ== dependencies: - domino "^2.1.6" + "@mixmark-io/domino" "^2.2.0" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" @@ -19894,11 +20220,6 @@ uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== -uuid@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" @@ -19914,6 +20235,11 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" @@ -19980,7 +20306,7 @@ vendors@^1.0.0: resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0" integrity sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw== -verror@1.10.0, verror@^1.10.0, verror@^1.8.1: +verror@1.10.0, verror@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= @@ -20484,7 +20810,7 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -wide-align@^1.1.2, wide-align@^1.1.5: +wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== @@ -20691,14 +21017,6 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml2js@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - xml2js@0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.4.tgz#3111010003008ae19240eba17497b57c729c555d" @@ -20707,6 +21025,14 @@ xml2js@0.4.4: sax "0.6.x" xmlbuilder ">=1.0.0" +xml2js@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + xml2js@^0.4.19: version "0.4.22" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" @@ -20739,11 +21065,6 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -20764,10 +21085,10 @@ xpath@0.0.32: resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af" integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw== -xss@1.0.14: - version "1.0.14" - resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.14.tgz#4f3efbde75ad0d82e9921cc3c95e6590dd336694" - integrity sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw== +xss@1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.15.tgz#96a0e13886f0661063028b410ed1b18670f4e59a" + integrity sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg== dependencies: commander "^2.20.3" cssfilter "0.0.10" From 29c8671ab229141ff6df66a500cb62272329c76d Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Tue, 6 Jan 2026 00:38:16 -0500 Subject: [PATCH 19/46] fix: breadcrumb path generation --- client/themes/default/components/page.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/themes/default/components/page.vue b/client/themes/default/components/page.vue index 76eb00be8..d3f089269 100644 --- a/client/themes/default/components/page.vue +++ b/client/themes/default/components/page.vue @@ -540,7 +540,7 @@ export default { return [{ path: `/${this.locale}`, name: 'Home' }].concat( _.reduce(this.path.split('/'), (result, value) => { result.push({ - path: _.get(_.last(result), 'path') + `/${value}`, + path: _.get(_.last(result), 'path', `/${this.locale}`) + `/${value}`, name: value }) return result From 028dcd5656ba20bfa2b00889dfb749e51baf006a Mon Sep 17 00:00:00 2001 From: NGPixel Date: Tue, 6 Jan 2026 00:54:56 -0500 Subject: [PATCH 20/46] fix: use promisified pipeline from stream --- server/core/system.js | 3 ++- server/modules/search/algolia/engine.js | 3 ++- server/modules/search/aws/engine.js | 3 ++- server/modules/search/azure/engine.js | 3 ++- server/modules/search/elasticsearch/engine.js | 3 ++- server/modules/search/postgres/engine.js | 3 ++- server/modules/storage/azure/storage.js | 3 ++- server/modules/storage/disk/common.js | 3 ++- server/modules/storage/disk/storage.js | 3 ++- server/modules/storage/git/storage.js | 3 ++- server/modules/storage/s3/common.js | 3 ++- server/modules/storage/sftp/storage.js | 3 ++- 12 files changed, 24 insertions(+), 12 deletions(-) diff --git a/server/core/system.js b/server/core/system.js index e3fbf1ddf..d04b4a292 100644 --- a/server/core/system.js +++ b/server/core/system.js @@ -4,7 +4,8 @@ const Promise = require('bluebird') const fs = require('fs-extra') const path = require('path') const zlib = require('zlib') -const { pipeline, Readable, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Readable, Transform } = require('node:stream') /* global WIKI */ diff --git a/server/modules/search/algolia/engine.js b/server/modules/search/algolia/engine.js index ead51a8fd..16380a544 100644 --- a/server/modules/search/algolia/engine.js +++ b/server/modules/search/algolia/engine.js @@ -1,6 +1,7 @@ const _ = require('lodash') const algoliasearch = require('algoliasearch') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') /* global WIKI */ diff --git a/server/modules/search/aws/engine.js b/server/modules/search/aws/engine.js index b1ec23aeb..862637045 100644 --- a/server/modules/search/aws/engine.js +++ b/server/modules/search/aws/engine.js @@ -1,6 +1,7 @@ const _ = require('lodash') const AWS = require('aws-sdk') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') /* global WIKI */ diff --git a/server/modules/search/azure/engine.js b/server/modules/search/azure/engine.js index 8d2547022..b5e9b16cf 100644 --- a/server/modules/search/azure/engine.js +++ b/server/modules/search/azure/engine.js @@ -1,7 +1,8 @@ const _ = require('lodash') const { SearchService, QueryType } = require('azure-search-client') const request = require('request-promise') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') /* global WIKI */ diff --git a/server/modules/search/elasticsearch/engine.js b/server/modules/search/elasticsearch/engine.js index 6d72ee5f9..5ad710b0c 100644 --- a/server/modules/search/elasticsearch/engine.js +++ b/server/modules/search/elasticsearch/engine.js @@ -1,6 +1,7 @@ const _ = require('lodash') const fs = require('fs') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') /* global WIKI */ diff --git a/server/modules/search/postgres/engine.js b/server/modules/search/postgres/engine.js index 397afdd65..cfbf927df 100644 --- a/server/modules/search/postgres/engine.js +++ b/server/modules/search/postgres/engine.js @@ -1,5 +1,6 @@ const tsquery = require('pg-tsquery')() -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') /* global WIKI */ diff --git a/server/modules/storage/azure/storage.js b/server/modules/storage/azure/storage.js index 9ad955e3b..0380c3af3 100644 --- a/server/modules/storage/azure/storage.js +++ b/server/modules/storage/azure/storage.js @@ -1,5 +1,6 @@ const { BlobServiceClient, StorageSharedKeyCredential } = require('@azure/storage-blob') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') const pageHelper = require('../../../helpers/page.js') const _ = require('lodash') diff --git a/server/modules/storage/disk/common.js b/server/modules/storage/disk/common.js index 38dd5b89a..c1980fd0f 100644 --- a/server/modules/storage/disk/common.js +++ b/server/modules/storage/disk/common.js @@ -1,6 +1,7 @@ const fs = require('fs-extra') const path = require('path') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('stream/promises') +const { Transform } = require('stream') const klaw = require('klaw') const mime = require('mime-types').lookup const _ = require('lodash') diff --git a/server/modules/storage/disk/storage.js b/server/modules/storage/disk/storage.js index c50069886..7e0300e52 100644 --- a/server/modules/storage/disk/storage.js +++ b/server/modules/storage/disk/storage.js @@ -3,7 +3,8 @@ const path = require('path') const tar = require('tar-fs') const zlib = require('zlib') const _ = require('lodash') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') const moment = require('moment') const pageHelper = require('../../../helpers/page') diff --git a/server/modules/storage/git/storage.js b/server/modules/storage/git/storage.js index 5429d4c55..54a7a4b6e 100644 --- a/server/modules/storage/git/storage.js +++ b/server/modules/storage/git/storage.js @@ -2,7 +2,8 @@ const path = require('path') const sgit = require('simple-git') const fs = require('fs-extra') const _ = require('lodash') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') const klaw = require('klaw') const os = require('os') diff --git a/server/modules/storage/s3/common.js b/server/modules/storage/s3/common.js index b436a6658..90aea1b66 100644 --- a/server/modules/storage/s3/common.js +++ b/server/modules/storage/s3/common.js @@ -1,5 +1,6 @@ const S3 = require('aws-sdk/clients/s3') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') const _ = require('lodash') const pageHelper = require('../../../helpers/page.js') diff --git a/server/modules/storage/sftp/storage.js b/server/modules/storage/sftp/storage.js index 07a9bbb47..8ce204971 100644 --- a/server/modules/storage/sftp/storage.js +++ b/server/modules/storage/sftp/storage.js @@ -1,7 +1,8 @@ const SSH2Promise = require('ssh2-promise') const _ = require('lodash') const path = require('path') -const { pipeline, Transform } = require('stream') +const { pipeline } = require('node:stream/promises') +const { Transform } = require('node:stream') const pageHelper = require('../../../helpers/page.js') /* global WIKI */ From b950e065e9b73d41b9d7ddbdb33765b170475c43 Mon Sep 17 00:00:00 2001 From: Felix Eckhofer Date: Tue, 6 Jan 2026 22:56:35 +0100 Subject: [PATCH 21/46] fix: stop dompurify from breaking draw.io diagrams (#7888) Newer versions of dompurify strip tags if not explicitly allowed. See https://github.com/cure53/DOMPurify/issues/1040 Fixes #7744 --- client/components/editor/editor-asciidoc.vue | 3 ++- client/components/editor/editor-markdown.vue | 3 ++- server/modules/rendering/html-security/renderer.js | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/client/components/editor/editor-asciidoc.vue b/client/components/editor/editor-asciidoc.vue index 296b2414b..126ba370e 100644 --- a/client/components/editor/editor-asciidoc.vue +++ b/client/components/editor/editor-asciidoc.vue @@ -228,7 +228,8 @@ export default { }) this.previewHTML = DOMPurify.sanitize($.html(), { - ADD_TAGS: ['foreignObject'] + ADD_TAGS: ['foreignObject'], + HTML_INTEGRATION_POINTS: { foreignobject: true } }) }, /** diff --git a/client/components/editor/editor-markdown.vue b/client/components/editor/editor-markdown.vue index 4ca6e192c..baee118d0 100644 --- a/client/components/editor/editor-markdown.vue +++ b/client/components/editor/editor-markdown.vue @@ -454,7 +454,8 @@ export default { // this.$store.set('editor/content', newContent) this.processMarkers(this.cm.firstLine(), this.cm.lastLine()) this.previewHTML = DOMPurify.sanitize(md.render(newContent), { - ADD_TAGS: ['foreignObject'] + ADD_TAGS: ['foreignObject'], + HTML_INTEGRATION_POINTS: { foreignobject: true } }) this.$nextTick(() => { tabsetHelper.format() diff --git a/server/modules/rendering/html-security/renderer.js b/server/modules/rendering/html-security/renderer.js index 3bf9b2dc0..b57aaf1b8 100644 --- a/server/modules/rendering/html-security/renderer.js +++ b/server/modules/rendering/html-security/renderer.js @@ -34,7 +34,8 @@ module.exports = { input = DOMPurify.sanitize(input, { ADD_ATTR: allowedAttrs, - ADD_TAGS: allowedTags + ADD_TAGS: allowedTags, + HTML_INTEGRATION_POINTS: { foreignobject: true } }) } return input From 19c26e58c9f8483024a35a2be703ddd8526e1cd4 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 8 Jan 2026 03:00:47 -0500 Subject: [PATCH 22/46] fix: handle breadcrumb locale prefix correctly --- .vscode/settings.json | 2 +- client/components/common/nav-header.vue | 6 +++++- client/themes/default/components/page.vue | 13 ++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index dc1a054c6..75e3a4478 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "vue" ], "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "i18n-ally.localesPaths": [ "server/locales" diff --git a/client/components/common/nav-header.vue b/client/components/common/nav-header.vue index ead24f945..e5f7acdfe 100644 --- a/client/components/common/nav-header.vue +++ b/client/components/common/nav-header.vue @@ -476,7 +476,11 @@ export default { window.location.assign('/logout') }, goHome () { - window.location.assign('/') + if (this.locales && this.locales.length > 0) { + window.location.assign(`/${this.locale}/home`) + } else { + window.location.assign('/') + } } } } diff --git a/client/themes/default/components/page.vue b/client/themes/default/components/page.vue index d3f089269..822e739fc 100644 --- a/client/themes/default/components/page.vue +++ b/client/themes/default/components/page.vue @@ -367,6 +367,8 @@ import _ from 'lodash' import ClipboardJS from 'clipboard' import Vue from 'vue' +/* global siteLangs */ + Vue.component('Tabset', Tabset) Prism.plugins.autoloader.languages_path = '/_assets/js/prism/' @@ -493,6 +495,7 @@ export default { }, data() { return { + locales: siteLangs, navShown: false, navExpanded: false, upBtnShown: false, @@ -537,10 +540,10 @@ export default { } }, breadcrumbs() { - return [{ path: `/${this.locale}`, name: 'Home' }].concat( + return [{ path: '/', name: 'Home' }].concat( _.reduce(this.path.split('/'), (result, value) => { result.push({ - path: _.get(_.last(result), 'path', `/${this.locale}`) + `/${value}`, + path: _.get(_.last(result), 'path', this.locales.length > 0 ? `/${this.locale}` : '') + `/${value}`, name: value }) return result @@ -650,7 +653,11 @@ export default { }, methods: { goHome () { - window.location.assign('/') + if (this.locales && this.locales.length > 0) { + window.location.assign(`/${this.locale}/home`) + } else { + window.location.assign('/') + } }, toggleNavigation () { this.navOpen = !this.navOpen From 857c1720b1d2b60955ef6e511d6035b2970c4536 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 8 Jan 2026 03:04:21 -0500 Subject: [PATCH 23/46] fix: css editor in page properties dialog not loading --- client/components/editor/editor-modal-properties.vue | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/client/components/editor/editor-modal-properties.vue b/client/components/editor/editor-modal-properties.vue index 1b7d4aa5d..a6ed1af3f 100644 --- a/client/components/editor/editor-modal-properties.vue +++ b/client/components/editor/editor-modal-properties.vue @@ -276,10 +276,10 @@ export default { currentTab: 0, cm: null, rules: { - required: value => !!value || 'This field is required.', - path: value => { - return filenamePattern.test(value) || 'Invalid path. Please ensure it does not contain special characters, or begin/end in a slash or hashtag string.' - } + required: value => !!value || 'This field is required.', + path: value => { + return filenamePattern.test(value) || 'Invalid path. Please ensure it does not contain special characters, or begin/end in a slash or hashtag string.' + } } } }, @@ -334,7 +334,7 @@ export default { this.loadEditor(this.$refs.codejs, 'html') }, 100) }) - } else if (newValue === 4) { + } else if (newValue === 3) { this.$nextTick(() => { setTimeout(() => { this.loadEditor(this.$refs.codecss, 'css') From 7d4627ba0bde5c2249e45001ca85bba0dfb02315 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 8 Jan 2026 03:40:26 -0500 Subject: [PATCH 24/46] fix: rocketchat auth prototype pollution via userProfile function --- .../rocketchat/authentication.js | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/server/modules/authentication/rocketchat/authentication.js b/server/modules/authentication/rocketchat/authentication.js index c966326ee..d15c4ce9f 100644 --- a/server/modules/authentication/rocketchat/authentication.js +++ b/server/modules/authentication/rocketchat/authentication.js @@ -12,7 +12,26 @@ module.exports = { init (passport, conf) { const siteURL = conf.siteURL.slice(-1) === '/' ? conf.siteURL.slice(0, -1) : conf.siteURL - OAuth2Strategy.prototype.userProfile = function (accessToken, cb) { + const strategyInstance = new OAuth2Strategy({ + authorizationURL: `${siteURL}/oauth/authorize`, + tokenURL: `${siteURL}/oauth/token`, + clientID: conf.clientId, + clientSecret: conf.clientSecret, + callbackURL: conf.callbackURL, + passReqToCallback: true + }, async (req, accessToken, refreshToken, profile, cb) => { + try { + const user = await WIKI.models.users.processProfile({ + providerKey: req.params.strategy, + profile + }) + cb(null, user) + } catch (err) { + cb(err, null) + } + }) + + strategyInstance.userProfile = function (accessToken, cb) { this._oauth2.get(`${siteURL}/api/v1/me`, accessToken, (err, body, res) => { if (err) { WIKI.logger.warn('Rocket.chat - Failed to fetch user profile.') @@ -33,26 +52,7 @@ module.exports = { }) } - passport.use(conf.key, - new OAuth2Strategy({ - authorizationURL: `${siteURL}/oauth/authorize`, - tokenURL: `${siteURL}/oauth/token`, - clientID: conf.clientId, - clientSecret: conf.clientSecret, - callbackURL: conf.callbackURL, - passReqToCallback: true - }, async (req, accessToken, refreshToken, profile, cb) => { - try { - const user = await WIKI.models.users.processProfile({ - providerKey: req.params.strategy, - profile - }) - cb(null, user) - } catch (err) { - cb(err, null) - } - }) - ) + passport.use(conf.key, strategyInstance) }, logout (conf) { if (!conf.logoutURL) { From 1d0d87af6e1932c2dddfa7819a6c5c12eaf03d9c Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 8 Jan 2026 04:22:22 -0500 Subject: [PATCH 25/46] fix: add cookie secure flag when site is using https --- server/controllers/auth.js | 8 ++++---- server/core/auth.js | 3 ++- server/helpers/common.js | 9 +++++++++ server/models/users.js | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 524d3f032..7a947338d 100644 --- a/server/controllers/auth.js +++ b/server/controllers/auth.js @@ -4,8 +4,8 @@ const express = require('express') const ExpressBrute = require('express-brute') const BruteKnex = require('../helpers/brute-knex') const router = express.Router() -const moment = require('moment') const _ = require('lodash') +const commonHelper = require('../helpers/common') const bruteforce = new ExpressBrute(new BruteKnex({ createTable: true, @@ -70,7 +70,7 @@ router.all('/login/:strategy/callback', async (req, res, next) => { const authResult = await WIKI.models.users.login({ strategy: req.params.strategy }, { req, res }) - res.cookie('jwt', authResult.jwt, { expires: moment().add(1, 'y').toDate() }) + res.cookie('jwt', authResult.jwt, commonHelper.getCookieOpts()) const loginRedirect = req.cookies['loginRedirect'] if (loginRedirect === '/' && authResult.redirect) { @@ -102,7 +102,7 @@ router.post('/login', bruteforce.prevent, async (req, res, next) => { password: req.body.pass }, { req, res }) req.brute.reset() - res.cookie('jwt', authResult.jwt, { expires: moment().add(1, 'y').toDate() }) + res.cookie('jwt', authResult.jwt, commonHelper.getCookieOpts()) res.redirect('/') } catch (err) { const { formStrategies, socialStrategies } = await WIKI.models.authentication.getStrategiesForLegacyClient() @@ -152,7 +152,7 @@ router.get('/verify/:token', bruteforce.prevent, async (req, res, next) => { res.redirect('/login') } else { const result = await WIKI.models.users.refreshToken(usr) - res.cookie('jwt', result.token, { expires: moment().add(1, 'years').toDate() }) + res.cookie('jwt', result.token, commonHelper.getCookieOpts()) res.redirect('/') } } catch (err) { diff --git a/server/core/auth.js b/server/core/auth.js index 6eb06b085..fb30c970c 100644 --- a/server/core/auth.js +++ b/server/core/auth.js @@ -8,6 +8,7 @@ const crypto = require('crypto') const pem2jwk = require('pem-jwk').pem2jwk const randomBytesAsync = require('util').promisify(crypto.randomBytes) +const commonHelper = require('../helpers/common') const securityHelper = require('../helpers/security') /* global WIKI */ @@ -154,7 +155,7 @@ module.exports = { if (req.get('content-type') === 'application/json') { res.set('new-jwt', newToken.token) } else { - res.cookie('jwt', newToken.token, { expires: DateTime.utc().plus({ days: 365 }).toJSDate() }) + res.cookie('jwt', newToken.token, commonHelper.getCookieOpts()) } // Avoid caching this response diff --git a/server/helpers/common.js b/server/helpers/common.js index e2a38a350..21cd577da 100644 --- a/server/helpers/common.js +++ b/server/helpers/common.js @@ -1,4 +1,7 @@ +/* global WIKI */ + const _ = require('lodash') +const { DateTime } = require('luxon') module.exports = { /** @@ -38,5 +41,11 @@ module.exports = { }) return result }, {}) + }, + getCookieOpts () { + return { + expires: DateTime.utc().plus({ days: 365 }).toJSDate(), + ...(WIKI.config.host.startsWith('https://') ? { secure: true } : {}) + } } } diff --git a/server/models/users.js b/server/models/users.js index 8191621db..8996206d6 100644 --- a/server/models/users.js +++ b/server/models/users.js @@ -502,7 +502,7 @@ module.exports = class User extends Model { if (!usr.isActive) { throw new WIKI.Error.AuthAccountBanned() } - + await WIKI.models.users.query().patch({ password: newPassword, mustChangePwd: false From 85c304f583efed56a7ed249dc0e63a90d5722a23 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 8 Jan 2026 04:49:09 -0500 Subject: [PATCH 26/46] fix: add cookie secure flag when site is using https (client-side) --- client/client-app.js | 50 +++++++++++++-------------- client/components/login.vue | 2 +- client/components/profile/profile.vue | 4 +-- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/client/client-app.js b/client/client-app.js index 40f4cc60d..0d2018d75 100644 --- a/client/client-app.js +++ b/client/client-app.js @@ -103,7 +103,7 @@ const graphQLLink = ApolloLink.from([ // Handle renewed JWT const newJWT = resp.headers.get('new-jwt') if (newJWT) { - Cookies.set('jwt', newJWT, { expires: 365 }) + Cookies.set('jwt', newJWT, { expires: 365, secure: window.location.protocol === 'https:' }) } return resp } @@ -148,30 +148,30 @@ Vue.prototype.Velocity = Velocity // Register Vue Components // ==================================== -Vue.component('admin', () => import(/* webpackChunkName: "admin" */ './components/admin.vue')) -Vue.component('comments', () => import(/* webpackChunkName: "comments" */ './components/comments.vue')) -Vue.component('editor', () => import(/* webpackPrefetch: -100, webpackChunkName: "editor" */ './components/editor.vue')) -Vue.component('history', () => import(/* webpackChunkName: "history" */ './components/history.vue')) -Vue.component('loader', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/loader.vue')) -Vue.component('login', () => import(/* webpackPrefetch: true, webpackChunkName: "login" */ './components/login.vue')) -Vue.component('nav-header', () => import(/* webpackMode: "eager" */ './components/common/nav-header.vue')) -Vue.component('new-page', () => import(/* webpackChunkName: "new-page" */ './components/new-page.vue')) -Vue.component('notify', () => import(/* webpackMode: "eager" */ './components/common/notify.vue')) -Vue.component('not-found', () => import(/* webpackChunkName: "not-found" */ './components/not-found.vue')) -Vue.component('page-selector', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/page-selector.vue')) -Vue.component('page-source', () => import(/* webpackChunkName: "source" */ './components/source.vue')) -Vue.component('profile', () => import(/* webpackChunkName: "profile" */ './components/profile.vue')) -Vue.component('register', () => import(/* webpackChunkName: "register" */ './components/register.vue')) -Vue.component('search-results', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/search-results.vue')) -Vue.component('social-sharing', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/social-sharing.vue')) -Vue.component('tags', () => import(/* webpackChunkName: "tags" */ './components/tags.vue')) -Vue.component('unauthorized', () => import(/* webpackChunkName: "unauthorized" */ './components/unauthorized.vue')) -Vue.component('v-card-chin', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/v-card-chin.vue')) -Vue.component('v-card-info', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/v-card-info.vue')) -Vue.component('welcome', () => import(/* webpackChunkName: "welcome" */ './components/welcome.vue')) - -Vue.component('nav-footer', () => import(/* webpackChunkName: "theme" */ './themes/' + siteConfig.theme + '/components/nav-footer.vue')) -Vue.component('page', () => import(/* webpackChunkName: "theme" */ './themes/' + siteConfig.theme + '/components/page.vue')) +Vue.component('Admin', () => import(/* webpackChunkName: "admin" */ './components/admin.vue')) +Vue.component('Comments', () => import(/* webpackChunkName: "comments" */ './components/comments.vue')) +Vue.component('Editor', () => import(/* webpackPrefetch: -100, webpackChunkName: "editor" */ './components/editor.vue')) +Vue.component('History', () => import(/* webpackChunkName: "history" */ './components/history.vue')) +Vue.component('Loader', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/loader.vue')) +Vue.component('Login', () => import(/* webpackPrefetch: true, webpackChunkName: "login" */ './components/login.vue')) +Vue.component('NavHeader', () => import(/* webpackMode: "eager" */ './components/common/nav-header.vue')) +Vue.component('NewPage', () => import(/* webpackChunkName: "new-page" */ './components/new-page.vue')) +Vue.component('Notify', () => import(/* webpackMode: "eager" */ './components/common/notify.vue')) +Vue.component('NotFound', () => import(/* webpackChunkName: "not-found" */ './components/not-found.vue')) +Vue.component('PageSelector', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/page-selector.vue')) +Vue.component('PageSource', () => import(/* webpackChunkName: "source" */ './components/source.vue')) +Vue.component('Profile', () => import(/* webpackChunkName: "profile" */ './components/profile.vue')) +Vue.component('Register', () => import(/* webpackChunkName: "register" */ './components/register.vue')) +Vue.component('SearchResults', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/search-results.vue')) +Vue.component('SocialSharing', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/social-sharing.vue')) +Vue.component('Tags', () => import(/* webpackChunkName: "tags" */ './components/tags.vue')) +Vue.component('Unauthorized', () => import(/* webpackChunkName: "unauthorized" */ './components/unauthorized.vue')) +Vue.component('VCardChin', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/v-card-chin.vue')) +Vue.component('VCardInfo', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/v-card-info.vue')) +Vue.component('Welcome', () => import(/* webpackChunkName: "welcome" */ './components/welcome.vue')) + +Vue.component('NavFooter', () => import(/* webpackChunkName: "theme" */ './themes/' + siteConfig.theme + '/components/nav-footer.vue')) +Vue.component('Page', () => import(/* webpackChunkName: "theme" */ './themes/' + siteConfig.theme + '/components/page.vue')) let bootstrap = () => { // ==================================== diff --git a/client/components/login.vue b/client/components/login.vue index f74a4744f..bf9b26c22 100644 --- a/client/components/login.vue +++ b/client/components/login.vue @@ -641,7 +641,7 @@ export default { } else { this.loaderColor = 'green darken-1' this.loaderTitle = this.$t('auth:loginSuccess') - Cookies.set('jwt', respObj.jwt, { expires: 365 }) + Cookies.set('jwt', respObj.jwt, { expires: 365, secure: window.location.protocol === 'https:' }) _.delay(() => { const loginRedirect = Cookies.get('loginRedirect') if (loginRedirect === '/' && respObj.redirect) { diff --git a/client/components/profile/profile.vue b/client/components/profile/profile.vue index 5817df91c..dfb0bba82 100644 --- a/client/components/profile/profile.vue +++ b/client/components/profile/profile.vue @@ -757,7 +757,7 @@ export default { }) const resp = _.get(respRaw, 'data.users.updateProfile.responseResult', {}) if (resp.succeeded) { - Cookies.set('jwt', _.get(respRaw, 'data.users.updateProfile.jwt', ''), { expires: 365 }) + Cookies.set('jwt', _.get(respRaw, 'data.users.updateProfile.jwt', ''), { expires: 365, secure: window.location.protocol === 'https:' }) this.$store.set('user/name', this.user.name) this.$store.commit('showNotification', { message: this.$t('profile:save.success'), @@ -865,7 +865,7 @@ export default { this.currentPass = '' this.newPass = '' this.verifyPass = '' - Cookies.set('jwt', _.get(respRaw, 'data.users.changePassword.jwt', ''), { expires: 365 }) + Cookies.set('jwt', _.get(respRaw, 'data.users.changePassword.jwt', ''), { expires: 365, secure: window.location.protocol === 'https:' }) this.$store.commit('showNotification', { message: this.$t('profile:auth.changePassSuccess'), style: 'success', From 3ba58f754dd6099e4a885d5414c2d5d00096a7a3 Mon Sep 17 00:00:00 2001 From: Felix Eckhofer Date: Tue, 20 Jan 2026 22:40:00 +0100 Subject: [PATCH 27/46] fix: apply theme style to embedded diagram svg (#7903) * fix: Apply theme style to embedded diagram (#7903) When diagrams are created with "adaptive colors" they automatically change to light-/darkmode depending on the browser preference. This leads to rendering problems when the settings in the browser differ from the wiki.js theme setting. Fixes #7677 * fix: Update color scheme for SVG in diagram class Refactor SVG color scheme handling in diagram class. * fix: remove duplicate svg first-child class Removed unnecessary direction property from first SVG in diagram. --------- Co-authored-by: Nicolas Giard --- client/themes/default/scss/app.scss | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/client/themes/default/scss/app.scss b/client/themes/default/scss/app.scss index ef18b5354..de822dc40 100644 --- a/client/themes/default/scss/app.scss +++ b/client/themes/default/scss/app.scss @@ -764,8 +764,17 @@ .diagram { margin-top: 1rem; overflow: auto; - svg:first-child { - direction: ltr; + + svg { + color-scheme: light; + + &:first-child { + direction: ltr; + } + + @at-root .theme--dark & { + color-scheme: dark !important; + } } } From 3dcf20ab6f59e72271fd84271884893c754b6d26 Mon Sep 17 00:00:00 2001 From: Felix Eckhofer Date: Thu, 22 Jan 2026 18:27:29 +0100 Subject: [PATCH 28/46] fix: diagram svg styling add `!important` qualifier for light scheme (#7905) This is required, because the element has an inline style with `color-scheme: light dark`, which has higher specificity than our css rule. --- client/themes/default/scss/app.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/themes/default/scss/app.scss b/client/themes/default/scss/app.scss index de822dc40..88380963f 100644 --- a/client/themes/default/scss/app.scss +++ b/client/themes/default/scss/app.scss @@ -766,7 +766,7 @@ overflow: auto; svg { - color-scheme: light; + color-scheme: light !important; &:first-child { direction: ltr; From 6ae53bf1bd9174c97585e1bf46bfbdc86673a859 Mon Sep 17 00:00:00 2001 From: mod242 <40213799+mod242@users.noreply.github.com> Date: Sat, 24 Jan 2026 00:36:52 +0100 Subject: [PATCH 29/46] feat: map OIDC/OAuth2 avatar claims to user pictureUrl (#7908) --- .../authentication/oauth2/authentication.js | 4 +++- .../authentication/oauth2/definition.yml | 19 +++++++++++++------ .../authentication/oidc/authentication.js | 4 +++- .../authentication/oidc/definition.yml | 15 +++++++++++---- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/server/modules/authentication/oauth2/authentication.js b/server/modules/authentication/oauth2/authentication.js index ce66c3db0..6ac3e830f 100644 --- a/server/modules/authentication/oauth2/authentication.js +++ b/server/modules/authentication/oauth2/authentication.js @@ -22,13 +22,15 @@ module.exports = { state: conf.enableCSRFProtection }, async (req, accessToken, refreshToken, profile, cb) => { try { + const picture = _.get(profile, conf.pictureClaim, '') const user = await WIKI.models.users.processProfile({ providerKey: req.params.strategy, profile: { ...profile, id: _.get(profile, conf.userIdClaim), displayName: _.get(profile, conf.displayNameClaim, '???'), - email: _.get(profile, conf.emailClaim) + email: _.get(profile, conf.emailClaim), + picture: picture } }) if (conf.mapGroups) { diff --git a/server/modules/authentication/oauth2/definition.yml b/server/modules/authentication/oauth2/definition.yml index 0e5996294..254bec0df 100644 --- a/server/modules/authentication/oauth2/definition.yml +++ b/server/modules/authentication/oauth2/definition.yml @@ -54,38 +54,45 @@ props: default: email maxWidth: 500 order: 8 + pictureClaim: + type: String + title: Picture Claim + hint: Field containing the user avatar URL + default: picture + maxWidth: 500 + order: 9 mapGroups: type: Boolean title: Map Groups hint: Map groups matching names from the groups claim value default: false - order: 9 + order: 10 groupsClaim: type: String title: Groups Claim hint: Field containing the group names default: groups maxWidth: 500 - order: 10 + order: 11 logoutURL: type: String title: Logout URL hint: (optional) Logout URL on the OAuth2 provider where the user will be redirected to complete the logout process. - order: 11 + order: 12 scope: type: String title: Scope hint: (optional) Application Client permission scopes. - order: 12 + order: 13 useQueryStringForAccessToken: type: Boolean default: false title: Pass access token via GET query string to User Info Endpoint hint: (optional) Pass the access token in an `access_token` parameter attached to the GET query string of the User Info Endpoint URL. Otherwise the access token will be passed in the Authorization header. - order: 13 + order: 14 enableCSRFProtection: type: Boolean default: true title: Enable CSRF protection hint: Pass a nonce state parameter during authentication to protect against CSRF attacks. - order: 14 + order: 15 diff --git a/server/modules/authentication/oidc/authentication.js b/server/modules/authentication/oidc/authentication.js index 4c7383e4b..bfda8c2fd 100644 --- a/server/modules/authentication/oidc/authentication.js +++ b/server/modules/authentication/oidc/authentication.js @@ -24,6 +24,7 @@ module.exports = { acrValues: conf.acrValues }, async (req, iss, uiProfile, idProfile, context, idToken, accessToken, refreshToken, params, cb) => { const profile = Object.assign({}, idProfile, uiProfile) + const picture = _.get(profile, '_json.' + conf.pictureClaim, '') try { const user = await WIKI.models.users.processProfile({ @@ -31,7 +32,8 @@ module.exports = { profile: { ...profile, email: _.get(profile, '_json.' + conf.emailClaim), - displayName: _.get(profile, '_json.' + conf.displayNameClaim, '') + displayName: _.get(profile, '_json.' + conf.displayNameClaim, ''), + picture: picture } }) if (conf.mapGroups) { diff --git a/server/modules/authentication/oidc/definition.yml b/server/modules/authentication/oidc/definition.yml index 774575c1b..266ea7e9f 100644 --- a/server/modules/authentication/oidc/definition.yml +++ b/server/modules/authentication/oidc/definition.yml @@ -62,26 +62,33 @@ props: default: displayName maxWidth: 500 order: 9 + pictureClaim: + type: String + title: Picture Claim + hint: Field containing the user avatar URL + default: picture + maxWidth: 500 + order: 10 mapGroups: type: Boolean title: Map Groups hint: Map groups matching names from the groups claim value default: false - order: 10 + order: 11 groupsClaim: type: String title: Groups Claim hint: Field containing the group names default: groups maxWidth: 500 - order: 11 + order: 12 logoutURL: type: String title: Logout URL hint: (optional) Logout URL on the OAuth2 provider where the user will be redirected to complete the logout process. - order: 12 + order: 13 acrValues: type: String title: ACR Values hint: (optional) Authentication Context Class Reference - order: 13 + order: 14 From 7ae6635d1686afa193bd1417abd9c9891aa0b71a Mon Sep 17 00:00:00 2001 From: "Kolega.dev" Date: Thu, 12 Feb 2026 02:27:36 +0000 Subject: [PATCH 30/46] fix: validate loginRedirect cookie to prevent open redirect (#7923) The loginRedirect cookie value was used directly in res.redirect() and window.location.replace() without validation, allowing redirection to arbitrary external URLs. Added validation to ensure the redirect target is a relative path before use. Co-authored-by: kolega.dev --- client/components/login.vue | 14 ++++++++++---- server/controllers/auth.js | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/client/components/login.vue b/client/components/login.vue index bf9b26c22..0bbaa2a5e 100644 --- a/client/components/login.vue +++ b/client/components/login.vue @@ -644,16 +644,22 @@ export default { Cookies.set('jwt', respObj.jwt, { expires: 365, secure: window.location.protocol === 'https:' }) _.delay(() => { const loginRedirect = Cookies.get('loginRedirect') + const isValidRedirect = loginRedirect && loginRedirect.startsWith('/') && !loginRedirect.startsWith('//') && !loginRedirect.includes('://') if (loginRedirect === '/' && respObj.redirect) { Cookies.remove('loginRedirect') window.location.replace(respObj.redirect) - } else if (loginRedirect) { + } else if (isValidRedirect) { Cookies.remove('loginRedirect') window.location.replace(loginRedirect) - } else if (respObj.redirect) { - window.location.replace(respObj.redirect) } else { - window.location.replace('/') + if (loginRedirect) { + Cookies.remove('loginRedirect') + } + if (respObj.redirect) { + window.location.replace(respObj.redirect) + } else { + window.location.replace('/') + } } }, 1000) } diff --git a/server/controllers/auth.js b/server/controllers/auth.js index 7a947338d..733486be0 100644 --- a/server/controllers/auth.js +++ b/server/controllers/auth.js @@ -73,16 +73,22 @@ router.all('/login/:strategy/callback', async (req, res, next) => { res.cookie('jwt', authResult.jwt, commonHelper.getCookieOpts()) const loginRedirect = req.cookies['loginRedirect'] + const isValidRedirect = loginRedirect && loginRedirect.startsWith('/') && !loginRedirect.startsWith('//') && !loginRedirect.includes('://') if (loginRedirect === '/' && authResult.redirect) { res.clearCookie('loginRedirect') res.redirect(authResult.redirect) - } else if (loginRedirect) { + } else if (isValidRedirect) { res.clearCookie('loginRedirect') res.redirect(loginRedirect) - } else if (authResult.redirect) { - res.redirect(authResult.redirect) } else { - res.redirect('/') + if (loginRedirect) { + res.clearCookie('loginRedirect') + } + if (authResult.redirect) { + res.redirect(authResult.redirect) + } else { + res.redirect('/') + } } } catch (err) { next(err) From d14b0a5509f1592e962b6d87324423eeb3903b1b Mon Sep 17 00:00:00 2001 From: "Kolega.dev" Date: Thu, 12 Feb 2026 02:40:25 +0000 Subject: [PATCH 31/46] fix: authenticate GraphQL subscription WebSocket connections (#7922) The onConnect handler for GraphQL subscriptions was empty, allowing any client to establish a WebSocket connection and subscribe to loggingLiveTrail without authentication. Added JWT verification in onConnect using the same RS256 credentials and permission checks (manage:system) used elsewhere. Co-authored-by: kolega.dev --- client/client-app.js | 6 +++++- server/core/servers.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/client/client-app.js b/client/client-app.js index 0d2018d75..cdf27a804 100644 --- a/client/client-app.js +++ b/client/client-app.js @@ -114,7 +114,11 @@ const graphQLWSLink = new WebSocketLink({ uri: graphQLWSEndpoint, options: { reconnect: true, - lazy: true + lazy: true, + connectionParams: () => { + const token = Cookies.get('jwt') + return token ? { token } : {} + } } }) diff --git a/server/core/servers.js b/server/core/servers.js index 95046e657..d2b2b79f3 100644 --- a/server/core/servers.js +++ b/server/core/servers.js @@ -4,6 +4,8 @@ const https = require('https') const { ApolloServer } = require('apollo-server-express') const Promise = require('bluebird') const _ = require('lodash') +const jwt = require('jsonwebtoken') +const cookie = require('cookie') /* global WIKI */ @@ -125,7 +127,35 @@ module.exports = { context: ({ req, res }) => ({ req, res }), subscriptions: { onConnect: (connectionParams, webSocket) => { + let token = _.get(connectionParams, 'token', null) + if (!token) { + const cookieHeader = _.get(webSocket, 'upgradeReq.headers.cookie', '') + if (cookieHeader) { + const cookies = cookie.parse(cookieHeader) + token = cookies.jwt || null + } + } + + if (!token) { + throw new Error('Unauthorized') + } + + try { + const user = jwt.verify(token, WIKI.config.certs.public, { + audience: WIKI.config.auth.audience, + issuer: 'urn:wiki.js', + algorithms: ['RS256'] + }) + + if (!_.includes(user.permissions, 'manage:system')) { + throw new Error('Forbidden') + } + + return { user } + } catch (err) { + throw new Error('Unauthorized') + } }, path: '/graphql-subscriptions' } From 8fc931a0d9ed99b5b74a30e5bb2a47eccd4a701b Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sun, 22 Feb 2026 00:04:24 -0500 Subject: [PATCH 32/46] fix(helm): Replace bitname PostgreSQL chart with custom statefulset (#7936) * fix(helm): Replace Bitnami PostgreSQL chart with custom StatefulSet (#7831) * refactor: migrate from Bitnami PostgreSQL to official PostgreSQL image Replace Bitnami PostgreSQL dependency with custom PostgreSQL StatefulSet implementation Add new PostgreSQL templates: statefulset, service, and PVC Update values.yaml to include PostgreSQL image configuration with official postgres:17.4 image Implement custom PostgreSQL deployment using official Docker Hub image instead of Bitnami chart Add PostgreSQL resource, nodeSelector, tolerations, and affinity configuration options Update helper templates to support new PostgreSQL implementation Update deployment template to connect to the new PostgreSQL implementation Update README.md to document the new PostgreSQL configuration parameters BREAKING CHANGE: This replaces the Bitnami PostgreSQL dependency with a custom PostgreSQL implementation using the official PostgreSQL image from Docker Hub, changing how PostgreSQL is deployed and configured. Signed-off-by: Ilya Gilev jazer23569@gmail.com * feature: added a option to use an existing secret for postresql installation --------- Signed-off-by: Ilya Gilev jazer23569@gmail.com * refactor(helm): adjust helm templates for clarity --------- Signed-off-by: Ilya Gilev jazer23569@gmail.com Co-authored-by: acidsugarx <58903233+acidsugarx@users.noreply.github.com> --- dev/helm/Chart.lock | 6 -- dev/helm/Chart.yaml | 35 +----- dev/helm/README.md | 70 ++++++++---- dev/helm/charts/postgresql-6.5.0.tgz | Bin 23426 -> 0 bytes dev/helm/templates/NOTES.txt | 13 +++ dev/helm/templates/_helpers.tpl | 61 ++++++++--- dev/helm/templates/deployment.yaml | 40 +++++-- dev/helm/templates/postgresql-pvc.yaml | 21 ++++ dev/helm/templates/postgresql-secret.yaml | 12 +++ dev/helm/templates/postgresql-service.yaml | 21 ++++ .../templates/postgresql-statefulset.yaml | 101 ++++++++++++++++++ dev/helm/templates/service.yaml | 4 - dev/helm/values.yaml | 75 +++++++++---- 13 files changed, 357 insertions(+), 102 deletions(-) delete mode 100644 dev/helm/Chart.lock delete mode 100644 dev/helm/charts/postgresql-6.5.0.tgz create mode 100644 dev/helm/templates/postgresql-pvc.yaml create mode 100644 dev/helm/templates/postgresql-secret.yaml create mode 100644 dev/helm/templates/postgresql-service.yaml create mode 100644 dev/helm/templates/postgresql-statefulset.yaml diff --git a/dev/helm/Chart.lock b/dev/helm/Chart.lock deleted file mode 100644 index d383d6e44..000000000 --- a/dev/helm/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: postgresql - repository: https://charts.bitnami.com/bitnami - version: 8.10.14 -digest: sha256:db7c1e0bc9ec0ed45520521bd76bb390d04711fd0f04affaadafa1dc498ce68b -generated: "2020-07-21T20:34:41.41180748-04:00" diff --git a/dev/helm/Chart.yaml b/dev/helm/Chart.yaml index 458defa31..b156d5efa 100644 --- a/dev/helm/Chart.yaml +++ b/dev/helm/Chart.yaml @@ -1,11 +1,7 @@ apiVersion: v2 -name: wiki -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -version: 2.3.0 -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. -AppVersion: latest +name: wiki-js +version: '3.0.0' +appVersion: '2' description: The most powerful and extensible open source Wiki software. keywords: - wiki @@ -14,29 +10,8 @@ keywords: - docs - reference - editor -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. type: application -dependencies: - - name: postgresql - version: 8.10.14 - repository: https://charts.bitnami.com/bitnami - condition: postgresql.enabled -home: https://wiki.js.org +home: https://js.wiki icon: https://cdn.js.wiki/images/wikijs-butterfly.svg sources: - - https://github.com/Requarks/wiki -maintainers: - - name: Nicolas Giard - email: github@ngpixel.com - url: https://github.com/NGPixel - - name: James Greenhill - email: james@fuziontech.net - url: https://github.com/fuziontech -engine: gotpl + - https://github.com/requarks/wiki diff --git a/dev/helm/README.md b/dev/helm/README.md index c1b73e227..762594b16 100644 --- a/dev/helm/README.md +++ b/dev/helm/README.md @@ -43,7 +43,7 @@ Wiki.js is an open source project that has been made possible due to the generou This chart bootstraps a Wiki.js deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. -It also optionally packages the [PostgreSQL](https://github.com/kubernetes/charts/tree/master/stable/postgresql) as the database but you are free to bring your own. +It also optionally deploys PostgreSQL as the database using the official PostgreSQL image from Docker Hub, but you are free to bring your own database. ## Prerequisites @@ -59,7 +59,7 @@ $ helm repo add requarks https://charts.js.wiki To install the chart with the release name `my-release` run the following: -### Using Helm 3: +### Using Helm 3/4: ```console $ helm install my-release requarks/wiki ``` @@ -95,7 +95,7 @@ The following table lists the configurable parameters of the Wiki.js chart and t | Parameter | Description | Default | | ------------------------------- | ------------------------------- | ---------------------------------------------------------- | | `image.repository` | Wiki.js image | `requarks/wiki` | -| `image.tag` | Wiki.js image tag | `latest` | +| `image.tag` | Wiki.js image tag | `2` | | `imagePullPolicy` | Image pull policy | `IfNotPresent` | | `replicacount` | Number of Wiki.js pods to run | `1` | | `revisionHistoryLimit` | Total number of revision history points | `10` | @@ -119,20 +119,33 @@ The following table lists the configurable parameters of the Wiki.js chart and t | `sideload.resources.limits` | Resource limits for the sideload container | `nil` | | `sideload.resources.requests` | Resource requests for the sideload container | `nil` | | `nodeExtraCaCerts` | Trusted certificates path | `nil` | +| `externalPostgresql.databaseURL` | External postgres connection string | `nil` | | `postgresql.enabled` | Deploy postgres server (see below) | `true` | | `postgresql.postgresqlDatabase` | Postgres database name | `wiki` | | `postgresql.postgresqlUser` | Postgres username | `postgres` | -| `postgresql.postgresqlHost` | External postgres host | `nil` | -| `postgresql.postgresqlPassword` | External postgres password | `nil` | +| `postgresql.postgresqlHost` | Postgres host | `nil` | +| `postgresql.postgresqlPassword` | Postgres password | `nil` | | `postgresql.existingSecret` | Provide an existing `Secret` for postgres | `nil` | | `postgresql.existingSecretKey` | The postgres password key in the existing `Secret` | `postgresql-password` | -| `postgresql.postgresqlPort` | External postgres port | `5432` | +| `postgresql.existingSecretUserKey` | The postgres username key in the existing `Secret` | `postgresql-username` | +| `postgresql.postgresqlPort` | Postgres port | `5432` | | `postgresql.ssl` | Enable external postgres SSL connection | `false` | | `postgresql.ca` | Certificate of Authority content 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` | -| `postgresql.persistence.size` | Postgers PVC Storage Request | `8Gi` | +| `postgresql.persistence.size` | Postgres PVC Storage Request | `8Gi` | +| `postgresql.persistence.accessMode` | Postgres Persistent Volume Access Mode | `ReadWriteOnce` | +| `postgresql.image.repository` | PostgreSQL image repository | `postgres` | +| `postgresql.image.tag` | PostgreSQL image tag | `18` | +| `postgresql.image.pullPolicy` | PostgreSQL image pull policy | `IfNotPresent` | +| `postgresql.resources` | PostgreSQL resource requests/limits | `{}` | +| `postgresql.nodeSelector` | PostgreSQL node selector labels | `{}` | +| `postgresql.tolerations` | PostgreSQL toleration labels | `[]` | +| `postgresql.affinity` | PostgreSQL affinity settings | `{}` | +| `postgresql.service.type` | PostgreSQL service type | `ClusterIP` | +| `postgresql.service.port` | PostgreSQL service port | `5432` | +| `postgresql.service.annotations` | PostgreSQL service annotations | `{}` | Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, @@ -150,25 +163,44 @@ $ helm install --name my-release -f values.yaml requarks/wiki > **Tip**: You can use the default [values.yaml](values.yaml) -## PostgresSQL +## PostgreSQL -By default, PostgreSQL is installed as part of the chart. +By default, PostgreSQL is installed as part of the chart using the official PostgreSQL image from Docker Hub (version 18). ### Using an external PostgreSQL server -To use an external PostgreSQL server, set `postgresql.enabled` to `false` and then set `postgresql.postgresqlHost` and `postgresql.postgresqlPassword`. To use an existing `Secret`, set `postgresql.existingSecret`. The other options (`postgresql.postgresqlDatabase`, `postgresql.postgresqlUser`, `postgresql.postgresqlPort` and `postgresql.existingSecretKey`) may also want changing from their default values. +To use an external PostgreSQL server, set `postgresql.enabled` to `false`, then use either: -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`. +#### Connection String -If `postgresql.existingSecret` is not specified, you also need to add the following Helm template to your deployment in order to create the postgresql `Secret`: +Set `externalPostgresql.databaseURL` to the full PostgreSQL connection string. -```yaml -kind: Secret -apiVersion: v1 -metadata: - name: {{ template "wiki.postgresql.secret" . }} -data: - {{ template "wiki.postgresql.secretKey" . }}: "{{ .Values.postgresql.postgresqlPassword | b64enc }}" +#### Connection Parameters + +Set `externalPostgresql.host`, `externalPostgres.port`, `externalPostgres.database`, `externalPostgres.username`, `externalPostgres.existingSecret` *(secret name)* and `externalPostgres.existingSecretKey` *(key in the secret containing the password)* + +Ensure the secret specified in `externalPostgresql.existingSecret` already exists, with a password set at the path specified in `externalPostgres.existingSecretKey`. + +To use an SSL connection you can set `externalPostgresql.ssl` to `true` and if needed the path to a Certificate of Authority can be set using `externalPostgresql.ca` to `/path/to/ca`. Default `externalPostgresql.ssl` value is `false`. + +### Using an existing PostgreSQL secret with built-in PostgreSQL + +When using the built-in PostgreSQL (default behavior with `postgresql.enabled: true`), you can still use an existing Kubernetes secret for the database credentials by setting: + +- `postgresql.existingSecret`: Name of the existing secret containing the credentials +- `postgresql.existingSecretKey`: Key in the secret containing the password (defaults to `postgresql-password`) +- `postgresql.existingSecretUserKey`: Key in the secret containing the username (defaults to `postgresql-username`) +Example usage: +```bash +# Create your existing secret +kubectl create secret generic my-postgres-secret \ + --from-literal=postgresql-username=postgres \ + --from-literal=postgresql-password=yourpassword + +# Deploy with existing secret +helm install my-release requarks/wiki \ + --set postgresql.enabled=true \ + --set postgresql.existingSecret=my-postgres-secret ``` ## Persistence diff --git a/dev/helm/charts/postgresql-6.5.0.tgz b/dev/helm/charts/postgresql-6.5.0.tgz deleted file mode 100644 index acc79962ce8f45da1a26062d7d64520e3e065af8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23426 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 LD}N+mWTgK9>s^5l diff --git a/dev/helm/templates/NOTES.txt b/dev/helm/templates/NOTES.txt index 93c0d3565..a28c69648 100644 --- a/dev/helm/templates/NOTES.txt +++ b/dev/helm/templates/NOTES.txt @@ -19,3 +19,16 @@ echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 {{- end }} + +{{- if .Values.postgresql.enabled }} +2. PostgreSQL database has been deployed as part of this release: + - Database: {{ .Values.postgresql.postgresqlDatabase }} + - User: {{ .Values.postgresql.postgresqlUser }} + - Service: {{ include "wiki.postgresql.fullname" . }} + - Version: {{ .Values.postgresql.image.tag }} + - Persistence: {{ .Values.postgresql.persistence.enabled | ternary "Enabled" "Disabled" }} +{{- end }} + +{{- if not .Values.postgresql.enabled }} +2. External PostgreSQL setup detected. Ensure your database is accessible at the configured host. +{{- end }} diff --git a/dev/helm/templates/_helpers.tpl b/dev/helm/templates/_helpers.tpl index 193ceab78..1684409a7 100644 --- a/dev/helm/templates/_helpers.tpl +++ b/dev/helm/templates/_helpers.tpl @@ -63,15 +63,18 @@ Create the name of the service account to use {{- end -}} {{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +PostgreSQL fullname */}} {{- define "wiki.postgresql.fullname" -}} -{{- if .Values.postgresql.fullnameOverride -}} -{{- .Values.postgresql.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{ printf "%s-%s" .Release.Name "postgresql"}} +{{- printf "%s-%s" (include "wiki.fullname" .) "postgresql" | trunc 63 | trimSuffix "-" -}} {{- end -}} + +{{/* +PostgreSQL selector labels +*/}} +{{- define "wiki.postgresql.selectorLabels" -}} +app.kubernetes.io/name: {{ include "wiki.name" . }}-postgresql +app.kubernetes.io/instance: {{ .Release.Name }} {{- end -}} {{/* @@ -79,9 +82,9 @@ Set postgres host */}} {{- define "wiki.postgresql.host" -}} {{- if .Values.postgresql.enabled -}} -{{- template "wiki.postgresql.fullname" . -}} +{{- include "wiki.postgresql.fullname" . -}} {{- else -}} -{{- .Values.postgresql.postgresqlHost | quote -}} +{{- .Values.postgresql.postgresqlHost | default "localhost" | quote -}} {{- end -}} {{- end -}} @@ -89,10 +92,25 @@ Set postgres host Set postgres secret */}} {{- define "wiki.postgresql.secret" -}} -{{- if .Values.postgresql.enabled -}} -{{- template "wiki.postgresql.fullname" . -}} +{{- if and .Values.postgresql.enabled .Values.postgresql.existingSecret -}} + {{- .Values.postgresql.existingSecret -}} +{{- else if .Values.postgresql.enabled -}} + {{- include "wiki.postgresql.fullname" . -}} {{- else -}} -{{- template "wiki.fullname" . -}} + {{- template "wiki.fullname" . -}} +{{- end -}} +{{- end -}} + +{{/* +Set postgres secretUserKey +*/}} +{{- define "wiki.postgresql.secretUserKey" -}} +{{- if and .Values.postgresql.enabled .Values.postgresql.existingSecret -}} + {{- default "postgresql-username" .Values.postgresql.existingSecretUserKey | quote -}} +{{- else if .Values.postgresql.enabled -}} + "postgresql-username" +{{- else -}} + {{- default "postgresql-username" .Values.postgresql.existingSecretUserKey | quote -}} {{- end -}} {{- end -}} @@ -100,9 +118,24 @@ Set postgres secret Set postgres secretKey */}} {{- define "wiki.postgresql.secretKey" -}} -{{- if .Values.postgresql.enabled -}} -"postgresql-password" +{{- if and .Values.postgresql.enabled .Values.postgresql.existingSecret -}} + {{- default "postgresql-password" .Values.postgresql.existingSecretKey | quote -}} +{{- else if .Values.postgresql.enabled -}} + "postgresql-password" +{{- else -}} + {{- default "postgresql-password" .Values.postgresql.existingSecretKey | quote -}} +{{- end -}} +{{- end -}} + +{{/* +Set postgres secretDatabaseKey +*/}} +{{- define "wiki.postgresql.secretDatabaseKey" -}} +{{- if and .Values.postgresql.enabled .Values.postgresql.existingSecret -}} + {{- default "postgresql-database" .Values.postgresql.existingSecretDatabaseKey | quote -}} +{{- else if .Values.postgresql.enabled -}} + "postgresql-database" {{- else -}} -{{- default "postgresql-password" .Values.postgresql.existingSecretKey | quote -}} + {{- default "postgresql-database" .Values.postgresql.existingSecretDatabaseKey | quote -}} {{- end -}} {{- end -}} diff --git a/dev/helm/templates/deployment.yaml b/dev/helm/templates/deployment.yaml index e4d1d1975..f817f22d2 100644 --- a/dev/helm/templates/deployment.yaml +++ b/dev/helm/templates/deployment.yaml @@ -29,7 +29,7 @@ spec: - name: {{ .Chart.Name }}-sideload securityContext: {{- toYaml .Values.sideload.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ default "latest" .Values.image.tag }}" + image: "{{ .Values.image.repository }}:{{ default "2" .Values.image.tag }}" imagePullPolicy: {{ default "IfNotPresent" .Values.image.imagePullPolicy }} env: {{- toYaml .Values.sideload.env | nindent 12 }} @@ -42,7 +42,7 @@ spec: - name: {{ .Chart.Name }} securityContext: {{- toYaml .Values.securityContext | nindent 12 }} - image: "{{ .Values.image.repository }}:{{ default "latest" .Values.image.tag }}" + image: "{{ .Values.image.repository }}:{{ default "2" .Values.image.tag }}" imagePullPolicy: {{ default "IfNotPresent" .Values.image.imagePullPolicy }} env: {{- if .Values.nodeExtraCaCerts }} @@ -56,15 +56,22 @@ spec: value: {{ .Values.externalPostgresql.databaseURL }} - name: NODE_TLS_REJECT_UNAUTHORIZED value: {{ default "1" .Values.externalPostgresql.NODE_TLS_REJECT_UNAUTHORIZED | quote }} - {{- else }} + {{- else if .Values.postgresql.enabled }} - name: DB_HOST value: {{ template "wiki.postgresql.host" . }} - name: DB_PORT value: "{{ default "5432" .Values.postgresql.postgresqlPort }}" - name: DB_NAME - value: {{ default "wiki" .Values.postgresql.postgresqlDatabase }} + value: {{ default "wiki" .Values.postgresql.postgresqlDatabase | quote }} - name: DB_USER - value: {{ default "wiki" .Values.postgresql.postgresqlUser }} + {{- if .Values.postgresql.existingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.postgresql.existingSecret }} + key: {{ template "wiki.postgresql.secretUserKey" . }} + {{- else }} + value: {{ default "postgres" .Values.postgresql.postgresqlUser }} + {{- end }} - name: DB_SSL value: "{{ default "false" .Values.postgresql.ssl }}" - name: DB_SSL_CA @@ -72,12 +79,27 @@ spec: - name: DB_PASS valueFrom: secretKeyRef: - {{- if .Values.postgresql.existingSecret }} - name: {{ .Values.postgresql.existingSecret }} - {{- else }} name: {{ template "wiki.postgresql.secret" . }} - {{- end }} key: {{ template "wiki.postgresql.secretKey" . }} + {{- else if .Values.externalPostgresql }} + # External PostgreSQL configuration + - name: DB_HOST + value: {{ required "External PostgreSQL host is required when postgresql.enabled is false" .Values.externalPostgresql.host | quote }} + - name: DB_PORT + value: {{ required "External PostgreSQL port is required when postgresql.enabled is false" .Values.externalPostgresql.port | quote }} + - name: DB_NAME + value: {{ required "External PostgreSQL database name is required when postgresql.enabled is false" .Values.externalPostgresql.database | quote }} + - name: DB_USER + value: {{ required "External PostgreSQL user is required when postgresql.enabled is false" .Values.externalPostgresql.username | quote }} + - name: DB_PASS + valueFrom: + secretKeyRef: + name: {{ required "External PostgreSQL secret name is required when postgresql.enabled is false" .Values.externalPostgresql.existingSecret | quote }} + key: {{ required "External PostgreSQL secret key is required when postgresql.enabled is false" .Values.externalPostgresql.existingSecretKey | quote }} + - name: DB_SSL + value: "{{ default "false" .Values.externalPostgresql.ssl }}" + - name: DB_SSL_CA + value: "{{ default "" .Values.externalPostgresql.ca }}" {{- end }} - name: HA_ACTIVE value: {{ .Values.replicaCount | int | le 2 | quote }} diff --git a/dev/helm/templates/postgresql-pvc.yaml b/dev/helm/templates/postgresql-pvc.yaml new file mode 100644 index 000000000..fb3bd1854 --- /dev/null +++ b/dev/helm/templates/postgresql-pvc.yaml @@ -0,0 +1,21 @@ +{{- if and .Values.postgresql.enabled .Values.postgresql.persistence.enabled -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "wiki.postgresql.fullname" . }} + labels: + {{- include "wiki.labels" . | nindent 4 }} +spec: + accessModes: + - {{ .Values.postgresql.persistence.accessMode | quote }} + resources: + requests: + storage: {{ .Values.postgresql.persistence.size | quote }} + {{- if .Values.postgresql.persistence.storageClass }} + {{- if (eq "-" .Values.postgresql.persistence.storageClass) }} + storageClassName: "" + {{- else }} + storageClassName: {{ .Values.postgresql.persistence.storageClass | quote }} + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/dev/helm/templates/postgresql-secret.yaml b/dev/helm/templates/postgresql-secret.yaml new file mode 100644 index 000000000..26a1da75b --- /dev/null +++ b/dev/helm/templates/postgresql-secret.yaml @@ -0,0 +1,12 @@ +{{- if and .Values.postgresql.enabled (not .Values.postgresql.existingSecret) -}} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "wiki.postgresql.fullname" . }} + labels: + {{- include "wiki.labels" . | nindent 4 }} +type: Opaque +data: + postgresql-password: {{ .Values.postgresql.postgresqlPassword | b64enc | quote }} + postgresql-username: {{ .Values.postgresql.postgresqlUser | b64enc | quote }} +{{- end }} diff --git a/dev/helm/templates/postgresql-service.yaml b/dev/helm/templates/postgresql-service.yaml new file mode 100644 index 000000000..4e87c33b3 --- /dev/null +++ b/dev/helm/templates/postgresql-service.yaml @@ -0,0 +1,21 @@ +{{- if .Values.postgresql.enabled -}} +apiVersion: v1 +kind: Service +metadata: + name: {{ include "wiki.postgresql.fullname" . }} + labels: + {{- include "wiki.labels" . | nindent 4 }} + {{- with .Values.postgresql.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.postgresql.service.type }} + ports: + - port: {{ .Values.postgresql.service.port }} + targetPort: 5432 + protocol: TCP + name: postgresql + selector: + {{- include "wiki.postgresql.selectorLabels" . | nindent 4 }} +{{- end }} \ No newline at end of file diff --git a/dev/helm/templates/postgresql-statefulset.yaml b/dev/helm/templates/postgresql-statefulset.yaml new file mode 100644 index 000000000..4d035295e --- /dev/null +++ b/dev/helm/templates/postgresql-statefulset.yaml @@ -0,0 +1,101 @@ +{{- if .Values.postgresql.enabled -}} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "wiki.postgresql.fullname" . }} + labels: + {{- include "wiki.labels" . | nindent 4 }} +spec: + serviceName: {{ include "wiki.postgresql.fullname" . }} + replicas: 1 + selector: + matchLabels: + {{- include "wiki.postgresql.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "wiki.postgresql.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.postgresql.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.postgresql.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.postgresql.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: postgresql + image: {{ .Values.postgresql.image.repository }}:{{ .Values.postgresql.image.tag }} + imagePullPolicy: {{ .Values.postgresql.image.pullPolicy }} + ports: + - containerPort: 5432 + name: postgresql + env: + - name: POSTGRES_DB + value: {{ .Values.postgresql.postgresqlDatabase | quote }} + - name: POSTGRES_USER + {{- if .Values.postgresql.existingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.postgresql.existingSecret }} + key: {{ default "postgresql-username" .Values.postgresql.existingSecretUserKey | quote }} + {{- else }} + valueFrom: + secretKeyRef: + name: {{ include "wiki.postgresql.fullname" . }} + key: postgresql-username + {{- end }} + - name: POSTGRES_PASSWORD + {{- if .Values.postgresql.existingSecret }} + valueFrom: + secretKeyRef: + name: {{ .Values.postgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey | quote }} + {{- else }} + valueFrom: + secretKeyRef: + name: {{ include "wiki.postgresql.fullname" . }} + key: postgresql-password + {{- end }} + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + livenessProbe: + exec: + command: + - sh + - -c + - exec pg_isready -U {{ .Values.postgresql.postgresqlUser }} -d {{ .Values.postgresql.postgresqlDatabase }} + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + readinessProbe: + exec: + command: + - sh + - -c + - exec pg_isready -U {{ .Values.postgresql.postgresqlUser }} -d {{ .Values.postgresql.postgresqlDatabase }} + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 6 + resources: + {{- toYaml .Values.postgresql.resources | nindent 12 }} + volumeMounts: + - name: postgresql-data + mountPath: /var/lib/postgresql/data + subPath: postgresql + volumes: + - name: postgresql-data + {{- if .Values.postgresql.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ include "wiki.postgresql.fullname" . }} + {{- else }} + emptyDir: {} + {{- end }} +{{- end }} diff --git a/dev/helm/templates/service.yaml b/dev/helm/templates/service.yaml index 62bcff25b..688f6b572 100644 --- a/dev/helm/templates/service.yaml +++ b/dev/helm/templates/service.yaml @@ -19,8 +19,4 @@ spec: targetPort: http protocol: TCP name: http - - port: {{ default "443" .Values.service.httpsPort}} - targetPort: http - protocol: TCP - name: https selector: {{- include "wiki.selectorLabels" . | nindent 4}} diff --git a/dev/helm/values.yaml b/dev/helm/values.yaml index db5496c04..9d65b2a82 100644 --- a/dev/helm/values.yaml +++ b/dev/helm/values.yaml @@ -3,7 +3,7 @@ # Declare variables to be passed into your templates. replicaCount: 1 -revisionHistoryLimit: 10 +revisionHistoryLimit: 2 image: repository: requarks/wiki @@ -61,7 +61,6 @@ service: # Annotations applied for services such as externalDNS or # service type LoadBalancer # type: LoadBalancer - # httpsPort: 443 # annotations: {} # loadBalancerIP: 172.16.0.1 @@ -108,7 +107,7 @@ volumes: [] sideload: enabled: false # Git-Repo containing all locales.json-files you need: - repoURL: https://github.com/Requarks/wiki-localization + repoURL: https://github.com/requarks/wiki-localization ## This can be helpfull if you have internet access over a http proxy: env: [] @@ -156,47 +155,52 @@ extraEnvVars: [] # # For self signed CAs, like DigitalOcean # NODE_TLS_REJECT_UNAUTHORIZED: "0" -## Configuration values for the postgresql dependency. -## ref: https://github.com/kubernetes/charts/blob/master/stable/postgresql/README.md +## Configuration for the custom PostgreSQL 18 deployment ## postgresql: - ## Use the PostgreSQL chart dependency. - ## 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 + 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 + ## Default to the service name of the custom PostgreSQL deployment ## - # postgresqlHost: postgres + postgresqlHost: "{{ include \"wiki.postgresql.fullname\" . }}" ## postgresqlPort port for postgres ## Default to 5432 ## - # postgresqlPort: 5432 - ## PostgreSQL fullname Override - ## Default to wiki-postgresql unless fullname override is set for Chart - ## - fullnameOverride: "" + postgresqlPort: 5432 ## PostgreSQL User to create. ## postgresqlUser: postgres ## PostgreSQL Database to create. ## postgresqlDatabase: wiki + ## PostgreSQL password (will be stored in a secret) + ## + postgresqlPassword: "postgres" + + ## Use existing secret for PostgreSQL credentials + ## If set, the chart will not create a new secret and will use the existing one + ## + # existingSecret: "my-existing-postgres-secret" + + ## Key in the existing secret containing the password + ## + # existingSecretKey: "postgresql-password" + + ## Key in the existing secret containing the username (defaults to "postgresql-username") + ## + # existingSecretUserKey: "postgresql-username" + ## Persistent Volume Storage configuration. ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes ## - replication: - ## Enable PostgreSQL replication (primary/secondary) - ## - enabled: false persistence: ## Enable PostgreSQL persistence using Persistent Volume Claims. ## @@ -215,3 +219,34 @@ postgresql: ## Persistent Volume Storage Size. ## size: 8Gi + + ## PostgreSQL Image Configuration + image: + repository: postgres + tag: "18" + pullPolicy: IfNotPresent + + ## PostgreSQL Resources Configuration + resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + ## PostgreSQL Node Selector, Tolerations and Affinity + nodeSelector: {} + tolerations: [] + affinity: {} + + ## PostgreSQL Service Configuration + service: + type: ClusterIP + port: 5432 + # Additional service annotations + annotations: {} From 4f3917ff2253d47ec1c99bdcd07b425861a784c0 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sun, 22 Feb 2026 00:13:49 -0500 Subject: [PATCH 33/46] ci(helm): fix chart versioning Updated Helm chart versioning to use dynamic version from Chart.yaml. --- .github/workflows/helm.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/helm.yml b/.github/workflows/helm.yml index 5c27af1ed..9543c0762 100644 --- a/.github/workflows/helm.yml +++ b/.github/workflows/helm.yml @@ -16,11 +16,12 @@ jobs: steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Package and Push Chart run: | + export CHARTVER=$(yq '.version' dev/helm/Chart.yaml) helm plugin install https://github.com/chartmuseum/helm-push.git helm repo add chartmuseum https://charts.js.wiki - helm cm-push --version="2.2.${{github.run_number}}" --username="${{secrets.HELM_REPO_USERNAME}}" --password="${{secrets.HELM_REPO_PASSWORD}}" dev/helm/ chartmuseum + helm cm-push --version="$CHARTVER" --username="${{secrets.HELM_REPO_USERNAME}}" --password="${{secrets.HELM_REPO_PASSWORD}}" dev/helm/ chartmuseum helm repo remove chartmuseum From 0317f7119983e18bcab3d16a07f71746eb58a8ed Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Sun, 22 Feb 2026 00:22:00 -0500 Subject: [PATCH 34/46] ci(helm): use prod chart --- dev/helm/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/helm/Chart.yaml b/dev/helm/Chart.yaml index b156d5efa..83ba6cd1a 100644 --- a/dev/helm/Chart.yaml +++ b/dev/helm/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -name: wiki-js +name: wiki version: '3.0.0' appVersion: '2' description: The most powerful and extensible open source Wiki software. From 04563323255d74c378608c798c85013be77032e0 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 26 Feb 2026 04:42:58 -0500 Subject: [PATCH 35/46] ci: update packer definition --- dev/packer/digitalocean.json | 14 +++---- dev/packer/scripts/001-onboot.sh | 15 +++++--- dev/packer/scripts/010-docker.sh | 26 ++++++++++--- dev/packer/scripts/011-docker-compose.sh | 4 -- dev/packer/scripts/011-ufw-docker.sh | 9 +++++ dev/packer/scripts/012-grub-opts.sh | 6 --- dev/packer/scripts/013-docker-dns.sh | 4 -- dev/packer/scripts/014-ufw-docker.sh | 9 ----- dev/packer/scripts/020-application-tag.sh | 24 ------------ dev/packer/scripts/020-force-ssh-logout.sh | 6 +++ dev/packer/scripts/099-one-click | 11 ++++-- dev/packer/scripts/900-cleanup.sh | 34 +++++++++-------- dev/packer/scripts/999-img-check.sh | 44 ++++++++++++++++++---- 13 files changed, 111 insertions(+), 95 deletions(-) delete mode 100644 dev/packer/scripts/011-docker-compose.sh create mode 100644 dev/packer/scripts/011-ufw-docker.sh delete mode 100644 dev/packer/scripts/012-grub-opts.sh delete mode 100644 dev/packer/scripts/013-docker-dns.sh delete mode 100644 dev/packer/scripts/014-ufw-docker.sh delete mode 100644 dev/packer/scripts/020-application-tag.sh create mode 100644 dev/packer/scripts/020-force-ssh-logout.sh diff --git a/dev/packer/digitalocean.json b/dev/packer/digitalocean.json index 0bd1523eb..14b3f2631 100644 --- a/dev/packer/digitalocean.json +++ b/dev/packer/digitalocean.json @@ -2,10 +2,9 @@ "variables": { "do_api_token": "{{env `DIGITALOCEAN_API_TOKEN`}}", "image_name": "wikijs-snapshot-{{timestamp}}", - "apt_packages": "apt-transport-https ca-certificates curl jq linux-image-extra-virtual software-properties-common gnupg-agent openssl ", + "apt_packages": "software-properties-common", "application_name": "Wiki.js", - "application_version": "{{env `WIKI_APP_VERSION`}}", - "docker_compose_version": "1.29.2" + "application_version": "{{env `WIKI_APP_VERSION`}}" }, "sensitive-variables": [ "do_api_token" @@ -14,7 +13,7 @@ { "type": "digitalocean", "api_token": "{{user `do_api_token`}}", - "image": "ubuntu-20-04-x64", + "image": "ubuntu-24-04-x64", "region": "tor1", "size": "s-1vcpu-1gb", "ssh_username": "root", @@ -73,11 +72,8 @@ ], "scripts": [ "scripts/010-docker.sh", - "scripts/011-docker-compose.sh", - "scripts/012-grub-opts.sh", - "scripts/013-docker-dns.sh", - "scripts/014-ufw-docker.sh", - "scripts/020-application-tag.sh", + "scripts/011-ufw-docker.sh", + "scripts/020-force-ssh-logout.sh", "scripts/900-cleanup.sh", "scripts/999-img-check.sh" ] diff --git a/dev/packer/scripts/001-onboot.sh b/dev/packer/scripts/001-onboot.sh index 2e4f9e4f5..0a0804d12 100644 --- a/dev/packer/scripts/001-onboot.sh +++ b/dev/packer/scripts/001-onboot.sh @@ -1,15 +1,18 @@ #!/bin/bash -# Scripts in this directory will be executed by cloud-init on the first boot of droplets -# created from your image. Things ike generating passwords, configuration requiring IP address -# or other items that will be unique to each instance should be done in scripts here. - +# Generate PostgreSQL password openssl rand -base64 32 > /etc/wiki/.db-secret +# Start containers if [[ -z $DATABASE_URL ]]; then docker start db fi docker start wiki docker start wiki-update-companion -# docker start nginx-proxy -# docker start watchtower + +# Remove the ssh force logout command +sed -e '/Match User root/d' \ + -e '/.*ForceCommand.*droplet.*/d' \ + -i /etc/ssh/sshd_config + +systemctl restart ssh diff --git a/dev/packer/scripts/010-docker.sh b/dev/packer/scripts/010-docker.sh index c83681bc6..661c9329e 100644 --- a/dev/packer/scripts/010-docker.sh +++ b/dev/packer/scripts/010-docker.sh @@ -1,17 +1,33 @@ #!/bin/bash -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - -sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" -apt -qqy update -apt -qqy -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold' install docker-ce docker-ce-cli containerd.io +# Add Docker's official GPG key: +sudo install -m 0755 -d /etc/apt/keyrings +sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc +sudo chmod a+r /etc/apt/keyrings/docker.asc + +# Add the repository to Apt sources: +sudo tee /etc/apt/sources.list.d/docker.sources < /var/log/ufw.log diff --git a/dev/packer/scripts/012-grub-opts.sh b/dev/packer/scripts/012-grub-opts.sh deleted file mode 100644 index 9a336bb0f..000000000 --- a/dev/packer/scripts/012-grub-opts.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -sed -e 's|GRUB_CMDLINE_LINUX="|GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1|g' \ - -i /etc/default/grub - -update-grub diff --git a/dev/packer/scripts/013-docker-dns.sh b/dev/packer/scripts/013-docker-dns.sh deleted file mode 100644 index 80fa11fe0..000000000 --- a/dev/packer/scripts/013-docker-dns.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -sed -e 's|#DOCKER_OPTS|DOCKER_OPTS|g' \ - -i /etc/default/docker diff --git a/dev/packer/scripts/014-ufw-docker.sh b/dev/packer/scripts/014-ufw-docker.sh deleted file mode 100644 index 481994585..000000000 --- a/dev/packer/scripts/014-ufw-docker.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -sudo ufw allow ssh -sudo ufw allow http -sudo ufw allow https - -sudo ufw --force enable - -cat /dev/null > /var/log/ufw.log diff --git a/dev/packer/scripts/020-application-tag.sh b/dev/packer/scripts/020-application-tag.sh deleted file mode 100644 index 7d04593f8..000000000 --- a/dev/packer/scripts/020-application-tag.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -################################ -## PART: Write the application tag -## -## vi: syntax=sh expandtab ts=4 - -build_date=$(date +%Y-%m-%d) -distro="$(lsb_release -s -i)" -distro_release="$(lsb_release -s -r)" -distro_codename="$(lsb_release -s -c)" -distro_arch="$(uname -m)" - -mkdir -p /var/lib/digitalocean - -cat >> /var/lib/digitalocean/application.info <> /etc/ssh/sshd_config < /root/.bash_history @@ -36,12 +46,4 @@ The secure erase will complete successfully when you see:${NC} dd: writing to '/zerofile': No space left on device\n Beginning secure erase now\n" -dd if=/dev/zero of=/zerofile & - PID=$! - while [ -d /proc/$PID ] - do - printf "." - sleep 5 - done -sync; rm /zerofile; sync -cat /dev/null > /var/log/lastlog; cat /dev/null > /var/log/wtmp +dd if=/dev/zero of=/zerofile bs=4096 || rm /zerofile diff --git a/dev/packer/scripts/999-img-check.sh b/dev/packer/scripts/999-img-check.sh index 6473b6628..cec950ff6 100644 --- a/dev/packer/scripts/999-img-check.sh +++ b/dev/packer/scripts/999-img-check.sh @@ -4,7 +4,7 @@ # © 2021-2022 DigitalOcean LLC. # This code is licensed under Apache 2.0 license (see LICENSE.md for details) -VERSION="v. 1.8" +VERSION="v. 1.8.1" RUNDATE=$( date ) # Script should be run with SUDO @@ -75,7 +75,7 @@ function checkAgent { echo -en "\e[41m[FAIL]\e[0m DigitalOcean directory detected.\n" ((FAIL++)) STATUS=2 - if [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]]; then + if [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]] || [[ $OS == "AlmaLinux" ]] || [[ $OS == "CloudLinux" ]]; then echo "To uninstall the agent: 'sudo yum remove droplet-agent'" echo "To remove the DO directory: 'find /opt/digitalocean/ -type d -empty -delete'" elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then @@ -357,7 +357,7 @@ function checkFirewall { # shellcheck disable=SC2031 ((WARN++)) fi - elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]]; then + elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]] || [[ $OS == "AlmaLinux" ]] || [[ $OS == "CloudLinux" ]]; then if [ -f /usr/lib/systemd/system/csf.service ]; then fw="csf" if [[ $(systemctl status $fw >/dev/null 2>&1) ]]; then @@ -456,7 +456,7 @@ function checkUpdates { echo -en "\e[32m[PASS]\e[0m There are no pending security updates for this image.\n\n" ((PASS++)) fi - elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]]; then + elif [[ $OS == "CentOS Linux" ]] || [[ $OS == "CentOS Stream" ]] || [[ $OS == "Rocky Linux" ]] || [[ $OS == "AlmaLinux" ]] || [[ $OS == "CloudLinux" ]]; then echo -en "\nChecking for available security updates, this may take a minute...\n\n" update_count=$(yum check-update --security --quiet | wc -l) @@ -506,7 +506,7 @@ osv=0 if [[ $OS == "Ubuntu" ]]; then ost=1 - if [[ $VER == "22.04" ]] || [[ $VER == "20.04" ]] || [[ $VER == "18.04" ]] || [[ $VER == "16.04" ]]; then + if [[ $VER == "24.04" ]] || [[ $VER == "22.10" ]] || [[ $VER == "22.04" ]] || [[ $VER == "20.04" ]] || [[ $VER == "18.04" ]] || [[ $VER == "16.04" ]]; then osv=1 fi @@ -521,7 +521,13 @@ elif [[ "$OS" =~ Debian.* ]]; then ;; 11) osv=1 - ;; + ;; + 12) + osv=1 + ;; + 13) + osv=1 + ;; *) osv=2 ;; @@ -542,12 +548,28 @@ elif [[ $OS == "CentOS Stream" ]]; then ost=1 if [[ $VER == "8" ]]; then osv=1 + elif [[ $VER == "9" ]]; then + osv=1 else osv=2 fi elif [[ $OS == "Rocky Linux" ]]; then ost=1 - if [[ $VER =~ 8\. ]]; then + if [[ $VER =~ 8\. ]] || [[ $VER =~ 9\. ]]; then + osv=1 + else + osv=2 + fi +elif [[ $OS == "AlmaLinux" ]]; then + ost=1 + if [[ "$VER" =~ 8.* ]] || [[ "$VER" =~ 9.* ]]; then + osv=1 + else + osv=2 + fi +elif [[ $OS == "CloudLinux" ]]; then + ost=1 + if [[ "$VER" =~ 8.* ]] || [[ "$VER" =~ 9.* ]]; then osv=1 else osv=2 @@ -599,6 +621,12 @@ checkRoot checkAgent +# Source GPU compatibility check +if [ -f "$(dirname "$0")/check_gpu_support.sh" ]; then + source "$(dirname "$0")/check_gpu_support.sh" +else + echo "GPU check script not found. Skipping GPU compatibility checks." +fi # Summary echo -en "\n\n---------------------------------------------------------------------------------------------------\n" @@ -625,4 +653,4 @@ elif [[ $STATUS == 1 ]]; then else echo -en "Some critical tests failed. These items must be resolved and this scan re-run before you submit your image to the DigitalOcean Marketplace.\n\n" exit 1 -fi \ No newline at end of file +fi From 44efae949328cf3beee9061a05752d51e11d2683 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 26 Feb 2026 04:51:10 -0500 Subject: [PATCH 36/46] ci: update packer build workflow --- .github/workflows/packer.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/packer.yml b/.github/workflows/packer.yml index 4ef42f316..ed1c94958 100644 --- a/.github/workflows/packer.yml +++ b/.github/workflows/packer.yml @@ -14,13 +14,13 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Install Packer run: | - curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - - sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" - sudo apt-get update && sudo apt-get install packer + wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list + sudo apt update && sudo apt install packer - name: Build Droplet Image env: @@ -28,4 +28,5 @@ jobs: WIKI_APP_VERSION: ${{ github.event.inputs.version }} working-directory: dev/packer run: | + packer plugins install github.com/digitalocean/digitalocean packer build digitalocean.json From 429866446bf728f1a87a93346ea5e6965ec415d9 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 26 Feb 2026 04:59:50 -0500 Subject: [PATCH 37/46] ci: fix packer docker script --- dev/packer/scripts/010-docker.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/packer/scripts/010-docker.sh b/dev/packer/scripts/010-docker.sh index 661c9329e..50c3689b7 100644 --- a/dev/packer/scripts/010-docker.sh +++ b/dev/packer/scripts/010-docker.sh @@ -14,10 +14,10 @@ Components: stable Signed-By: /etc/apt/keyrings/docker.asc EOF -sudo apt update +sudo apt -qqy update # Install Docker -sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin +sudo apt -qqy install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin systemctl enable docker systemctl start docker From 4a1a6a934f7c3f66493126c28c269419f563e2ae Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 26 Feb 2026 05:10:46 -0500 Subject: [PATCH 38/46] ci: purge droplet-agent in packer cleanup script --- dev/packer/scripts/900-cleanup.sh | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/dev/packer/scripts/900-cleanup.sh b/dev/packer/scripts/900-cleanup.sh index d0961a30d..245180702 100644 --- a/dev/packer/scripts/900-cleanup.sh +++ b/dev/packer/scripts/900-cleanup.sh @@ -14,16 +14,13 @@ if [[ ! -d /tmp ]]; then fi chmod 1777 /tmp -if [ -n "$(command -v yum)" ]; then - yum update -y - yum clean all -elif [ -n "$(command -v apt-get)" ]; then - export DEBIAN_FRONTEND=noninteractive - apt-get -y update - apt-get -o Dpkg::Options::="--force-confold" upgrade -q -y --force-yes - apt-get -y autoremove - apt-get -y autoclean -fi +export DEBIAN_FRONTEND=noninteractive +apt-get -y update +apt-get -o Dpkg::Options::="--force-confold" upgrade -q -y --force-yes +apt-get purge droplet-agent +rm -rf /opt/digitalocean +apt-get -y autoremove +apt-get -y autoclean rm -rf /tmp/* /var/tmp/* history -c From 48dc6da3338fc466d0b10c70a2750d5611d7068d Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 26 Feb 2026 05:23:59 -0500 Subject: [PATCH 39/46] ci: fix packer cleanup script --- dev/packer/scripts/900-cleanup.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev/packer/scripts/900-cleanup.sh b/dev/packer/scripts/900-cleanup.sh index 245180702..00c8b53e4 100644 --- a/dev/packer/scripts/900-cleanup.sh +++ b/dev/packer/scripts/900-cleanup.sh @@ -16,8 +16,7 @@ chmod 1777 /tmp export DEBIAN_FRONTEND=noninteractive apt-get -y update -apt-get -o Dpkg::Options::="--force-confold" upgrade -q -y --force-yes -apt-get purge droplet-agent +apt-get -y purge droplet-agent rm -rf /opt/digitalocean apt-get -y autoremove apt-get -y autoclean From f0f71536ab2a534ae64478a97f99e01a0b2fb5d1 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Thu, 26 Feb 2026 05:41:53 -0500 Subject: [PATCH 40/46] ci: pin packer postgres to 17 --- dev/packer/scripts/010-docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/packer/scripts/010-docker.sh b/dev/packer/scripts/010-docker.sh index 50c3689b7..db5955a56 100644 --- a/dev/packer/scripts/010-docker.sh +++ b/dev/packer/scripts/010-docker.sh @@ -28,6 +28,6 @@ mkdir -p /etc/wiki docker network create wikinet docker volume create pgdata -docker create --name=db -e POSTGRES_DB=wiki -e POSTGRES_USER=wiki -e POSTGRES_PASSWORD_FILE=/etc/wiki/.db-secret -v /etc/wiki/.db-secret:/etc/wiki/.db-secret:ro -v pgdata:/var/lib/postgresql/data --restart=unless-stopped -h db --network=wikinet postgres:18 +docker create --name=db -e POSTGRES_DB=wiki -e POSTGRES_USER=wiki -e POSTGRES_PASSWORD_FILE=/etc/wiki/.db-secret -v /etc/wiki/.db-secret:/etc/wiki/.db-secret:ro -v pgdata:/var/lib/postgresql/data --restart=unless-stopped -h db --network=wikinet postgres:17 docker create --name=wiki -e DB_TYPE=postgres -e DB_HOST=db -e DB_PORT=5432 -e DB_PASS_FILE=/etc/wiki/.db-secret -v /etc/wiki/.db-secret:/etc/wiki/.db-secret:ro -e DB_USER=wiki -e DB_NAME=wiki -e UPGRADE_COMPANION=1 --restart=unless-stopped -h wiki --network=wikinet -p 80:3000 -p 443:3443 ghcr.io/requarks/wiki:2 docker create --name=wiki-update-companion -v /var/run/docker.sock:/var/run/docker.sock:ro --restart=unless-stopped -h wiki-update-companion --network=wikinet ghcr.io/requarks/wiki-update-companion:latest From 42a72183d006469be53bd1cf733b8740476c4c45 Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Mon, 23 Mar 2026 12:04:41 -0400 Subject: [PATCH 41/46] docs: Update README --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index f00f2c560..9b2b9f1cf 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,6 @@ - [Feature Requests](https://feedback.js.wiki/wiki) - Chat with us on [Discord](https://discord.gg/rcxt9QS2jd) - [Translations](https://docs.requarks.io/dev/translations) *(We need your help!)* -- [E2E Testing Results](https://dashboard.cypress.io/projects/r7qxah/runs) - [Special Thanks](#special-thanks) - [Contribute](#contributors) @@ -512,9 +511,6 @@ This project exists thanks to all the people who contribute. [[Contribute]](http ![Icons8](https://static.requarks.io/logo/icons8-text-h40.png) [Icons8](https://icons8.com/) for providing access to their beautiful icon sets. -![Localazy](https://static.requarks.io/logo/localazy-h40.png) -[Localazy](https://localazy.com/) for providing access to their great localization service. - ![Lokalise](https://static.requarks.io/logo/lokalise-text-h40.png) [Lokalise](https://lokalise.com/) for providing access to their great localization tool. From 188d36e6bb7deccf0c85d6c08d660f09b8379695 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Mon, 20 Apr 2026 06:03:17 -0400 Subject: [PATCH 42/46] fix: prevent user assignment to elevated groups --- server/core/auth.js | 43 +++++++++++++++++++++++++++++++++ server/graph/resolvers/group.js | 8 ++++++ server/graph/resolvers/user.js | 12 +++++++-- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/server/core/auth.js b/server/core/auth.js index fb30c970c..c92962e9a 100644 --- a/server/core/auth.js +++ b/server/core/auth.js @@ -317,6 +317,49 @@ module.exports = { return true }, + /** + * Check if user can perform assignment to a group with elevated permissions + * + * @param {User} user + * @param {Array} groupIds + * @returns {Boolean} + */ + async checkAssignUserToGroupAccess(user, groupIds = []) { + if (!groupIds || groupIds.length < 1) { + return true + } + + const userPermissions = user.permissions ? user.permissions : user.getGlobalPermissions() + + // System Admin + if (userPermissions.includes('manage:system')) { + return true + } + + // Ensure basic user management permission + if (!userPermissions.some(p => ['write:users', 'manage:users', 'write:groups', 'manage:groups'].includes(p))) { + return false + } + + const groups = await WIKI.models.groups.query().whereIn('id', groupIds) + return !groups.some(grp => { + // Check for manage:system permission + if (grp.permissions.includes('manage:system') && !userPermissions.includes('manage:groups')) { + return false + } + + // Check for elevated permissions + if (grp.permissions.some(p => { + const permType = _.last(p.split(':')) + return ['users', 'groups', 'navigation', 'theme', 'api'].includes(permType) + }) && !(userPermissions.includes('write:groups') || userPermissions.includes('manage:groups'))) { + return false + } + + return true + }) + }, + /** * Check and apply Page Rule specificity * diff --git a/server/graph/resolvers/group.js b/server/graph/resolvers/group.js index 1e2959794..68da2ffe2 100644 --- a/server/graph/resolvers/group.js +++ b/server/graph/resolvers/group.js @@ -56,6 +56,14 @@ module.exports = { throw new gql.GraphQLError('You are not authorized to assign a user to this elevated group.') } + // Check assigned permissions for manage:groups + if ( + WIKI.auth.checkExclusiveAccess(req.user, ['manage:groups'], ['manage:system']) && + grp.permissions.some(p => _.last(p.split(':')) === 'system') + ) { + throw new gql.GraphQLError('You are not authorized to assign a user to a group with the manage:system permission.') + } + // Check for valid user const usr = await WIKI.models.users.query().findById(args.userId) if (!usr) { diff --git a/server/graph/resolvers/user.js b/server/graph/resolvers/user.js index a94aef8a5..50a9d37d4 100644 --- a/server/graph/resolvers/user.js +++ b/server/graph/resolvers/user.js @@ -62,8 +62,12 @@ module.exports = { } }, UserMutation: { - async create (obj, args) { + async create (obj, args, context) { try { + if (!(await WIKI.auth.checkAssignUserToGroupAccess(context.req.user, args.groups))) { + throw new Error('You are not authorized to assign a user to a group with elevated permissions.') + } + await WIKI.models.users.createNewUser(args) return { @@ -94,8 +98,12 @@ module.exports = { } } }, - async update (obj, args) { + async update (obj, args, context) { try { + if (!(await WIKI.auth.checkAssignUserToGroupAccess(context.req.user, args.groups))) { + throw new Error('You are not authorized to assign a user to a group with elevated permissions.') + } + await WIKI.models.users.updateUser(args) return { From 34cd445a462fc77d70a2641ae35ee6ed2d884ff7 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Mon, 27 Apr 2026 04:15:54 -0400 Subject: [PATCH 43/46] fix: users + groups permissions assign logic + text hints --- .../admin/admin-groups-edit-permissions.vue | 10 ++++---- server/core/auth.js | 24 +++++++++---------- server/graph/resolvers/group.js | 8 +++---- server/graph/resolvers/user.js | 6 ++--- server/graph/schemas/group.graphql | 6 ++--- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/client/components/admin/admin-groups-edit-permissions.vue b/client/components/admin/admin-groups-edit-permissions.vue index 91b1b6841..62304129b 100644 --- a/client/components/admin/admin-groups-edit-permissions.vue +++ b/client/components/admin/admin-groups-edit-permissions.vue @@ -149,28 +149,28 @@ export default { items: [ { permission: 'write:users', - hint: 'Can create or authorize new users, but not modify existing ones', + hint: 'Can create or authorize new users, but not modify existing ones. Can only assign to non-administrative groups', warning: false, restrictedForSystem: true, disabled: false }, { permission: 'manage:users', - hint: 'Can manage all users (but not users with administrative permissions)', + hint: 'Can create, authorize and modify ANY users. Can only assign to non-administrative groups', warning: false, restrictedForSystem: true, disabled: false }, { permission: 'write:groups', - hint: 'Can manage groups and assign CONTENT permissions / page rules', + hint: 'Can manage groups and set CONTENT permissions / page rules. Can only assign users to non-administrative groups', warning: false, restrictedForSystem: true, disabled: false }, { permission: 'manage:groups', - hint: 'Can manage groups and assign ANY permissions (but not manage:system) / page rules', + hint: 'Can manage groups and set ANY permissions (but not manage:system) / page rules. Can assign users to ANY groups (except groups with the manage:system permission)', warning: true, restrictedForSystem: true, disabled: false @@ -203,7 +203,7 @@ export default { }, { permission: 'manage:system', - hint: 'Can manage and access everything. Root administrator.', + hint: 'Can manage and access everything. Root administrator', warning: true, restrictedForSystem: true, disabled: true diff --git a/server/core/auth.js b/server/core/auth.js index c92962e9a..ec0dd720b 100644 --- a/server/core/auth.js +++ b/server/core/auth.js @@ -318,41 +318,41 @@ module.exports = { }, /** - * Check if user can perform assignment to a group with elevated permissions + * Check if user (requester) can perform user assignment to a group with elevated permissions * - * @param {User} user - * @param {Array} groupIds + * @param {User} requester The user attempting to perform the assignment + * @param {Array} groupIds List of group IDs to be assigned * @returns {Boolean} */ - async checkAssignUserToGroupAccess(user, groupIds = []) { + async checkAssignUserToGroupAccess(requester, groupIds = []) { if (!groupIds || groupIds.length < 1) { return true } - const userPermissions = user.permissions ? user.permissions : user.getGlobalPermissions() + const requesterPermissions = requester.permissions ? requester.permissions : requester.getGlobalPermissions() // System Admin - if (userPermissions.includes('manage:system')) { + if (requesterPermissions.includes('manage:system')) { return true } // Ensure basic user management permission - if (!userPermissions.some(p => ['write:users', 'manage:users', 'write:groups', 'manage:groups'].includes(p))) { + if (!requesterPermissions.some(p => ['write:users', 'manage:users', 'write:groups', 'manage:groups'].includes(p))) { return false } const groups = await WIKI.models.groups.query().whereIn('id', groupIds) - return !groups.some(grp => { - // Check for manage:system permission - if (grp.permissions.includes('manage:system') && !userPermissions.includes('manage:groups')) { + return groups.every(grp => { + // Check group for manage:system permission + if (grp.permissions.includes('manage:system')) { return false } - // Check for elevated permissions + // Check group for administrative permissions if (grp.permissions.some(p => { const permType = _.last(p.split(':')) return ['users', 'groups', 'navigation', 'theme', 'api'].includes(permType) - }) && !(userPermissions.includes('write:groups') || userPermissions.includes('manage:groups'))) { + }) && !requesterPermissions.includes('manage:groups')) { return false } diff --git a/server/graph/resolvers/group.js b/server/graph/resolvers/group.js index 68da2ffe2..8cc847c16 100644 --- a/server/graph/resolvers/group.js +++ b/server/graph/resolvers/group.js @@ -45,15 +45,15 @@ module.exports = { throw new gql.GraphQLError('Invalid Group ID') } - // Check assigned permissions for write:groups + // Check assigned permissions for manage:users / write:groups if ( - WIKI.auth.checkExclusiveAccess(req.user, ['write:groups'], ['manage:groups', 'manage:system']) && + WIKI.auth.checkExclusiveAccess(req.user, ['manage:users', 'write:groups'], ['manage:groups', 'manage:system']) && grp.permissions.some(p => { const resType = _.last(p.split(':')) return ['users', 'groups', 'navigation', 'theme', 'api', 'system'].includes(resType) }) ) { - throw new gql.GraphQLError('You are not authorized to assign a user to this elevated group.') + throw new gql.GraphQLError('You are not authorized to assign a user to this administrative group.') } // Check assigned permissions for manage:groups @@ -178,7 +178,7 @@ module.exports = { return ['users', 'groups', 'navigation', 'theme', 'api', 'system'].includes(resType) }) ) { - throw new gql.GraphQLError('You are not authorized to manage this group or assign these permissions.') + throw new gql.GraphQLError('You are not authorized to manage this group or assign these administrative permissions.') } // Check assigned permissions for manage:groups diff --git a/server/graph/resolvers/user.js b/server/graph/resolvers/user.js index 50a9d37d4..19b9f42ba 100644 --- a/server/graph/resolvers/user.js +++ b/server/graph/resolvers/user.js @@ -65,7 +65,7 @@ module.exports = { async create (obj, args, context) { try { if (!(await WIKI.auth.checkAssignUserToGroupAccess(context.req.user, args.groups))) { - throw new Error('You are not authorized to assign a user to a group with elevated permissions.') + throw new Error('You are not authorized to create a user with an assignment to an administrative group.') } await WIKI.models.users.createNewUser(args) @@ -101,13 +101,13 @@ module.exports = { async update (obj, args, context) { try { if (!(await WIKI.auth.checkAssignUserToGroupAccess(context.req.user, args.groups))) { - throw new Error('You are not authorized to assign a user to a group with elevated permissions.') + throw new Error('You are not authorized to modify / assign a user from / to an administrative group.') } await WIKI.models.users.updateUser(args) return { - responseResult: graphHelper.generateSuccess('User created successfully') + responseResult: graphHelper.generateSuccess('User updated successfully') } } catch (err) { return graphHelper.generateError(err) diff --git a/server/graph/schemas/group.graphql b/server/graph/schemas/group.graphql index b1f99ade6..67898e851 100644 --- a/server/graph/schemas/group.graphql +++ b/server/graph/schemas/group.graphql @@ -18,7 +18,7 @@ type GroupQuery { list( filter: String orderBy: String - ): [GroupMinimal] @auth(requires: ["write:groups", "manage:groups", "manage:system"]) + ): [GroupMinimal] @auth(requires: ["write:users", "manage:users", "write:groups", "manage:groups", "manage:system"]) single( id: Int! @@ -49,12 +49,12 @@ type GroupMutation { assignUser( groupId: Int! userId: Int! - ): DefaultResponse @auth(requires: ["write:groups", "manage:groups", "manage:system"]) + ): DefaultResponse @auth(requires: ["manage:users", "write:groups", "manage:groups", "manage:system"]) unassignUser( groupId: Int! userId: Int! - ): DefaultResponse @auth(requires: ["write:groups", "manage:groups", "manage:system"]) + ): DefaultResponse @auth(requires: ["manage:users", "write:groups", "manage:groups", "manage:system"]) } # ----------------------------------------------- From da64dcdd03915ab5a82520a743cfe0aef6bb84dd Mon Sep 17 00:00:00 2001 From: Nicolas Giard Date: Fri, 1 May 2026 06:11:22 -0400 Subject: [PATCH 44/46] ci: update build workflow to latest action versions Updated GitHub Actions workflow to use newer versions of actions and changed the Ubuntu runner version for ARM builds. --- .github/workflows/build.yml | 66 ++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c0d613c2..44d404d84 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set Build Variables run: | @@ -42,20 +42,20 @@ jobs: cat package.json - name: Login to DockerHub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push Docker images - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v7 with: context: . file: dev/build/Dockerfile @@ -77,7 +77,7 @@ jobs: find _dist/wiki/ -printf "%P\n" | tar -czf wiki-js.tar.gz --no-recursion -C _dist/wiki/ -T - - name: Upload a Build Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: drop path: wiki-js.tar.gz @@ -92,7 +92,7 @@ jobs: dbtype: [postgres, mysql, mariadb, sqlite] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set Test Variables run: | @@ -115,21 +115,13 @@ jobs: arm: name: ARM Build - runs-on: ubuntu-latest + runs-on: ubuntu-24.04-arm needs: [cypress] permissions: packages: write - strategy: - matrix: - include: - - platform: linux/arm64 - docker: arm64 - # - platform: linux/arm/v7 - # docker: armv7 - steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set Version Variables run: | @@ -142,26 +134,26 @@ jobs: fi - name: Set up QEMU - uses: docker/setup-qemu-action@v3 + uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Login to DockerHub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Download a Build Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: drop path: drop @@ -172,16 +164,16 @@ jobs: tar -xzf $GITHUB_WORKSPACE/drop/wiki-js.tar.gz -C $GITHUB_WORKSPACE/build --exclude=node_modules - name: Build and push Docker images - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v7 with: context: . file: dev/build-arm/Dockerfile - platforms: ${{ matrix.platform }} + platforms: linux/arm64 provenance: false push: true tags: | - requarks/wiki:canary-${{ matrix.docker }}-${{ env.REL_VERSION_STRICT }} - ghcr.io/requarks/wiki:canary-${{ matrix.docker }}-${{ env.REL_VERSION_STRICT }} + requarks/wiki:canary-arm64-${{ env.REL_VERSION_STRICT }} + ghcr.io/requarks/wiki:canary-arm64-${{ env.REL_VERSION_STRICT }} windows: name: Windows Build @@ -190,12 +182,12 @@ jobs: steps: - name: Setup Node.js environment - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: - node-version: 20.x + node-version: 24.x - name: Download a Build Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: drop path: drop @@ -218,10 +210,10 @@ jobs: Copy-Item patch-extractfile.json win\node_modules\extract-files\package.json -Force - name: Create Bundle - run: tar -czf wiki-js-windows.tar.gz -C $env:GITHUB_WORKSPACE\win . + run: tar -czf $env:GITHUB_WORKSPACE\wiki-js-windows.tar.gz -C $env:GITHUB_WORKSPACE\win . - name: Upload a Build Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: drop-win path: wiki-js-windows.tar.gz @@ -241,13 +233,13 @@ jobs: echo "REL_VERSION_STRICT=${GITHUB_REF_NAME#?}" >> $GITHUB_ENV - name: Login to DockerHub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -282,13 +274,13 @@ jobs: echo "REL_VERSION_STRICT=${GITHUB_REF_NAME#?}" >> $GITHUB_ENV - name: Login to DockerHub - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -328,13 +320,13 @@ jobs: docker manifest push -p ghcr.io/requarks/wiki:latest - name: Download Linux Build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: drop path: drop - name: Download Windows Build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: drop-win path: drop-win @@ -348,7 +340,7 @@ jobs: writeToFile: false - name: Update GitHub Release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.21.0 with: allowUpdates: true draft: false From ec36eb2d86bef4b3aff4980c20133ef032889519 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Fri, 1 May 2026 06:15:46 -0400 Subject: [PATCH 45/46] fix: update arm docker base to node 24 --- .github/workflows/build.yml | 4 ++-- dev/build-arm/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 44d404d84..22974b1fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -362,7 +362,7 @@ jobs: # SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK - name: Notify Telegram Channel - uses: appleboy/telegram-action@v0.1.1 + uses: appleboy/telegram-action@v1.0.1 with: to: ${{ secrets.TELEGRAM_TO }} token: ${{ secrets.TELEGRAM_TOKEN }} @@ -384,7 +384,7 @@ jobs: # needs: [release] # steps: - # - uses: actions/checkout@v4 + # - uses: actions/checkout@v6 # - name: Set Version Variables # run: | diff --git a/dev/build-arm/Dockerfile b/dev/build-arm/Dockerfile index 19342ee35..61fa23be6 100644 --- a/dev/build-arm/Dockerfile +++ b/dev/build-arm/Dockerfile @@ -1,7 +1,7 @@ # ========================= # --- BUILD NPM MODULES --- # ========================= -FROM node:20-alpine AS build +FROM node:24-alpine AS build RUN apk add yarn g++ make cmake python3 --no-cache @@ -16,7 +16,7 @@ RUN yarn patch-package # =============== # --- Release --- # =============== -FROM node:20-alpine +FROM node:24-alpine LABEL maintainer="requarks.io" RUN apk add bash curl git openssh gnupg sqlite --no-cache && \ From 6f042e97cc2d3acda6b6ff611de8e0faacce91c1 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Fri, 1 May 2026 06:26:10 -0400 Subject: [PATCH 46/46] ci: disable docker build summary --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 22974b1fb..6bc8b4792 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,6 +56,8 @@ jobs: - name: Build and push Docker images uses: docker/build-push-action@v7 + env: + DOCKER_BUILD_SUMMARY: false with: context: . file: dev/build/Dockerfile @@ -165,6 +167,8 @@ jobs: - name: Build and push Docker images uses: docker/build-push-action@v7 + env: + DOCKER_BUILD_SUMMARY: false with: context: . file: dev/build-arm/Dockerfile