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>
67 lines
2.4 KiB
TypeScript
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;
|
|
}
|