ui-next: format index.ts

This commit is contained in:
Baoshuo committed 2026-05-10 01:12:46 +08:00
1 parent 3575ad6578
commit 0d16157deb
1 file changed
+86 -86
+86 -86
View File
@@ -1,104 +1,104 @@
import fs from 'fs'; import fs from 'fs';
import path from 'path'; import path from 'path';
import { serializer } from '@hydrooj/framework';
import { Context } from 'hydrooj';
import importMetaUrlPlugin from '@chialab/esbuild-plugin-meta-url'; import importMetaUrlPlugin from '@chialab/esbuild-plugin-meta-url';
import react from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react';
import c2k from 'koa2-connect/ts'; import c2k from 'koa2-connect/ts';
import { createServer, type Plugin } from 'vite'; import { createServer, type Plugin } from 'vite';
import { serializer } from '@hydrooj/framework';
import { Context } from 'hydrooj';
import type { PageData } from './src/context/pageData'; import type { PageData } from './src/context/pageData';
const INJECT_MARKER = '<!-- __HYDRO_INJECTION__DO_NOT_REMOVE_THIS__ -->'; const INJECT_MARKER = '<!-- __HYDRO_INJECTION__DO_NOT_REMOVE_THIS__ -->';
const buildInject = (str: string) => `<script id="__HYDRO_INJECTION__" type="application/json">${str}</script>`; const buildInject = (str: string) => `<script id="__HYDRO_INJECTION__" type="application/json">${str}</script>`;
function hydroPlugins(): Plugin { function hydroPlugins(): Plugin {
const virtualModuleId = 'virtual:hydro-plugins'; const virtualModuleId = 'virtual:hydro-plugins';
const resolvedVirtualModuleId = `\0${virtualModuleId}`; const resolvedVirtualModuleId = `\0${virtualModuleId}`;
return { return {
name: 'hydro-plugins', name: 'hydro-plugins',
resolveId(id) { resolveId(id) {
if (id === virtualModuleId) { if (id === virtualModuleId) {
return resolvedVirtualModuleId; return resolvedVirtualModuleId;
} }
return undefined; return undefined;
}, },
load(id) { load(id) {
if (id === resolvedVirtualModuleId) { if (id === resolvedVirtualModuleId) {
const entries: string[] = []; const entries: string[] = [];
for (const addon of Object.values(global.addons)) { for (const addon of Object.values(global.addons)) {
const uiEntry = path.resolve(addon, 'ui', 'index.ts'); const uiEntry = path.resolve(addon, 'ui', 'index.ts');
if (fs.existsSync(uiEntry)) entries.push(uiEntry); if (fs.existsSync(uiEntry)) entries.push(uiEntry);
} }
if (!entries.length) return 'export default [];'; if (!entries.length) return 'export default [];';
const imports = entries.map((e, i) => `import * as plugin${i} from '${e}';`).join('\n'); const imports = entries.map((e, i) => `import * as plugin${i} from '${e}';`).join('\n');
const exports = `export default [${entries.map((_, i) => `plugin${i}`).join(', ')}];`; const exports = `export default [${entries.map((_, i) => `plugin${i}`).join(', ')}];`;
return `${imports}\n${exports}`; return `${imports}\n${exports}`;
} }
return undefined; return undefined;
}, },
}; };
} }
export async function apply(ctx: Context) { export async function apply(ctx: Context) {
if (process.env.HYDRO_CLI) return; if (process.env.HYDRO_CLI) return;
// 现在只是开发环境的实现,生产环境的实现还未完成 // 现在只是开发环境的实现,生产环境的实现还未完成
const vite = await createServer({ const vite = await createServer({
server: { server: {
middlewareMode: true, middlewareMode: true,
hmr: { hmr: {
port: 3010, port: 3010,
}, },
headers: { headers: {
'Cross-Origin-Opener-Policy': 'same-origin', 'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp', 'Cross-Origin-Embedder-Policy': 'require-corp',
}, },
// allowedHosts: ['beta.hydro.ac'], // allowedHosts: ['beta.hydro.ac'],
}, },
appType: 'custom', appType: 'custom',
root: __dirname, root: __dirname,
base: '/', base: '/',
plugins: [react(), hydroPlugins()], plugins: [react(), hydroPlugins()],
optimizeDeps: { optimizeDeps: {
esbuildOptions: { esbuildOptions: {
plugins: [ plugins: [
// @ts-ignore // @ts-ignore
importMetaUrlPlugin(), importMetaUrlPlugin(),
], ],
}, },
}, },
worker: { worker: {
format: 'es', format: 'es',
}, },
}); });
const middleware = c2k(vite.middlewares); const middleware = c2k(vite.middlewares);
const capture = ['/@vite/', '/src/', '/node_modules/', '/@react-refresh', '/@fs', '/@id/']; const capture = ['/@vite/', '/src/', '/node_modules/', '/@react-refresh', '/@fs', '/@id/'];
for (const route of capture) { for (const route of capture) {
ctx.server.addCaptureRoute(route, middleware); ctx.server.addCaptureRoute(route, middleware);
} }
const html = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8'); const html = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8');
ctx.server.registerRenderer('next', { ctx.server.registerRenderer('next', {
name: 'next', name: 'next',
accept: [], accept: [],
output: 'html', output: 'html',
asFallback: true, asFallback: true,
priority: 100, priority: 100,
async render(name, args, context) { async render(name, args, context) {
const data: PageData = { const data: PageData = {
HYDRO_INJECTED: true, HYDRO_INJECTED: true,
name, name,
args, args,
url: context.handler.context.req.url, url: context.handler.context.req.url!,
routeMap: ctx.server.routeMap, routeMap: ctx.server.routeMap,
}; };
const serialized = JSON.stringify(data, serializer(false, context.handler)); const serialized = JSON.stringify(data, serializer(false, context.handler));
const htmlToRender = html.replace(INJECT_MARKER, buildInject(serialized)); const htmlToRender = html.replace(INJECT_MARKER, buildInject(serialized));
return await vite.transformIndexHtml(context.handler.context.req.url!, htmlToRender); return await vite.transformIndexHtml(context.handler.context.req.url!, htmlToRender);
}, },
}); });
// eslint-disable-next-line consistent-return // eslint-disable-next-line consistent-return
return async () => { return async () => {
await vite.close().catch((e) => console.error(e)); await vite.close().catch((e) => console.error(e));
}; };
} }