upgrade: dependency updates across phases 1-3

Phase 1 - Security:
  - lodash 4.17.21 -> 4.18.1 (CVE fix)
  - dompurify 3.3.1 -> 3.4.10 (XSS fixes)
  - passport 0.4.1 -> 0.7.0 (security fixes)
  - remove deprecated request/request-promise, use native fetch instead
  - update semver, simple-git, winston, nodemailer

Phase 2 - Light upgrades:
  - sass 1.27.0 -> 1.101.0
  - chokidar 3.5.3 -> 4.0.3
  - mysql2 3.16.0 -> 3.22.5
  - pg 8.16.3 -> 8.21.0
  - cors, cross-env updates

Phase 3 - Medium risk:
  - js-yaml 3.14.0 -> 4.2.0 (safeLoad -> load across 11 files)
  - markdown-it 11.0.1 -> 14.2.0 (+7 plugin updates)
  - luxon 1.25.0 -> 3.7.2
  - fs-extra 9.0.1 -> 11.3.5
  - cheerio 1.0.0-rc.5 -> 1.2.0
  - highlight.js 10.3.1 -> 11.11.1

18 files changed, 67 insertions, 79 deletions
pull/8026/head
Dalibor Marković 4 weeks ago
parent 6f042e97cc
commit 779357ca12
No known key found for this signature in database
GPG Key ID: 9A80B4A40A8B91A7

