diff --git a/framework/eslint-config/package.json b/framework/eslint-config/package.json index e5b48d516..dd9caeff2 100644 --- a/framework/eslint-config/package.json +++ b/framework/eslint-config/package.json @@ -6,7 +6,7 @@ "dependencies": { "@eslint-react/eslint-plugin": "^1.37.0", "@eslint/compat": "^1.2.7", - "@eslint/eslintrc": "^3.3.0", + "@eslint/eslintrc": "^3.3.1", "@stylistic/eslint-plugin": "^4.2.0", "@typescript-eslint/eslint-plugin": "^8.27.0", "@typescript-eslint/parser": "^8.27.0", diff --git a/package.json b/package.json index e3f4e3d32..3b3310f0c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "cross-env": "^7.0.3", "cross-spawn": "^7.0.6", "esbuild": "0.25.0", - "eslint": "^9.22.0", + "eslint": "^9.23.0", "eslint-import-resolver-typescript": "^4.2.2", "eslint-import-resolver-webpack": "^0.13.10", "fs-extra": "^11.3.0", @@ -53,7 +53,7 @@ "mongodb-memory-server": "10.1.4", "nyc": "^17.1.0", "ora": "^8.2.0", - "oxlint": "^0.16.1", + "oxlint": "^0.16.2", "package-json": "^10.0.1", "semver": "^7.7.1", "simple-git": "^3.27.0", diff --git a/packages/elastic/index.ts b/packages/elastic/index.ts index 331d5612b..2b3f31e0b 100644 --- a/packages/elastic/index.ts +++ b/packages/elastic/index.ts @@ -31,7 +31,7 @@ export default class ElasticSearchService extends Service { this.client = new Client({ node: config.url }); } - async problemSearch(domainId: string, q: string, opts): ReturnType { + async problemSearch(domainId: string, q: string, opts: Parameters[2] = {}): ReturnType { const size = opts?.limit || SystemModel.get('pagination.problem'); const from = Math.min(this.config.indexSize - size, opts?.skip || 0); const res = await this.client.search({ diff --git a/packages/hydrooj/src/handler/discussion.ts b/packages/hydrooj/src/handler/discussion.ts index 1a7357846..2c8939258 100644 --- a/packages/hydrooj/src/handler/discussion.ts +++ b/packages/hydrooj/src/handler/discussion.ts @@ -72,7 +72,7 @@ class DiscussionMainHandler extends Handler { const parentType = { $in: Object.keys(typeMapper).map((i) => typeMapper[i]) }; all &&= this.user.hasPerm(PERM.PERM_MOD_BADGE); const [ddocs, dpcount] = await this.paginate( - discussion.getMulti(domainId, { parentType, ...all ? {} : { hidden: false } }), + discussion.getMulti(domainId, { parentType, ...all ? {} : { hidden: false } }).hint('discussionSort'), page, 'discussion', ); diff --git a/packages/hydrooj/src/handler/home.ts b/packages/hydrooj/src/handler/home.ts index 3253e361c..5366e42f1 100644 --- a/packages/hydrooj/src/handler/home.ts +++ b/packages/hydrooj/src/handler/home.ts @@ -507,6 +507,8 @@ class HomeDomainHandler extends Handler { @param('id', Types.String) async postLeave({ }, id: string) { + const ddoc = await domain.get(id); + if (!ddoc) throw new NotFoundError(id); await domain.setJoin(id, this.user._id, false); this.back(); } diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index 752627e46..4c48bc916 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -46,7 +46,6 @@ if (process.env.NIX_PROFILES) { export class Loader extends Service { public state: Record = Object.create(null); - public config: {}; public suspend = false; public cache: Record = Object.create(null); // public warnings: Record = Object.create(null); diff --git a/packages/hydrooj/src/model/document.ts b/packages/hydrooj/src/model/document.ts index c8c43d922..c4263ccbe 100644 --- a/packages/hydrooj/src/model/document.ts +++ b/packages/hydrooj/src/model/document.ts @@ -220,7 +220,7 @@ export async function deleteSub, ): Promise { - subId = (subId instanceof Array) ? subId : [subId]; + subId = Array.isArray(subId) ? subId : [subId]; return await coll.findOneAndUpdate( { domainId, docType, docId }, // @ts-ignore @@ -416,6 +416,7 @@ export async function apply(ctx: Context) { collStatus.deleteMany({ domainId }), ])); await db.clearIndexes(coll, ['tag', 'hidden']); + const onlyFor = (docType: number) => ({ partialFilterExpression: { docType } }); await db.ensureIndexes( coll, { key: { domainId: 1, docType: 1, docId: 1 }, name: 'basic', unique: true }, @@ -426,8 +427,8 @@ export async function apply(ctx: Context) { // For problem solution { key: { domainId: 1, docType: 1, parentType: 1, parentId: 1, vote: -1, docId: -1 }, name: 'solution', sparse: true }, // For discussion - { key: { domainId: 1, docType: 1, pin: -1, docId: -1 }, name: 'discussionSort', sparse: true }, - { key: { domainId: 1, docType: 1, parentType: 1, parentId: 1, pin: -1, docId: -1 }, name: 'discussionNodeSort', sparse: true }, + { key: { docType: 1, domainId: 1, hidden: 1, pin: -1, docId: -1 }, name: 'discussionSort', ...onlyFor(TYPE_DISCUSSION) }, + { key: { docType: 1, domainId: 1, hidden: 1, parentType: 1, parentId: 1, pin: -1, docId: -1 }, name: 'discussionNodeSort', sparse: true }, // Hidden doc { key: { domainId: 1, docType: 1, hidden: 1, docId: -1 }, name: 'hiddenDoc', sparse: true }, // For contest diff --git a/packages/hydrooj/src/model/domain.ts b/packages/hydrooj/src/model/domain.ts index 39fedd717..fb3ca8448 100644 --- a/packages/hydrooj/src/model/domain.ts +++ b/packages/hydrooj/src/model/domain.ts @@ -302,7 +302,7 @@ export async function apply(ctx: Context) { ctx.on('domain/delete-cache', async (domainId: string) => { const ddoc = await DomainModel.get(domainId); if (!ddoc) return; - for (const host of ddoc.hosts || []) { + for (const host of ddoc.host || []) { cache.delete(`host::${host}`); } cache.delete(`id::${domainId}`); diff --git a/packages/scoreboard-xcpcio/package.json b/packages/scoreboard-xcpcio/package.json index 40d473a59..2a54e69a1 100644 --- a/packages/scoreboard-xcpcio/package.json +++ b/packages/scoreboard-xcpcio/package.json @@ -7,6 +7,6 @@ "postinstall": "node -r @hydrooj/register install.ts" }, "dependencies": { - "@xcpcio/board-app": "^0.53.2" + "@xcpcio/board-app": "^0.54.0" } } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index d2c22ed25..6504e1721 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -7,9 +7,6 @@ "types": "api.ts", "repository": "https://github.com/hydro-dev/Hydro.git", "preferUnplugged": true, - "scripts": { - "lint": "eslint" - }, "hydro": { "cli": false }, @@ -25,7 +22,7 @@ "@fontsource/source-code-pro": "^5.2.5", "@fontsource/ubuntu-mono": "^5.2.5", "@hydrooj/utils": "workspace:^", - "@sentry/browser": "^9.7.0", + "@sentry/browser": "^9.8.0", "@sentry/webpack-plugin": "^3.2.2", "@simplewebauthn/browser": "13.1.0", "@svgr/webpack": "^8.1.0", @@ -70,7 +67,7 @@ "jquery.easing": "^1.4.1", "jquery.transit": "^0.9.12", "matchmedia-polyfill": "^0.3.2", - "md-editor-rt": "^5.4.2", + "md-editor-rt": "^5.4.3", "mini-css-extract-plugin": "^2.9.2", "moment": "^2.30.1", "monaco-editor": "0.52.2", diff --git a/packages/ui-next/package.json b/packages/ui-next/package.json index 89ed6e819..634751f32 100644 --- a/packages/ui-next/package.json +++ b/packages/ui-next/package.json @@ -13,11 +13,9 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@eslint/js": "^9.22.0", "@types/react": "^19.0.12", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react-swc": "^3.8.1", - "typescript": "~5.8.2", "vite": "^6.2.2" } }