typescript-to-gdscript 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/cli/convert.d.ts.map +1 -1
- package/dist/cli/convert.js +15 -5
- package/dist/cli/convert.js.map +1 -1
- package/dist/converter/ts-to-gd/access-rewrite.d.ts +40 -0
- package/dist/converter/ts-to-gd/access-rewrite.d.ts.map +1 -0
- package/dist/converter/ts-to-gd/access-rewrite.js +124 -0
- package/dist/converter/ts-to-gd/access-rewrite.js.map +1 -0
- package/dist/converter/ts-to-gd/expressions.d.ts.map +1 -1
- package/dist/converter/ts-to-gd/expressions.js +31 -7
- package/dist/converter/ts-to-gd/expressions.js.map +1 -1
- package/dist/watcher/check.d.ts +87 -0
- package/dist/watcher/check.d.ts.map +1 -0
- package/dist/watcher/check.js +209 -0
- package/dist/watcher/check.js.map +1 -0
- package/dist/watcher/heal.d.ts +66 -0
- package/dist/watcher/heal.d.ts.map +1 -0
- package/dist/watcher/heal.js +132 -0
- package/dist/watcher/heal.js.map +1 -0
- package/dist/watcher/index.d.ts +1 -0
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +48 -52
- package/dist/watcher/index.js.map +1 -1
- package/package.json +1 -1
- package/typings/classes/AccessibilityServer.d.ts +405 -0
- package/typings/classes/AnimationLibrary.d.ts +4 -4
- package/typings/classes/AnimationNodeBlendSpace1D.d.ts +45 -4
- package/typings/classes/AnimationNodeBlendSpace2D.d.ts +45 -4
- package/typings/classes/Area3D.d.ts +14 -7
- package/typings/classes/AreaLight3D.d.ts +37 -0
- package/typings/classes/ArrayMesh.d.ts +15 -0
- package/typings/classes/AudioEffectAmplify.d.ts +2 -2
- package/typings/classes/AudioEffectBandLimitFilter.d.ts +1 -1
- package/typings/classes/AudioEffectBandPassFilter.d.ts +1 -1
- package/typings/classes/AudioEffectCapture.d.ts +10 -9
- package/typings/classes/AudioEffectChorus.d.ts +57 -28
- package/typings/classes/AudioEffectCompressor.d.ts +11 -9
- package/typings/classes/AudioEffectDelay.d.ts +21 -15
- package/typings/classes/AudioEffectDistortion.d.ts +19 -10
- package/typings/classes/AudioEffectEQ.d.ts +2 -2
- package/typings/classes/AudioEffectEQ10.d.ts +2 -2
- package/typings/classes/AudioEffectEQ21.d.ts +2 -2
- package/typings/classes/AudioEffectEQ6.d.ts +2 -2
- package/typings/classes/AudioEffectFilter.d.ts +25 -9
- package/typings/classes/AudioEffectHardLimiter.d.ts +8 -5
- package/typings/classes/AudioEffectHighPassFilter.d.ts +1 -1
- package/typings/classes/AudioEffectHighShelfFilter.d.ts +1 -1
- package/typings/classes/AudioEffectInstance.d.ts +1 -1
- package/typings/classes/AudioEffectLimiter.d.ts +9 -4
- package/typings/classes/AudioEffectLowPassFilter.d.ts +1 -1
- package/typings/classes/AudioEffectLowShelfFilter.d.ts +1 -1
- package/typings/classes/AudioEffectNotchFilter.d.ts +1 -1
- package/typings/classes/AudioEffectPanner.d.ts +7 -2
- package/typings/classes/AudioEffectPhaser.d.ts +9 -7
- package/typings/classes/AudioEffectPitchShift.d.ts +3 -3
- package/typings/classes/AudioEffectReverb.d.ts +17 -8
- package/typings/classes/AudioEffectSpectrumAnalyzer.d.ts +4 -5
- package/typings/classes/AudioEffectStereoEnhance.d.ts +7 -4
- package/typings/classes/AudioServer.d.ts +2 -2
- package/typings/classes/AudioStreamPlaybackResampled.d.ts +8 -0
- package/typings/classes/AudioStreamRandomizer.d.ts +10 -0
- package/typings/classes/AwaitTweener.d.ts +10 -0
- package/typings/classes/BaseButton.d.ts +1 -1
- package/typings/classes/Basis.d.ts +6 -2
- package/typings/classes/BlitMaterial.d.ts +22 -0
- package/typings/classes/CPUParticles2D.d.ts +2 -2
- package/typings/classes/CPUParticles3D.d.ts +2 -2
- package/typings/classes/Camera3D.d.ts +1 -1
- package/typings/classes/CameraAttributes.d.ts +1 -0
- package/typings/classes/CameraFeed.d.ts +4 -0
- package/typings/classes/CanvasItem.d.ts +16 -1
- package/typings/classes/CodeEdit.d.ts +6 -0
- package/typings/classes/CollisionObject2D.d.ts +6 -0
- package/typings/classes/CollisionPolygon2D.d.ts +5 -0
- package/typings/classes/CollisionShape2D.d.ts +5 -0
- package/typings/classes/Container.d.ts +7 -0
- package/typings/classes/Control.d.ts +127 -9
- package/typings/classes/Curve.d.ts +26 -1
- package/typings/classes/Curve2D.d.ts +15 -0
- package/typings/classes/Curve3D.d.ts +20 -0
- package/typings/classes/DPITexture.d.ts +14 -0
- package/typings/classes/Decal.d.ts +1 -0
- package/typings/classes/Dictionary.d.ts +1 -0
- package/typings/classes/DirAccess.d.ts +6 -1
- package/typings/classes/DisplayServer.d.ts +161 -9
- package/typings/classes/DrawableTexture2D.d.ts +43 -0
- package/typings/classes/EditorCommandPalette.d.ts +0 -2
- package/typings/classes/EditorContextMenuPlugin.d.ts +4 -0
- package/typings/classes/EditorDock.d.ts +10 -5
- package/typings/classes/EditorExportPlatform.d.ts +4 -2
- package/typings/classes/EditorExportPlugin.d.ts +7 -0
- package/typings/classes/EditorFeatureProfile.d.ts +1 -1
- package/typings/classes/EditorFileSystem.d.ts +2 -0
- package/typings/classes/EditorInspector.d.ts +10 -0
- package/typings/classes/EditorInterface.d.ts +6 -4
- package/typings/classes/EditorNode3DGizmoPlugin.d.ts +4 -0
- package/typings/classes/EditorPlugin.d.ts +4 -4
- package/typings/classes/EditorResourcePicker.d.ts +2 -1
- package/typings/classes/EditorSceneFormatImporter.d.ts +23 -0
- package/typings/classes/EditorSettings.d.ts +241 -140
- package/typings/classes/EditorSpinSlider.d.ts +6 -0
- package/typings/classes/EditorTranslationParserPlugin.d.ts +4 -0
- package/typings/classes/EditorVCSInterface.d.ts +6 -2
- package/typings/classes/Environment.d.ts +7 -2
- package/typings/classes/FileAccess.d.ts +1 -1
- package/typings/classes/FileDialog.d.ts +16 -1
- package/typings/classes/FoldableContainer.d.ts +1 -1
- package/typings/classes/Font.d.ts +15 -3
- package/typings/classes/FontVariation.d.ts +10 -0
- package/typings/classes/GDScript.d.ts +8 -0
- package/typings/classes/GDScriptLanguageProtocol.d.ts +25 -0
- package/typings/classes/GDScriptSyntaxHighlighter.d.ts +6 -0
- package/typings/classes/GDScriptTextDocument.d.ts +27 -0
- package/typings/classes/GDScriptWorkspace.d.ts +17 -0
- package/typings/classes/GPUParticles2D.d.ts +2 -2
- package/typings/classes/GPUParticles3D.d.ts +19 -2
- package/typings/classes/Geometry2D.d.ts +2 -2
- package/typings/classes/GeometryInstance3D.d.ts +1 -1
- package/typings/classes/GradientTexture2D.d.ts +2 -0
- package/typings/classes/Image.d.ts +7 -4
- package/typings/classes/ImageFormatLoader.d.ts +5 -0
- package/typings/classes/ImageTexture.d.ts +0 -2
- package/typings/classes/ImporterMesh.d.ts +6 -0
- package/typings/classes/Input.d.ts +159 -15
- package/typings/classes/InputEvent.d.ts +8 -0
- package/typings/classes/InputEventGesture.d.ts +2 -3
- package/typings/classes/InputEventMouse.d.ts +2 -3
- package/typings/classes/InputEventMouseMotion.d.ts +2 -2
- package/typings/classes/InputEventWithModifiers.d.ts +2 -3
- package/typings/classes/InputMap.d.ts +3 -0
- package/typings/classes/ItemList.d.ts +29 -2
- package/typings/classes/IterateIK3D.d.ts +6 -3
- package/typings/classes/JavaClassWrapper.d.ts +13 -0
- package/typings/classes/JavaScriptBridge.d.ts +1 -1
- package/typings/classes/Joint3D.d.ts +1 -0
- package/typings/classes/Label.d.ts +1 -0
- package/typings/classes/LabelSettings.d.ts +25 -0
- package/typings/classes/Light3D.d.ts +1 -1
- package/typings/classes/Logger.d.ts +1 -1
- package/typings/classes/LookAtModifier3D.d.ts +2 -1
- package/typings/classes/MainLoop.d.ts +4 -0
- package/typings/classes/MenuButton.d.ts +35 -0
- package/typings/classes/MeshLibrary.d.ts +2 -0
- package/typings/classes/MovieWriter.d.ts +2 -0
- package/typings/classes/MultiplayerPeerExtension.d.ts +9 -9
- package/typings/classes/NativeMenu.d.ts +10 -3
- package/typings/classes/Node.d.ts +15 -5
- package/typings/classes/Node3D.d.ts +6 -4
- package/typings/classes/OS.d.ts +3 -3
- package/typings/classes/Object.d.ts +9 -3
- package/typings/classes/OptimizedTranslation.d.ts +2 -2
- package/typings/classes/OptionButton.d.ts +51 -1
- package/typings/classes/PCKPacker.d.ts +4 -0
- package/typings/classes/PacketPeerExtension.d.ts +1 -1
- package/typings/classes/ParticleProcessMaterial.d.ts +63 -0
- package/typings/classes/PhysicsDirectBodyState2D.d.ts +2 -1
- package/typings/classes/PhysicsDirectBodyState3D.d.ts +2 -1
- package/typings/classes/PhysicsDirectSpaceState2DExtension.d.ts +6 -6
- package/typings/classes/PhysicsDirectSpaceState3DExtension.d.ts +6 -6
- package/typings/classes/PhysicsServer2D.d.ts +2 -2
- package/typings/classes/PhysicsServer2DExtension.d.ts +6 -6
- package/typings/classes/PhysicsServer3D.d.ts +145 -42
- package/typings/classes/PhysicsServer3DExtension.d.ts +1 -1
- package/typings/classes/PopupMenu.d.ts +74 -8
- package/typings/classes/PopupPanel.d.ts +2 -0
- package/typings/classes/PortableCompressedTexture2D.d.ts +0 -2
- package/typings/classes/ProjectSettings.d.ts +62 -10
- package/typings/classes/Quaternion.d.ts +2 -2
- package/typings/classes/RDAccelerationStructureGeometry.d.ts +42 -0
- package/typings/classes/RDAccelerationStructureInstance.d.ts +34 -0
- package/typings/classes/RDHitGroup.d.ts +20 -0
- package/typings/classes/RDPipelineShader.d.ts +14 -0
- package/typings/classes/RDShaderSPIRV.d.ts +30 -0
- package/typings/classes/RDShaderSource.d.ts +10 -0
- package/typings/classes/RandomNumberGenerator.d.ts +4 -2
- package/typings/classes/RenderSceneBuffersConfiguration.d.ts +4 -1
- package/typings/classes/RenderingDevice.d.ts +175 -1
- package/typings/classes/RenderingServer.d.ts +264 -14
- package/typings/classes/Resource.d.ts +4 -2
- package/typings/classes/ResourceImporterDynamicFont.d.ts +3 -1
- package/typings/classes/ResourceImporterOBJ.d.ts +1 -1
- package/typings/classes/ResourceImporterSVG.d.ts +10 -0
- package/typings/classes/ResourceImporterScene.d.ts +11 -3
- package/typings/classes/ResourceImporterTexture.d.ts +2 -2
- package/typings/classes/RichTextLabel.d.ts +14 -6
- package/typings/classes/Script.d.ts +2 -0
- package/typings/classes/ScriptEditor.d.ts +13 -0
- package/typings/classes/ScriptLanguageExtension.d.ts +7 -0
- package/typings/classes/ScrollContainer.d.ts +17 -5
- package/typings/classes/Shader.d.ts +2 -0
- package/typings/classes/Shape3D.d.ts +1 -0
- package/typings/classes/SkeletonModification2DJiggle.d.ts +4 -0
- package/typings/classes/SplitContainer.d.ts +6 -0
- package/typings/classes/SpringBoneSimulator3D.d.ts +4 -2
- package/typings/classes/SpriteFrames.d.ts +20 -4
- package/typings/classes/StreamPeerExtension.d.ts +2 -2
- package/typings/classes/String.d.ts +1 -1
- package/typings/classes/SubViewport.d.ts +4 -0
- package/typings/classes/TabBar.d.ts +20 -0
- package/typings/classes/TabContainer.d.ts +21 -3
- package/typings/classes/TextEdit.d.ts +5 -2
- package/typings/classes/TextServer.d.ts +25 -1
- package/typings/classes/TextServerExtension.d.ts +25 -1
- package/typings/classes/Texture2D.d.ts +14 -0
- package/typings/classes/TextureRect.d.ts +4 -1
- package/typings/classes/TileSet.d.ts +3 -1
- package/typings/classes/Tree.d.ts +25 -9
- package/typings/classes/TreeItem.d.ts +17 -2
- package/typings/classes/Tween.d.ts +13 -0
- package/typings/classes/UndoRedo.d.ts +2 -2
- package/typings/classes/Vector2.d.ts +4 -2
- package/typings/classes/Vector2i.d.ts +4 -2
- package/typings/classes/Vector3.d.ts +4 -2
- package/typings/classes/Vector3i.d.ts +4 -2
- package/typings/classes/Vector4.d.ts +4 -2
- package/typings/classes/Vector4i.d.ts +4 -2
- package/typings/classes/Viewport.d.ts +27 -1
- package/typings/classes/VirtualJoystick.d.ts +94 -0
- package/typings/classes/VoxelGIData.d.ts +10 -0
- package/typings/classes/Window.d.ts +41 -4
- package/typings/classes/XRCamera3D.d.ts +1 -1
- package/typings/classes/XRServer.d.ts +2 -0
- package/typings/classes/_globals.d.ts +55 -18
- package/typings/classes/index.d.ts +15 -112
- package/typings/godot-class-registry.json +2120 -3693
- package/typings/classes/VisualShader.d.ts +0 -110
- package/typings/classes/VisualShaderNode.d.ts +0 -63
- package/typings/classes/VisualShaderNodeBillboard.d.ts +0 -28
- package/typings/classes/VisualShaderNodeBooleanConstant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeBooleanParameter.d.ts +0 -14
- package/typings/classes/VisualShaderNodeClamp.d.ts +0 -26
- package/typings/classes/VisualShaderNodeColorConstant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeColorFunc.d.ts +0 -32
- package/typings/classes/VisualShaderNodeColorOp.d.ts +0 -32
- package/typings/classes/VisualShaderNodeColorParameter.d.ts +0 -14
- package/typings/classes/VisualShaderNodeComment.d.ts +0 -12
- package/typings/classes/VisualShaderNodeCompare.d.ts +0 -68
- package/typings/classes/VisualShaderNodeConstant.d.ts +0 -6
- package/typings/classes/VisualShaderNodeCubemap.d.ts +0 -43
- package/typings/classes/VisualShaderNodeCubemapParameter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeCurveTexture.d.ts +0 -10
- package/typings/classes/VisualShaderNodeCurveXYZTexture.d.ts +0 -10
- package/typings/classes/VisualShaderNodeCustom.d.ts +0 -122
- package/typings/classes/VisualShaderNodeDerivativeFunc.d.ts +0 -56
- package/typings/classes/VisualShaderNodeDeterminant.d.ts +0 -6
- package/typings/classes/VisualShaderNodeDistanceFade.d.ts +0 -6
- package/typings/classes/VisualShaderNodeDotProduct.d.ts +0 -6
- package/typings/classes/VisualShaderNodeExpression.d.ts +0 -12
- package/typings/classes/VisualShaderNodeFaceForward.d.ts +0 -8
- package/typings/classes/VisualShaderNodeFloatConstant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeFloatFunc.d.ts +0 -108
- package/typings/classes/VisualShaderNodeFloatOp.d.ts +0 -36
- package/typings/classes/VisualShaderNodeFloatParameter.d.ts +0 -52
- package/typings/classes/VisualShaderNodeFrame.d.ts +0 -35
- package/typings/classes/VisualShaderNodeFresnel.d.ts +0 -6
- package/typings/classes/VisualShaderNodeGlobalExpression.d.ts +0 -6
- package/typings/classes/VisualShaderNodeGroupBase.d.ts +0 -60
- package/typings/classes/VisualShaderNodeIf.d.ts +0 -8
- package/typings/classes/VisualShaderNodeInput.d.ts +0 -20
- package/typings/classes/VisualShaderNodeIntConstant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeIntFunc.d.ts +0 -24
- package/typings/classes/VisualShaderNodeIntOp.d.ts +0 -48
- package/typings/classes/VisualShaderNodeIntParameter.d.ts +0 -58
- package/typings/classes/VisualShaderNodeIs.d.ts +0 -18
- package/typings/classes/VisualShaderNodeLinearSceneDepth.d.ts +0 -6
- package/typings/classes/VisualShaderNodeMix.d.ts +0 -28
- package/typings/classes/VisualShaderNodeMultiplyAdd.d.ts +0 -22
- package/typings/classes/VisualShaderNodeOuterProduct.d.ts +0 -6
- package/typings/classes/VisualShaderNodeOutput.d.ts +0 -6
- package/typings/classes/VisualShaderNodeParameter.d.ts +0 -32
- package/typings/classes/VisualShaderNodeParameterRef.d.ts +0 -10
- package/typings/classes/VisualShaderNodeParticleAccelerator.d.ts +0 -20
- package/typings/classes/VisualShaderNodeParticleBoxEmitter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeParticleConeVelocity.d.ts +0 -6
- package/typings/classes/VisualShaderNodeParticleEmit.d.ts +0 -22
- package/typings/classes/VisualShaderNodeParticleEmitter.d.ts +0 -12
- package/typings/classes/VisualShaderNodeParticleMeshEmitter.d.ts +0 -20
- package/typings/classes/VisualShaderNodeParticleMultiplyByAxisAngle.d.ts +0 -10
- package/typings/classes/VisualShaderNodeParticleOutput.d.ts +0 -6
- package/typings/classes/VisualShaderNodeParticleRandomness.d.ts +0 -22
- package/typings/classes/VisualShaderNodeParticleRingEmitter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeParticleSphereEmitter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeProximityFade.d.ts +0 -6
- package/typings/classes/VisualShaderNodeRandomRange.d.ts +0 -6
- package/typings/classes/VisualShaderNodeRemap.d.ts +0 -33
- package/typings/classes/VisualShaderNodeReroute.d.ts +0 -8
- package/typings/classes/VisualShaderNodeResizableBase.d.ts +0 -10
- package/typings/classes/VisualShaderNodeRotationByAxis.d.ts +0 -6
- package/typings/classes/VisualShaderNodeSDFRaymarch.d.ts +0 -6
- package/typings/classes/VisualShaderNodeSDFToScreenUV.d.ts +0 -8
- package/typings/classes/VisualShaderNodeSample3D.d.ts +0 -18
- package/typings/classes/VisualShaderNodeScreenNormalWorldSpace.d.ts +0 -6
- package/typings/classes/VisualShaderNodeScreenUVToSDF.d.ts +0 -8
- package/typings/classes/VisualShaderNodeSmoothStep.d.ts +0 -28
- package/typings/classes/VisualShaderNodeStep.d.ts +0 -28
- package/typings/classes/VisualShaderNodeSwitch.d.ts +0 -30
- package/typings/classes/VisualShaderNodeTexture.d.ts +0 -57
- package/typings/classes/VisualShaderNodeTexture2DArray.d.ts +0 -12
- package/typings/classes/VisualShaderNodeTexture2DArrayParameter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTexture2DParameter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTexture3D.d.ts +0 -12
- package/typings/classes/VisualShaderNodeTexture3DParameter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTextureParameter.d.ts +0 -104
- package/typings/classes/VisualShaderNodeTextureParameterTriplanar.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTextureSDF.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTextureSDFNormal.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTransformCompose.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTransformConstant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeTransformDecompose.d.ts +0 -6
- package/typings/classes/VisualShaderNodeTransformFunc.d.ts +0 -18
- package/typings/classes/VisualShaderNodeTransformOp.d.ts +0 -32
- package/typings/classes/VisualShaderNodeTransformParameter.d.ts +0 -14
- package/typings/classes/VisualShaderNodeTransformVecMult.d.ts +0 -22
- package/typings/classes/VisualShaderNodeUIntConstant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeUIntFunc.d.ts +0 -20
- package/typings/classes/VisualShaderNodeUIntOp.d.ts +0 -48
- package/typings/classes/VisualShaderNodeUIntParameter.d.ts +0 -16
- package/typings/classes/VisualShaderNodeUVFunc.d.ts +0 -22
- package/typings/classes/VisualShaderNodeUVPolarCoord.d.ts +0 -6
- package/typings/classes/VisualShaderNodeVarying.d.ts +0 -14
- package/typings/classes/VisualShaderNodeVaryingGetter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeVaryingSetter.d.ts +0 -6
- package/typings/classes/VisualShaderNodeVec2Constant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeVec2Parameter.d.ts +0 -14
- package/typings/classes/VisualShaderNodeVec3Constant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeVec3Parameter.d.ts +0 -14
- package/typings/classes/VisualShaderNodeVec4Constant.d.ts +0 -10
- package/typings/classes/VisualShaderNodeVec4Parameter.d.ts +0 -14
- package/typings/classes/VisualShaderNodeVectorBase.d.ts +0 -20
- package/typings/classes/VisualShaderNodeVectorCompose.d.ts +0 -8
- package/typings/classes/VisualShaderNodeVectorDecompose.d.ts +0 -8
- package/typings/classes/VisualShaderNodeVectorDistance.d.ts +0 -6
- package/typings/classes/VisualShaderNodeVectorFunc.d.ts +0 -84
- package/typings/classes/VisualShaderNodeVectorLen.d.ts +0 -6
- package/typings/classes/VisualShaderNodeVectorOp.d.ts +0 -42
- package/typings/classes/VisualShaderNodeVectorRefract.d.ts +0 -8
- package/typings/classes/VisualShaderNodeWorldPositionFromDepth.d.ts +0 -8
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debounced full-project diagnostic check + error-driven self-heal for
|
|
3
|
+
* watch mode. Extracted from the Watcher class (file-size rule); the
|
|
4
|
+
* watcher delegates here via a small deps interface.
|
|
5
|
+
*
|
|
6
|
+
* Concurrency: checks now WRITE files (the heal pass), so overlapping
|
|
7
|
+
* runs are forbidden — `run()` is guarded by an in-flight flag, and a
|
|
8
|
+
* run requested while one is active is re-scheduled (debounced) after
|
|
9
|
+
* the active one finishes.
|
|
10
|
+
*/
|
|
11
|
+
import ts from 'typescript';
|
|
12
|
+
import { createTsProgram } from "../parser/typescript/index.js";
|
|
13
|
+
import { collectProjectDiagnostics, printDiagnostics, summarizeDiagnostics, } from "../checker/index.js";
|
|
14
|
+
import { diagnosticSignatures, computeSuspects, healFiles, normPath, } from "./heal.js";
|
|
15
|
+
export class CheckRunner {
|
|
16
|
+
deps;
|
|
17
|
+
/**
|
|
18
|
+
* Per-file diagnostic signature from the previous completed check.
|
|
19
|
+
* `null` = no baseline yet (first check after startup) — then every
|
|
20
|
+
* file with diagnostics counts as changed, intentionally healing
|
|
21
|
+
* stale-error files left over from previous sessions.
|
|
22
|
+
*/
|
|
23
|
+
prevDiagSignatures = null;
|
|
24
|
+
/**
|
|
25
|
+
* Normalized paths of files converted since the last check. Their
|
|
26
|
+
* diagnostic signature legitimately changed (they were edited), so
|
|
27
|
+
* they're excluded from heal suspects.
|
|
28
|
+
*/
|
|
29
|
+
batchConverted = new Set();
|
|
30
|
+
/**
|
|
31
|
+
* Files whose diagnostics moved in the post-heal recheck without
|
|
32
|
+
* having been healed themselves (e.g. a heal-write changed what Godot
|
|
33
|
+
* reports about a third file). They couldn't be acted on in that
|
|
34
|
+
* cycle (single heal iteration per check), so they're carried over as
|
|
35
|
+
* pre-seeded suspects for the next one.
|
|
36
|
+
*/
|
|
37
|
+
pendingHealSuspects = new Set();
|
|
38
|
+
running = false;
|
|
39
|
+
rerunRequested = false;
|
|
40
|
+
disposed = false;
|
|
41
|
+
current = null;
|
|
42
|
+
constructor(deps) {
|
|
43
|
+
this.deps = deps;
|
|
44
|
+
}
|
|
45
|
+
/** Record a file converted by the watcher's batch path. */
|
|
46
|
+
noteConverted(filePath) {
|
|
47
|
+
this.batchConverted.add(normPath(filePath));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Run one check cycle. Never overlaps: a call while a cycle is active
|
|
51
|
+
* requests a re-schedule instead (the heal pass writes files — two
|
|
52
|
+
* interleaved chains could tear writes and stomp baselines).
|
|
53
|
+
*/
|
|
54
|
+
run() {
|
|
55
|
+
if (this.disposed)
|
|
56
|
+
return;
|
|
57
|
+
if (this.running) {
|
|
58
|
+
this.rerunRequested = true;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.running = true;
|
|
62
|
+
this.current = this.runOnce()
|
|
63
|
+
.catch((err) => {
|
|
64
|
+
console.error(`[check] Failed: ${err.message}`);
|
|
65
|
+
})
|
|
66
|
+
.finally(() => {
|
|
67
|
+
this.running = false;
|
|
68
|
+
this.current = null;
|
|
69
|
+
if (this.rerunRequested && !this.disposed) {
|
|
70
|
+
this.rerunRequested = false;
|
|
71
|
+
this.deps.requestRecheck();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Block new runs and wait for the in-flight one (if any) to settle. */
|
|
76
|
+
async dispose() {
|
|
77
|
+
this.disposed = true;
|
|
78
|
+
this.rerunRequested = false;
|
|
79
|
+
if (this.current)
|
|
80
|
+
await this.current;
|
|
81
|
+
}
|
|
82
|
+
async runOnce() {
|
|
83
|
+
const tsFiles = [...this.deps.getTsFiles()].filter((f) => !f.endsWith('.d.ts'));
|
|
84
|
+
if (tsFiles.length === 0) {
|
|
85
|
+
this.deps.debugLog('Diagnostic check skipped — no .ts files');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const checkStart = Date.now();
|
|
89
|
+
this.deps.debugLog(`Diagnostic check starting (${tsFiles.length} file(s), program=${this.deps.getProgram() ? 'reused' : 'fresh'})`);
|
|
90
|
+
const firstResult = await this.collect(tsFiles);
|
|
91
|
+
const { result, rewrote } = await this.healAndRecheck(firstResult, tsFiles);
|
|
92
|
+
this.deps.debugLog(`Diagnostic check finished in ${Date.now() - checkStart}ms`);
|
|
93
|
+
const summary = summarizeDiagnostics(result);
|
|
94
|
+
// Only clear the console when there's something to show — preserves the
|
|
95
|
+
// recent per-file conversion logs when the project is clean.
|
|
96
|
+
if (summary) {
|
|
97
|
+
process.stdout.write('\x1Bc');
|
|
98
|
+
if (rewrote.length > 0) {
|
|
99
|
+
console.log(`[heal] Reconverted ${rewrote.length} stale file(s):`);
|
|
100
|
+
for (const f of rewrote)
|
|
101
|
+
console.log(` ${f}`);
|
|
102
|
+
console.log('');
|
|
103
|
+
}
|
|
104
|
+
printDiagnostics(result.tsDiagnostics, 'TS');
|
|
105
|
+
printDiagnostics(result.converterDiagnostics, 'CONV');
|
|
106
|
+
printDiagnostics(result.godotDiagnostics, 'GD');
|
|
107
|
+
console.log('[check] complete:');
|
|
108
|
+
console.log(summary);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
if (rewrote.length > 0) {
|
|
112
|
+
console.log(`[heal] Reconverted ${rewrote.length} stale file(s).`);
|
|
113
|
+
}
|
|
114
|
+
console.log('[check] No issues found.');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** One full-project diagnostics pass (reuses the watcher's program). */
|
|
118
|
+
collect(tsFiles) {
|
|
119
|
+
return collectProjectDiagnostics({
|
|
120
|
+
tsDir: this.deps.tsDir,
|
|
121
|
+
gdDir: this.deps.gdDir,
|
|
122
|
+
projectRoot: this.deps.projectRoot,
|
|
123
|
+
tsFiles,
|
|
124
|
+
tsConfigPath: this.deps.tsConfigPath,
|
|
125
|
+
cache: this.deps.cache,
|
|
126
|
+
godotPath: this.deps.godotPath,
|
|
127
|
+
cacheDir: this.deps.cacheDir,
|
|
128
|
+
noEmit: false,
|
|
129
|
+
program: this.deps.getProgram() ?? undefined,
|
|
130
|
+
onDebug: this.deps.debug ? (msg) => this.deps.debugLog(msg) : undefined,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Error-driven self-heal. Files whose diagnostic signature changed
|
|
135
|
+
* without having been converted in the current batch are presumed
|
|
136
|
+
* stale (a type they depend on changed in another file): reconvert
|
|
137
|
+
* them in memory and rewrite the ones whose bytes differ. When bytes
|
|
138
|
+
* changed, rerun the diagnostic check ONCE; suspects that surface
|
|
139
|
+
* only in that second pass are carried over to the next cycle (a
|
|
140
|
+
* recheck is requested), keeping the one-heal-per-cycle bound while
|
|
141
|
+
* still converging.
|
|
142
|
+
*/
|
|
143
|
+
async healAndRecheck(result, tsFiles) {
|
|
144
|
+
const curr = diagnosticSignatures(result);
|
|
145
|
+
const projectTsFiles = new Set(tsFiles.map(normPath));
|
|
146
|
+
// Snapshot + reset synchronously: files converted while this check
|
|
147
|
+
// is awaiting belong to the NEXT cycle's exclusion set.
|
|
148
|
+
const batch = this.batchConverted;
|
|
149
|
+
this.batchConverted = new Set();
|
|
150
|
+
const carried = [...this.pendingHealSuspects].filter((f) => projectTsFiles.has(f) && !batch.has(f));
|
|
151
|
+
this.pendingHealSuspects = new Set();
|
|
152
|
+
const suspects = [
|
|
153
|
+
...new Set([
|
|
154
|
+
...computeSuspects(this.prevDiagSignatures, curr, {
|
|
155
|
+
batchConverted: batch,
|
|
156
|
+
projectTsFiles,
|
|
157
|
+
}),
|
|
158
|
+
...carried,
|
|
159
|
+
]),
|
|
160
|
+
];
|
|
161
|
+
let final = result;
|
|
162
|
+
const rewroteAll = [];
|
|
163
|
+
if (suspects.length > 0) {
|
|
164
|
+
this.deps.debugLog(`Heal: ${suspects.length} suspect file(s) with changed diagnostics`);
|
|
165
|
+
const program = this.deps.getProgram() ??
|
|
166
|
+
createTsProgram({
|
|
167
|
+
rootDir: this.deps.tsDir,
|
|
168
|
+
files: tsFiles,
|
|
169
|
+
tsConfigPath: this.deps.tsConfigPath,
|
|
170
|
+
});
|
|
171
|
+
this.deps.setProgram(program);
|
|
172
|
+
const { rewrote } = healFiles({
|
|
173
|
+
files: suspects,
|
|
174
|
+
program,
|
|
175
|
+
cache: this.deps.cache,
|
|
176
|
+
tsDir: this.deps.tsDir,
|
|
177
|
+
gdDir: this.deps.gdDir,
|
|
178
|
+
projectRoot: this.deps.projectRoot,
|
|
179
|
+
tsConfigPath: this.deps.tsConfigPath,
|
|
180
|
+
emitOnError: this.deps.emitOnError,
|
|
181
|
+
onLog: (file, msg) => this.deps.log(file, msg, 'info'),
|
|
182
|
+
});
|
|
183
|
+
rewroteAll.push(...rewrote);
|
|
184
|
+
if (rewrote.length > 0) {
|
|
185
|
+
this.deps.cache.save();
|
|
186
|
+
this.deps.debugLog(`Heal rewrote ${rewrote.length} file(s) — re-running diagnostic check once`);
|
|
187
|
+
final = await this.collect(tsFiles);
|
|
188
|
+
// Heal-writes can move diagnostics of files we did NOT heal
|
|
189
|
+
// (e.g. Godot's view of a third file changes when a healed .gd
|
|
190
|
+
// changes a type annotation). All suspects are fresh now, so
|
|
191
|
+
// only OTHER files qualify — carry them into the next cycle.
|
|
192
|
+
const second = diagnosticSignatures(final);
|
|
193
|
+
const next = computeSuspects(curr, second, {
|
|
194
|
+
batchConverted: new Set(suspects),
|
|
195
|
+
projectTsFiles,
|
|
196
|
+
});
|
|
197
|
+
if (next.length > 0) {
|
|
198
|
+
for (const f of next)
|
|
199
|
+
this.pendingHealSuspects.add(f);
|
|
200
|
+
this.deps.debugLog(`Heal: ${next.length} file(s) affected by heal-writes — recheck scheduled`);
|
|
201
|
+
this.deps.requestRecheck();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
this.prevDiagSignatures = diagnosticSignatures(final);
|
|
206
|
+
return { result: final, rewrote: rewroteAll };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/watcher/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error-driven self-healing for watch mode.
|
|
3
|
+
*
|
|
4
|
+
* The watcher reconverts only files whose own content changed, so a type
|
|
5
|
+
* change in `b.ts` can leave `a.gd` stale. By design every *dangerous*
|
|
6
|
+
* stale output surfaces as a fresh diagnostic each check cycle (TS
|
|
7
|
+
* diagnostics are recomputed from the live program; Godot validates the
|
|
8
|
+
* actual on-disk `.gd`). This module turns those diagnostics into the
|
|
9
|
+
* "affected set": files whose diagnostic signature changed — without
|
|
10
|
+
* having been reconverted in the current batch — are reconverted in
|
|
11
|
+
* memory and rewritten when their output bytes differ.
|
|
12
|
+
*
|
|
13
|
+
* Positions are deliberately excluded from signatures: editing `b.ts`
|
|
14
|
+
* shifts line numbers in ITS diagnostics, not in other files'. A file
|
|
15
|
+
* whose only delta is diagnostic positions was edited itself (and thus
|
|
16
|
+
* sits in the converted batch, which is excluded anyway).
|
|
17
|
+
*/
|
|
18
|
+
import type ts from 'typescript';
|
|
19
|
+
import type { CheckResult } from '../checker/index.ts';
|
|
20
|
+
import type { ProjectCache } from '../cache/index.ts';
|
|
21
|
+
/** Normalize a path for map keys (forward slashes). */
|
|
22
|
+
export declare function normPath(p: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Per-file signature of a check result's diagnostics. Key: normalized
|
|
25
|
+
* file path. Value: hash over the SORTED set of `severity|message`
|
|
26
|
+
* entries — positions excluded, duplicates collapse.
|
|
27
|
+
*/
|
|
28
|
+
export declare function diagnosticSignatures(result: CheckResult): Map<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Files whose diagnostic signature changed between two check runs
|
|
31
|
+
* (appeared, disappeared, or differs), excluding files converted in the
|
|
32
|
+
* current batch (already fresh) and anything that isn't a watched
|
|
33
|
+
* project `.ts` file.
|
|
34
|
+
*
|
|
35
|
+
* `prev === null` means "no baseline yet" (first check after startup):
|
|
36
|
+
* every file with diagnostics counts as changed — intentionally heals
|
|
37
|
+
* stale-error files left over from previous sessions.
|
|
38
|
+
*/
|
|
39
|
+
export declare function computeSuspects(prev: Map<string, string> | null, curr: Map<string, string>, options: {
|
|
40
|
+
/** Normalized paths converted in the current batch. */
|
|
41
|
+
batchConverted: Set<string>;
|
|
42
|
+
/** Normalized paths of all watched project .ts files. */
|
|
43
|
+
projectTsFiles: Set<string>;
|
|
44
|
+
}): string[];
|
|
45
|
+
export interface HealOptions {
|
|
46
|
+
files: string[];
|
|
47
|
+
program: ts.Program;
|
|
48
|
+
cache: ProjectCache;
|
|
49
|
+
tsDir: string;
|
|
50
|
+
gdDir: string;
|
|
51
|
+
projectRoot: string;
|
|
52
|
+
tsConfigPath?: string;
|
|
53
|
+
emitOnError?: boolean;
|
|
54
|
+
onLog?: (file: string, message: string) => void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reconvert `files` in memory and rewrite the ones whose generated
|
|
58
|
+
* bytes differ from disk (cache entries refreshed alongside). Returns
|
|
59
|
+
* the list of `.gd` paths actually rewritten — non-empty means the
|
|
60
|
+
* caller should rerun the diagnostic check ONCE so Godot validates the
|
|
61
|
+
* healed bytes and converter diagnostics come from the fresh entries.
|
|
62
|
+
*/
|
|
63
|
+
export declare function healFiles(options: HealOptions): {
|
|
64
|
+
rewrote: string[];
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=heal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heal.d.ts","sourceRoot":"","sources":["../../src/watcher/heal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAIjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwB7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,EAChC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACzB,OAAO,EAAE;IACP,uDAAuD;IACvD,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,yDAAyD;IACzD,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,GACA,MAAM,EAAE,CAYV;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAgErE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error-driven self-healing for watch mode.
|
|
3
|
+
*
|
|
4
|
+
* The watcher reconverts only files whose own content changed, so a type
|
|
5
|
+
* change in `b.ts` can leave `a.gd` stale. By design every *dangerous*
|
|
6
|
+
* stale output surfaces as a fresh diagnostic each check cycle (TS
|
|
7
|
+
* diagnostics are recomputed from the live program; Godot validates the
|
|
8
|
+
* actual on-disk `.gd`). This module turns those diagnostics into the
|
|
9
|
+
* "affected set": files whose diagnostic signature changed — without
|
|
10
|
+
* having been reconverted in the current batch — are reconverted in
|
|
11
|
+
* memory and rewritten when their output bytes differ.
|
|
12
|
+
*
|
|
13
|
+
* Positions are deliberately excluded from signatures: editing `b.ts`
|
|
14
|
+
* shifts line numbers in ITS diagnostics, not in other files'. A file
|
|
15
|
+
* whose only delta is diagnostic positions was edited itself (and thus
|
|
16
|
+
* sits in the converted batch, which is excluded anyway).
|
|
17
|
+
*/
|
|
18
|
+
import { createHash } from 'crypto';
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
20
|
+
import { dirname, relative, resolve } from 'path';
|
|
21
|
+
import { convertTsToGd } from "../converter/ts-to-gd/index.js";
|
|
22
|
+
import { isConversionErrorSeverity } from "../converter/common/index.js";
|
|
23
|
+
/** Normalize a path for map keys (forward slashes). */
|
|
24
|
+
export function normPath(p) {
|
|
25
|
+
return p.replace(/\\/g, '/');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Per-file signature of a check result's diagnostics. Key: normalized
|
|
29
|
+
* file path. Value: hash over the SORTED set of `severity|message`
|
|
30
|
+
* entries — positions excluded, duplicates collapse.
|
|
31
|
+
*/
|
|
32
|
+
export function diagnosticSignatures(result) {
|
|
33
|
+
const byFile = new Map();
|
|
34
|
+
const collect = (diags, source) => {
|
|
35
|
+
for (const d of diags) {
|
|
36
|
+
if (d.severity === 'info')
|
|
37
|
+
continue;
|
|
38
|
+
const key = normPath(d.file);
|
|
39
|
+
const list = byFile.get(key) ?? [];
|
|
40
|
+
list.push(`${source}|${d.severity}|${d.message}`);
|
|
41
|
+
byFile.set(key, list);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
collect(result.tsDiagnostics, 'TS');
|
|
45
|
+
collect(result.converterDiagnostics, 'CONV');
|
|
46
|
+
collect(result.godotDiagnostics, 'GD');
|
|
47
|
+
const signatures = new Map();
|
|
48
|
+
for (const [file, entries] of byFile) {
|
|
49
|
+
const sorted = [...new Set(entries)].sort().join('\n');
|
|
50
|
+
signatures.set(file, createHash('md5').update(sorted).digest('hex').slice(0, 16));
|
|
51
|
+
}
|
|
52
|
+
return signatures;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Files whose diagnostic signature changed between two check runs
|
|
56
|
+
* (appeared, disappeared, or differs), excluding files converted in the
|
|
57
|
+
* current batch (already fresh) and anything that isn't a watched
|
|
58
|
+
* project `.ts` file.
|
|
59
|
+
*
|
|
60
|
+
* `prev === null` means "no baseline yet" (first check after startup):
|
|
61
|
+
* every file with diagnostics counts as changed — intentionally heals
|
|
62
|
+
* stale-error files left over from previous sessions.
|
|
63
|
+
*/
|
|
64
|
+
export function computeSuspects(prev, curr, options) {
|
|
65
|
+
const prevMap = prev ?? new Map();
|
|
66
|
+
const candidates = new Set([...prevMap.keys(), ...curr.keys()]);
|
|
67
|
+
const suspects = [];
|
|
68
|
+
for (const file of candidates) {
|
|
69
|
+
if (prevMap.get(file) === curr.get(file))
|
|
70
|
+
continue;
|
|
71
|
+
if (options.batchConverted.has(file))
|
|
72
|
+
continue;
|
|
73
|
+
if (!file.endsWith('.ts') || file.endsWith('.d.ts'))
|
|
74
|
+
continue;
|
|
75
|
+
if (!options.projectTsFiles.has(file))
|
|
76
|
+
continue;
|
|
77
|
+
suspects.push(file);
|
|
78
|
+
}
|
|
79
|
+
return suspects;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Reconvert `files` in memory and rewrite the ones whose generated
|
|
83
|
+
* bytes differ from disk (cache entries refreshed alongside). Returns
|
|
84
|
+
* the list of `.gd` paths actually rewritten — non-empty means the
|
|
85
|
+
* caller should rerun the diagnostic check ONCE so Godot validates the
|
|
86
|
+
* healed bytes and converter diagnostics come from the fresh entries.
|
|
87
|
+
*/
|
|
88
|
+
export function healFiles(options) {
|
|
89
|
+
const rewrote = [];
|
|
90
|
+
for (const filePath of options.files) {
|
|
91
|
+
const relPath = relative(options.tsDir, filePath);
|
|
92
|
+
const outputPath = resolve(options.gdDir, relPath.replace(/\.ts$/, '.gd'));
|
|
93
|
+
const result = convertTsToGd({
|
|
94
|
+
filePath,
|
|
95
|
+
rootDir: options.tsDir,
|
|
96
|
+
tsDir: options.tsDir,
|
|
97
|
+
gdDir: options.gdDir,
|
|
98
|
+
projectRoot: options.projectRoot,
|
|
99
|
+
tsConfigPath: options.tsConfigPath,
|
|
100
|
+
sourceMap: true,
|
|
101
|
+
program: options.program,
|
|
102
|
+
});
|
|
103
|
+
// Mirror convertSingleFile: hard conversion errors block the write.
|
|
104
|
+
if (result.diagnostics.some((d) => isConversionErrorSeverity(d.severity)) &&
|
|
105
|
+
!options.emitOnError) {
|
|
106
|
+
options.onLog?.(filePath, 'Heal skipped — conversion errors block the write');
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const normalize = (s) => s.replace(/\r\n/g, '\n');
|
|
110
|
+
const onDisk = existsSync(outputPath)
|
|
111
|
+
? readFileSync(outputPath, 'utf-8')
|
|
112
|
+
: null;
|
|
113
|
+
if (onDisk !== null && normalize(onDisk) === normalize(result.code)) {
|
|
114
|
+
// Output already current — refresh diagnostics/source map only.
|
|
115
|
+
// Hash the bytes actually on disk: a CRLF .gd would never look
|
|
116
|
+
// fresh against the hash of the LF `result.code`.
|
|
117
|
+
if (result.sourceMap) {
|
|
118
|
+
options.cache.updateTsToGd(filePath, outputPath, result.sourceMap, result.diagnostics, { gdContent: onDisk });
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
mkdirSync(dirname(outputPath), { recursive: true });
|
|
123
|
+
writeFileSync(outputPath, result.code);
|
|
124
|
+
if (result.sourceMap) {
|
|
125
|
+
options.cache.updateTsToGd(filePath, outputPath, result.sourceMap, result.diagnostics, { gdContent: result.code });
|
|
126
|
+
}
|
|
127
|
+
rewrote.push(outputPath);
|
|
128
|
+
options.onLog?.(outputPath, 'Healed (stale output)');
|
|
129
|
+
}
|
|
130
|
+
return { rewrote };
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=heal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heal.js","sourceRoot":"","sources":["../../src/watcher/heal.ts"],"names":[],"mappings":"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"}
|
package/dist/watcher/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyBD,qBAAa,OAAO;IAClB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,eAAe,CAAS;IAGhC,OAAO,CAAC,aAAa,CAA2B;IAGhD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,aAAa,CAA8C;IAGnE,OAAO,CAAC,kBAAkB,CAA8C;IAGxE,OAAO,CAAC,WAAW,CAAc;IAGjC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,cAAc;IAoCnC,KAAK,IAAI,IAAI;IA2DP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IA8BpB,OAAO,CAAC,YAAY;IAkDpB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAyGzB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,GAAG;CAgBZ"}
|
package/dist/watcher/index.js
CHANGED
|
@@ -10,9 +10,9 @@ import { generateTypings, generateAddonTypings, generateFileTypings, } from "../
|
|
|
10
10
|
import { shouldIgnore } from "../config/index.js";
|
|
11
11
|
import { ProjectCache } from "../cache/index.js";
|
|
12
12
|
import { isConversionErrorSeverity } from "../converter/common/index.js";
|
|
13
|
-
import { writeFileSync, mkdirSync } from 'fs';
|
|
13
|
+
import { writeFileSync, mkdirSync, readFileSync, existsSync } from 'fs';
|
|
14
14
|
import { dirname } from 'path';
|
|
15
|
-
import {
|
|
15
|
+
import { CheckRunner } from "./check.js";
|
|
16
16
|
/** File extensions that trigger typings regeneration (scenes, resources, assets). */
|
|
17
17
|
const RESOURCE_EXTENSIONS = new Set([
|
|
18
18
|
'.tscn',
|
|
@@ -49,6 +49,8 @@ export class Watcher {
|
|
|
49
49
|
debounceTimer = null;
|
|
50
50
|
// ── Debounced full-project check ──────────────────────────
|
|
51
51
|
checkDebounceTimer = null;
|
|
52
|
+
// ── Check + error-driven self-heal (see check.ts / heal.ts) ──
|
|
53
|
+
checkRunner;
|
|
52
54
|
// ── Initial scan counters ─────────────────────────────────
|
|
53
55
|
initialConverted = 0;
|
|
54
56
|
initialSkipped = 0;
|
|
@@ -65,6 +67,25 @@ export class Watcher {
|
|
|
65
67
|
// parallel ts-plugin (inside tsserver). Without it, both sides hold
|
|
66
68
|
// independent in-memory snapshots and their views of the cache drift.
|
|
67
69
|
this.cache = new ProjectCache(this.cacheDir, { watch: true });
|
|
70
|
+
this.checkRunner = new CheckRunner({
|
|
71
|
+
tsDir: this.tsDir,
|
|
72
|
+
gdDir: this.gdDir,
|
|
73
|
+
projectRoot: options.projectRoot ?? options.rootDir,
|
|
74
|
+
cacheDir: this.cacheDir,
|
|
75
|
+
tsConfigPath: options.tsConfigPath,
|
|
76
|
+
godotPath: options.godotPath,
|
|
77
|
+
emitOnError: options.emitOnError,
|
|
78
|
+
debug: options.debug,
|
|
79
|
+
cache: this.cache,
|
|
80
|
+
getTsFiles: () => this.tsFiles,
|
|
81
|
+
getProgram: () => this.cachedProgram,
|
|
82
|
+
setProgram: (p) => {
|
|
83
|
+
this.cachedProgram = p;
|
|
84
|
+
},
|
|
85
|
+
requestRecheck: () => this.scheduleCheck(),
|
|
86
|
+
log: (file, message, severity) => this.log(file, message, severity),
|
|
87
|
+
debugLog: (message) => this.debugLog(message),
|
|
88
|
+
});
|
|
68
89
|
}
|
|
69
90
|
start() {
|
|
70
91
|
// Chokidar v4 does not support glob patterns — watch directories and filter via ignored.
|
|
@@ -122,6 +143,9 @@ export class Watcher {
|
|
|
122
143
|
clearTimeout(this.debounceTimer);
|
|
123
144
|
if (this.checkDebounceTimer)
|
|
124
145
|
clearTimeout(this.checkDebounceTimer);
|
|
146
|
+
// Wait for an in-flight check (which may be heal-writing files)
|
|
147
|
+
// before tearing anything down.
|
|
148
|
+
await this.checkRunner.dispose();
|
|
125
149
|
await this.fsWatcher?.close();
|
|
126
150
|
this.cache.save();
|
|
127
151
|
await this.cache.close();
|
|
@@ -237,52 +261,12 @@ export class Watcher {
|
|
|
237
261
|
}
|
|
238
262
|
runCheck() {
|
|
239
263
|
this.checkDebounceTimer = null;
|
|
240
|
-
|
|
241
|
-
if (tsFiles.length === 0) {
|
|
242
|
-
this.debugLog('Diagnostic check skipped — no .ts files');
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
const projectRoot = this.options.projectRoot ?? this.options.rootDir;
|
|
246
|
-
const checkStart = Date.now();
|
|
247
|
-
this.debugLog(`Diagnostic check starting (${tsFiles.length} file(s), program=${this.cachedProgram ? 'reused' : 'fresh'})`);
|
|
248
|
-
collectProjectDiagnostics({
|
|
249
|
-
tsDir: this.tsDir,
|
|
250
|
-
gdDir: this.gdDir,
|
|
251
|
-
projectRoot,
|
|
252
|
-
tsFiles,
|
|
253
|
-
tsConfigPath: this.options.tsConfigPath,
|
|
254
|
-
cache: this.cache,
|
|
255
|
-
godotPath: this.options.godotPath,
|
|
256
|
-
cacheDir: this.cacheDir,
|
|
257
|
-
noEmit: false,
|
|
258
|
-
// Reuse the program from the just-finished convertBatch — avoids
|
|
259
|
-
// re-parsing all .ts files. Falls back to a fresh program when null
|
|
260
|
-
// (e.g. when the only event was a removal that invalidated it).
|
|
261
|
-
program: this.cachedProgram ?? undefined,
|
|
262
|
-
onDebug: this.options.debug ? (msg) => this.debugLog(msg) : undefined,
|
|
263
|
-
})
|
|
264
|
-
.then((result) => {
|
|
265
|
-
this.debugLog(`Diagnostic check finished in ${Date.now() - checkStart}ms`);
|
|
266
|
-
const summary = summarizeDiagnostics(result);
|
|
267
|
-
// Only clear the console when there's something to show — preserves the
|
|
268
|
-
// recent per-file conversion logs when the project is clean.
|
|
269
|
-
if (summary) {
|
|
270
|
-
process.stdout.write('\x1Bc');
|
|
271
|
-
printDiagnostics(result.tsDiagnostics, 'TS');
|
|
272
|
-
printDiagnostics(result.converterDiagnostics, 'CONV');
|
|
273
|
-
printDiagnostics(result.godotDiagnostics, 'GD');
|
|
274
|
-
console.log('[check] complete:');
|
|
275
|
-
console.log(summary);
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
console.log('[check] No issues found.');
|
|
279
|
-
}
|
|
280
|
-
})
|
|
281
|
-
.catch((err) => {
|
|
282
|
-
this.log('', `[check] Failed: ${err.message}`, 'warning');
|
|
283
|
-
});
|
|
264
|
+
this.checkRunner.run();
|
|
284
265
|
}
|
|
285
266
|
convertSingleFile(filePath, outputPath, program) {
|
|
267
|
+
// This file's diagnostics may legitimately change this cycle (it was
|
|
268
|
+
// edited) — exclude it from the heal pass's suspect detection.
|
|
269
|
+
this.checkRunner.noteConverted(filePath);
|
|
286
270
|
const result = convertTsToGd({
|
|
287
271
|
filePath,
|
|
288
272
|
rootDir: this.tsDir,
|
|
@@ -303,14 +287,25 @@ export class Watcher {
|
|
|
303
287
|
if (!this.options.emitOnError)
|
|
304
288
|
return;
|
|
305
289
|
}
|
|
306
|
-
// Write output
|
|
307
|
-
|
|
308
|
-
|
|
290
|
+
// Write output — only when the bytes actually changed, so Godot
|
|
291
|
+
// doesn't reimport identical files and file watchers don't churn.
|
|
292
|
+
const normalizeEol = (s) => s.replace(/\r\n/g, '\n');
|
|
293
|
+
const diskContent = existsSync(outputPath)
|
|
294
|
+
? readFileSync(outputPath, 'utf-8')
|
|
295
|
+
: null;
|
|
296
|
+
const outputUnchanged = diskContent !== null &&
|
|
297
|
+
normalizeEol(diskContent) === normalizeEol(result.code);
|
|
298
|
+
if (!outputUnchanged) {
|
|
299
|
+
mkdirSync(dirname(outputPath), { recursive: true });
|
|
300
|
+
writeFileSync(outputPath, result.code);
|
|
301
|
+
}
|
|
309
302
|
// Update cache. `gdContent` populates `<cacheDir>/gd-output/` so a
|
|
310
303
|
// later run (or the plugin) can reuse the exact bytes via promote.
|
|
304
|
+
// When the write was skipped, hash the bytes actually on disk — a
|
|
305
|
+
// CRLF .gd would never look fresh against the LF `result.code` hash.
|
|
311
306
|
if (result.sourceMap) {
|
|
312
307
|
this.cache.updateTsToGd(filePath, outputPath, result.sourceMap, result.diagnostics, {
|
|
313
|
-
gdContent: result.code,
|
|
308
|
+
gdContent: outputUnchanged ? diskContent : result.code,
|
|
314
309
|
});
|
|
315
310
|
}
|
|
316
311
|
this.cache.save();
|
|
@@ -318,8 +313,9 @@ export class Watcher {
|
|
|
318
313
|
this.initialConverted++;
|
|
319
314
|
}
|
|
320
315
|
this.log(filePath, `Converted -> ${relative(this.options.rootDir, outputPath) || outputPath}`, 'info');
|
|
321
|
-
// Validate with Godot if configured
|
|
322
|
-
|
|
316
|
+
// Validate with Godot if configured (identical bytes → identical
|
|
317
|
+
// validation result, so skip when nothing was written)
|
|
318
|
+
if (this.options.godotPath && !outputUnchanged) {
|
|
323
319
|
const projectRoot = this.options.projectRoot ?? this.options.rootDir;
|
|
324
320
|
validateGdFiles({
|
|
325
321
|
gdFiles: [outputPath],
|