@ -0,0 +1,263 @@
# Wiki.js — Project Memory
> Generated: 2026-06-14
> Branch: `upgrade/phase1-security`
---
## 1. About
**Wiki.js** is a modern, lightweight and powerful wiki app built on Node.js, Git and Markdown.
- Author: Nicolas Giard (NGPixel)
- License: AGPL-3.0
- Website: https://js.wiki/
- GitHub: https://github.com/requarks/wiki
- Current version: 2.0.0 (dev)
---
## 2. Tech Stack
| Layer | Technology | Version |
|-------|-----------|---------|
| **Runtime** | Node.js | >=20 (currently v24.14.1) |
| **Backend** | Express | 4.18.2 |
| **API** | Apollo Server 2.x | 2.25.2 |
| **GraphQL** | graphql | 15.3.0 (locked via resolutions) |
| **ORM** | Objection.js | 2.2.18 |
| **Query Builder** | Knex | 0.21.7 |
| **Databases** | PostgreSQL, MySQL, MariaDB, MSSQL, SQLite | — |
| **Frontend** | Vue 2 | 2.6.14 |
| **UI Framework** | Vuetify | 2.3.15 |
| **State Management** | Vuex | 3.5.1 |
| **Router** | vue-router | 3.4.7 |
| **Build** | Webpack | 4.44.2 |
| **Tests** | Jest + Cypress | Jest 26.6.1 / Cypress 5.3.0 |
| **Linter** | ESLint | 7.12.0 |
| **Package Manager** | Yarn | 1.22.22 |
| **Docker** | requarks/wiki | — |
---
## 3. Architecture
### Boot Sequence
```
server/index.js
└── Init WIKI global object
└── WIKI.configSvc.init() ← Load config.yml
└── WIKI.logger = winston
└── WIKI.kernel.init()
├── WIKI.models = db.init() ← Knex + Objection ORM
├── configSvc.loadFromDb() ← Config from database
├── configSvc.applyFlags()
├── preBootMaster()
│ ├── initTelemetry()
│ ├── sideloader.init()
│ ├── cache.init()
│ ├── scheduler.init()
│ ├── servers.init()
│ ├── extensions.init()
│ └── asar.init()
└── bootMaster()
└── master.js ← Express app
```
### Express App (server/master.js)
- **Middleware**: compression, cookie-parser, cors, express-session, body-parser, serve-favicon
- **Security middleware**: server/middlewares/security.js
- **Passport**: multiple strategies (21 auth providers)
- **GraphQL**: Apollo Server 2.x via `apollo-server-express`
- **Session store**: KnexSessionStore (connect-session-knex)
### Module System
Modules located in `server/modules/`:
```
authentication/ → 21 providers (local, oauth2, saml, ldap, azure, google, github...)
editor/ → 7 editors (markdown, wysiwyg, asciidoc, code, ckeditor...)
rendering/ → 27 rendering packages (markdown-it plugins, mermaid, mathjax...)
storage/ → 11 providers (git, s3, azure, disk, gdrive, dropbox...)
search/ → 9 engines (algolia, elasticsearch, postgres, azure...)
analytics/ → analytics
comments/ → comments
logging/ → logging
extensions/ → optional extensions
```
---
## 4. Package Upgrade Status
### Overview
| Category | Count |
|----------|:-----:|
| Total dependencies | ~296 |
| Precise pinned (reviewed) | 276 |
| Up-to-date | 119 |
| **Outdated** | **156** |
| Errors | 0 |
### ✅ Phase 1 — Security (completed)
| Package | Old | New | Reason |
|---------|:---:|:---:|--------|
| lodash | 4.17.21 | 4.18.1 | CVE Prototype Pollution |
| dompurify | 3.3.1 | 3.4.10 | XSS fixes |
| passport | 0.4.1 | 0.7.0 | Security fixes |
| request | 2.88.2 | **REMOVED** | Deprecated → native fetch |
| request-promise | 4.2.6 | **REMOVED** | Deprecated → native fetch |
| semver | 7.7.3 | 7.8.4 | Update |
| simple-git | 3.30.0 | 3.36.0 | Update |
| winston | 3.8.2 | 3.19.0 | Update |
| nodemailer | 6.9.1 | 8.0.11 | Update |
### ✅ Phase 2 — Light upgrades (completed)
| Package | Old | New |
|---------|:---:|:---:|
| sass | 1.27.0 | 1.101.0 |
| chokidar | 3.5.3 | 4.0.3 |
| mysql2 | 3.16.0 | 3.22.5 |
| pg | 8.16.3 | 8.21.0 |
| cors | 2.8.5 | 2.8.6 |
| cross-env | 10.0.0 | 10.1.0 |
### ✅ Phase 3 — Medium risk (completed)
| Package | Old | New | Notes |
|---------|:---:|:---:|-------|
| js-yaml | 3.14.0 | 4.2.0 | safeLoad→load in 11 files |
| fs-extra | 9.0.1 | 11.3.5 | |
| cheerio | 1.0.0-rc.5 | 1.2.0 | |
| luxon | 1.25.0 | 3.7.2 | |
| markdown-it | 11.0.1 | 14.2.0 | +7 plugins updated |
| highlight.js | 10.3.1 | 11.11.1 | |
| markdown-it-abbr | 1.0.4 | 2.0.0 | |
| markdown-it-attrs | 3.0.3 | 5.0.0 | |
| markdown-it-footnote | 3.0.3 | 4.0.0 | |
| markdown-it-mark | 3.0.1 | 4.0.0 | |
| markdown-it-multimd-table | 4.0.3 | 4.2.3 | |
| markdown-it-sub | 1.0.0 | 2.0.0 | |
| markdown-it-sup | 1.0.0 | 2.0.0 | |
### ⏳ Skipped
| Package | Reason |
|---------|--------|
| chalk 5.x | ESM only, breaks `require('chalk')` |
| knex 0.21→3.x | Major API changes, pending |
| objection 2→3 | Depends on knex upgrade |
| i18next 19→26 | Major API rewrite |
| mermaid 8→11 | Major version jump |
| graphql 15→16 | Locked in resolutions |
---
## 5. Modified Files
### Files changed (18 total)
| File | Change |
|------|--------|
| `package.json` | 22 version bumps, 2 removals |
| `server/core/config.js` | yaml.safeLoad→yaml.load |
| `server/core/localization.js` | yaml.safeLoad→yaml.load |
| `server/graph/resolvers/contribute.js` | request-promise→native fetch |
| `server/graph/resolvers/system.js` | request-promise→native fetch |
| `server/models/analytics.js` | yaml.safeLoad→yaml.load |
| `server/models/authentication.js` | yaml.safeLoad→yaml.load |
| `server/models/commentProviders.js` | yaml.safeLoad→yaml.load |
| `server/models/editors.js` | yaml.safeLoad→yaml.load |
| `server/models/loggers.js` | yaml.safeLoad→yaml.load |
| `server/models/pages.js` | yaml.safeLoad→yaml.load |
| `server/models/renderers.js` | yaml.safeLoad→yaml.load |
| `server/models/searchEngines.js` | yaml.safeLoad→yaml.load |
| `server/models/storage.js` | yaml.safeLoad→yaml.load |
| `server/modules/rendering/html-image-prefetch/renderer.js` | request-promise→native fetch |
| `server/modules/search/azure/engine.js` | request-promise→native fetch |
| `server/setup.js` | Added null check for telemetry |
| `yarn.lock` | Updated |
### Git Branches
| Branch | Status | Description |
|--------|--------|-------------|
| `main` | ✅ | Original upstream branch |
| `upgrade/phase1-security` | 🟢 Active | Phase 1-3 upgrades |
| `feat-toc` | — | Previous work |
| `scarlett` | — | Previous work |
| `vega` | — | Previous work |
---
## 6. Code Observations
### Good
- Consistent error handling hierarchy (custom-error-instance)
- Modular architecture (each provider in its own folder)
- ESLint standard JS style
- Timing attack protection in local auth (fake bcrypt compare)
- Configuration via YAML + database
### Issues
- **Global `WIKI` object** — makes testing hard (mocking)
- **Low test coverage**`server/test/` exists but coverage is low
- **Deprecated APIs**`yaml.safeLoad` (fixed), `babel-eslint`, `@babel/polyfill`
- **`request` package** — unmaintained, replaced with native `fetch()`
- **GraphQL locked at 15.3.0** via `resolutions` — blocks Apollo Server upgrade
### Security
- Error codes (1001-7004) — consistent
- CORS set to `origin: false`
- Session secret from `config.yml`
- `xss` package used for sanitization
- Timing-safe password comparison in local auth
---
## 7. Next Steps
### Phase 4 — Heavy upgrades
- knex 0.21.7 → 3.2.10 (+ objection 2→3)
- i18next 19→26
- Mermaid 8→11
### Phase 5 — Architectural
- Apollo Server 2 → 3 + GraphQL 15→16
- Express 4 → 5
- Webpack 4 → 5
- ESLint 7 → 10
### Phase 6 — Frontend rewrite
- Vue 2 → 3 (Vuetify, Vuex→Pinia, vue-router)
---
## 8. Commands
```bash
# Dev mode
yarn dev
# Build
yarn build
# Tests
yarn test
# ESLint
yarn run eslint --format codeframe --ext .js,.vue .
# Git
git branch
git checkout -b <name>
git branch -d <name>
git status
git diff
git add . && git commit -m "message"
```

