chore: update to Node 24 and upgrade dependencies

vega
NGPixel 2 months ago
parent df91335f11
commit c3f562b315
No known key found for this signature in database
GPG Key ID: B755FB6870B30F63

@ -1,6 +1,6 @@
# Based of https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile # Based of https://github.com/devcontainers/images/blob/main/src/javascript-node/.devcontainer/Dockerfile
ARG VARIANT=22-bookworm ARG VARIANT=24-bookworm
FROM node:${VARIANT} FROM node:${VARIANT}
ARG USERNAME=node ARG USERNAME=node

@ -4,6 +4,7 @@ cd /workspace
echo "Disabling git info in terminal..." echo "Disabling git info in terminal..."
git config codespaces-theme.hide-status 1 git config codespaces-theme.hide-status 1
git config devcontainers-theme.hide-status 1
git config oh-my-zsh.hide-info 1 git config oh-my-zsh.hide-info 1
echo "Waiting for DB container to come online..." echo "Waiting for DB container to come online..."

@ -59,7 +59,7 @@
"upgradePackages": "true" "upgradePackages": "true"
}, },
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"version": "none" "version": "24"
}, },
"ghcr.io/devcontainers/features/git:1": {}, "ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/joedmck/devcontainer-features/cloudflared:1": {} "ghcr.io/joedmck/devcontainer-features/cloudflared:1": {}

@ -7,7 +7,7 @@ services:
# Update 'VARIANT' to pick an LTS version of Node.js: 18, 16, 14, 12. # Update 'VARIANT' to pick an LTS version of Node.js: 18, 16, 14, 12.
# Append -bullseye or -buster to pin to an OS version. # Append -bullseye or -buster to pin to an OS version.
# Use -bullseye variants on local arm64/Apple Silicon. # Use -bullseye variants on local arm64/Apple Silicon.
VARIANT: 22-bookworm VARIANT: 24-bookworm
volumes: volumes:
- ..:/workspace - ..:/workspace
@ -26,7 +26,7 @@ services:
# (Adding the "ports" property to this file will not forward from a Codespace.) # (Adding the "ports" property to this file will not forward from a Codespace.)
db: db:
image: postgres:16 image: postgres:17
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- postgres-data:/var/lib/postgresql/data - postgres-data:/var/lib/postgresql/data

@ -1,4 +1,4 @@
FROM node:20 FROM node:24
LABEL maintainer="requarks.io" LABEL maintainer="requarks.io"
RUN apt-get update && apt-get install -qy --no-install-recommends \ RUN apt-get update && apt-get install -qy --no-install-recommends \

