diff --git a/packages/editor-app/vite.config.ts b/packages/editor-app/vite.config.ts index dbe740e4..c8a6c266 100644 --- a/packages/editor-app/vite.config.ts +++ b/packages/editor-app/vite.config.ts @@ -223,6 +223,7 @@ function copyEngineModulesPlugin(): Plugin { for (const pattern of includes) { // Convert glob pattern to regex const regexPattern = pattern + .replace(/\\/g, '\\\\') .replace(/\./g, '\\.') .replace(/\*/g, '.*') .replace(/\?/g, '.'); diff --git a/packages/editor-core/src/Services/Build/pipelines/WebBuildPipeline.ts b/packages/editor-core/src/Services/Build/pipelines/WebBuildPipeline.ts index 91a6bc37..f6f230a3 100644 --- a/packages/editor-core/src/Services/Build/pipelines/WebBuildPipeline.ts +++ b/packages/editor-core/src/Services/Build/pipelines/WebBuildPipeline.ts @@ -711,6 +711,7 @@ export class WebBuildPipeline implements IBuildPipeline { for (const pattern of includes) { const regexPattern = pattern + .replace(/\\/g, '\\\\') .replace(/\./g, '\\.') .replace(/\*/g, '.*') .replace(/\?/g, '.'); @@ -1115,16 +1116,6 @@ export class WebBuildPipeline implements IBuildPipeline { } } - const esEngineDir = `${context.outputDir}/libs/es-engine`; - const hasWasm = await fs.pathExists(esEngineDir); - let wasmFileName = 'es_engine_bg.wasm'; - if (hasWasm) { - const wasmFiles = await fs.listFilesByExtension(esEngineDir, ['.wasm']); - if (wasmFiles.length > 0) { - wasmFileName = wasmFiles[0].split(/[/\\]/).pop() || wasmFileName; - } - } - const useBundledModules = webConfig.bundleModules !== false; let importMapScript = ''; let pluginImportCode = ''; diff --git a/packages/rapier2d/src/control/character_controller.ts b/packages/rapier2d/src/control/character_controller.ts index 8e536392..e27c32b8 100644 --- a/packages/rapier2d/src/control/character_controller.ts +++ b/packages/rapier2d/src/control/character_controller.ts @@ -91,8 +91,9 @@ export class KinematicCharacterController { */ public setUp(vector: Vector) { let rawVect = VectorOps.intoRaw(vector); - return this.raw.setUp(rawVect); + const result = this.raw.setUp(rawVect); rawVect.free(); + return result; } public applyImpulsesToDynamicBodies(): boolean { diff --git a/packages/rapier2d/src/control/ray_cast_vehicle_controller.ts b/packages/rapier2d/src/control/ray_cast_vehicle_controller.ts index fa65b3e3..3268d1de 100644 --- a/packages/rapier2d/src/control/ray_cast_vehicle_controller.ts +++ b/packages/rapier2d/src/control/ray_cast_vehicle_controller.ts @@ -28,6 +28,9 @@ export class DynamicRayCastVehicleController { bodies: RigidBodySet, colliders: ColliderSet, ) { + if (typeof RawDynamicRayCastVehicleController === 'undefined') { + throw new Error('DynamicRayCastVehicleController is not available in 2D mode'); + } this.raw = new RawDynamicRayCastVehicleController(chassis.handle); this.broadPhase = broadPhase; this.narrowPhase = narrowPhase; diff --git a/packages/shader-editor/src/analysis/ShaderAnalyzer.ts b/packages/shader-editor/src/analysis/ShaderAnalyzer.ts index 42bfb421..5aadbb2e 100644 --- a/packages/shader-editor/src/analysis/ShaderAnalyzer.ts +++ b/packages/shader-editor/src/analysis/ShaderAnalyzer.ts @@ -186,9 +186,9 @@ export class ShaderAnalyzer { * 从源代码中移除注释。 */ private removeComments(source: string): string { - // Remove single-line comments. - // 移除单行注释。 - let result = source.replace(/\/\/.*$/gm, ''); + // Remove single-line comments (non-greedy, stop at newline). + // 移除单行注释(非贪婪,遇到换行停止)。 + let result = source.replace(/\/\/[^\n\r]*/g, ''); // Remove multi-line comments. // 移除多行注释。 result = result.replace(/\/\*[\s\S]*?\*\//g, ''); diff --git a/packages/shader-editor/src/components/ShaderEditorPanel.tsx b/packages/shader-editor/src/components/ShaderEditorPanel.tsx index 3ed685d8..1a1a35e2 100644 --- a/packages/shader-editor/src/components/ShaderEditorPanel.tsx +++ b/packages/shader-editor/src/components/ShaderEditorPanel.tsx @@ -38,7 +38,7 @@ export function ShaderEditorPanel({ filePath: propFilePath }: ShaderEditorPanelP const [activeTab, setActiveTab] = useState<'vertex' | 'fragment'>('fragment'); const [showAnalysis, setShowAnalysis] = useState(true); - const [showPreview, setShowPreview] = useState(true); + const [_showPreview, _setShowPreview] = useState(true); const [vertexAnalysis, setVertexAnalysis] = useState(null); const [fragmentAnalysis, setFragmentAnalysis] = useState(null); const [compileError, setCompileError] = useState(null); diff --git a/packages/sprite-editor/src/SpriteComponentInspector.tsx b/packages/sprite-editor/src/SpriteComponentInspector.tsx index ceceb64b..7ae0a4b5 100644 --- a/packages/sprite-editor/src/SpriteComponentInspector.tsx +++ b/packages/sprite-editor/src/SpriteComponentInspector.tsx @@ -9,7 +9,7 @@ import React, { useState, useEffect, useMemo, useCallback } from 'react'; import { Component, Core, getComponentInstanceTypeName } from '@esengine/ecs-framework'; import { IComponentInspector, ComponentInspectorContext, MessageHub, IFileSystemService, IFileSystem, ProjectService } from '@esengine/editor-core'; -import { SpriteComponent, MaterialOverrides, MaterialPropertyOverride } from '@esengine/sprite'; +import { SpriteComponent, MaterialPropertyOverride } from '@esengine/sprite'; import { getMaterialManager, Material, BlendMode, BuiltInShaders, UniformType } from '@esengine/material-system'; import { ChevronDown, ChevronRight, X, Plus, Save, ExternalLink, RefreshCw } from 'lucide-react'; import './SpriteComponentInspector.css'; diff --git a/packages/tilemap-editor/src/components/TilemapViewport.tsx b/packages/tilemap-editor/src/components/TilemapViewport.tsx index a1fd6c8f..3b2e2f57 100644 --- a/packages/tilemap-editor/src/components/TilemapViewport.tsx +++ b/packages/tilemap-editor/src/components/TilemapViewport.tsx @@ -45,7 +45,7 @@ export const TilemapViewport: React.FC = ({ panX, panY, showGrid, - showCollision, + showCollision: _showCollision, selectedTiles, brushSize, currentLayer, @@ -63,12 +63,12 @@ export const TilemapViewport: React.FC = ({ const [isPanning, setIsPanning] = useState(false); const [lastPanPos, setLastPanPos] = useState({ x: 0, y: 0 }); - const [mousePos, setMousePos] = useState<{ tileX: number; tileY: number } | null>(null); + const [_mousePos, setMousePos] = useState<{ tileX: number; tileY: number } | null>(null); const [spacePressed, setSpacePressed] = useState(false); - // Get canvas size - const canvasWidth = tilemap.width * tileWidth; - const canvasHeight = tilemap.height * tileHeight; + // Get canvas size (reserved for future virtual scrolling) + const _canvasWidth = tilemap.width * tileWidth; + const _canvasHeight = tilemap.height * tileHeight; // Initialize viewport service useEffect(() => { diff --git a/packages/tilemap-editor/src/components/TilesetPreview.tsx b/packages/tilemap-editor/src/components/TilesetPreview.tsx index 91fef26e..f9f5b757 100644 --- a/packages/tilemap-editor/src/components/TilesetPreview.tsx +++ b/packages/tilemap-editor/src/components/TilesetPreview.tsx @@ -223,7 +223,7 @@ export const TilesetPreview: React.FC = ({ }); }; - const handleCloseContextMenu = () => { + const _handleCloseContextMenu = () => { setContextMenu(null); }; diff --git a/packages/tilemap-editor/src/components/panels/TileSetSelectorPanel.tsx b/packages/tilemap-editor/src/components/panels/TileSetSelectorPanel.tsx index 392690a5..70ccdc75 100644 --- a/packages/tilemap-editor/src/components/panels/TileSetSelectorPanel.tsx +++ b/packages/tilemap-editor/src/components/panels/TileSetSelectorPanel.tsx @@ -49,7 +49,7 @@ export const TileSetSelectorPanel: React.FC = ({ } = useTilemapEditorStore(); const [showTilesetDropdown, setShowTilesetDropdown] = useState(false); - const [previewZoom, setPreviewZoom] = useState(1); + const [_previewZoom, _setPreviewZoom] = useState(1); const [editingAnimationTileId, setEditingAnimationTileId] = useState(null); // Get animated tile IDs from tileset diff --git a/packages/tilemap-editor/src/components/panels/TilemapDetailsPanel.tsx b/packages/tilemap-editor/src/components/panels/TilemapDetailsPanel.tsx index a3087401..bc63a854 100644 --- a/packages/tilemap-editor/src/components/panels/TilemapDetailsPanel.tsx +++ b/packages/tilemap-editor/src/components/panels/TilemapDetailsPanel.tsx @@ -3,7 +3,7 @@ * Tilemap 详情面板 - 右侧分组属性面板 */ -import React, { useState, useCallback, useRef, useEffect } from 'react'; +import React, { useState, useCallback, useRef } from 'react'; import { ChevronDown, ChevronRight, @@ -412,7 +412,7 @@ export const TilemapDetailsPanel: React.FC = ({ // Colors for grid (editor settings, not layer properties) const [tileGridColor, setTileGridColor] = useState('#333333'); const [multiTileGridColor, setMultiTileGridColor] = useState('#ff0000'); - const [layerGridColor, setLayerGridColor] = useState('#00ff00'); + const [_layerGridColor, _setLayerGridColor] = useState('#00ff00'); const handleLayerSelect = useCallback((index: number) => { setCurrentLayer(index); diff --git a/packages/tilemap-editor/src/components/panels/TilemapEditorPanel.tsx b/packages/tilemap-editor/src/components/panels/TilemapEditorPanel.tsx index e5934a7e..a9a0b0e5 100644 --- a/packages/tilemap-editor/src/components/panels/TilemapEditorPanel.tsx +++ b/packages/tilemap-editor/src/components/panels/TilemapEditorPanel.tsx @@ -18,13 +18,12 @@ import { FolderOpen, File, Image as ImageIcon, - ChevronDown, AlertTriangle, Box, Map } from 'lucide-react'; -import { Core, Entity } from '@esengine/ecs-framework'; -import { MessageHub, ProjectService, IFileSystemService, type IFileSystem, IDialogService, type IDialog } from '@esengine/editor-core'; +import { Core } from '@esengine/ecs-framework'; +import { MessageHub, ProjectService, IFileSystemService, type IFileSystem, type IDialog } from '@esengine/editor-core'; import { TilemapComponent, type ITilesetData, type ResizeAnchor } from '@esengine/tilemap'; import { useTilemapEditorStore, type TilemapToolType, type LayerState } from '../../stores/TilemapEditorStore'; import { TilemapCanvas } from '../TilemapCanvas'; @@ -567,7 +566,7 @@ const PanelDivider: React.FC = ({ onDrag, direction }) => { export const TilemapEditorPanel: React.FC = ({ messageHub: propMessageHub }) => { const [tilemap, setTilemap] = useState(null); - const [entity, setEntity] = useState(null); + const [_entity, setEntity] = useState(null); // Panel widths for resizable layout - smaller defaults to give viewport more space const [leftPanelWidth, setLeftPanelWidth] = useState(180); @@ -595,12 +594,12 @@ export const TilemapEditorPanel: React.FC = ({ messageH entityId, pendingFilePath, currentFilePath, - currentTool, + currentTool: _currentTool, zoom, showGrid, - showCollision, - editingCollision, - tileWidth, + showCollision: _showCollision, + editingCollision: _editingCollision, + tileWidth: _tileWidth, tileHeight, tilesetImageUrl, tilesetColumns, @@ -608,11 +607,11 @@ export const TilemapEditorPanel: React.FC = ({ messageH setEntityId, setPendingFilePath, setCurrentFilePath, - setCurrentTool, + setCurrentTool: _setCurrentTool, setZoom, setShowGrid, setShowCollision, - setEditingCollision, + setEditingCollision: _setEditingCollision, setPan, setTileset, setLayers, @@ -989,8 +988,8 @@ export const TilemapEditorPanel: React.FC = ({ messageH setPan(0, 0); }; - // 退出全屏模式 - const handleExitFullscreen = useCallback(() => { + // 退出全屏模式 (reserved for future use) + const _handleExitFullscreen = useCallback(() => { messageHub?.publish('editor:fullscreen', { fullscreen: false }); }, [messageHub]); diff --git a/packages/tilemap-editor/src/index.ts b/packages/tilemap-editor/src/index.ts index de76fe8b..a03a9dbf 100644 --- a/packages/tilemap-editor/src/index.ts +++ b/packages/tilemap-editor/src/index.ts @@ -3,7 +3,6 @@ * Tilemap Editor Module Entry */ -import React from 'react'; import type { ServiceContainer, Entity } from '@esengine/ecs-framework'; import { Core } from '@esengine/ecs-framework'; import type { @@ -24,7 +23,6 @@ import { ComponentRegistry, IDialogService, IFileSystemService, - UIRegistry, FileActionRegistry } from '@esengine/editor-core'; import type { IDialog, IFileSystem } from '@esengine/editor-core'; diff --git a/packages/tilemap/src/TilemapComponent.ts b/packages/tilemap/src/TilemapComponent.ts index c8c86c1c..1a2e0775 100644 --- a/packages/tilemap/src/TilemapComponent.ts +++ b/packages/tilemap/src/TilemapComponent.ts @@ -1025,8 +1025,8 @@ export class TilemapComponent extends Component implements IResourceComponent { // Parse anchor to get X and Y alignment // 解析锚点获取X和Y方向的对齐方式 - let xAnchor: 'start' | 'center' | 'end' = 'start'; - let yAnchor: 'start' | 'center' | 'end' = 'end'; // 'end' means bottom in Y-up system + let xAnchor: 'start' | 'center' | 'end'; + let yAnchor: 'start' | 'center' | 'end'; if (anchor.includes('left')) xAnchor = 'start'; else if (anchor.includes('right')) xAnchor = 'end'; diff --git a/packages/ui/src/systems/UICanvasScalerSystem.ts b/packages/ui/src/systems/UICanvasScalerSystem.ts index 66620b0e..9935ae12 100644 --- a/packages/ui/src/systems/UICanvasScalerSystem.ts +++ b/packages/ui/src/systems/UICanvasScalerSystem.ts @@ -263,20 +263,8 @@ export class UICanvasScalerSystem extends EntitySystem { const safeArea = entity.getComponent(UISafeAreaComponent); if (safeArea) { safeArea.update(); - - // 将安全区域转换为设计单位 - // Convert safe area to design units - const scaledInsets = { - top: safeArea.appliedInsets.top / finalScale, - right: safeArea.appliedInsets.right / finalScale, - bottom: safeArea.appliedInsets.bottom / finalScale, - left: safeArea.appliedInsets.left / finalScale - }; - - // 调整画布有效尺寸(可选,取决于使用方式) - // 这里不直接修改画布尺寸,而是让 UI 元素通过锚点适配 - // Adjust effective canvas size (optional, depends on usage) - // Here we don't modify canvas size directly, let UI elements adapt via anchors + // 安全区域已更新,UI 元素通过锚点适配 + // Safe area updated, UI elements adapt via anchors } } diff --git a/scripts/update-module-sizes.mjs b/scripts/update-module-sizes.mjs index 490c585a..70428cb1 100644 --- a/scripts/update-module-sizes.mjs +++ b/scripts/update-module-sizes.mjs @@ -40,18 +40,26 @@ function updateModuleSizes() { const stat = fs.statSync(distIndexPath); const actualSize = stat.size; - // Read module.json - const moduleJson = JSON.parse(fs.readFileSync(moduleJsonPath, 'utf-8')); - const oldSize = moduleJson.estimatedSize; + // Read module.json - use file descriptor to avoid race condition + const fd = fs.openSync(moduleJsonPath, 'r+'); + try { + const content = fs.readFileSync(fd, 'utf-8'); + const moduleJson = JSON.parse(content); + const oldSize = moduleJson.estimatedSize; - // Update if different - if (oldSize !== actualSize) { - moduleJson.estimatedSize = actualSize; - fs.writeFileSync(moduleJsonPath, JSON.stringify(moduleJson, null, 2) + '\n'); - const oldKB = oldSize ? (oldSize / 1024).toFixed(1) : 'N/A'; - const newKB = (actualSize / 1024).toFixed(1); - console.log(` ${pkg}: ${oldKB} KB -> ${newKB} KB`); - updated++; + // Update if different + if (oldSize !== actualSize) { + moduleJson.estimatedSize = actualSize; + const newContent = JSON.stringify(moduleJson, null, 2) + '\n'; + fs.ftruncateSync(fd, 0); + fs.writeSync(fd, newContent, 0, 'utf-8'); + const oldKB = oldSize ? (oldSize / 1024).toFixed(1) : 'N/A'; + const newKB = (actualSize / 1024).toFixed(1); + console.log(` ${pkg}: ${oldKB} KB -> ${newKB} KB`); + updated++; + } + } finally { + fs.closeSync(fd); } } catch (err) { console.error(` Error processing ${pkg}:`, err.message); diff --git a/thirdparty/rapier.js/src.ts/control/character_controller.ts b/thirdparty/rapier.js/src.ts/control/character_controller.ts index 8e536392..e27c32b8 100644 --- a/thirdparty/rapier.js/src.ts/control/character_controller.ts +++ b/thirdparty/rapier.js/src.ts/control/character_controller.ts @@ -91,8 +91,9 @@ export class KinematicCharacterController { */ public setUp(vector: Vector) { let rawVect = VectorOps.intoRaw(vector); - return this.raw.setUp(rawVect); + const result = this.raw.setUp(rawVect); rawVect.free(); + return result; } public applyImpulsesToDynamicBodies(): boolean { diff --git a/thirdparty/rapier.js/src.ts/control/ray_cast_vehicle_controller.ts b/thirdparty/rapier.js/src.ts/control/ray_cast_vehicle_controller.ts index fa65b3e3..3268d1de 100644 --- a/thirdparty/rapier.js/src.ts/control/ray_cast_vehicle_controller.ts +++ b/thirdparty/rapier.js/src.ts/control/ray_cast_vehicle_controller.ts @@ -28,6 +28,9 @@ export class DynamicRayCastVehicleController { bodies: RigidBodySet, colliders: ColliderSet, ) { + if (typeof RawDynamicRayCastVehicleController === 'undefined') { + throw new Error('DynamicRayCastVehicleController is not available in 2D mode'); + } this.raw = new RawDynamicRayCastVehicleController(chassis.handle); this.broadPhase = broadPhase; this.narrowPhase = narrowPhase;