@ -57,21 +57,21 @@
"bluebird": "3.7.2",
"body-parser": "1.20.1",
"chalk": "4.1.0",
"cheerio": "1.0.0-rc.5",
"chokidar": "3.5.3",
"cheerio": "1.2.0",
"chokidar": "4.0.3",
"chromium-pickle-js": "0.2.0",
"clean-css": "5.3.3",
"command-exists": "1.2.9",
"compression": "1.8.1",
"connect-session-knex": "2.0.0",
"cookie-parser": "1.4.7",
"cors": "2.8.5",
"cors": "2.8.6",
"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.3.1",
"dompurify": "3.4.10",
"dotize": "0.3.0",
"elasticsearch6": "npm:@elastic/elasticsearch@6",
"elasticsearch7": "npm:@elastic/elasticsearch@7",
@ -83,7 +83,7 @@
"express-session": "1.18.2",
"file-type": "15.0.1",
"filesize": "6.1.0",
"fs-extra": "9.0.1",
"fs-extra": "11.3.5",
"getos": "3.2.1",
"graphql": "15.3.0",
"graphql-list-fields": "2.0.2",
@ -91,36 +91,36 @@
"graphql-subscriptions": "1.1.0",
"graphql-tools": "7.0.0",
"he": "1.2.0",
"highlight.js": "10.3.1",
"highlight.js": "11.11.1",
"i18next": "19.8.3",
"i18next-express-middleware": "2.0.0",
"i18next-node-fs-backend": "2.1.3",
"image-size": "0.9.2",
"js-base64": "3.7.8",
"js-binary": "1.2.0",
"js-yaml": "3.14.0",
"js-yaml": "4.2.0",
"jsdom": "16.4.0",
"jsonwebtoken": "9.0.3",
"katex": "0.12.0",
"klaw": "3.0.0",
"knex": "0.21.7",
"lodash": "4.17.21",
"luxon": "1.25.0",
"markdown-it": "11.0.1",
"markdown-it-abbr": "1.0.4",
"markdown-it-attrs": "3.0.3",
"lodash": "4.18.1",
"luxon": "3.7.2",
"markdown-it": "14.2.0",
"markdown-it-abbr": "2.0.0",
"markdown-it-attrs": "5.0.0",
"markdown-it-decorate": "1.2.2",
"markdown-it-emoji": "3.0.0",
"markdown-it-expand-tabs": "1.0.13",
"markdown-it-external-links": "0.0.6",
"markdown-it-footnote": "3.0.3",
"markdown-it-footnote": "4.0.0",
"markdown-it-imsize": "2.0.1",
"markdown-it-mark": "3.0.1",
"markdown-it-mark": "4.0.0",
"markdown-it-mathjax": "2.0.0",
"markdown-it-multimd-table": "4.0.3",
"markdown-it-multimd-table": "4.2.3",
"markdown-it-pivot-table": "1.0.5",
"markdown-it-sub": "1.0.0",
"markdown-it-sup": "1.0.0",
"markdown-it-sub": "2.0.0",
"markdown-it-sup": "2.0.0",
"markdown-it-task-lists": "2.1.1",
"mathjax": "3.2.2",
"mime-types": "2.1.35",
@ -130,13 +130,13 @@
"ms": "2.1.3",
"mssql": "6.2.3",
"multer": "1.4.4",
"mysql2": "3.16.0",
"mysql2": "3.22.5",
"nanoid": "3.2.0",
"node-2fa": "1.1.2",
"node-cache": "5.1.2",
"nodemailer": "6.9.1",
"nodemailer": "8.0.11",
"objection": "2.2.18",
"passport": "0.4.1",
"passport": "0.7.0",
"passport-auth0": "1.4.5",
"passport-azure-ad": "4.3.5",
"passport-cas": "0.1.1",
@ -158,7 +158,7 @@
"passport-twitch-strategy": "2.2.0",
"patch-package": "8.0.1",
"pem-jwk": "2.0.0",
"pg": "8.16.3",
"pg": "8.21.0",
"pg-hstore": "2.3.4",
"pg-pubsub": "0.8.1",
"pg-query-stream": "4.10.3",
@ -169,14 +169,12 @@
"qr-image": "3.2.0",
"raven": "2.6.4",
"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.7.3",
"semver": "7.8.4",
"serve-favicon": "2.5.1",
"simple-git": "3.30.0",
"simple-git": "3.36.0",
"solr-node": "1.2.1",
"sqlite3": "5.1.7",
"ssh2": "1.11.0",
@ -189,7 +187,7 @@
"uslug": "1.0.4",
"uuid": "9.0.0",
"validate.js": "0.13.1",
"winston": "3.8.2",
"winston": "3.19.0",
"xss": "1.0.15",
"yargs": "17.6.2"
},
@ -240,7 +238,7 @@
"codemirror-asciidoc": "1.0.4",
"copy-webpack-plugin": "6.2.1",
"core-js": "3.6.5",
"cross-env": "10.0.0",
"cross-env": "10.1.0",
"css-loader": "4.3.0",
"cssnano": "4.1.10",
"cypress": "5.3.0",
@ -292,7 +290,7 @@
"pug-plain-loader": "1.0.0",
"raw-loader": "4.0.2",
"resolve-url-loader": "3.1.2",
"sass": "1.27.0",
"sass": "1.101.0",
"sass-loader": "10.0.4",
"sass-resources-loader": "2.1.1",
"script-ext-html-webpack-plugin": "2.1.5",

