This commit is contained in:
undefined committed 2025-03-08 18:20:23 +08:00
1 parent 0aecafcd00
commit 4c086db05c
4 files changed
+13 -16

No files matched your search

+2 -3
View File
@@ -712,14 +712,13 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`);
this.ctx.on(`handler/register/${name}`, callback as any); this.ctx.on(`handler/register/${name}`, callback as any);
} }
// FIXME: should be typeof Handler<Context> instead of any
// eslint-disable-next-line @typescript-eslint/naming-convention // eslint-disable-next-line @typescript-eslint/naming-convention
public Route(name: string, path: string, RouteHandler: any, ...permPrivChecker) { public Route(name: string, path: string, RouteHandler: typeof Handler<C>, ...permPrivChecker) {
return this.register('route', name, path, RouteHandler, ...permPrivChecker); return this.register('route', name, path, RouteHandler, ...permPrivChecker);
} }
// eslint-disable-next-line @typescript-eslint/naming-convention // eslint-disable-next-line @typescript-eslint/naming-convention
public Connection(name: string, path: string, RouteHandler: any, ...permPrivChecker) { public Connection(name: string, path: string, RouteHandler: typeof ConnectionHandler<C>, ...permPrivChecker) {
return this.register('conn', name, path, RouteHandler, ...permPrivChecker); return this.register('conn', name, path, RouteHandler, ...permPrivChecker);
} }
+2 -2
View File
@@ -40,12 +40,12 @@ export class ConfigService extends Service {
applyDelta(source: any, key: string, value: any) { applyDelta(source: any, key: string, value: any) {
const path = key.split('.'); const path = key.split('.');
if (path.filter((i) => ['__proto__', 'prototype'].includes(i)).length) return false; if (path.filter((i) => ['__proto__', 'prototype', 'constructor'].includes(i)).length) return false;
const t = path.pop(); const t = path.pop();
const root = JSON.parse(JSON.stringify(source)); const root = JSON.parse(JSON.stringify(source));
let cursor = root; let cursor = root;
for (const p of path) { for (const p of path) {
cursor[p] ||= {}; cursor[p] ??= {};
cursor = cursor[p]; cursor = cursor[p];
} }
cursor[t] = value; cursor[t] = value;
+6 -5
View File
@@ -25,13 +25,14 @@ const page = new NamedPage('manage_config', async () => {
const { monaco, registerAction, renderMarkdown } = await load(['yaml']); const { monaco, registerAction, renderMarkdown } = await load(['yaml']);
const KForm = applyVueInReact(form.Form) as any; const KForm = applyVueInReact(form.Form) as any;
function MarkdownContainer(props) { function MarkdownContainer({ source }) {
const rendered = React.useMemo(() => { const rendered = React.useMemo(() => {
const res = renderMarkdown({ value: props.source }); const res = renderMarkdown({ value: source });
const value = res.element.innerHTML; const value = res.element.innerHTML;
res.dispose(); res.dispose();
return value; return value;
}, [props.source]); }, [source]);
// Markdown snippet come from trusted backend code, no need to sanitize here
return <div dangerouslySetInnerHTML={{ __html: rendered }} />; return <div dangerouslySetInnerHTML={{ __html: rendered }} />;
} }
const [, ReactMissVue] = createReactMissVue({ const [, ReactMissVue] = createReactMissVue({
@@ -62,8 +63,8 @@ const page = new NamedPage('manage_config', async () => {
if (!editor) return; if (!editor) return;
editor.layout(); editor.layout();
}; };
document.addEventListener('resize', listener); window.addEventListener('resize', listener);
return () => document.removeEventListener('resize', listener); return () => window.removeEventListener('resize', listener);
}, [editor]); }, [editor]);
React.useEffect(() => { React.useEffect(() => {
if (!editorRef.current || loading) return; if (!editorRef.current || loading) return;
+3 -6
View File
@@ -3,12 +3,10 @@ import importMetaUrlPlugin from '@codingame/esbuild-import-meta-url-plugin';
import react from '@vitejs/plugin-react-swc'; import react from '@vitejs/plugin-react-swc';
import c2k from 'koa2-connect'; import c2k from 'koa2-connect';
import _ from 'lodash'; import _ from 'lodash';
import fs from 'fs';
import { createServer } from 'vite'; import { createServer } from 'vite';
import { } from '@hydrooj/framework'; import { } from '@hydrooj/framework';
import { import { Context } from 'hydrooj';
BadRequestError, Context, db, DocumentModel, Handler, ObjectId, param, ProblemModel, RecordModel, SettingModel,
StorageModel,
} from 'hydrooj';
export async function apply(ctx: Context) { export async function apply(ctx: Context) {
if (process.env.HYDRO_CLI) return; if (process.env.HYDRO_CLI) return;
@@ -45,8 +43,7 @@ export async function apply(ctx: Context) {
for (const route of capture) { for (const route of capture) {
ctx.server.addCaptureRoute(route, middleware); ctx.server.addCaptureRoute(route, middleware);
} }
const html = require('fs').readFileSync(path.join(__dirname, 'index.html'), 'utf-8'); const html = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8');
console.log(html);
ctx.server.registerRenderer('next', { ctx.server.registerRenderer('next', {
name: 'next', name: 'next',
accept: ['main.html'], accept: ['main.html'],