@ -33,7 +33,7 @@ export default function () {
/** /**
* Site Asset * Site Asset
*/ */
router.get('/_site/:siteId?/:resource', async (req, res, next) => { router.get('/_site{/:siteId}/:resource', async (req, res, next) => {
const site = req.params.siteId ? WIKI.sites[req.params.siteId] : await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname }) const site = req.params.siteId ? WIKI.sites[req.params.siteId] : await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname })
if (!site) { if (!site) {
return res.status(404).send('Site Not Found') return res.status(404).send('Site Not Found')
@ -540,7 +540,7 @@ export default function () {
// } // }
// }) // })
router.get('/*', async (req, res, next) => { router.get('/{*splat}', async (req, res, next) => {
const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname }) const site = await WIKI.db.sites.getSiteByHostname({ hostname: req.hostname })
if (!site) { if (!site) {

@ -2,7 +2,7 @@ import fs from 'node:fs/promises'
import http from 'node:http' import http from 'node:http'
import https from 'node:https' import https from 'node:https'
import { ApolloServer } from '@apollo/server' import { ApolloServer } from '@apollo/server'
import { expressMiddleware } from '@apollo/server/express4' import { expressMiddleware } from '@as-integrations/express5'
import { isEmpty } from 'lodash-es' import { isEmpty } from 'lodash-es'
import { Server as IoServer } from 'socket.io' import { Server as IoServer } from 'socket.io'
import { ApolloServerPluginLandingPageLocalDefault, ApolloServerPluginLandingPageProductionDefault } from '@apollo/server/plugin/landingPage/default' import { ApolloServerPluginLandingPageLocalDefault, ApolloServerPluginLandingPageProductionDefault } from '@apollo/server/plugin/landingPage/default'
@ -46,7 +46,7 @@ export default {
}) })
this.http.on('connection', conn => { this.http.on('connection', conn => {
let connKey = `http:${conn.remoteAddress}:${conn.remotePort}` const connKey = `http:${conn.remoteAddress}:${conn.remotePort}`
this.connections.set(connKey, conn) this.connections.set(connKey, conn)
conn.on('close', () => { conn.on('close', () => {
this.connections.delete(connKey) this.connections.delete(connKey)
@ -113,7 +113,7 @@ export default {
}) })
this.https.on('connection', conn => { this.https.on('connection', conn => {
let connKey = `https:${conn.remoteAddress}:${conn.remotePort}` const connKey = `https:${conn.remoteAddress}:${conn.remotePort}`
this.connections.set(connKey, conn) this.connections.set(connKey, conn)
conn.on('close', () => { conn.on('close', () => {
this.connections.delete(connKey) this.connections.delete(connKey)
@ -137,15 +137,17 @@ export default {
csrfPrevention: true, csrfPrevention: true,
cache: 'bounded', cache: 'bounded',
plugins: [ plugins: [
process.env.NODE_ENV === 'production' ? ApolloServerPluginLandingPageProductionDefault({ process.env.NODE_ENV === 'production'
footer: false ? ApolloServerPluginLandingPageProductionDefault({
}) : ApolloServerPluginLandingPageLocalDefault({ footer: false
footer: false, })
embed: { : ApolloServerPluginLandingPageLocalDefault({
endpointIsEditable: false, footer: false,
runTelemetry: false embed: {
} endpointIsEditable: false,
}) runTelemetry: false
}
})
// ApolloServerPluginDrainHttpServer({ httpServer: this.http }) // ApolloServerPluginDrainHttpServer({ httpServer: this.http })
// ...(this.https && ApolloServerPluginDrainHttpServer({ httpServer: this.https })) // ...(this.https && ApolloServerPluginDrainHttpServer({ httpServer: this.https }))
] ]
@ -162,20 +164,20 @@ export default {
/** /**
* Start Socket.io WebSocket Server * Start Socket.io WebSocket Server
*/ */
async initWebSocket() { async initWebSocket () {
if (this.https) { if (this.https) {
this.ws = new IoServer(this.https, { this.ws = new IoServer(this.https, {
path: '/_ws/', path: '/_ws/',
serveClient: false serveClient: false
}) })
WIKI.logger.info(`WebSocket Server attached to HTTPS Server [ OK ]`) WIKI.logger.info('WebSocket Server attached to HTTPS Server [ OK ]')
} else { } else {
this.ws = new IoServer(this.http, { this.ws = new IoServer(this.http, {
path: '/_ws/', path: '/_ws/',
serveClient: false, serveClient: false,
cors: true // TODO: dev only, replace with app settings once stable cors: true // TODO: dev only, replace with app settings once stable
}) })
WIKI.logger.info(`WebSocket Server attached to HTTP Server [ OK ]`) WIKI.logger.info('WebSocket Server attached to HTTP Server [ OK ]')
} }
}, },
/** /**
@ -183,7 +185,7 @@ export default {
*/ */
closeConnections (mode = 'all') { closeConnections (mode = 'all') {
for (const [key, conn] of this.connections) { for (const [key, conn] of this.connections) {
if (mode !== `all` && key.indexOf(`${mode}:`) !== 0) { if (mode !== 'all' && key.indexOf(`${mode}:`) !== 0) {
continue continue
} }
conn.destroy() conn.destroy()

@ -223,6 +223,10 @@ export default {
}, },
async installExtension (obj, args, context) { async installExtension (obj, args, context) {
try { try {
if (!WIKI.auth.checkAccess(context.req.user, ['manage:system'])) {
throw new Error('ERR_FORBIDDEN')
}
await WIKI.extensions.ext[args.key].install() await WIKI.extensions.ext[args.key].install()
// TODO: broadcast ext install // TODO: broadcast ext install
return { return {

@ -1,5 +1,5 @@
import { generateError, generateSuccess } from '../../helpers/graph.mjs' import { generateError, generateSuccess } from '../../helpers/graph.mjs'
import _, { isNil } from 'lodash-es' import { find, isNil, mapValues, transform } from 'lodash-es'
import path from 'node:path' import path from 'node:path'
import fs from 'fs-extra' import fs from 'fs-extra'
import { DateTime } from 'luxon' import { DateTime } from 'luxon'
@ -67,7 +67,7 @@ export default {
// usr.providerName = str.displayName // usr.providerName = str.displayName
// usr.providerIs2FACapable = _.get(str, 'strategy.useForm', false) // usr.providerIs2FACapable = _.get(str, 'strategy.useForm', false)
usr.auth = _.mapValues(usr.auth, (auth, providerKey) => { usr.auth = mapValues(usr.auth, (auth, providerKey) => {
if (auth.password) { if (auth.password) {
auth.password = 'redacted' auth.password = 'redacted'
} }
@ -153,7 +153,7 @@ export default {
throw new Error('ERR_FORBIDDEN') throw new Error('ERR_FORBIDDEN')
} }
if (args.id <= 2) { if (args.id === WIKI.auth.guest.id) {
throw new WIKI.Error.UserDeleteProtected() throw new WIKI.Error.UserDeleteProtected()
} }
await WIKI.db.users.deleteUser(args.id, args.replaceId) await WIKI.db.users.deleteUser(args.id, args.replaceId)
@ -165,11 +165,7 @@ export default {
operation: generateSuccess('User deleted successfully') operation: generateSuccess('User deleted successfully')
} }
} catch (err) { } catch (err) {
if (err.message.indexOf('foreign') >= 0) { return generateError(err)
return generateError(new WIKI.Error.UserDeleteForeignConstraint())
} else {
return generateError(err)
}
} }
}, },
async updateUser (obj, args, context) { async updateUser (obj, args, context) {
@ -371,7 +367,7 @@ export default {
const destFolder = path.resolve( const destFolder = path.resolve(
process.cwd(), process.cwd(),
WIKI.config.dataPath, WIKI.config.dataPath,
`assets` 'assets'
) )
const destPath = path.join(destFolder, `userav-${args.id}.jpg`) const destPath = path.join(destFolder, `userav-${args.id}.jpg`)
await fs.ensureDir(destFolder) await fs.ensureDir(destFolder)
@ -451,22 +447,24 @@ export default {
User: { User: {
async auth (usr, args, context) { async auth (usr, args, context) {
const authStrategies = await WIKI.db.authentication.getStrategies({ enabledOnly: true }) const authStrategies = await WIKI.db.authentication.getStrategies({ enabledOnly: true })
return _.transform(usr.auth, (result, value, key) => { return transform(usr.auth, (result, value, key) => {
const authStrategy = _.find(authStrategies, ['id', key]) const authStrategy = find(authStrategies, ['id', key])
const authModule = _.find(WIKI.data.authentication, ['key', authStrategy.module]) const authModule = find(WIKI.data.authentication, ['key', authStrategy.module])
if (!authStrategy || !authModule) { return } if (!authStrategy || !authModule) { return }
result.push({ result.push({
authId: key, authId: key,
authName: authStrategy.displayName, authName: authStrategy.displayName,
strategyKey: authStrategy.module, strategyKey: authStrategy.module,
strategyIcon: authModule.icon, strategyIcon: authModule.icon,
config: authStrategy.module === 'local' ? { config: authStrategy.module === 'local'
isPasswordSet: value.password?.length > 0, ? {
isTfaSetup: value.tfaIsActive && value.tfaSecret?.length > 0, isPasswordSet: value.password?.length > 0,
isTfaRequired: (value.tfaRequired || authStrategy.config.enforceTfa) ?? false, isTfaSetup: value.tfaIsActive && value.tfaSecret?.length > 0,
mustChangePwd: value.mustChangePwd ?? false, isTfaRequired: (value.tfaRequired || authStrategy.config.enforceTfa) ?? false,
restrictLogin: value.restrictLogin ?? false mustChangePwd: value.mustChangePwd ?? false,
} : value restrictLogin: value.restrictLogin ?? false
}
: value
}) })
}, []) }, [])
}, },

@ -14,8 +14,8 @@ import logger from './core/logger.mjs'
const nanoid = customAlphabet('1234567890abcdef', 10) const nanoid = customAlphabet('1234567890abcdef', 10)
if (!semver.satisfies(process.version, '>=20')) { if (!semver.satisfies(process.version, '>=24')) {
console.error('ERROR: Node.js 20.x or later required!') console.error('ERROR: Node.js 24.x or later required!')
process.exit(1) process.exit(1)
} }

@ -36,70 +36,71 @@
"node": ">=18.0" "node": ">=18.0"
}, },
"dependencies": { "dependencies": {
"@apollo/server": "4.11.3", "@apollo/server": "5.0.0",
"@azure/storage-blob": "12.27.0", "@as-integrations/express5": "1.1.2",
"@azure/storage-blob": "12.28.0",
"@exlinc/keycloak-passport": "1.0.2", "@exlinc/keycloak-passport": "1.0.2",
"@graphql-tools/schema": "10.0.23", "@graphql-tools/schema": "10.0.25",
"@graphql-tools/utils": "10.8.6", "@graphql-tools/utils": "10.9.1",
"@hexagon/base64": "2.0.4", "@hexagon/base64": "2.0.4",
"@joplin/turndown-plugin-gfm": "1.0.61", "@joplin/turndown-plugin-gfm": "1.0.62",
"@node-saml/passport-saml": "5.0.1", "@node-saml/passport-saml": "5.1.0",
"@root/csr": "0.8.1", "@root/csr": "0.8.1",
"@root/keypairs": "0.10.3", "@root/keypairs": "0.10.3",
"@root/pem": "1.0.4", "@root/pem": "1.0.4",
"@simplewebauthn/server": "13.1.1", "@simplewebauthn/server": "13.1.2",
"@vue-email/compiler": "0.8.14", "@vue-email/compiler": "0.8.14",
"acme": "3.0.3", "acme": "3.0.3",
"akismet-api": "6.0.0", "akismet-api": "6.0.0",
"aws-sdk": "2.1692.0", "aws-sdk": "2.1692.0",
"bcryptjs": "3.0.2", "bcryptjs": "3.0.2",
"chalk": "5.4.1", "chalk": "5.4.1",
"cheerio": "1.0.0", "cheerio": "1.1.2",
"chokidar": "4.0.3", "chokidar": "4.0.3",
"chromium-pickle-js": "0.2.0", "chromium-pickle-js": "0.2.0",
"clean-css": "5.3.3", "clean-css": "5.3.3",
"command-exists": "1.2.9", "command-exists": "1.2.9",
"compression": "1.8.0", "compression": "1.8.1",
"connect-session-knex": "5.0.0", "connect-session-knex": "5.0.0",
"cookie-parser": "1.4.7", "cookie-parser": "1.4.7",
"cors": "2.8.5", "cors": "2.8.5",
"cron-parser": "5.0.6", "cron-parser": "5.3.0",
"cuint": "0.2.2", "cuint": "0.2.2",
"custom-error-instance": "2.1.2", "custom-error-instance": "2.1.2",
"dependency-graph": "1.0.0", "dependency-graph": "1.0.0",
"diff": "7.0.0", "diff": "8.0.2",
"diff2html": "3.4.51", "diff2html": "3.4.52",
"dompurify": "3.2.4", "dompurify": "3.2.6",
"dotize": "0.3.0", "dotize": "0.6.0",
"emoji-regex": "10.4.0", "emoji-regex": "10.4.0",
"eventemitter2": "6.4.9", "eventemitter2": "6.4.9",
"express": "4.21.2", "express": "5.1.0",
"express-brute": "1.0.1", "express-brute": "1.0.1",
"express-session": "1.18.1", "express-session": "1.18.2",
"file-type": "20.4.1", "file-type": "21.0.0",
"filesize": "10.1.6", "filesize": "11.0.2",
"fs-extra": "11.3.0", "fs-extra": "11.3.0",
"getos": "3.2.1", "getos": "3.2.1",
"graphql": "16.10.0", "graphql": "16.11.0",
"graphql-list-fields": "2.0.4", "graphql-list-fields": "2.0.4",
"graphql-rate-limit-directive": "2.0.6", "graphql-rate-limit-directive": "2.0.6",
"graphql-tools": "9.0.18", "graphql-tools": "9.0.20",
"graphql-upload": "17.0.0", "graphql-upload": "17.0.0",
"gray-matter": "4.0.3", "gray-matter": "4.0.3",
"he": "1.2.0", "he": "1.2.0",
"highlight.js": "11.11.1", "highlight.js": "11.11.1",
"image-size": "2.0.1", "image-size": "2.0.2",
"js-base64": "3.7.7", "js-base64": "3.7.7",
"js-binary": "1.2.0", "js-binary": "1.2.0",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"jsdom": "26.0.0", "jsdom": "26.1.0",
"jsonwebtoken": "9.0.2", "jsonwebtoken": "9.0.2",
"katex": "0.16.21", "katex": "0.16.22",
"klaw": "4.1.0", "klaw": "4.1.0",
"knex": "3.1.0", "knex": "3.1.0",
"lodash": "4.17.21", "lodash": "4.17.21",
"lodash-es": "4.17.21", "lodash-es": "4.17.21",
"luxon": "3.5.0", "luxon": "3.7.1",
"markdown-it": "14.1.0", "markdown-it": "14.1.0",
"markdown-it-abbr": "2.0.0", "markdown-it-abbr": "2.0.0",
"markdown-it-attrs": "4.3.1", "markdown-it-attrs": "4.3.1",
@ -109,21 +110,21 @@
"markdown-it-footnote": "4.0.0", "markdown-it-footnote": "4.0.0",
"markdown-it-imsize": "2.0.1", "markdown-it-imsize": "2.0.1",
"markdown-it-mark": "4.0.0", "markdown-it-mark": "4.0.0",
"markdown-it-mdc": "0.2.5", "markdown-it-mdc": "0.2.6",
"markdown-it-multimd-table": "4.2.3", "markdown-it-multimd-table": "4.2.3",
"markdown-it-sub": "2.0.0", "markdown-it-sub": "2.0.0",
"markdown-it-sup": "2.0.0", "markdown-it-sup": "2.0.0",
"markdown-it-task-lists": "2.1.1", "markdown-it-task-lists": "2.1.1",
"mathjax": "3.2.2", "mathjax": "3.2.2",
"mime-types": "2.1.35", "mime-types": "3.0.1",
"ms": "2.1.3", "ms": "2.1.3",
"multer": "1.4.5-lts.2", "multer": "2.0.2",
"nanoid": "5.1.5", "nanoid": "5.1.5",
"node-2fa": "2.0.3", "node-2fa": "2.0.3",
"node-cache": "5.1.2", "node-cache": "5.1.2",
"nodemailer": "6.10.0", "nodemailer": "7.0.5",
"objection": "3.1.5", "objection": "3.1.5",
"octokit": "4.1.2", "octokit": "5.0.3",
"passport": "0.7.0", "passport": "0.7.0",
"passport-auth0": "1.4.4", "passport-auth0": "1.4.4",
"passport-cas": "0.1.1", "passport-cas": "0.1.1",
@ -143,44 +144,43 @@
"passport-slack-oauth2": "1.2.0", "passport-slack-oauth2": "1.2.0",
"passport-twitch-strategy": "2.2.0", "passport-twitch-strategy": "2.2.0",
"pem-jwk": "2.0.0", "pem-jwk": "2.0.0",
"pg": "8.14.1", "pg": "8.16.3",
"pg-hstore": "2.3.4", "pg-hstore": "2.3.4",
"pg-pubsub": "0.8.1", "pg-pubsub": "0.8.1",
"pg-query-stream": "4.8.1", "pg-query-stream": "4.10.3",
"pg-tsquery": "8.4.2", "pg-tsquery": "8.4.2",
"poolifier": "4.4.5", "poolifier": "5.1.0",
"prom-client": "15.1.3", "prom-client": "15.1.3",
"punycode": "2.3.1", "punycode": "2.3.1",
"puppeteer-core": "24.4.0", "puppeteer-core": "24.15.0",
"qr-image": "3.2.0", "qr-image": "3.2.0",
"remove-markdown": "0.6.0", "remove-markdown": "0.6.2",
"safe-regex": "2.1.1", "safe-regex": "2.1.1",
"sanitize-filename": "1.6.3", "sanitize-filename": "1.6.3",
"scim-query-filter-parser": "2.0.4", "scim-query-filter-parser": "2.0.4",
"semver": "7.7.1", "semver": "7.7.2",
"serve-favicon": "2.5.0", "serve-favicon": "2.5.1",
"sharp": "0.33.5", "sharp": "0.34.3",
"simple-git": "3.27.0", "simple-git": "3.28.0",
"socket.io": "4.8.1", "socket.io": "4.8.1",
"striptags": "3.2.0", "striptags": "3.2.0",
"tar-fs": "3.0.8", "tar-fs": "3.1.0",
"turndown": "7.2.0", "turndown": "7.2.0",
"twemoji": "14.0.2", "twemoji": "14.0.2",
"ufo": "1.5.4", "ufo": "1.6.1",
"uslug": "1.0.4", "uslug": "1.0.4",
"uuid": "11.1.0", "uuid": "11.1.0",
"validate.js": "0.13.1", "validate.js": "0.13.1",
"vue": "3.5.13", "vue": "3.5.18",
"xss": "1.0.15", "xss": "1.0.15"
"yargs": "17.7.2"
}, },
"devDependencies": { "devDependencies": {
"eslint": "9.23.0", "eslint": "9.32.0",
"eslint-plugin-import": "2.31.0", "eslint-plugin-import": "2.32.0",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "7.2.1", "eslint-plugin-promise": "7.2.1",
"neostandard": "0.12.1", "neostandard": "0.12.2",
"nodemon": "3.1.9" "nodemon": "3.1.10"
}, },
"overrides": { "overrides": {
"@graphql-tools/utils": "10.5.5" "@graphql-tools/utils": "10.5.5"

File diff suppressed because it is too large Load Diff

@ -93,7 +93,7 @@ export async function init () {
next() next()
}) })
app.use(cors({ origin: false })) app.use(cors({ origin: false }))
app.options('*', cors({ origin: false })) app.options('/{*splat}', cors({ origin: false }))
if (WIKI.config.security.securityTrustProxy) { if (WIKI.config.security.securityTrustProxy) {
app.enable('trust proxy') app.enable('trust proxy')
} }

@ -11,11 +11,11 @@
"build": "NODE_OPTIONS=--max-old-space-size=8192 vite build --emptyOutDir" "build": "NODE_OPTIONS=--max-old-space-size=8192 vite build --emptyOutDir"
}, },
"dependencies": { "dependencies": {
"@apollo/client": "3.13.5", "@apollo/client": "3.13.8",
"@lezer/common": "1.2.3", "@lezer/common": "1.2.3",
"@mdi/font": "7.4.47", "@mdi/font": "7.4.47",
"@quasar/extras": "1.16.17", "@quasar/extras": "1.17.0",
"@simplewebauthn/browser": "13.1.0", "@simplewebauthn/browser": "13.1.2",
"@tiptap/core": "2.11.5", "@tiptap/core": "2.11.5",
"@tiptap/extension-code-block": "2.11.5", "@tiptap/extension-code-block": "2.11.5",
"@tiptap/extension-code-block-lowlight": "2.11.5", "@tiptap/extension-code-block-lowlight": "2.11.5",
@ -44,23 +44,23 @@
"@vue/repl": "3.4.0", "@vue/repl": "3.4.0",
"@xterm/xterm": "5.5.0", "@xterm/xterm": "5.5.0",
"apollo-upload-client": "18.0.1", "apollo-upload-client": "18.0.1",
"browser-fs-access": "0.35.0", "browser-fs-access": "0.38.0",
"clipboard": "2.0.11", "clipboard": "2.0.11",
"codemirror": "5.65.11", "codemirror": "5.65.11",
"codemirror-asciidoc": "1.0.4", "codemirror-asciidoc": "1.0.4",
"dependency-graph": "1.0.0", "dependency-graph": "1.0.0",
"filesize": "10.1.6", "filesize": "11.0.2",
"filesize-parser": "1.5.1", "filesize-parser": "1.5.1",
"fuse.js": "7.1.0", "fuse.js": "7.1.0",
"graphql": "16.10.0", "graphql": "16.11.0",
"graphql-tag": "2.12.6", "graphql-tag": "2.12.6",
"highlight.js": "11.11.1", "highlight.js": "11.11.1",
"js-cookie": "3.0.5", "js-cookie": "3.0.5",
"jwt-decode": "4.0.0", "jwt-decode": "4.0.0",
"katex": "0.16.21", "katex": "0.16.22",
"lodash-es": "4.17.21", "lodash-es": "4.17.21",
"lowlight": "3.3.0", "lowlight": "3.3.0",
"luxon": "3.5.0", "luxon": "3.7.1",
"markdown-it": "14.1.0", "markdown-it": "14.1.0",
"markdown-it-abbr": "2.0.0", "markdown-it-abbr": "2.0.0",
"markdown-it-attrs": "4.3.1", "markdown-it-attrs": "4.3.1",
@ -70,7 +70,7 @@
"markdown-it-footnote": "4.0.0", "markdown-it-footnote": "4.0.0",
"markdown-it-imsize": "2.0.1", "markdown-it-imsize": "2.0.1",
"markdown-it-mark": "4.0.0", "markdown-it-mark": "4.0.0",
"markdown-it-mdc": "0.2.5", "markdown-it-mdc": "0.2.6",
"markdown-it-multimd-table": "4.2.3", "markdown-it-multimd-table": "4.2.3",
"markdown-it-sub": "2.0.0", "markdown-it-sub": "2.0.0",
"markdown-it-sup": "2.0.0", "markdown-it-sup": "2.0.0",
@ -78,17 +78,17 @@
"mitt": "3.0.1", "mitt": "3.0.1",
"monaco-editor": "0.52.2", "monaco-editor": "0.52.2",
"pako": "2.1.0", "pako": "2.1.0",
"pinia": "3.0.1", "pinia": "3.0.3",
"prosemirror-commands": "1.7.0", "prosemirror-commands": "1.7.1",
"prosemirror-history": "1.4.1", "prosemirror-history": "1.4.1",
"prosemirror-keymap": "1.2.2", "prosemirror-keymap": "1.2.3",
"prosemirror-model": "1.25.0", "prosemirror-model": "1.25.2",
"prosemirror-schema-list": "1.5.1", "prosemirror-schema-list": "1.5.1",
"prosemirror-state": "1.4.3", "prosemirror-state": "1.4.3",
"prosemirror-transform": "1.10.3", "prosemirror-transform": "1.10.4",
"prosemirror-view": "1.38.1", "prosemirror-view": "1.40.1",
"pug": "3.0.3", "pug": "3.0.3",
"quasar": "2.18.1", "quasar": "2.18.2",
"slugify": "1.6.6", "slugify": "1.6.6",
"socket.io-client": "4.8.1", "socket.io-client": "4.8.1",
"sortablejs": "1.15.6", "sortablejs": "1.15.6",
@ -96,34 +96,34 @@
"tabulator-tables": "6.3.1", "tabulator-tables": "6.3.1",
"tippy.js": "6.3.7", "tippy.js": "6.3.7",
"twemoji": "14.0.2", "twemoji": "14.0.2",
"typescript": "5.8.2", "typescript": "5.8.3",
"uuid": "11.1.0", "uuid": "11.1.0",
"v-network-graph": "0.9.20", "v-network-graph": "0.9.21",
"vue": "3.5.13", "vue": "3.5.18",
"vue-i18n": "11.1.2", "vue-i18n": "11.1.11",
"vue-router": "4.5.0", "vue-router": "4.5.1",
"vue3-otp-input": "0.5.21", "vue3-otp-input": "0.5.40",
"vuedraggable": "4.1.0", "vuedraggable": "4.1.0",
"zxcvbn": "4.4.2" "zxcvbn": "4.4.2"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "9.23.0", "@eslint/js": "9.32.0",
"@intlify/unplugin-vue-i18n": "6.0.5", "@intlify/unplugin-vue-i18n": "6.0.8",
"@quasar/app-vite": "2.1.4", "@quasar/app-vite": "2.3.0",
"@quasar/vite-plugin": "1.9.0", "@quasar/vite-plugin": "1.10.0",
"@types/lodash": "4.17.16", "@types/lodash": "4.17.20",
"@vue/devtools": "7.7.2", "@vue/devtools": "7.7.7",
"@vue/language-plugin-pug": "2.2.8", "@vue/language-plugin-pug": "3.0.4",
"autoprefixer": "10.4.21", "autoprefixer": "10.4.21",
"browserlist": "latest", "browserlist": "latest",
"eslint": "9.23.0", "eslint": "9.32.0",
"eslint-plugin-import": "2.31.0", "eslint-plugin-import": "2.32.0",
"eslint-plugin-n": "17.16.2", "eslint-plugin-n": "17.21.0",
"eslint-plugin-promise": "7.2.1", "eslint-plugin-promise": "7.2.1",
"eslint-plugin-vue": "10.0.0", "eslint-plugin-vue": "10.3.0",
"eslint-plugin-vue-pug": "1.0.0-alpha.2", "eslint-plugin-vue-pug": "1.0.0-alpha.3",
"neostandard": "0.12.1", "neostandard": "0.12.2",
"sass": "1.86.0" "sass": "1.89.2"
}, },
"engines": { "engines": {
"node": ">= 18.0", "node": ">= 18.0",

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