From bf51bd30c7b80ec78d7543d23346e7f689a06934 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 11 Apr 2025 21:21:47 +0800 Subject: [PATCH] workspace: upgrade to cordis@4.0.0-beta.1, fix #975 --- README.md | 1 + framework/eslint-config/package.json | 8 +++---- framework/framework/decorators.ts | 2 +- framework/framework/interface.ts | 2 +- framework/framework/package.json | 4 ++-- framework/framework/server.ts | 6 ++--- framework/register/package.json | 2 +- package.json | 10 ++++---- packages/components/package.json | 2 +- packages/hydrooj/package.json | 5 ++-- packages/hydrooj/src/context.ts | 16 +++---------- packages/hydrooj/src/handler/domain.ts | 2 +- packages/hydrooj/src/lib/i18n.ts | 6 +---- packages/hydrooj/src/libs.ts | 4 +--- packages/hydrooj/src/loader.ts | 16 ++++++------- packages/hydrooj/src/model/setting.ts | 4 ++-- packages/hydrooj/src/service/check.ts | 2 +- packages/hydrooj/src/service/db.ts | 2 +- packages/hydrooj/src/service/hmr.ts | 2 +- packages/hydrooj/src/service/migration.ts | 18 +++++++++++++- packages/hydrooj/src/service/monitor.ts | 2 +- packages/hydrooj/src/service/storage.ts | 2 +- packages/hydrooj/src/ui.ts | 2 +- packages/migrate/package.json | 2 +- packages/prom-client/index.ts | 2 +- packages/prom-client/metrics.ts | 2 +- .../components/scratchpad/index.tsx | 2 +- packages/ui-default/context.ts | 6 ++--- packages/ui-default/package.json | 24 +++++++++---------- packages/ui-default/pages/api.page.tsx | 2 +- .../ui-default/pages/home_messages.page.tsx | 2 +- .../ui-default/pages/home_security.page.tsx | 5 ++-- packages/ui-next/package.json | 6 ++--- packages/vjudge/src/index.ts | 2 +- 34 files changed, 87 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 6987da296..f4ac7f752 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ Hydro 用户群:1085853538 - core: 移除 setting.yaml - core: oauth: 改为使用 ctx.oauth.provide() 注册 - framework: 移除 ready 与 dispose 事件 (使用 ctx.effect 代替) +- core: 最低要求 node 22 ## Hydro 4.19.0 / UI 4.57.0 diff --git a/framework/eslint-config/package.json b/framework/eslint-config/package.json index 8fa842d1f..bd90a61a6 100644 --- a/framework/eslint-config/package.json +++ b/framework/eslint-config/package.json @@ -4,12 +4,12 @@ "license": "MIT", "main": "base.mjs", "dependencies": { - "@eslint-react/eslint-plugin": "^1.40.1", + "@eslint-react/eslint-plugin": "^1.45.0", "@eslint/compat": "^1.2.8", "@eslint/eslintrc": "^3.3.1", "@stylistic/eslint-plugin": "^4.2.0", - "@typescript-eslint/eslint-plugin": "^8.29.0", - "@typescript-eslint/parser": "^8.29.0", + "@typescript-eslint/eslint-plugin": "^8.29.1", + "@typescript-eslint/parser": "^8.29.1", "eslint-config-airbnb": "^19.0.4", "eslint-plugin-de-morgan": "^1.2.1", "eslint-plugin-github": "^6.0.0", @@ -24,6 +24,6 @@ "eslint": ">= 9" }, "optionalDependencies": { - "typescript": "^5.8.2" + "typescript": "^5.8.3" } } diff --git a/framework/framework/decorators.ts b/framework/framework/decorators.ts index 14133357e..c23519794 100644 --- a/framework/framework/decorators.ts +++ b/framework/framework/decorators.ts @@ -1,4 +1,4 @@ -import { Context } from '@cordisjs/core'; +import { Context } from 'cordis'; import { ValidationError } from './error'; import type { Handler } from './server'; import { Converter, Type, Validator } from './validator'; diff --git a/framework/framework/interface.ts b/framework/framework/interface.ts index 7796bc443..05a84c71c 100644 --- a/framework/framework/interface.ts +++ b/framework/framework/interface.ts @@ -33,7 +33,7 @@ export interface ServerEvents extends KnownHandlerEvents, HandlerEvents { [k: `handler/error/${string}`]: (thisArg: Handler, e: Error) => VoidReturn } -declare module '@cordisjs/core' { +declare module 'cordis' { interface Events extends ServerEvents { } } diff --git a/framework/framework/package.json b/framework/framework/package.json index b7c43e22a..57840aa94 100644 --- a/framework/framework/package.json +++ b/framework/framework/package.json @@ -4,13 +4,13 @@ "main": "index.ts", "license": "MIT", "peerDependencies": { - "@cordisjs/core": "*" + "cordis": "*" }, "dependencies": { "@hydrooj/utils": "workspace:^", "emoji-regex": "^10.4.0", "fs-extra": "^11.3.0", - "koa": "^2.16.0", + "koa": "^2.16.1", "koa-body": "^6.0.1", "koa-compress": "^5.1.1", "koa-router": "^13.0.1", diff --git a/framework/framework/server.ts b/framework/framework/server.ts index 34e07196d..f3d065259 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -2,7 +2,7 @@ import http from 'http'; import { tmpdir } from 'os'; import { join } from 'path'; import { PassThrough } from 'stream'; -import { Context as CordisContext, Service } from '@cordisjs/core'; +import { Context as CordisContext, Service } from 'cordis'; import type { Files } from 'formidable'; import fs from 'fs-extra'; import Koa from 'koa'; @@ -625,7 +625,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); for (const { name, target } of h.__subscribe || []) sub.ctx.on(name, target.bind(h)); if (layer) { let lastHeartbeat = Date.now(); - sub.ctx.setInterval(() => { + sub.ctx.interval(() => { if (Date.now() - lastHeartbeat > 80000) { clean(); conn.terminate(); @@ -841,7 +841,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } } -declare module '@cordisjs/core' { +declare module 'cordis' { interface Context { server: WebService; Route: WebService['Route']; diff --git a/framework/register/package.json b/framework/register/package.json index a519cd9ea..ade5a4894 100644 --- a/framework/register/package.json +++ b/framework/register/package.json @@ -7,7 +7,7 @@ "node": ">=16" }, "dependencies": { - "esbuild": "0.25.0", + "esbuild": "0.25.2", "source-map-support": "^0.5.21" }, "devDependencies": { diff --git a/package.json b/package.json index 1ba43c103..f59eb9268 100644 --- a/package.json +++ b/package.json @@ -42,9 +42,9 @@ "chai": "^5.2.0", "cross-env": "^7.0.3", "cross-spawn": "^7.0.6", - "esbuild": "0.25.0", - "eslint": "^9.23.0", - "eslint-import-resolver-typescript": "^4.3.1", + "esbuild": "0.25.2", + "eslint": "^9.24.0", + "eslint-import-resolver-typescript": "^4.3.2", "eslint-import-resolver-webpack": "^0.13.10", "fs-extra": "^11.3.0", "globals": "^16.0.0", @@ -53,13 +53,13 @@ "mongodb-memory-server": "10.1.4", "nyc": "^17.1.0", "ora": "^8.2.0", - "oxlint": "^0.16.4", + "oxlint": "^0.16.5", "package-json": "^10.0.1", "semver": "^7.7.1", "simple-git": "^3.27.0", "supertest": "^7.1.0", "supports-hyperlinks": "^3.2.0", - "typescript": "5.8.2", + "typescript": "5.8.3", "wtfnode": "^0.10.0" } } diff --git a/packages/components/package.json b/packages/components/package.json index 2d237f74c..8f398a837 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -15,6 +15,6 @@ "@types/diff": "^7.0.2", "@types/js-yaml": "^4.0.9", "@types/lodash": "^4.17.16", - "sass": "^1.86.1" + "sass": "^1.86.3" } } diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 9dc5fcc29..83e536d8a 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -16,18 +16,17 @@ "@aws-sdk/lib-storage": "3.726.1", "@aws-sdk/s3-presigned-post": "3.726.1", "@aws-sdk/s3-request-presigner": "3.726.1", - "@cordisjs/core": "4.0.0-alpha.8", "@cordisjs/logger": "1.0.0-alpha.5", - "@cordisjs/plugin-timer": "1.0.0-alpha.0", + "@cordisjs/plugin-timer": "1.1.1", "@graphql-tools/schema": "^10.0.23", "@hydrooj/common": "workspace:^", "@hydrooj/framework": "workspace:^", "@hydrooj/utils": "workspace:^", "@simplewebauthn/server": "13.1.1", "@undefined-moe/require-resolve-hook": "^1.1.0", - "@yarnpkg/libzip": "^3.1.1", "adm-zip": "0.5.16", "cac": "^6.7.14", + "cordis": "4.0.0-beta.1", "csv-stringify": "^6.5.2", "emoji-regex": "^10.4.0", "emojis-list": "2.1.0", diff --git a/packages/hydrooj/src/context.ts b/packages/hydrooj/src/context.ts index f722ca580..22068e707 100644 --- a/packages/hydrooj/src/context.ts +++ b/packages/hydrooj/src/context.ts @@ -1,4 +1,4 @@ -import * as cordis from '@cordisjs/core'; +import * as cordis from 'cordis'; import LoggerService from '@cordisjs/logger'; import { TimerService } from '@cordisjs/plugin-timer'; import Schema from 'schemastery'; @@ -23,9 +23,9 @@ function provideModule(type: T, id: string, mo return () => delete global.Hydro.module[type][id]; } -export type EffectScope = cordis.EffectScope; +export type Fiber = cordis.Fiber; -export { Disposable, Plugin, ScopeStatus } from '@cordisjs/core'; +export { Disposable, Plugin, FiberState } from 'cordis'; export interface Context extends cordis.Context { [Context.events]: EventMap & cordis.Events; @@ -74,13 +74,3 @@ export class Context extends cordis.Context { this.plugin(LoggerService); } } - -const old = cordis.Registry.prototype.inject; -// cordis.Registry.prototype.using = old; -cordis.Registry.prototype.inject = function wrapper(...args) { - if (typeof args[0] === 'string') { - console.warn('old functionality of ctx.inject is deprecated. please use ctx.injectUI instead.'); - return T(inject).call(this, ...args as any) as any; - } - return old.call(this, ...args); -}; diff --git a/packages/hydrooj/src/handler/domain.ts b/packages/hydrooj/src/handler/domain.ts index a45e01d87..e2b721592 100644 --- a/packages/hydrooj/src/handler/domain.ts +++ b/packages/hydrooj/src/handler/domain.ts @@ -142,7 +142,7 @@ class DomainUserHandler extends ManageHandler { user: 1, role: 1, join: 1, - displayName: this.user.hasPerm(PERM.PERM_VIEW_DISPLAYNAME), + ...(this.user.hasPerm(PERM.PERM_VIEW_DISPLAYNAME) ? { displayName: 1 } : {}), }, }, ]).toArray(), diff --git a/packages/hydrooj/src/lib/i18n.ts b/packages/hydrooj/src/lib/i18n.ts index 1311abf52..c7d626b7a 100644 --- a/packages/hydrooj/src/lib/i18n.ts +++ b/packages/hydrooj/src/lib/i18n.ts @@ -13,7 +13,7 @@ declare module '../service/bus' { } } -class I18nService extends Service { +export class I18nService extends Service { constructor(ctx: Context) { super(ctx, 'i18n'); this.translate = this.translate.bind(this); @@ -55,10 +55,6 @@ class I18nService extends Service { } export const name = 'i18n'; -export function apply(ctx: Context) { - ctx.provide('i18n', undefined, true); - ctx.i18n = new I18nService(ctx); -} function collect(lang: string) { const s = translations[lang]; diff --git a/packages/hydrooj/src/libs.ts b/packages/hydrooj/src/libs.ts index 2e88e66f2..ffd6b34eb 100644 --- a/packages/hydrooj/src/libs.ts +++ b/packages/hydrooj/src/libs.ts @@ -1,4 +1,3 @@ -import { ZipFS, ZipOpenFS } from '@yarnpkg/libzip'; import AdmZip from 'adm-zip'; import _ from 'lodash'; import { ObjectId as ObjectID } from 'mongodb'; @@ -10,9 +9,8 @@ export { WebSocket, WebSocketServer } from '@hydrooj/framework'; export * from './utils'; export * from './interface'; export * from './typeutils'; -export * as LibZip from '@yarnpkg/libzip'; export { - Schema, AdmZip, superagent, _, ObjectID, ZipFS, ZipOpenFS, + Schema, AdmZip, superagent, _, ObjectID, }; export const definePlugin = (args: { using?: keyof Context[]; diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index fef271f57..6fcf3ba10 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -9,11 +9,11 @@ import child from 'child_process'; import './utils'; import cac from 'cac'; import './ui'; -import * as I18n from './lib/i18n'; +import { I18nService } from './lib/i18n'; import { Logger } from './logger'; import { - Context, Service, ScopeStatus, EffectScope, + Context, Service, FiberState, Fiber, } from './context'; // eslint-disable-next-line import/no-duplicates import { sleep, unwrapExports } from './utils'; @@ -45,7 +45,7 @@ if (process.env.NIX_PROFILES) { } export class Loader extends Service { - public state: Record = Object.create(null); + public state: Record = Object.create(null); public suspend = false; public cache: Record = Object.create(null); // public warnings: Record = Object.create(null); @@ -56,8 +56,8 @@ export class Loader extends Service { super(ctx, 'loader'); ctx.on('app/started', () => { - ctx.setInterval(async () => { - const pending = Object.entries(this.state).filter((v) => v[1].status === ScopeStatus.PENDING); + ctx.interval(async () => { + const pending = Object.entries(this.state).filter((v) => v[1].state === FiberState.PENDING); if (pending.length) { logger.warn('Plugins are still pending: %s', pending.map((v) => v[0]).join(', ')); for (const [key, value] of pending) { @@ -65,7 +65,7 @@ export class Loader extends Service { console.log(value); } } - const loading = Object.entries(this.state).filter((v) => v[1].status === ScopeStatus.LOADING); + const loading = Object.entries(this.state).filter((v) => v[1].state === FiberState.LOADING); if (loading.length) { logger.warn('Plugins are still loading: %s', loading.map((v) => v[0]).join(', ')); for (const [key, value] of loading) { @@ -73,7 +73,7 @@ export class Loader extends Service { console.log(value); } } - const failed = Object.entries(this.state).filter((v) => v[1].status === ScopeStatus.FAILED); + const failed = Object.entries(this.state).filter((v) => v[1].state === FiberState.FAILED); if (failed.length) { logger.warn('Plugins failed to load: %s', failed.map((v) => v[0]).join(', ')); for (const [key, value] of failed) { @@ -143,7 +143,7 @@ export class Loader extends Service { } } -app.plugin(I18n); +app.plugin(I18nService); app.plugin(Loader); async function preload() { diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts index 5077ce305..6898cd6b5 100644 --- a/packages/hydrooj/src/model/setting.ts +++ b/packages/hydrooj/src/model/setting.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ /* eslint-disable no-await-in-loop */ -import * as cordis from '@cordisjs/core'; +import * as cordis from 'cordis'; import yaml from 'js-yaml'; import { Dictionary } from 'lodash'; import moment from 'moment-timezone'; @@ -356,7 +356,7 @@ SystemSetting( export const langs: Record = {}; -declare module '@cordisjs/core' { +declare module 'cordis' { interface Context { setting: SettingService; } diff --git a/packages/hydrooj/src/service/check.ts b/packages/hydrooj/src/service/check.ts index 0886cf3f6..9ca6f8072 100644 --- a/packages/hydrooj/src/service/check.ts +++ b/packages/hydrooj/src/service/check.ts @@ -1,7 +1,7 @@ // TODO check more import os from 'os'; -import { DisposableList } from '@cordisjs/core'; +import { DisposableList } from 'cordis'; import { Context, Service } from '../context'; import * as system from '../model/system'; import db from './db'; diff --git a/packages/hydrooj/src/service/db.ts b/packages/hydrooj/src/service/db.ts index 3f7decc53..efc72d44a 100644 --- a/packages/hydrooj/src/service/db.ts +++ b/packages/hydrooj/src/service/db.ts @@ -62,7 +62,7 @@ export class MongoService extends Service { yield () => { this.client.close(); }; this.db = this.client.db(url.database || 'hydro'); await bus.parallel('database/connect', this.db); - yield this.ctx.setInterval(() => this.fixExpireAfter(), Time.hour); + yield this.ctx.interval(() => this.fixExpireAfter(), Time.hour); } public collection(c: K) { diff --git a/packages/hydrooj/src/service/hmr.ts b/packages/hydrooj/src/service/hmr.ts index 1ab99545a..54022192d 100644 --- a/packages/hydrooj/src/service/hmr.ts +++ b/packages/hydrooj/src/service/hmr.ts @@ -209,7 +209,7 @@ export default class HMR extends Service { const reload = async (plugin: any, runtime?: Plugin.Runtime) => { if (!runtime) return; - for (const oldFiber of runtime.scopes) { + for (const oldFiber of runtime.fibers) { // eslint-disable-next-line no-await-in-loop await oldFiber.parent.plugin(plugin, oldFiber.config); } diff --git a/packages/hydrooj/src/service/migration.ts b/packages/hydrooj/src/service/migration.ts index 144102b07..96410e794 100644 --- a/packages/hydrooj/src/service/migration.ts +++ b/packages/hydrooj/src/service/migration.ts @@ -1,8 +1,11 @@ /* eslint-disable no-await-in-loop */ +import cac from 'cac'; import { Logger } from '@hydrooj/utils'; import { Context, Service } from '../context'; import * as system from '../model/system'; +const argv = cac().parse(); + export type MigrationScript = null | ((ctx: Context) => Promise); const logger = new Logger('migration'); @@ -43,6 +46,18 @@ export default class MigrationService extends Service { await system.set(name, expected); continue; } + let upgraded = false; + if (dbVer > expected) { + logger.warn('Current database version for [%s] is %d, expected %d.', channel, dbVer, expected); + logger.warn('You are likely trying to apply a downgrade.'); + logger.warn('This version of Hydro is not compatible with newer data version.'); + if (!argv.options.ignoreVersion) { + logger.warn('To prevent data corruption, the startup has been aborted.'); + logger.warn('If you want to continue, use --ignore-version on startup.'); + logger.warn('Do it at your own risk.'); + await new Promise(() => { }); + } + } while (dbVer < expected) { const func = scripts[dbVer]; if (typeof func !== 'function') { @@ -62,8 +77,9 @@ export default class MigrationService extends Service { } dbVer++; await system.set(name, dbVer); + upgraded = true; } - logger.success('Database upgraded [%s]: current version %d', channel, dbVer); + if (upgraded) logger.success('Database upgraded [%s]: current version %d', channel, dbVer); } } } diff --git a/packages/hydrooj/src/service/monitor.ts b/packages/hydrooj/src/service/monitor.ts index e6eab92a3..ddb0c90bc 100644 --- a/packages/hydrooj/src/service/monitor.ts +++ b/packages/hydrooj/src/service/monitor.ts @@ -107,5 +107,5 @@ export async function apply(ctx: Context) { { upsert: true }, ); feedback(); - return ctx.setInterval(update, 1800 * 1000); // eslint-disable-line + return ctx.interval(update, 1800 * 1000); // eslint-disable-line } diff --git a/packages/hydrooj/src/service/storage.ts b/packages/hydrooj/src/service/storage.ts index 8a4b930ad..ec62738d6 100644 --- a/packages/hydrooj/src/service/storage.ts +++ b/packages/hydrooj/src/service/storage.ts @@ -425,7 +425,7 @@ export async function apply(ctx: Context, config: ReturnType return await next(); }); }); - ctx.set('storage', service); + ctx.provide('storage', service); } declare module '../context' { diff --git a/packages/hydrooj/src/ui.ts b/packages/hydrooj/src/ui.ts index 557b2973d..c64bea5ce 100644 --- a/packages/hydrooj/src/ui.ts +++ b/packages/hydrooj/src/ui.ts @@ -11,7 +11,7 @@ async function terminate() { }, 1000); try { await bus.parallel('app/exit'); - await app.scope.dispose(); + await app.fiber.dispose(); } catch (e) { hasError = true; } diff --git a/packages/migrate/package.json b/packages/migrate/package.json index a9236d227..042dd395a 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -6,7 +6,7 @@ "author": "undefined ", "license": "AGPL-3.0-or-later", "dependencies": { - "mariadb": "^3.4.0", + "mariadb": "^3.4.1", "mongodb": "^6.15.0", "turndown": "^7.2.0", "xml2js": "^0.6.2" diff --git a/packages/prom-client/index.ts b/packages/prom-client/index.ts index 47d2fc44b..503241443 100644 --- a/packages/prom-client/index.ts +++ b/packages/prom-client/index.ts @@ -55,7 +55,7 @@ export function apply(ctx: Context) { const registry = createRegistry(ctx); ctx.on('metrics', (id, metrics) => { instances[id] = metrics; }); let pushError = ''; - ctx.setInterval(async () => { + ctx.interval(async () => { try { const [gateway, name, pass] = SystemModel.getMany(['prom-client.gateway', 'prom-client.name', 'prom-client.password']); if (gateway) { diff --git a/packages/prom-client/metrics.ts b/packages/prom-client/metrics.ts index 31fc07e4d..fac9393b0 100644 --- a/packages/prom-client/metrics.ts +++ b/packages/prom-client/metrics.ts @@ -75,6 +75,6 @@ export function createRegistry(ctx: Context) { collectDefaultMetrics({ register: registry }); - ctx.set('metrics', registry); + ctx.provide('metrics', registry); return registry; } diff --git a/packages/ui-default/components/scratchpad/index.tsx b/packages/ui-default/components/scratchpad/index.tsx index 5ed3bd6cc..92e2583cf 100644 --- a/packages/ui-default/components/scratchpad/index.tsx +++ b/packages/ui-default/components/scratchpad/index.tsx @@ -66,7 +66,7 @@ export default function ScratchpadContainer() { const store = useStore(); if (!scratchpad) { scratchpad = new ScratchpadService(store); - ctx.set('scratchpad', scratchpad); + ctx.provide('scratchpad', scratchpad); } const [, updateState] = React.useState(); const forceUpdate = React.useCallback(() => updateState({}), []); diff --git a/packages/ui-default/context.ts b/packages/ui-default/context.ts index f100649b4..8eafbe0ea 100644 --- a/packages/ui-default/context.ts +++ b/packages/ui-default/context.ts @@ -1,9 +1,9 @@ -import * as cordis from '@cordisjs/core'; +import * as cordis from 'cordis'; import type { EventMap } from './api'; export interface Events extends cordis.Events, EventMap { } -export type { Disposable, ScopeStatus, Plugin } from '@cordisjs/core'; +export type { Disposable, FiberState, Plugin } from 'cordis'; export interface Context { [Context.events]: Events; @@ -11,7 +11,7 @@ export interface Context { } export class Context extends cordis.Context { } -export type EffectScope = cordis.EffectScope; +export type Fiber = cordis.Fiber; export class Service extends cordis.Service { } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index a70f078d7..843ab89a0 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -11,8 +11,7 @@ "cli": false }, "devDependencies": { - "@blueprintjs/core": "^5.17.6", - "@cordisjs/core": "4.0.0-alpha.8", + "@blueprintjs/core": "^5.18.0", "@fontsource/dm-mono": "^5.2.5", "@fontsource/fira-code": "^5.2.5", "@fontsource/inconsolata": "^5.2.5", @@ -22,8 +21,8 @@ "@fontsource/source-code-pro": "^5.2.5", "@fontsource/ubuntu-mono": "^5.2.5", "@hydrooj/utils": "workspace:^", - "@sentry/browser": "^9.10.1", - "@sentry/webpack-plugin": "^3.2.4", + "@sentry/browser": "^9.12.0", + "@sentry/webpack-plugin": "^3.3.1", "@simplewebauthn/browser": "13.1.0", "@svgr/webpack": "^8.1.0", "@types/html-to-text": "^9.0.4", @@ -36,7 +35,7 @@ "@types/pickadate": "^3.5.35", "@types/qrcode": "^1.5.5", "@types/react": "^18.3.20", - "@types/react-dom": "^18.3.5", + "@types/react-dom": "^18.3.6", "@types/redux-logger": "^3.0.13", "@types/uuid": "^10.0.0", "@types/webpack-env": "^1.18.8", @@ -50,6 +49,7 @@ "clean-webpack-plugin": "^4.0.0", "clipboard": "^2.0.11", "copy-webpack-plugin": "^13.0.0", + "cordis": "4.0.0-beta.1", "core-js": "^3.41.0", "core-js-compat": "^3.41.0", "css-loader": "^7.1.2", @@ -99,7 +99,7 @@ "redux-promise-middleware": "^6.2.0", "redux-thunk": "^3.1.0", "rupture": "^0.7.1", - "sass": "^1.86.1", + "sass": "^1.86.3", "sass-loader": "^16.0.5", "schemastery": "^3.16.1", "schemastery-react": "^0.1.2", @@ -108,15 +108,15 @@ "sticky-kit": "^1.1.3", "style-loader": "^4.0.0", "stylus": "^0.64.0", - "stylus-loader": "7.1.2", - "svgtofont": "^6.3.1", + "stylus-loader": "7.1.3", + "svgtofont": "^6.3.2", "tether": "1.4.7", "tether-drop": "^1.4.2", "timeago-react": "^3.0.7", "timeago.js": "^4.0.2", "ts-loader": "^9.5.2", "web-streams-polyfill": "^4.1.0", - "webpack": "^5.98.0", + "webpack": "^5.99.5", "webpack-bundle-analyzer": "^4.10.2", "webpack-dev-server": "^5.2.1", "webpack-manifest-plugin": "^5.0.1", @@ -124,14 +124,14 @@ }, "dependencies": { "@hydrooj/common": "workspace:^", - "ansi_up": "^6.0.2", + "ansi_up": "^6.0.5", "cssfilter": "^0.0.11", - "esbuild": "0.25.0", + "esbuild": "0.25.2", "fs-extra": "^11.3.0", "html-to-text": "^9.0.5", "js-yaml": "^4.1.0", "jsesc": "^3.1.0", - "katex": "^0.16.21", + "katex": "^0.16.22", "lodash": "^4.17.21", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", diff --git a/packages/ui-default/pages/api.page.tsx b/packages/ui-default/pages/api.page.tsx index e1144dc9c..77008e2e4 100644 --- a/packages/ui-default/pages/api.page.tsx +++ b/packages/ui-default/pages/api.page.tsx @@ -21,7 +21,7 @@ export default new NamedPage('api', async () => { } as any; createRoot(document.getElementById('main')!).render( request.post('/api', body, pick(opts, 'headers'))} + fetcher={(body, opts = {}) => request.post(`/d/${UiContext.domain._id}/api`, body, pick(opts, 'headers'))} defaultQuery={defaultQuery} variables='{"name": "Hydro"}' />, diff --git a/packages/ui-default/pages/home_messages.page.tsx b/packages/ui-default/pages/home_messages.page.tsx index 915fee803..b8847e783 100644 --- a/packages/ui-default/pages/home_messages.page.tsx +++ b/packages/ui-default/pages/home_messages.page.tsx @@ -43,7 +43,7 @@ const page = new NamedPage('home_messages', () => { reduxStore = store; (window as any).store = reduxStore; - ctx.set('messagepad', new MessagePadService(store, WebSocket)); + ctx.provide('messagepad', new MessagePadService(store, WebSocket)); const sock = new WebSocket(`${UiContext.ws_prefix}home/messages-conn`); sock.onmessage = (message) => { diff --git a/packages/ui-default/pages/home_security.page.tsx b/packages/ui-default/pages/home_security.page.tsx index 0392f5cc6..722f4c21b 100644 --- a/packages/ui-default/pages/home_security.page.tsx +++ b/packages/ui-default/pages/home_security.page.tsx @@ -1,6 +1,5 @@ import { browserSupportsWebAuthn, platformAuthenticatorIsAvailable, startRegistration } from '@simplewebauthn/browser'; import $ from 'jquery'; -import { escape } from 'lodash'; import QRCode from 'qrcode'; import { ActionDialog } from 'vj/components/dialog'; import Notification from 'vj/components/notification'; @@ -28,7 +27,7 @@ async function changeMail() { - + , ), onDispatch(action) { if (action === 'ok') { @@ -199,7 +198,7 @@ export default new NamedPage('home_security', () => { )} - + , ); const action = await new ActionDialog({ $body, $action: [] }).open(); if (!action || action === 'cancel') return; diff --git a/packages/ui-next/package.json b/packages/ui-next/package.json index 6ecdc0382..1bde1431e 100644 --- a/packages/ui-next/package.json +++ b/packages/ui-next/package.json @@ -13,9 +13,9 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", + "@types/react": "^19.1.0", + "@types/react-dom": "^19.1.2", "@vitejs/plugin-react-swc": "^3.8.1", - "vite": "^6.2.4" + "vite": "^6.2.6" } } diff --git a/packages/vjudge/src/index.ts b/packages/vjudge/src/index.ts index bec31c55c..905e4dd62 100644 --- a/packages/vjudge/src/index.ts +++ b/packages/vjudge/src/index.ts @@ -193,7 +193,7 @@ class VJudgeService extends Service { if (process.env.NODE_APP_INSTANCE !== '0') return; if (process.env.HYDRO_CLI) return; this.accounts = await coll.find().toArray(); - this.ctx.setInterval(this.sync.bind(this), Time.week); + this.ctx.interval(this.sync.bind(this), Time.week); } addProvider(type: string, provider: BasicProvider, override = false) {