* refactor: reorganize package structure and decouple framework packages ## Package Structure Reorganization - Reorganized 55 packages into categorized subdirectories: - packages/framework/ - Generic framework (Laya/Cocos compatible) - packages/engine/ - ESEngine core modules - packages/rendering/ - Rendering modules (WASM dependent) - packages/physics/ - Physics modules - packages/streaming/ - World streaming - packages/network-ext/ - Network extensions - packages/editor/ - Editor framework and plugins - packages/rust/ - Rust WASM engine - packages/tools/ - Build tools and SDK ## Framework Package Decoupling - Decoupled behavior-tree and blueprint packages from ESEngine dependencies - Created abstracted interfaces (IBTAssetManager, IBehaviorTreeAssetContent) - ESEngine-specific code moved to esengine/ subpath exports - Framework packages now usable with Cocos/Laya without ESEngine ## CI Configuration - Updated CI to only type-check and lint framework packages - Added type-check:framework and lint:framework scripts ## Breaking Changes - Package import paths changed due to directory reorganization - ESEngine integrations now use subpath imports (e.g., '@esengine/behavior-tree/esengine') * fix: update es-engine file path after directory reorganization * docs: update README to focus on framework over engine * ci: only build framework packages, remove Rust/WASM dependencies * fix: remove esengine subpath from behavior-tree and blueprint builds ESEngine integration code will only be available in full engine builds. Framework packages are now purely engine-agnostic. * fix: move network-protocols to framework, build both in CI * fix: update workflow paths from packages/core to packages/framework/core * fix: exclude esengine folder from type-check in behavior-tree and blueprint * fix: update network tsconfig references to new paths * fix: add test:ci:framework to only test framework packages in CI * fix: only build core and math npm packages in CI * fix: exclude test files from CodeQL and fix string escaping security issue
61 lines
2.3 KiB
TypeScript
61 lines
2.3 KiB
TypeScript
import 'reflect-metadata';
|
|
import React from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import { setGlobalLogLevel, LogLevel } from '@esengine/ecs-framework';
|
|
import { invoke } from '@tauri-apps/api/core';
|
|
import App from './App';
|
|
import './styles/global.css';
|
|
import './styles/index.css';
|
|
|
|
// Set log level to Warn in production to reduce console noise
|
|
setGlobalLogLevel(LogLevel.Warn);
|
|
|
|
// 写入错误日志到文件
|
|
// Write error log to file
|
|
async function logErrorToFile(type: string, error: unknown) {
|
|
try {
|
|
const timestamp = new Date().toISOString();
|
|
const errorStr = error instanceof Error
|
|
? `${error.message}\n${error.stack || ''}`
|
|
: String(error);
|
|
const logEntry = `[${timestamp}] [${type}]\n${errorStr}\n${'='.repeat(80)}\n`;
|
|
|
|
// 写入用户目录下的日志文件
|
|
// Write to log file in user directory
|
|
const tempDir = await invoke<string>('get_temp_dir');
|
|
const logPath = `${tempDir}/esengine-editor-crash.log`;
|
|
await invoke('append_to_log', { path: logPath, content: logEntry });
|
|
console.log(`[Error logged to ${logPath}]`);
|
|
} catch (e) {
|
|
console.error('Failed to write error log:', e);
|
|
}
|
|
}
|
|
|
|
// Global error handlers to prevent silent crashes
|
|
// 全局错误处理器,防止静默崩溃
|
|
window.addEventListener('error', (event) => {
|
|
console.error('[Global Error]', event.error || event.message);
|
|
logErrorToFile('Global Error', event.error || event.message);
|
|
// Prevent default to stop page reload on uncaught errors
|
|
// 阻止默认行为,防止未捕获错误导致页面刷新
|
|
event.preventDefault();
|
|
});
|
|
|
|
window.addEventListener('unhandledrejection', (event) => {
|
|
console.error('[Unhandled Promise Rejection]', event.reason);
|
|
logErrorToFile('Unhandled Promise Rejection', event.reason);
|
|
// Prevent default to stop potential page reload
|
|
// 阻止默认行为,防止潜在的页面刷新
|
|
event.preventDefault();
|
|
});
|
|
|
|
// 记录应用启动,方便判断是否发生了刷新
|
|
// Log app start to help detect refreshes
|
|
logErrorToFile('App Start', `Editor started at ${new Date().toISOString()}`);
|
|
|
|
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
<React.StrictMode>
|
|
<App />
|
|
</React.StrictMode>
|
|
);
|