@ -32,12 +32,12 @@ module.exports = {
let appdata = {}
try {
appconfig = yaml.safeLoad(
appconfig = yaml.load(
cfgHelper.parseConfigValue(
fs.readFileSync(confPaths.config, 'utf8')
)
)
appdata = yaml.safeLoad(fs.readFileSync(confPaths.data, 'utf8'))
appdata = yaml.load(fs.readFileSync(confPaths.data, 'utf8'))
appdata.regex = require(confPaths.dataRegex)
console.info(chalk.green.bold(`OK`))
} catch (err) {

@ -80,7 +80,7 @@ module.exports = {
try {
const devEntriesRaw = await fs.readFile(path.join(WIKI.SERVERPATH, `locales/${locale}.yml`), 'utf8')
if (devEntriesRaw) {
const devEntries = yaml.safeLoad(devEntriesRaw)
const devEntries = yaml.load(devEntriesRaw)
_.forOwn(devEntries, (data, ns) => {
this.namespaces.push(ns)
this.engine.addResourceBundle(locale, ns, data, true, true)

@ -1,4 +1,3 @@
const request = require('request-promise')
const _ = require('lodash')
/* global WIKI */
@ -10,16 +9,16 @@ module.exports = {
ContributeQuery: {
async contributors(obj, args, context, info) {
try {
const resp = await request({
const resp = await fetch('https://graph.requarks.io', {
method: 'POST',
uri: 'https://graph.requarks.io',
json: true,
body: {
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: '{\n sponsors {\n list(kind: BACKER) {\n id\n source\n name\n joined\n website\n twitter\n avatar\n }\n }\n}\n',
variables: {}
}
})
})
return _.get(resp, 'data.sponsors.list', [])
const data = await resp.json()
return _.get(data, 'data.sponsors.list', [])
} catch (err) {
WIKI.logger.warn(err)
}

@ -6,7 +6,6 @@ const path = require('path')
const fs = require('fs-extra')
const moment = require('moment')
const graphHelper = require('../../helpers/graph')
const request = require('request-promise')
const crypto = require('crypto')
const nanoid = require('nanoid/non-secure').customAlphabet('1234567890abcdef', 10)
@ -89,13 +88,11 @@ module.exports = {
async performUpgrade (obj, args, context) {
try {
if (process.env.UPGRADE_COMPANION) {
await request({
method: 'POST',
uri: 'http://wiki-update-companion/upgrade',
qs: {
...process.env.UPGRADE_COMPANION_REF && { container: process.env.UPGRADE_COMPANION_REF }
}
})
const upgradeUrl = new URL('http://wiki-update-companion/upgrade')
if (process.env.UPGRADE_COMPANION_REF) {
upgradeUrl.searchParams.set('container', process.env.UPGRADE_COMPANION_REF)
}
await fetch(upgradeUrl, { method: 'POST' })
return {
responseResult: graphHelper.generateSuccess('Upgrade has started.')
}

@ -45,7 +45,7 @@ module.exports = class Analytics extends Model {
let diskProviders = []
for (let dir of analyticsDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/analytics', dir, 'definition.yml'), 'utf8')
diskProviders.push(yaml.safeLoad(def))
diskProviders.push(yaml.load(def))
}
WIKI.data.analytics = diskProviders.map(provider => ({
...provider,
@ -111,7 +111,7 @@ module.exports = class Analytics extends Model {
for (let provider of providers) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/analytics', provider.key, 'code.yml'), 'utf8')
let code = yaml.safeLoad(def)
let code = yaml.load(def)
code.head = _.defaultTo(code.head, '')
code.bodyStart = _.defaultTo(code.bodyStart, '')
code.bodyEnd = _.defaultTo(code.bodyEnd, '')

@ -84,7 +84,7 @@ module.exports = class Authentication extends Model {
WIKI.data.authentication = []
for (let dir of authDirs) {
const defRaw = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/authentication', dir, 'definition.yml'), 'utf8')
const def = yaml.safeLoad(defRaw)
const def = yaml.load(defRaw)
WIKI.data.authentication.push({
...def,
props: commonHelper.parseModuleProps(def.props)

@ -49,7 +49,7 @@ module.exports = class CommentProvider extends Model {
let diskProviders = []
for (let dir of commentDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', dir, 'definition.yml'), 'utf8')
diskProviders.push(yaml.safeLoad(def))
diskProviders.push(yaml.load(def))
}
WIKI.data.commentProviders = diskProviders.map(provider => ({
...provider,
@ -111,7 +111,7 @@ module.exports = class CommentProvider extends Model {
if (WIKI.data.commentProvider.codeTemplate) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/comments', commentProvider.key, 'code.yml'), 'utf8')
let code = yaml.safeLoad(def)
let code = yaml.load(def)
code.head = _.defaultTo(code.head, '')
code.body = _.defaultTo(code.body, '')
code.main = _.defaultTo(code.main, '')

@ -44,7 +44,7 @@ module.exports = class Editor extends Model {
let diskEditors = []
for (let dir of editorDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/editor', dir, 'definition.yml'), 'utf8')
diskEditors.push(yaml.safeLoad(def))
diskEditors.push(yaml.load(def))
}
WIKI.data.editors = diskEditors.map(editor => ({
...editor,

@ -45,7 +45,7 @@ module.exports = class Logger extends Model {
let diskLoggers = []
for (let dir of loggersDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/logging', dir, 'definition.yml'), 'utf8')
diskLoggers.push(yaml.safeLoad(def))
diskLoggers.push(yaml.load(def))
}
WIKI.data.loggers = diskLoggers.map(logger => ({
...logger,

@ -199,7 +199,7 @@ module.exports = class Page extends Model {
result = frontmatterRegex.markdown.exec(raw)
if (result[2]) {
return {
...yaml.safeLoad(result[2]),
...yaml.load(result[2]),
content: result[3]
}
} else {
@ -218,7 +218,7 @@ module.exports = class Page extends Model {
result = frontmatterRegex.html.exec(raw)
if (result[2]) {
return {
...yaml.safeLoad(result[2]),
...yaml.load(result[2]),
content: result[3]
}
}

@ -40,7 +40,7 @@ module.exports = class Renderer extends Model {
let diskRenderers = []
for (let dir of rendererDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/rendering', dir, 'definition.yml'), 'utf8')
diskRenderers.push(yaml.safeLoad(def))
diskRenderers.push(yaml.load(def))
}
WIKI.data.renderers = diskRenderers.map(renderer => ({
...renderer,

@ -45,7 +45,7 @@ module.exports = class SearchEngine extends Model {
let diskSearchEngines = []
for (let dir of searchEnginesDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/search', dir, 'definition.yml'), 'utf8')
diskSearchEngines.push(yaml.safeLoad(def))
diskSearchEngines.push(yaml.load(def))
}
WIKI.data.searchEngines = diskSearchEngines.map(searchEngine => ({
...searchEngine,

@ -45,7 +45,7 @@ module.exports = class Storage extends Model {
let diskTargets = []
for (let dir of storageDirs) {
const def = await fs.readFile(path.join(WIKI.SERVERPATH, 'modules/storage', dir, 'definition.yml'), 'utf8')
diskTargets.push(yaml.safeLoad(def))
diskTargets.push(yaml.load(def))
}
WIKI.data.storage = diskTargets.map(target => ({
...target,

@ -1,21 +1,16 @@
const request = require('request-promise')
const prefetch = async (element) => {
const url = element.attr(`src`)
let response
try {
response = await request({
method: `GET`,
url,
resolveWithFullResponse: true
})
response = await fetch(url)
} catch (err) {
WIKI.logger.warn(`Failed to prefetch ${url}`)
WIKI.logger.warn(err)
return
}
const contentType = response.headers[`content-type`]
const image = Buffer.from(response.body).toString('base64')
const contentType = response.headers.get('content-type') || 'image/png'
const buffer = await response.arrayBuffer()
const image = Buffer.from(buffer).toString('base64')
element.attr('src', `data:${contentType};base64,${image}`)
element.removeClass('prefetch-candidate')
}

@ -1,6 +1,5 @@
const _ = require('lodash')
const { SearchService, QueryType } = require('azure-search-client')
const request = require('request-promise')
const { pipeline } = require('node:stream/promises')
const { Transform } = require('node:stream')
@ -100,25 +99,23 @@ module.exports = {
top: 50
})
if (results.result.value.length < 5) {
// Using plain request, not yet available in library...
// Using native fetch, not yet available in library...
try {
const suggestResults = await request({
uri: `https://${this.config.serviceName}.search.windows.net/indexes/${this.config.indexName}/docs/autocomplete`,
method: 'post',
qs: {
'api-version': '2017-11-11-Preview'
},
const suggestUrl = new URL(`https://${this.config.serviceName}.search.windows.net/indexes/${this.config.indexName}/docs/autocomplete`)
suggestUrl.searchParams.set('api-version', '2017-11-11-Preview')
const suggestResp = await fetch(suggestUrl, {
method: 'POST',
headers: {
'api-key': this.config.adminKey,
'Content-Type': 'application/json'
},
json: true,
body: {
body: JSON.stringify({
autocompleteMode: 'oneTermWithContext',
search: q,
suggesterName: 'suggestions'
}
})
})
const suggestResults = await suggestResp.json()
suggestions = suggestResults.value.map(s => s.queryPlusText)
} catch (err) {
WIKI.logger.warn('Search Engine suggestion failure: ', err)

@ -392,7 +392,9 @@ module.exports = () => {
error: WIKI.IS_DEBUG ? err : {}
})
WIKI.logger.error(err.message)
WIKI.telemetry.sendError(err)
if (WIKI.telemetry) {
WIKI.telemetry.sendError(err)
}
})
// ----------------------------------------

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save