diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..fb876d40f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,22 @@ +cff-version: 1.2.0 +title: Hydro +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: Yi + family-names: Huang + email: i@undefined.moe + - given-names: Haojun + family-names: Pan + email: panda@hydro.ac + - name: All Hydro Project Developers +repository-code: 'https://github.com/hydro-dev/Hydro' +url: 'https://hydro.js.org' +keywords: + - Online Judge + - ICPC + - OI + - Competitive Programming +license: AGPL-3.0-or-later diff --git a/README.md b/README.md index 91243df74..6987da296 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ Hydro 用户群:1085853538

更新日志(点击展开)

-## Unreleased +## Hydro 5.0.0-beta.0 / UI 4.58.0-beta.0 - judge: 添加 checker 编译缓存 - ui: 优化题目详情页面 OGP 信息 @@ -135,6 +135,8 @@ Hydro 用户群:1085853538 - core: 支持存储并显示提交记录重测历史 - core: 新的加域逻辑 - ui: UserSelect.Multi: 支持批量粘贴用户名 +- ui: 修复在线 IDE 右键菜单 +- ui: 修复未登录用户查看题目文件页 - core: oauth: 支持绑定/解绑三方平台账户 (#971) - ui: 修复暗色模式表格边框 (#968) - core: 优化 icpc 题目包导入 (#966) @@ -154,6 +156,9 @@ Hydro 用户群:1085853538 - core: 升级至 Mongo Driver 6 - core: 移除 registerResolver, registerValue, registerUnion (使用 ctx.api.resolver/...) - core: 移除 paginate, rank (使用 ctx.db.paginate, ctx.db.ranked) +- core: 移除 setting.yaml +- core: oauth: 改为使用 ctx.oauth.provide() 注册 +- framework: 移除 ready 与 dispose 事件 (使用 ctx.effect 代替) ## Hydro 4.19.0 / UI 4.57.0 diff --git a/framework/eslint-config/package.json b/framework/eslint-config/package.json index f3a8e986b..8fa842d1f 100644 --- a/framework/eslint-config/package.json +++ b/framework/eslint-config/package.json @@ -1,11 +1,11 @@ { "name": "@hydrooj/eslint-config", - "version": "1.1.2", + "version": "2.0.0", "license": "MIT", "main": "base.mjs", "dependencies": { - "@eslint-react/eslint-plugin": "^1.40.0", - "@eslint/compat": "^1.2.7", + "@eslint-react/eslint-plugin": "^1.40.1", + "@eslint/compat": "^1.2.8", "@eslint/eslintrc": "^3.3.1", "@stylistic/eslint-plugin": "^4.2.0", "@typescript-eslint/eslint-plugin": "^8.29.0", diff --git a/framework/framework/package.json b/framework/framework/package.json index 3c1a84cb0..b7c43e22a 100644 --- a/framework/framework/package.json +++ b/framework/framework/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/framework", - "version": "0.2.0-alpha.0", + "version": "0.2.0-beta.0", "main": "index.ts", "license": "MIT", "peerDependencies": { diff --git a/framework/framework/server.ts b/framework/framework/server.ts index fd649c38f..34e07196d 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -424,7 +424,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } } }); - this.ctx.on('dispose', () => { + this.ctx.effect(() => () => { fs.emptyDirSync(uploadDir); }); // if killed by ctrl-c, on('dispose') will not be called @@ -461,17 +461,17 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } catch (e) { } }); socket.pause(); - const c: any = koa.createContext(request, {} as any); // eslint-disable-line - await executeMiddlewareStack(c, this.wsLayers); + const KoaContext: any = koa.createContext(request, {} as any); + await executeMiddlewareStack(KoaContext, this.wsLayers); for (const manager of router.wsStack) { - if (manager.accept(socket, request, c)) return; + if (manager.accept(socket, request, KoaContext)) return; } socket.close(); }); } async listen() { - this.ctx.on('dispose', () => { + this.ctx.effect(() => () => { httpServer.close(); wsServer.close(); }); @@ -727,7 +727,7 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); const dispose = router.disposeLastOp; // @ts-ignore this.ctx.parallel(`handler/register/${name}`, HandlerClass); - this.ctx.on('dispose', () => { + this.ctx.effect(() => () => { this.registrationCount[name]--; if (!this.registrationCount[name]) delete this.registry[name]; dispose(); diff --git a/packages/blog/package.json b/packages/blog/package.json index e8224697f..c61d1c9ab 100644 --- a/packages/blog/package.json +++ b/packages/blog/package.json @@ -1,5 +1,5 @@ { "name": "@hydrooj/blog", - "version": "0.0.4", + "version": "0.1.0-beta.0", "license": "AGPL-3.0-or-later" } diff --git a/packages/common/package.json b/packages/common/package.json index 9bf2995f0..b460a259b 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/common", "main": "./index.ts", - "version": "0.0.1", + "version": "0.0.2", "dependencies": { "@hydrooj/utils": "workspace:^" } diff --git a/packages/components/package.json b/packages/components/package.json index 2fa35e0b3..2d237f74c 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/components", - "version": "1.0.0-alpha.0", + "version": "1.0.0-beta.0", "main": "./frontend/index.ts", "dependencies": { "diff": "^7.0.0", diff --git a/packages/elastic/package.json b/packages/elastic/package.json index dd14ba924..cb106aa11 100644 --- a/packages/elastic/package.json +++ b/packages/elastic/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/elastic-search", - "version": "1.2.0-alpha.0", + "version": "1.2.0-beta.0", "main": "index.ts", "repository": "https://github.com/hydro-dev/Hydro", "author": "undefined ", diff --git a/packages/fps-importer/package.json b/packages/fps-importer/package.json index 471c3d356..0722d196d 100644 --- a/packages/fps-importer/package.json +++ b/packages/fps-importer/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/fps-importer", - "version": "1.5.14", + "version": "1.6.0-beta.0", "description": "Import FPS problems", "main": "index.ts", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/geoip/package.json b/packages/geoip/package.json index dd2a3a22d..9abbe5a67 100644 --- a/packages/geoip/package.json +++ b/packages/geoip/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/geoip", - "version": "1.3.3", + "version": "1.4.0-beta.0", "main": "index.ts", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/hydrojudge/package.json b/packages/hydrojudge/package.json index 902a9d6bf..cc4e8cf5b 100644 --- a/packages/hydrojudge/package.json +++ b/packages/hydrojudge/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/hydrojudge", "bin": "bin/hydrojudge.js", - "version": "3.5.0-alpha.0", + "version": "3.5.0-beta.0", "main": "./src/index.ts", "author": "undefined ", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/hydrojudge/src/index.ts b/packages/hydrojudge/src/index.ts index 853b396b1..c14c9ebd2 100644 --- a/packages/hydrojudge/src/index.ts +++ b/packages/hydrojudge/src/index.ts @@ -4,8 +4,8 @@ import { JudgeSettings, overrideConfig } from './config'; export const Config = JudgeSettings; export function apply(ctx: Context, config: ReturnType) { - if (process.env.NODE_APP_INSTANCE !== '0') return; overrideConfig(config); + if (process.env.NODE_APP_INSTANCE !== '0') return; // eslint-disable-next-line consistent-return if (!config.disable) return require('./hosts/builtin').apply(ctx); } diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index fdf6a4b73..9dc5fcc29 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "5.0.0-alpha.0", + "version": "5.0.0-beta.0", "bin": "bin/hydrooj.js", "main": "src/plugin-api", "module": "src/plugin-api", diff --git a/packages/hydrooj/src/entry/cli.ts b/packages/hydrooj/src/entry/cli.ts index 5cae2ac69..97f67caa1 100644 --- a/packages/hydrooj/src/entry/cli.ts +++ b/packages/hydrooj/src/entry/cli.ts @@ -113,7 +113,7 @@ export async function load(ctx: Context) { await ctx.plugin(ConfigService); await require('../model/system').runConfig(); ctx = await new Promise((resolve) => { - ctx.inject(['loader', 'config'], (c) => { + ctx.inject(['loader', 'config', 'db'], (c) => { resolve(c); }); }); diff --git a/packages/hydrooj/src/entry/worker.ts b/packages/hydrooj/src/entry/worker.ts index 50656efcf..64c3f396c 100644 --- a/packages/hydrooj/src/entry/worker.ts +++ b/packages/hydrooj/src/entry/worker.ts @@ -34,7 +34,7 @@ export async function apply(ctx: Context) { const modelSystem = require('../model/system'); await modelSystem.runConfig(); ctx = await new Promise((resolve) => { - ctx.inject(['loader', 'config'], (c) => { + ctx.inject(['loader', 'config', 'db'], (c) => { resolve(c); }); }); diff --git a/packages/hydrooj/src/handler/user.ts b/packages/hydrooj/src/handler/user.ts index 783b33672..4d22b8bf7 100644 --- a/packages/hydrooj/src/handler/user.ts +++ b/packages/hydrooj/src/handler/user.ts @@ -437,8 +437,9 @@ class OauthCallbackHandler extends Handler { noCheckPermView = true; async get(args: any) { - if (!this.ctx.oauth.providers[args.type]) throw new UserFacingError('Oauth type'); - const r = await this.ctx.oauth.providers[args.type].callback.call(this, args); + const provider = this.ctx.oauth.providers[args.type]; + if (!provider) throw new UserFacingError('Oauth type'); + const r = await provider.callback.call(this, args); if (this.session.oauthBind === args.type) { delete this.session.oauthBind; const existing = await this.ctx.oauth.get(args.type, r._id); @@ -456,6 +457,7 @@ class OauthCallbackHandler extends Handler { this.response.redirect = '/'; return; } + if (!provider.canRegister) throw new ForbiddenError('No binded account found'); this.checkPriv(PRIV.PRIV_REGISTER_USER); let username = ''; r.uname ||= []; diff --git a/packages/hydrooj/src/model/blacklist.ts b/packages/hydrooj/src/model/blacklist.ts index 613284cee..255695584 100644 --- a/packages/hydrooj/src/model/blacklist.ts +++ b/packages/hydrooj/src/model/blacklist.ts @@ -31,12 +31,12 @@ class BlackListModel { } } -export function apply(ctx: Context) { - coll = db.collection('blacklist'); - ctx.on('ready', () => db.ensureIndexes( +export async function apply(ctx: Context) { + coll = ctx.db.collection('blacklist'); + await ctx.db.ensureIndexes( coll, { key: { expireAt: -1 }, name: 'expire', expireAfterSeconds: 0 }, - )); + ); } export default BlackListModel; global.Hydro.model.blacklist = BlackListModel; diff --git a/packages/hydrooj/src/model/oauth.ts b/packages/hydrooj/src/model/oauth.ts index 1eeef213b..fb682c017 100644 --- a/packages/hydrooj/src/model/oauth.ts +++ b/packages/hydrooj/src/model/oauth.ts @@ -34,6 +34,7 @@ export interface OAuthProvider { hidden?: boolean; get: (this: Handler) => Promise; callback: (this: Handler, args: Record) => Promise; + canRegister?: boolean; lockUsername?: boolean; } diff --git a/packages/hydrooj/src/model/token.ts b/packages/hydrooj/src/model/token.ts index 6223ca193..4ae5ff5eb 100644 --- a/packages/hydrooj/src/model/token.ts +++ b/packages/hydrooj/src/model/token.ts @@ -1,6 +1,6 @@ import { Filter } from 'mongodb'; +import { Context } from '../context'; import { TokenDoc } from '../interface'; -import bus from '../service/bus'; import db from '../service/db'; import { ArgMethod } from '../utils'; @@ -107,10 +107,12 @@ class TokenModel { } } -bus.on('ready', () => db.ensureIndexes( - TokenModel.coll, - { key: { uid: 1, tokenType: 1, updateAt: -1 }, name: 'basic', sparse: true }, - { key: { expireAt: -1 }, name: 'expire', expireAfterSeconds: 0 }, -)); +export async function apply(ctx: Context) { + await ctx.db.ensureIndexes( + TokenModel.coll, + { key: { uid: 1, tokenType: 1, updateAt: -1 }, name: 'basic', sparse: true }, + { key: { expireAt: -1 }, name: 'expire', expireAfterSeconds: 0 }, + ); +} export default TokenModel; global.Hydro.model.token = TokenModel; diff --git a/packages/hydrooj/src/service/api.ts b/packages/hydrooj/src/service/api.ts index eef4fc229..33674d690 100644 --- a/packages/hydrooj/src/service/api.ts +++ b/packages/hydrooj/src/service/api.ts @@ -104,7 +104,7 @@ class ApiService extends Service { constructor(ctx: Context) { super(ctx, 'api'); this.rebuild = debounce(this.rebuild.bind(this), 500, { trailing: true }); - ctx.on('ready', this.rebuild); + this.rebuild(); } private rebuild() { diff --git a/packages/hydrooj/src/service/db.ts b/packages/hydrooj/src/service/db.ts index 2f49cc3ad..3f7decc53 100644 --- a/packages/hydrooj/src/service/db.ts +++ b/packages/hydrooj/src/service/db.ts @@ -178,10 +178,10 @@ export class MongoService extends Service { } /** @deprecated use ctx.db instead */ -const db = new Proxy({} as MongoService, { +const deprecatedDb = new Proxy({} as MongoService, { get(target, prop) { return app.get('db')?.[prop]; }, }); -export default db; +export default deprecatedDb; diff --git a/packages/hydrooj/src/service/migration.ts b/packages/hydrooj/src/service/migration.ts index 38cd7a5ce..144102b07 100644 --- a/packages/hydrooj/src/service/migration.ts +++ b/packages/hydrooj/src/service/migration.ts @@ -63,6 +63,7 @@ export default class MigrationService extends Service { dbVer++; await system.set(name, dbVer); } + logger.success('Database upgraded [%s]: current version %d', channel, dbVer); } } } diff --git a/packages/hydrooj/src/ui.ts b/packages/hydrooj/src/ui.ts index 64ad00441..557b2973d 100644 --- a/packages/hydrooj/src/ui.ts +++ b/packages/hydrooj/src/ui.ts @@ -11,6 +11,7 @@ async function terminate() { }, 1000); try { await bus.parallel('app/exit'); + await app.scope.dispose(); } catch (e) { hasError = true; } diff --git a/packages/import-hoj/package.json b/packages/import-hoj/package.json index 065b9e671..49b96518a 100644 --- a/packages/import-hoj/package.json +++ b/packages/import-hoj/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/import-hoj", - "version": "0.0.5", + "version": "0.0.6-beta.0", "description": "Import HOJ problem export", "main": "index.ts", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/import-qduoj/package.json b/packages/import-qduoj/package.json index a8427007f..668b36b52 100644 --- a/packages/import-qduoj/package.json +++ b/packages/import-qduoj/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/import-qduoj", - "version": "1.5.9", + "version": "1.6.0-beta.0", "description": "Import QDUOJ problem export", "main": "index.ts", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/login-with-github/index.ts b/packages/login-with-github/index.ts index 47682df4b..d445566dd 100644 --- a/packages/login-with-github/index.ts +++ b/packages/login-with-github/index.ts @@ -13,6 +13,7 @@ export default class LoginWithGithubService extends Service { id: Schema.string().description('Github OAuth AppID').required(), secret: Schema.string().description('Github OAuth Secret').role('secret').required(), endpoint: Schema.string().description('Github Endpoint'), + canRegister: Schema.boolean().default(true), }); constructor(ctx: Context, config: ReturnType) { @@ -21,6 +22,7 @@ export default class LoginWithGithubService extends Service { text: 'Login with Github', name: 'Github', icon, + canRegister: config.canRegister, callback: async function callback({ state, code }) { const s = await TokenModel.get(state, TokenModel.TYPE_OAUTH); if (!s) throw new ValidationError('token'); diff --git a/packages/login-with-github/package.json b/packages/login-with-github/package.json index 916e4acbd..98df80637 100644 --- a/packages/login-with-github/package.json +++ b/packages/login-with-github/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/login-with-github", - "version": "0.2.0", + "version": "0.3.0-beta.0", "main": "index.ts", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/login-with-google/index.ts b/packages/login-with-google/index.ts index e67381272..bdf8b9202 100644 --- a/packages/login-with-google/index.ts +++ b/packages/login-with-google/index.ts @@ -31,6 +31,7 @@ export default class GoogleOAuthService extends Service { id: Schema.string().description('Google OAuth AppID').required(), secret: Schema.string().description('Google OAuth Secret').role('secret').required(), proxy: Schema.string().description('Google OAuth Proxy').role('proxy'), + canRegister: Schema.boolean().default(true), }); constructor(ctx: Context, config: ReturnType) { @@ -38,6 +39,7 @@ export default class GoogleOAuthService extends Service { ctx.oauth.provide('google', { text: 'Login with Google', name: 'Google', + canRegister: config.canRegister, callback: async function callback(this: Handler, { state, code, error, }) { diff --git a/packages/login-with-google/package.json b/packages/login-with-google/package.json index a477c005b..958f829df 100644 --- a/packages/login-with-google/package.json +++ b/packages/login-with-google/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/login-with-google", - "version": "0.2.0", + "version": "0.3.0-beta.0", "main": "index.ts", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 38139ebd1..a9236d227 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/migrate", - "version": "0.4.4-alpha.0", + "version": "0.5.0-beta.0", "main": "index.ts", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/onlyoffice/package.json b/packages/onlyoffice/package.json index 481ba11f5..8f7fa1302 100644 --- a/packages/onlyoffice/package.json +++ b/packages/onlyoffice/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/onlyoffice", - "version": "1.4.5", + "version": "1.5.0-beta.0", "main": "index.ts", "repository": "git@github.com:hydro-dev/Hydro.git", "author": "undefined ", diff --git a/packages/onsite-toolkit/package.json b/packages/onsite-toolkit/package.json index cf2d16a7e..a783d9df2 100644 --- a/packages/onsite-toolkit/package.json +++ b/packages/onsite-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/onsite-toolkit", - "version": "0.0.5-alpha.0", + "version": "0.1.0-beta.0", "dependencies": { "@react-spring/web": "^9.7.5", "react-use": "^17.6.0" diff --git a/packages/prom-client/package.json b/packages/prom-client/package.json index 6cb655782..7ad436fa6 100644 --- a/packages/prom-client/package.json +++ b/packages/prom-client/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/prom-client", - "version": "0.2.0-alpha.0", + "version": "0.2.0-beta.0", "main": "index.ts", "dependencies": { "prom-client": "^15.1.3" diff --git a/packages/scoreboard-xcpcio/package.json b/packages/scoreboard-xcpcio/package.json index 7d39c2070..ba9085576 100644 --- a/packages/scoreboard-xcpcio/package.json +++ b/packages/scoreboard-xcpcio/package.json @@ -1,7 +1,7 @@ { "name": "@hydrooj/scoreboard-xcpcio", "license": "AGPL-3.0-or-later", - "version": "0.0.4", + "version": "0.0.5-beta.0", "main": "index.ts", "scripts": { "postinstall": "node -r @hydrooj/register install.ts" diff --git a/packages/sonic/package.json b/packages/sonic/package.json index bf3fb051d..2b41f9a1d 100644 --- a/packages/sonic/package.json +++ b/packages/sonic/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/sonic", - "version": "1.4.0-alpha.0", + "version": "1.4.0-beta.0", "description": "Sonic search service", "main": "index.ts", "preferUnplugged": true, diff --git a/packages/telegram/index.ts b/packages/telegram/index.ts index 9e540e5b6..bda077624 100644 --- a/packages/telegram/index.ts +++ b/packages/telegram/index.ts @@ -13,6 +13,7 @@ export default class TelegramService extends Service { token: Schema.string().role('secret').required(), botLogin: Schema.string().required(), endpoint: Schema.string().default('https://api.telegram.org/bot'), + canRegister: Schema.boolean().default(false), }); constructor(ctx: Context, config: ReturnType) { @@ -21,6 +22,7 @@ export default class TelegramService extends Service { text: 'Login with Telegram', name: 'Telegram', icon, + canRegister: config.canRegister, callback: async function callback({ payload }) { const parsed = JSON.parse(payload); const hash = parsed.hash; diff --git a/packages/telegram/package.json b/packages/telegram/package.json index 8f4aeef6c..406ad1bd9 100644 --- a/packages/telegram/package.json +++ b/packages/telegram/package.json @@ -1,4 +1,4 @@ { "name": "@hydrooj/telegram", - "version": "0.0.1" + "version": "0.0.2-beta.0" } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 3b02fbe8b..a70f078d7 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.58.0-alpha.0", + "version": "4.58.0-beta.0", "author": "undefined ", "license": "AGPL-3.0", "main": "index.ts", diff --git a/packages/ui-next/index.ts b/packages/ui-next/index.ts index c6e8210cb..9fc34d844 100644 --- a/packages/ui-next/index.ts +++ b/packages/ui-next/index.ts @@ -52,7 +52,8 @@ export async function apply(ctx: Context) { render: async (name, args, context) => await vite.transformIndexHtml(context.handler.context.req.url, html), }); - ctx.on('dispose', async () => { + // eslint-disable-next-line consistent-return + return async () => { await vite.close().catch((e) => console.error(e)); - }); + }; } diff --git a/packages/utils/lib/utils.ts b/packages/utils/lib/utils.ts index 27cec8446..d2045d28a 100644 --- a/packages/utils/lib/utils.ts +++ b/packages/utils/lib/utils.ts @@ -12,6 +12,8 @@ import type * as superagent from 'superagent'; export * as yaml from 'js-yaml'; export * as fs from 'fs-extra'; +Factory.formatters['d'] = (value, exporter) => Reggol.color(exporter, 3, value); + const factory = new Factory(); factory.addExporter(new Exporter.Console({ diff --git a/packages/utils/package.json b/packages/utils/package.json index d34f4c887..5bdd5a811 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/utils", - "version": "1.4.34-alpha.0", + "version": "1.4.34-beta.0", "description": "hydrooj utils", "main": "lib/utils.ts", "repository": "https://github.com/hydro-dev/Hydro.git", diff --git a/packages/vjudge/package.json b/packages/vjudge/package.json index 6373ef704..a75586bf3 100644 --- a/packages/vjudge/package.json +++ b/packages/vjudge/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/vjudge", - "version": "1.9.16", + "version": "1.10.0-beta.0", "description": "Submit problems to remote oj", "main": "./src/index.ts", "repository": "https://github.com/hydro-dev/Hydro.git",