Files
ONE-OS/axhub-make/vite-plugins/virtualHtml/handlers/hackCssSaveHandler.ts
王冕 a27e3b8e43 feat: sync full workspace including web modules, docs, and configurations to Gitea
Optimized the root .gitignore to exclude virtual environments, node modules,
and temp folders to ensure clean and lightweight version tracking.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 18:12:25 +08:00

67 lines
2.4 KiB
TypeScript

import type { IncomingMessage, ServerResponse } from 'http';
import fs from 'fs';
import path from 'path';
import { mergeCss } from '../../utils/cssUtils';
export function handleHackCssSave(req: IncomingMessage, res: ServerResponse): boolean {
if (req.method === 'POST' && req.url?.startsWith('/api/hack-css/save')) {
let body = '';
req.on('data', chunk => {
body += chunk.toString();
});
req.on('end', () => {
try {
const { path: rawTargetPath, content } = JSON.parse(body);
const targetPath = decodeURIComponent(String(rawTargetPath || ''));
if (!targetPath) {
res.statusCode = 400;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ error: 'path is required' }));
return;
}
const pathParts = targetPath.split('/').filter(Boolean);
if (pathParts.length < 2 || !['components', 'prototypes'].includes(pathParts[0])) {
res.statusCode = 400;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ error: 'Invalid path format. Expected: components/xxx or prototypes/xxx' }));
return;
}
const hackCssPath = path.resolve(process.cwd(), 'src', targetPath, 'hack.css');
let existingCss = '';
if (fs.existsSync(hackCssPath)) {
existingCss = fs.readFileSync(hackCssPath, 'utf8');
}
const mergedCss = mergeCss(existingCss, content || '');
const warningComment = '/* @ai-agent-warning: Do not modify this file unless explicitly requested by the user */\n\n';
const finalCss = mergedCss.startsWith('/* @ai-agent-warning:')
? mergedCss
: warningComment + mergedCss;
fs.writeFileSync(hackCssPath, finalCss, 'utf8');
console.log('[API] ✅ 增量保存 hack.css:', hackCssPath);
res.statusCode = 200;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ success: true, path: hackCssPath, merged: mergedCss }));
} catch (err) {
console.error('[API] ❌ 保存 hack.css 失败:', err);
res.statusCode = 500;
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ error: 'Failed to save hack.css' }));
}
});
return true;
}
return false;
}