typescript-to-gdscript 0.1.0 → 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.
Files changed (280) hide show
  1. package/README.md +232 -104
  2. package/dist/cli/convert.d.ts.map +1 -1
  3. package/dist/cli/convert.js +15 -5
  4. package/dist/cli/convert.js.map +1 -1
  5. package/dist/converter/common/index.d.ts +17 -1
  6. package/dist/converter/common/index.d.ts.map +1 -1
  7. package/dist/converter/common/index.js +69 -19
  8. package/dist/converter/common/index.js.map +1 -1
  9. package/dist/converter/ts-to-gd/access-rewrite.d.ts +40 -0
  10. package/dist/converter/ts-to-gd/access-rewrite.d.ts.map +1 -0
  11. package/dist/converter/ts-to-gd/access-rewrite.js +124 -0
  12. package/dist/converter/ts-to-gd/access-rewrite.js.map +1 -0
  13. package/dist/converter/ts-to-gd/class-members.d.ts.map +1 -1
  14. package/dist/converter/ts-to-gd/class-members.js +5 -5
  15. package/dist/converter/ts-to-gd/class-members.js.map +1 -1
  16. package/dist/converter/ts-to-gd/expressions.d.ts.map +1 -1
  17. package/dist/converter/ts-to-gd/expressions.js +32 -8
  18. package/dist/converter/ts-to-gd/expressions.js.map +1 -1
  19. package/dist/converter/ts-to-gd/file-scope.d.ts.map +1 -1
  20. package/dist/converter/ts-to-gd/file-scope.js +1 -1
  21. package/dist/converter/ts-to-gd/file-scope.js.map +1 -1
  22. package/dist/converter/ts-to-gd/gd-getset.js +2 -2
  23. package/dist/converter/ts-to-gd/gd-getset.js.map +1 -1
  24. package/dist/converter/ts-to-gd/index.d.ts.map +1 -1
  25. package/dist/converter/ts-to-gd/index.js +1 -0
  26. package/dist/converter/ts-to-gd/index.js.map +1 -1
  27. package/dist/converter/ts-to-gd/parameters.d.ts.map +1 -1
  28. package/dist/converter/ts-to-gd/parameters.js +2 -2
  29. package/dist/converter/ts-to-gd/parameters.js.map +1 -1
  30. package/dist/converter/ts-to-gd/statements.d.ts.map +1 -1
  31. package/dist/converter/ts-to-gd/statements.js +1 -1
  32. package/dist/converter/ts-to-gd/statements.js.map +1 -1
  33. package/dist/typings/override-system.d.ts.map +1 -1
  34. package/dist/typings/override-system.js +6 -0
  35. package/dist/typings/override-system.js.map +1 -1
  36. package/dist/watcher/check.d.ts +87 -0
  37. package/dist/watcher/check.d.ts.map +1 -0
  38. package/dist/watcher/check.js +209 -0
  39. package/dist/watcher/check.js.map +1 -0
  40. package/dist/watcher/heal.d.ts +66 -0
  41. package/dist/watcher/heal.d.ts.map +1 -0
  42. package/dist/watcher/heal.js +132 -0
  43. package/dist/watcher/heal.js.map +1 -0
  44. package/dist/watcher/index.d.ts +1 -0
  45. package/dist/watcher/index.d.ts.map +1 -1
  46. package/dist/watcher/index.js +48 -52
  47. package/dist/watcher/index.js.map +1 -1
  48. package/package.json +6 -1
  49. package/typings/classes/AccessibilityServer.d.ts +1 -1
  50. package/typings/classes/AnimationLibrary.d.ts +4 -4
  51. package/typings/classes/AnimationNodeBlendSpace1D.d.ts +28 -2
  52. package/typings/classes/AnimationNodeBlendSpace2D.d.ts +28 -2
  53. package/typings/classes/AreaLight3D.d.ts +37 -0
  54. package/typings/classes/AudioEffectInstance.d.ts +1 -1
  55. package/typings/classes/AudioStreamRandomizer.d.ts +10 -0
  56. package/typings/classes/Basis.d.ts +2 -2
  57. package/typings/classes/CPUParticles2D.d.ts +2 -2
  58. package/typings/classes/CPUParticles3D.d.ts +2 -2
  59. package/typings/classes/CanvasItem.d.ts +15 -0
  60. package/typings/classes/CodeEdit.d.ts +2 -0
  61. package/typings/classes/CollisionObject2D.d.ts +2 -2
  62. package/typings/classes/Container.d.ts +1 -0
  63. package/typings/classes/Control.d.ts +68 -9
  64. package/typings/classes/Curve.d.ts +26 -1
  65. package/typings/classes/Curve2D.d.ts +15 -0
  66. package/typings/classes/Curve3D.d.ts +20 -0
  67. package/typings/classes/DirAccess.d.ts +6 -1
  68. package/typings/classes/DisplayServer.d.ts +35 -10
  69. package/typings/classes/DrawableTexture2D.d.ts +0 -4
  70. package/typings/classes/EditorCommandPalette.d.ts +0 -2
  71. package/typings/classes/EditorContextMenuPlugin.d.ts +4 -0
  72. package/typings/classes/EditorDock.d.ts +2 -3
  73. package/typings/classes/EditorExportPlatform.d.ts +4 -2
  74. package/typings/classes/EditorExportPlugin.d.ts +2 -0
  75. package/typings/classes/EditorFeatureProfile.d.ts +1 -1
  76. package/typings/classes/EditorInspector.d.ts +10 -0
  77. package/typings/classes/EditorInterface.d.ts +2 -2
  78. package/typings/classes/EditorNode3DGizmoPlugin.d.ts +4 -0
  79. package/typings/classes/EditorPlugin.d.ts +4 -4
  80. package/typings/classes/EditorResourcePicker.d.ts +2 -1
  81. package/typings/classes/EditorSceneFormatImporter.d.ts +23 -0
  82. package/typings/classes/EditorSettings.d.ts +44 -7
  83. package/typings/classes/EditorTranslationParserPlugin.d.ts +4 -0
  84. package/typings/classes/EditorVCSInterface.d.ts +6 -2
  85. package/typings/classes/FileDialog.d.ts +15 -0
  86. package/typings/classes/Font.d.ts +13 -1
  87. package/typings/classes/FontVariation.d.ts +10 -0
  88. package/typings/classes/GDScript.d.ts +8 -0
  89. package/typings/classes/GDScriptLanguageProtocol.d.ts +25 -0
  90. package/typings/classes/GDScriptSyntaxHighlighter.d.ts +6 -0
  91. package/typings/classes/GDScriptTextDocument.d.ts +27 -0
  92. package/typings/classes/GDScriptWorkspace.d.ts +17 -0
  93. package/typings/classes/GPUParticles2D.d.ts +2 -2
  94. package/typings/classes/GPUParticles3D.d.ts +15 -2
  95. package/typings/classes/Geometry2D.d.ts +2 -2
  96. package/typings/classes/Image.d.ts +6 -4
  97. package/typings/classes/ImageFormatLoader.d.ts +5 -0
  98. package/typings/classes/Input.d.ts +11 -2
  99. package/typings/classes/InputEventMouseMotion.d.ts +2 -2
  100. package/typings/classes/ItemList.d.ts +20 -0
  101. package/typings/classes/IterateIK3D.d.ts +6 -3
  102. package/typings/classes/JavaClassWrapper.d.ts +13 -0
  103. package/typings/classes/JavaScriptBridge.d.ts +1 -1
  104. package/typings/classes/Label.d.ts +1 -0
  105. package/typings/classes/LabelSettings.d.ts +25 -0
  106. package/typings/classes/Light3D.d.ts +1 -1
  107. package/typings/classes/Logger.d.ts +1 -1
  108. package/typings/classes/LookAtModifier3D.d.ts +1 -1
  109. package/typings/classes/MenuButton.d.ts +35 -0
  110. package/typings/classes/MeshLibrary.d.ts +2 -0
  111. package/typings/classes/MovieWriter.d.ts +2 -0
  112. package/typings/classes/MultiplayerPeerExtension.d.ts +9 -9
  113. package/typings/classes/Node.d.ts +6 -0
  114. package/typings/classes/Node3D.d.ts +6 -4
  115. package/typings/classes/OS.d.ts +1 -1
  116. package/typings/classes/Object.d.ts +11 -8
  117. package/typings/classes/OptimizedTranslation.d.ts +2 -2
  118. package/typings/classes/OptionButton.d.ts +51 -7
  119. package/typings/classes/PacketPeerExtension.d.ts +1 -1
  120. package/typings/classes/ParticleProcessMaterial.d.ts +58 -0
  121. package/typings/classes/PhysicsDirectSpaceState2DExtension.d.ts +6 -6
  122. package/typings/classes/PhysicsDirectSpaceState3DExtension.d.ts +6 -6
  123. package/typings/classes/PhysicsServer2DExtension.d.ts +5 -5
  124. package/typings/classes/PhysicsServer3DExtension.d.ts +1 -1
  125. package/typings/classes/PopupMenu.d.ts +58 -6
  126. package/typings/classes/ProjectSettings.d.ts +89 -21
  127. package/typings/classes/Quaternion.d.ts +2 -2
  128. package/typings/classes/RDAccelerationStructureGeometry.d.ts +42 -0
  129. package/typings/classes/RDAccelerationStructureInstance.d.ts +34 -0
  130. package/typings/classes/RDHitGroup.d.ts +20 -0
  131. package/typings/classes/RDPipelineShader.d.ts +14 -0
  132. package/typings/classes/RandomNumberGenerator.d.ts +4 -2
  133. package/typings/classes/RenderSceneBuffersConfiguration.d.ts +4 -1
  134. package/typings/classes/RenderingDevice.d.ts +93 -23
  135. package/typings/classes/RenderingServer.d.ts +51 -3
  136. package/typings/classes/Resource.d.ts +2 -0
  137. package/typings/classes/ResourceImporterOBJ.d.ts +1 -1
  138. package/typings/classes/ResourceImporterScene.d.ts +11 -3
  139. package/typings/classes/RichTextLabel.d.ts +14 -6
  140. package/typings/classes/SceneTree.d.ts +29 -5
  141. package/typings/classes/Script.d.ts +2 -0
  142. package/typings/classes/ScriptEditor.d.ts +7 -0
  143. package/typings/classes/ScriptLanguageExtension.d.ts +7 -0
  144. package/typings/classes/ScrollContainer.d.ts +17 -5
  145. package/typings/classes/SkeletonModification2DJiggle.d.ts +4 -0
  146. package/typings/classes/SpringBoneSimulator3D.d.ts +4 -2
  147. package/typings/classes/SpriteFrames.d.ts +20 -4
  148. package/typings/classes/StreamPeerExtension.d.ts +2 -2
  149. package/typings/classes/TabBar.d.ts +20 -0
  150. package/typings/classes/TabContainer.d.ts +21 -3
  151. package/typings/classes/TextEdit.d.ts +2 -2
  152. package/typings/classes/TextServer.d.ts +23 -1
  153. package/typings/classes/TextServerExtension.d.ts +23 -1
  154. package/typings/classes/TileSet.d.ts +3 -1
  155. package/typings/classes/Tree.d.ts +16 -7
  156. package/typings/classes/TreeItem.d.ts +9 -2
  157. package/typings/classes/UndoRedo.d.ts +2 -2
  158. package/typings/classes/Vector2.d.ts +4 -2
  159. package/typings/classes/Vector2i.d.ts +4 -2
  160. package/typings/classes/Vector3.d.ts +4 -2
  161. package/typings/classes/Vector3i.d.ts +4 -2
  162. package/typings/classes/Vector4.d.ts +4 -2
  163. package/typings/classes/Vector4i.d.ts +4 -2
  164. package/typings/classes/Viewport.d.ts +17 -1
  165. package/typings/classes/Window.d.ts +20 -6
  166. package/typings/classes/_globals.d.ts +104 -26
  167. package/typings/classes/index.d.ts +10 -112
  168. package/typings/godot-class-registry.json +885 -3604
  169. package/typings/classes/VisualShader.d.ts +0 -112
  170. package/typings/classes/VisualShaderNode.d.ts +0 -63
  171. package/typings/classes/VisualShaderNodeBillboard.d.ts +0 -28
  172. package/typings/classes/VisualShaderNodeBooleanConstant.d.ts +0 -10
  173. package/typings/classes/VisualShaderNodeBooleanParameter.d.ts +0 -14
  174. package/typings/classes/VisualShaderNodeClamp.d.ts +0 -26
  175. package/typings/classes/VisualShaderNodeColorConstant.d.ts +0 -10
  176. package/typings/classes/VisualShaderNodeColorFunc.d.ts +0 -32
  177. package/typings/classes/VisualShaderNodeColorOp.d.ts +0 -32
  178. package/typings/classes/VisualShaderNodeColorParameter.d.ts +0 -14
  179. package/typings/classes/VisualShaderNodeComment.d.ts +0 -12
  180. package/typings/classes/VisualShaderNodeCompare.d.ts +0 -68
  181. package/typings/classes/VisualShaderNodeConstant.d.ts +0 -6
  182. package/typings/classes/VisualShaderNodeCubemap.d.ts +0 -43
  183. package/typings/classes/VisualShaderNodeCubemapParameter.d.ts +0 -6
  184. package/typings/classes/VisualShaderNodeCurveTexture.d.ts +0 -10
  185. package/typings/classes/VisualShaderNodeCurveXYZTexture.d.ts +0 -10
  186. package/typings/classes/VisualShaderNodeCustom.d.ts +0 -122
  187. package/typings/classes/VisualShaderNodeDerivativeFunc.d.ts +0 -56
  188. package/typings/classes/VisualShaderNodeDeterminant.d.ts +0 -6
  189. package/typings/classes/VisualShaderNodeDistanceFade.d.ts +0 -6
  190. package/typings/classes/VisualShaderNodeDotProduct.d.ts +0 -6
  191. package/typings/classes/VisualShaderNodeExpression.d.ts +0 -12
  192. package/typings/classes/VisualShaderNodeFaceForward.d.ts +0 -8
  193. package/typings/classes/VisualShaderNodeFloatConstant.d.ts +0 -10
  194. package/typings/classes/VisualShaderNodeFloatFunc.d.ts +0 -108
  195. package/typings/classes/VisualShaderNodeFloatOp.d.ts +0 -36
  196. package/typings/classes/VisualShaderNodeFloatParameter.d.ts +0 -52
  197. package/typings/classes/VisualShaderNodeFrame.d.ts +0 -35
  198. package/typings/classes/VisualShaderNodeFresnel.d.ts +0 -6
  199. package/typings/classes/VisualShaderNodeGlobalExpression.d.ts +0 -6
  200. package/typings/classes/VisualShaderNodeGroupBase.d.ts +0 -60
  201. package/typings/classes/VisualShaderNodeIf.d.ts +0 -8
  202. package/typings/classes/VisualShaderNodeInput.d.ts +0 -20
  203. package/typings/classes/VisualShaderNodeIntConstant.d.ts +0 -10
  204. package/typings/classes/VisualShaderNodeIntFunc.d.ts +0 -24
  205. package/typings/classes/VisualShaderNodeIntOp.d.ts +0 -48
  206. package/typings/classes/VisualShaderNodeIntParameter.d.ts +0 -58
  207. package/typings/classes/VisualShaderNodeIs.d.ts +0 -18
  208. package/typings/classes/VisualShaderNodeLinearSceneDepth.d.ts +0 -6
  209. package/typings/classes/VisualShaderNodeMix.d.ts +0 -28
  210. package/typings/classes/VisualShaderNodeMultiplyAdd.d.ts +0 -22
  211. package/typings/classes/VisualShaderNodeOuterProduct.d.ts +0 -6
  212. package/typings/classes/VisualShaderNodeOutput.d.ts +0 -6
  213. package/typings/classes/VisualShaderNodeParameter.d.ts +0 -32
  214. package/typings/classes/VisualShaderNodeParameterRef.d.ts +0 -10
  215. package/typings/classes/VisualShaderNodeParticleAccelerator.d.ts +0 -20
  216. package/typings/classes/VisualShaderNodeParticleBoxEmitter.d.ts +0 -6
  217. package/typings/classes/VisualShaderNodeParticleConeVelocity.d.ts +0 -6
  218. package/typings/classes/VisualShaderNodeParticleEmit.d.ts +0 -22
  219. package/typings/classes/VisualShaderNodeParticleEmitter.d.ts +0 -12
  220. package/typings/classes/VisualShaderNodeParticleMeshEmitter.d.ts +0 -20
  221. package/typings/classes/VisualShaderNodeParticleMultiplyByAxisAngle.d.ts +0 -10
  222. package/typings/classes/VisualShaderNodeParticleOutput.d.ts +0 -6
  223. package/typings/classes/VisualShaderNodeParticleRandomness.d.ts +0 -22
  224. package/typings/classes/VisualShaderNodeParticleRingEmitter.d.ts +0 -6
  225. package/typings/classes/VisualShaderNodeParticleSphereEmitter.d.ts +0 -6
  226. package/typings/classes/VisualShaderNodeProximityFade.d.ts +0 -6
  227. package/typings/classes/VisualShaderNodeRandomRange.d.ts +0 -6
  228. package/typings/classes/VisualShaderNodeRemap.d.ts +0 -33
  229. package/typings/classes/VisualShaderNodeReroute.d.ts +0 -8
  230. package/typings/classes/VisualShaderNodeResizableBase.d.ts +0 -10
  231. package/typings/classes/VisualShaderNodeRotationByAxis.d.ts +0 -6
  232. package/typings/classes/VisualShaderNodeSDFRaymarch.d.ts +0 -6
  233. package/typings/classes/VisualShaderNodeSDFToScreenUV.d.ts +0 -8
  234. package/typings/classes/VisualShaderNodeSample3D.d.ts +0 -18
  235. package/typings/classes/VisualShaderNodeScreenNormalWorldSpace.d.ts +0 -6
  236. package/typings/classes/VisualShaderNodeScreenUVToSDF.d.ts +0 -8
  237. package/typings/classes/VisualShaderNodeSmoothStep.d.ts +0 -28
  238. package/typings/classes/VisualShaderNodeStep.d.ts +0 -28
  239. package/typings/classes/VisualShaderNodeSwitch.d.ts +0 -30
  240. package/typings/classes/VisualShaderNodeTexture.d.ts +0 -57
  241. package/typings/classes/VisualShaderNodeTexture2DArray.d.ts +0 -12
  242. package/typings/classes/VisualShaderNodeTexture2DArrayParameter.d.ts +0 -6
  243. package/typings/classes/VisualShaderNodeTexture2DParameter.d.ts +0 -6
  244. package/typings/classes/VisualShaderNodeTexture3D.d.ts +0 -12
  245. package/typings/classes/VisualShaderNodeTexture3DParameter.d.ts +0 -6
  246. package/typings/classes/VisualShaderNodeTextureParameter.d.ts +0 -104
  247. package/typings/classes/VisualShaderNodeTextureParameterTriplanar.d.ts +0 -6
  248. package/typings/classes/VisualShaderNodeTextureSDF.d.ts +0 -6
  249. package/typings/classes/VisualShaderNodeTextureSDFNormal.d.ts +0 -6
  250. package/typings/classes/VisualShaderNodeTransformCompose.d.ts +0 -6
  251. package/typings/classes/VisualShaderNodeTransformConstant.d.ts +0 -10
  252. package/typings/classes/VisualShaderNodeTransformDecompose.d.ts +0 -6
  253. package/typings/classes/VisualShaderNodeTransformFunc.d.ts +0 -18
  254. package/typings/classes/VisualShaderNodeTransformOp.d.ts +0 -32
  255. package/typings/classes/VisualShaderNodeTransformParameter.d.ts +0 -14
  256. package/typings/classes/VisualShaderNodeTransformVecMult.d.ts +0 -22
  257. package/typings/classes/VisualShaderNodeUIntConstant.d.ts +0 -10
  258. package/typings/classes/VisualShaderNodeUIntFunc.d.ts +0 -20
  259. package/typings/classes/VisualShaderNodeUIntOp.d.ts +0 -48
  260. package/typings/classes/VisualShaderNodeUIntParameter.d.ts +0 -16
  261. package/typings/classes/VisualShaderNodeUVFunc.d.ts +0 -22
  262. package/typings/classes/VisualShaderNodeUVPolarCoord.d.ts +0 -6
  263. package/typings/classes/VisualShaderNodeVarying.d.ts +0 -14
  264. package/typings/classes/VisualShaderNodeVaryingGetter.d.ts +0 -6
  265. package/typings/classes/VisualShaderNodeVaryingSetter.d.ts +0 -6
  266. package/typings/classes/VisualShaderNodeVec2Constant.d.ts +0 -10
  267. package/typings/classes/VisualShaderNodeVec2Parameter.d.ts +0 -14
  268. package/typings/classes/VisualShaderNodeVec3Constant.d.ts +0 -10
  269. package/typings/classes/VisualShaderNodeVec3Parameter.d.ts +0 -14
  270. package/typings/classes/VisualShaderNodeVec4Constant.d.ts +0 -10
  271. package/typings/classes/VisualShaderNodeVec4Parameter.d.ts +0 -14
  272. package/typings/classes/VisualShaderNodeVectorBase.d.ts +0 -20
  273. package/typings/classes/VisualShaderNodeVectorCompose.d.ts +0 -8
  274. package/typings/classes/VisualShaderNodeVectorDecompose.d.ts +0 -8
  275. package/typings/classes/VisualShaderNodeVectorDistance.d.ts +0 -6
  276. package/typings/classes/VisualShaderNodeVectorFunc.d.ts +0 -84
  277. package/typings/classes/VisualShaderNodeVectorLen.d.ts +0 -6
  278. package/typings/classes/VisualShaderNodeVectorOp.d.ts +0 -42
  279. package/typings/classes/VisualShaderNodeVectorRefract.d.ts +0 -8
  280. package/typings/classes/VisualShaderNodeWorldPositionFromDepth.d.ts +0 -8
package/README.md CHANGED
@@ -4,8 +4,6 @@ Write Godot 4 scripts in TypeScript. Get autocomplete and type-checking for the
4
4
 
5
5
  ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/convert.webp)
6
6
 
7
- > Have an existing GDScript project? Bulk-convert it to TypeScript with [tstogd initial-convert-gd-to-ts](docs/gd-to-ts-migration.md).
8
-
9
7
  ## Why
10
8
 
11
9
  GDScript is great for getting things on screen, but its type system and tooling are intentionally lightweight. The bigger a project gets, the more that costs you: typos surface at runtime, refactors are risky, and autocomplete only goes so far. TypeScript was built for exactly this problem, and it has had a decade of investment poured into making large codebases safe to change.
@@ -24,13 +22,55 @@ The output is clean, idiomatic `.gd` you can read and ship — TypeScript is the
24
22
 
25
23
  - **Type-safe Godot API** — all 900+ engine classes generated as `.d.ts` from the official Godot XML docs, with nullable reference types where appropriate
26
24
  - **Live IDE diagnostics** — TypeScript language service plugin surfaces converter and Godot CLI errors as squiggles, on unsaved buffers
27
- - **Watch mode** — auto-convert on save, then run a debounced full-project check (TypeScript + converter + Godot CLI)
25
+ - **Watch mode** — auto-convert on save and keep typings in sync (it watches your `.tscn` scenes and assets too), then run a debounced full-project check (TypeScript + converter + Godot CLI)
28
26
  - **Source maps** — Godot script parse errors, runtime errors and stack traces map back to your TypeScript line/column
29
27
  - **Scene and path typings** — `get_node()`, `get_parent()`, `get_child()`, `load()`, `preload()` and group queries typed from your project files
30
28
  - **`gd` namespace** — strongly-typed helpers for GDScript-only constructs (signals, decorators, match, operator overloading)
31
29
  - **Addons supported** — typings for third-party GDScript addons, consumable from TypeScript
32
30
  - **GD → TS migration** — one-shot bulk converter for existing projects
33
31
 
32
+ ### Showcase
33
+
34
+ <details>
35
+ <summary>Scene and path type hints</summary>
36
+
37
+ Given this scene structure:
38
+
39
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_scene.png)
40
+
41
+ You get type hints for this:
42
+
43
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_hint_1.png)
44
+
45
+ …or this:
46
+
47
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_hint_2.png)
48
+
49
+ …or even this:
50
+
51
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_hint_3.png)
52
+
53
+ `preload()` is typed too:
54
+
55
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_preload.png)
56
+
57
+ </details>
58
+
59
+ <details>
60
+ <summary>GDScript and converter errors in TypeScript code</summary>
61
+
62
+ GDScript doesn't allow a static and an instance member to share the same name — though TypeScript does. Your IDE surfaces the GDScript error at the exact spot in your `.ts`:
63
+
64
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_gdscript_error.png)
65
+
66
+ For edge cases — like using the result of `&&` as a value — you get a converter error instead, because logical operations in GDScript always return a boolean:
67
+
68
+ ![](https://raw.githubusercontent.com/nnn3d/typescript-to-gdscript/HEAD/docs/assets/showcase_converter_error.png)
69
+
70
+ You also get all of these errors (along with the TypeScript errors themselves) from the `convert` CLI command.
71
+
72
+ </details>
73
+
34
74
  ## Quick start
35
75
 
36
76
  ```bash
@@ -41,10 +81,12 @@ tstogd init # interactive: writes tstogd.json + tsconfig.json + installs typescr
41
81
  Then:
42
82
 
43
83
  1. Write a `.ts` class in your TS source dir (default `src/`).
44
- 2. `tstogd convert` — emits `.gd` files into your output dir (default `scripts/`).
84
+ 2. `tstogd convert` — emits `.gd` into your output dir (default `scripts/`), regenerates all typings, and runs a full diagnostic check.
45
85
  3. Attach the `.gd` file in Godot as you normally would. Configure Godot's external editor to point at your IDE for TS language server and one-click jump-to-source ([guide](docs/ide-integration.md)).
46
86
 
47
- Use `tstogd watch` during development for auto-conversion plus live diagnostics.
87
+ That's the whole loop — `convert` and `watch` are the only commands you need in normal use. Each one converts your code _and_ regenerates every typing (scene, script, resource, addon) in the same pass, so `get_node()` paths, `res://` references, and group queries stay in sync without any extra step. Most projects never run another CLI command.
88
+
89
+ For day-to-day work, run **`tstogd watch`**: it auto-converts on save, watches your `.tscn` scenes and assets so scene typings refresh the instant you change the tree in Godot, and runs a debounced full-project check feeding live IDE diagnostics.
48
90
 
49
91
  ### Requirements
50
92
 
@@ -56,19 +98,32 @@ Use `tstogd watch` during development for auto-conversion plus live diagnostics.
56
98
 
57
99
  Setup `tstogd.json` and `tsconfig.json` in your project - for full template and field reference see [docs/configuration.md](docs/configuration.md).
58
100
 
101
+ ### Migration from existing GDScript
102
+
103
+ Have an existing GDScript project? Bulk-convert it to TypeScript with [tstogd initial-convert-gd-to-ts](docs/gd-to-ts-migration.md).
104
+
59
105
  ## CLI
60
106
 
107
+ In everyday use you only need these three:
108
+
109
+ ```bash
110
+ tstogd init # one-time interactive scaffold (tsconfig + tstogd.json + ts-plugin)
111
+ tstogd convert # convert TS → GD + regenerate all typings + full diagnostic check
112
+ tstogd watch # the same, continuously: auto-convert on save, live diagnostics
113
+ ```
114
+
115
+ > **Note:** `watch` self-heals — when an edit causes new errors in other files, those files are reconverted automatically. For a guaranteed full refresh of every `.gd`, run `tstogd convert` after a `watch` session.
116
+
117
+ `convert` and `watch` already regenerate every typing (scene, script, resource, addon) as part of the run — there is no separate "generate typings" step to remember. The commands below cover one-off or advanced situations, and most projects never touch them:
118
+
61
119
  ```bash
62
- tstogd init # interactive scaffold (tsconfig + tstogd.json + ts-plugin)
63
- tstogd convert # convert TS GD (cached, with diagnostic check)
64
- tstogd watch # auto-convert on change + debounced full check
65
- tstogd generate-typings # generate scene + script typings
66
- tstogd clear-cache # clear conversion cache
120
+ tstogd generate-typings # regenerate typings standalone (convert/watch do this for you)
121
+ tstogd clear-cache # clear the conversion cache (e.g. after upgrading the converter)
67
122
  ```
68
123
 
69
124
  Full reference in [docs/cli.md](docs/cli.md). Specialized commands:
70
125
 
71
- - [`initial-convert-gd-to-ts`](docs/gd-to-ts-migration.md) — bulk migration of an existing GDScript project to TypeScript
126
+ - [`initial-convert-gd-to-ts`](docs/gd-to-ts-migration.md) — one-shot bulk migration of an existing GDScript project to TypeScript
72
127
  - [`generate-gdscript-global-typings`](docs/typings.md#tstogd-generate-gdscript-global-typings), [`generate-addon-typings`](docs/typings.md#tstogd-generate-addon-typings) — typings generation
73
128
  - [`open-editor`](docs/ide-integration.md#tstogd-open-editor) — Godot external-editor integration
74
129
 
@@ -84,125 +139,116 @@ Each `.ts` file must contain exactly one class. Named classes (`class Foo`) are
84
139
  - `bool` — alias for `boolean`, also a cast: `bool(x)` → GDScript `bool(x)`. Same for `String(x)`.
85
140
  - `Dictionary<K, V>` — generic, with typed `get` / `set` / `keys` / `values`. `{}` literals keep dictionary methods via the `Object` interface. Untyped `Dictionary` is `<unknown, unknown>`.
86
141
  - `let` and `const` both convert to GDScript `var`. **Use `let`** — TS `var` is restricted (GDScript `var` ≈ TS `let`, not TS `var`).
87
- - `undefined` is restricted — use `null`. Optional property access (`obj.foo` where the type includes `undefined`) auto-converts to `obj.get("foo")`. Same for `obj["key"]` with an undefined type. Class-field access stays direct.
142
+ - `undefined` is restricted — use `null`. Plain objects (interfaces, object literals) are Dictionaries in GDScript: member reads convert to `obj.get("foo")`, which returns `null` for a missing key instead of crashing. Writes and class-instance access stay direct.
88
143
  - `TSOnly<T>` — type-level wrapper, stripped at conversion.
144
+ - Only types GDScript actually has get an annotation. Godot classes/value types and your own `class_name` classes (including ones imported from another file) keep their type; plain `interface`s, `object`, `type` aliases, and unknown/unresolved names have the annotation **omitted** (bare untyped `var x` / `func f(x)`) rather than emitting a bogus GD type. See [docs/transform-rules.md#type-annotations--what-gets-emitted](docs/transform-rules.md#type-annotations--what-gets-emitted).
89
145
 
90
146
  For comments, async, `this` / `self`, logical operators, and constructor mapping, see [docs/transform-rules.md](docs/transform-rules.md).
91
147
 
92
148
  ## Cheat sheet
93
149
 
94
- Cheat sheet with all basics to write scripts, with comments showing the generated GDScript. For advanced helpers and deep dive, see the [**full cheat sheet** in docs/transform-rules.md](docs/transform-rules.md#full-cheat-sheet).
150
+ Basics for writing scripts For advanced helpers and the deep dive, see the [**full cheat sheet** in docs/transform-rules.md](docs/transform-rules.md#full-cheat-sheet).
95
151
 
96
152
  ```typescript
97
- // ── Inner classes, class-level constants & enums (namespace merging) ──
98
- // A `namespace Player { ... }` block paired with the same-named class
99
- // lifts each `export`ed member into the class as a nested member.
100
- // Put constants and enums INSIDE the namespace — that's how GD
101
- // class-level `const` and `enum` are declared.
153
+ // Use imports instead of global classes for better DX
154
+ // Can be changed by `converterOptions.generateGlobalClassTypes` config option
155
+ import { PlayerSprite, type PlayerSpriteState } from './PlayerSprite';
156
+
157
+ // Inner classes, class-level constants & enums.
158
+ // A `namespace Player` merged with class `Player`
159
+ // lifts each exported member onto the class.
102
160
  export namespace Player {
103
- export const MAX_HP = 100; // → const MAX_HP = 100 (on Player)
161
+ export const MAX_HP = 100;
104
162
 
105
163
  export enum State {
106
164
  IDLE,
107
165
  RUNNING,
108
- } // → enum State { ... } (on Player)
166
+ }
109
167
 
110
168
  export class Bullet extends Node2D {
111
- // class Bullet extends Node2D:
112
- damage: int = 10; // var damage: int = 10
169
+ damage: int = 10;
113
170
  }
114
171
  }
115
172
 
116
173
  export class Player extends CharacterBody2D {
117
- // ── Statics (mutable) for constants, use the namespace block above ──
118
- static MAX_INSTANCES = 8; // → static var MAX_INSTANCES = 8
119
- // `readonly` is a TS-only contract — emits a plain `var` on GD.
120
-
121
- // ── Field decorators ─────────────────────────────────────────────
122
- // Every Godot annotation works as a decorator.
123
- // `@exports` is the only special alias:
124
- // `@export` is a TS reserved word, so the plural form emits
125
- @exports speed: float = 200.0; // → @export var speed: float = 200.0
126
- @export_range(0, 100) health: int = 100; // → @export_range(0, 100) var health: int = 100
127
- @onready sprite: Sprite2D; // @onready var sprite: Sprite2D
128
-
129
- // ── Signals — named tuple labels become GD arg names ─────────────
130
- health_changed = gd.signal<[from: int, to: int]>(); // → signal health_changed(from: int, to: int)
131
- died = gd.signal(); // signal died
132
-
133
- // ── Constructor → _init ──────────────────────────────────────────
174
+ // Statics (mutable); for constants use the namespace
175
+ static MAX_INSTANCES = 8;
176
+
177
+ // Field decorators. `@exports` aliases `@export`
178
+ // (a TS reserved word); other annotations are 1:1
179
+ @exports speed: float = 200.0;
180
+ @export_range(0, 100) health: int = 100;
181
+ @onready sprite: PlayerSprite = this.get_node('Sprite');
182
+ @onready sprite_state: PlayerSpriteState = this.sprite.get_state();
183
+
184
+ // Signals; tuple labels become GD arg names
185
+ health_changed = gd.signal<[from: int, to: int]>();
186
+ died = gd.signal();
187
+
188
+ // Constructor replaces _init
134
189
  constructor(speed: float = 200.0) {
135
- // → func _init(speed: float = 200.0):
136
- this.speed = speed; // self.speed = speed
190
+ this.speed = speed;
137
191
  }
138
192
 
139
- // ── Getters / setters native TS accessors ──────────────────────
193
+ // Getters / setters (native TS accessors)
140
194
  get score(): int {
141
195
  return this.score;
142
- } // → var score: int:
196
+ }
143
197
  set score(v: int) {
144
198
  this.score = v;
145
- } // get: return score
146
- // set(value): score = value
199
+ }
147
200
 
148
- // ── Async / await Promise<T> unwraps to T on the GD side ───────
201
+ // Async / await; Promise<T> unwraps to T
149
202
  async long_task(): Promise<int> {
150
- // → func long_task() -> int:
151
203
  await this.get_tree().create_timer(1).timeout;
152
204
  return 42;
153
205
  }
154
206
 
155
207
  _process(delta: float) {
156
- // → func _process(delta: float):
157
- // ── Operators ──────────────────────────────────────────────────
158
- let eq = this.health === 0; // → var eq = self.health == 0
159
- let ternary = eq ? 1 : 2; // → var ternary = 1 if eq else 2
208
+ // Operators
209
+ let eq = this.health === 0;
210
+ let ternary = eq ? 1 : 2;
160
211
 
161
- // ── Math on value types (Vector2, Color, …) needs gd.ops ───────
162
- let pos = gd.ops.add(this.position, Vector2(1, 0)); // → var pos = (self.position + Vector2(1, 0))
163
- // Available: add, sub, mul, div, rem, eq, ne, gt, gte, lt, lte, plus (unary), minus (unary)
212
+ // Math on value types (Vector2, Color, …) needs gd.ops
213
+ let pos = gd.ops.add(this.position, Vector2(1, 0));
214
+ // Also available: add, sub, mul, div, rem, eq, ne, gt, gte, lt, lte, plus (unary), minus (unary)
164
215
 
165
- // ── Type casting / checking ────────────────────────────────────
166
- let body = gd.as(this.get_node('Body'), CharacterBody2D); // → var body = self.get_node("Body") as CharacterBody2D
216
+ // Type casting / checking
217
+ // self.get_node("Body") as CharacterBody2D
218
+ let body = gd.as(this.get_node('Body'), CharacterBody2D);
167
219
  if (body instanceof CharacterBody2D) {
168
- /* class check */
169
- } // → if body is CharacterBody2D:
220
+ /* body is CharacterBody2D */
221
+ }
170
222
  if (gd.is(this.health, int)) {
171
- /* primitive */
172
- } // → if self.health is int:
223
+ /* health is int */
224
+ }
173
225
 
174
- // ── Object construction ────────────────────────────────────────
175
- let bullet = new Player.Bullet(); // → var bullet = Bullet.new()
226
+ // Object construction instead of Player.Bullet.new()
227
+ let bullet = new Player.Bullet();
176
228
 
177
- // ── Dictionaries (string keys — for non-string keys use gd.dict) ──
178
- let stats = { name: 'Hero', hp: 100 }; // → var stats = { "name": "Hero", "hp": 100 }
229
+ // Dictionaries (other keys: gd.dict)
230
+ let stats = { name: 'Hero', hp: 100 };
179
231
 
180
- // ── Strings, StringName, NodePath ──────────────────────────────
181
- let greet = `Hi ${this.name}!`; // → var greet = "Hi " + str(self.name) + "!"
182
- let path = NodePath('Body/Sprite'); // → var path = ^"Body/Sprite"
183
- let sig = StringName('died'); // → var sig = &"died"
232
+ // Strings, StringName, NodePath
233
+ let greet = `Hi ${this.name}!`;
234
+ let path = NodePath('Body/Sprite');
235
+ let sig = StringName('died');
184
236
 
185
- // ── Control flow ───────────────────────────────────────────────
186
- for (let s of range(3)) print(s); // → for s in range(3): print(s)
237
+ // Control flow
238
+ for (let s of range(3)) print(s);
187
239
 
188
- // ── Match — native TS switch round-trips with GD `match` ───────
189
- switch (
190
- this.health // → match self.health:
191
- ) {
240
+ // Match (TS switch round-trips with GD match)
241
+ switch (this.health) {
192
242
  case 0:
193
243
  this.died.emit();
194
- break; // 0: self.died.emit()
195
244
  default:
196
245
  print('alive');
197
- break; // _: print("alive")
198
246
  }
199
247
  }
200
248
 
201
249
  _ready() {
202
- // → func _ready():
203
- // Signals — emit and connect
204
- this.health_changed.emit(0, 100); // → self.health_changed.emit(0, 100)
205
250
  this.health_changed.connect(this._on_health_changed);
251
+ this.health_changed.emit(0, 100);
206
252
  }
207
253
 
208
254
  _on_health_changed(from: int, to: int) {
@@ -214,35 +260,117 @@ export class Player extends CharacterBody2D {
214
260
  }
215
261
  ```
216
262
 
217
- #### Useful global types
218
-
219
- Each interface is a map from a string literal (a `res://` path or a group name) to the typed entity that path resolves to. You index them directly to get the typed value:
263
+ <details>
264
+ <summary>Result gdscript:</summary>
265
+
266
+ ```gdscript
267
+ extends CharacterBody2D
268
+ class_name Player
269
+
270
+ const MAX_HP = 100
271
+
272
+ enum State { IDLE, RUNNING }
273
+
274
+ class Bullet extends Node2D:
275
+ var damage: int = 10
276
+
277
+ # Statics (mutable); for constants use the namespace
278
+ static var MAX_INSTANCES = 8
279
+ # Field decorators. `@exports` aliases `@export`
280
+ # (a TS reserved word); other annotations are 1:1
281
+ @export
282
+ var speed: float = 200.0
283
+ @export_range(0, 100)
284
+ var health: int = 100
285
+ @onready
286
+ var sprite: PlayerSprite = self.get_node("Sprite")
287
+ @onready
288
+ var spriteState = self.sprite.get_state()
289
+ # Signals; tuple labels become GD arg names
290
+ signal health_changed(from: int, to: int)
291
+ signal died
292
+
293
+ # Constructor replaces _init
294
+ func _init(speed: float = 200.0):
295
+ self.speed = speed
296
+
297
+ var score: int:
298
+ get:
299
+ return score
300
+ set(v):
301
+ score = v
302
+
303
+ # Async / await; Promise<T> unwraps to T
304
+ func long_task() -> int:
305
+ await self.get_tree().create_timer(1).timeout
306
+ return 42
307
+
308
+ func _process(delta: float):
309
+ # Operators
310
+ var eq = self.health == 0
311
+ var ternary = 1 if eq else 2
312
+ # Math on value types (Vector2, Color, …) needs gd.ops
313
+ var pos = (self.position + Vector2(1, 0))
314
+ # Also available: add, sub, mul, div, rem, eq, ne, gt, gte, lt, lte, plus (unary), minus (unary)
315
+ # Type casting / checking
316
+ # self.get_node("Body") as CharacterBody2D
317
+ var body = self.get_node("Body") as CharacterBody2D
318
+ if body is CharacterBody2D:
319
+ pass
320
+ if self.health is int:
321
+ pass
322
+ # Object construction instead of Player.Bullet.new()
323
+ var bullet = self.Bullet.new()
324
+ # Dictionaries (other keys: gd.dict)
325
+ var stats = {
326
+ "name": "Hero",
327
+ "hp": 100,
328
+ }
329
+ # Strings, StringName, NodePath
330
+ var greet = "Hi " + str(self.name) + "!"
331
+ var path = NodePath("Body/Sprite")
332
+ var sig = StringName("died")
333
+ # Control flow
334
+ for s in range(3):
335
+ print(s)
336
+ # Match (TS switch round-trips with GD match)
337
+ match self.health:
338
+ 0:
339
+ self.died.emit()
340
+ _:
341
+ print("alive")
342
+
343
+ func _ready():
344
+ self.health_changed.connect(self._on_health_changed)
345
+ self.health_changed.emit(0, 100)
346
+
347
+ func _on_health_changed(from: int, to: int):
348
+ pass
349
+
350
+ func die():
351
+ pass
352
+ ```
220
353
 
221
- | Interface | Keys | Values | Example |
222
- | ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
223
- | `GodotResources` | every asset path (`.tscn`, `.gd`, `.tres`, images, audio, …) | The resource type the path resolves to — `PackedScene<Root>` for scenes, `typeof Class` for scripts, the concrete `Resource` subclass for `.tres` | `let mat: GodotResources["res://player_material.tres"]` |
224
- | `GodotScripts` | `.gd` script paths | `typeof <Class>` — the class constructor for the script | `const GameManager: GodotScripts["res://GameManager.gd"]` |
225
- | `GodotScenes` | `.tscn` paths | The **root node** type of the scene (with full tree attached) | `let root: GodotScenes["res://Level.tscn"]` |
226
- | `GodotSceneTrees` | `.tscn` paths | The **tree** type — used when you need to index descendants directly | `type Tree = GodotSceneTrees["res://Player.tscn"]` |
227
- | `GodotGroups` | group names declared in `.tscn` files | `{ [scenePath]: union of node types in that group }` | `GodotGroups["enemies"]["res://Level.tscn"]` → `Goblin \| Slime` |
228
- | `GodotConnections` | scene paths that have `[connection]` entries | `{ "Node.signal": _GDSignalConnection<…> }` — connection metadata | `GodotConnections["res://UI.tscn"]["Button.pressed"]` |
354
+ </details>
229
355
 
230
- The Godot-typed `load()`, `preload()`, `get_node()`, and autoload singletons all index these interfaces under the hood.
356
+ #### Useful global types
231
357
 
232
- #### The `*Name` key-union aliases
358
+ Each interface maps a string literal (a `res://` path or group name) to the type it resolves to — index it directly, e.g. `GodotResources["res://player.tres"]` or `GodotScripts["res://player.gd"]`:
233
359
 
234
- Each base interface has a parallel alias defined as `keyof <Interface>`, so you can constrain a function argument to **only paths/names that exist in the project**:
360
+ - **`GodotResources`** any asset path its resource type (`PackedScene<Root>`, `typeof Class`, or the concrete `Resource` subclass)
361
+ - **`GodotResourceName`** (= `keyof GodotResources`) — any `res://…` asset
362
+ - **`GodotScripts`** — `.gd` path → `typeof <Class>` (the script constructor)
363
+ - **`GodotScriptName`** (= `keyof GodotScripts`) — a `.gd` path
364
+ - **`GodotScenes`** — `.tscn` path → the scene's **root node** type
365
+ - **`GodotSceneName`** (= `keyof GodotScenes`) — a `.tscn` path
366
+ - **`GodotSceneTrees`** — `.tscn` path → the **tree** type, for indexing descendants directly
367
+ - **`GodotSceneTreeName`** (= `keyof GodotSceneTrees`) — same set as `GodotSceneName`, for the tree rather than the root
368
+ - **`GodotGroups`** — group name → union of the node types in that group
369
+ - **`GodotGroupName`** (= `keyof GodotGroups`) — a group identifier (`"enemies"`, …)
235
370
 
236
- | Alias | Equivalent to | Typical use |
237
- | -------------------------- | ------------------------ | ----------------------------------------------------------------------- |
238
- | `GodotResourceName` | `keyof GodotResources` | `res://…` to any asset |
239
- | `GodotSceneName` | `keyof GodotScenes` | `res://…` to a `.tscn` |
240
- | `GodotSceneTreeName` | `keyof GodotSceneTrees` | Same set as `GodotSceneName`; pick when you want the tree, not the root |
241
- | `GodotScriptName` | `keyof GodotScripts` | `res://…` to a `.gd` |
242
- | `GodotGroupName` | `keyof GodotGroups` | Group identifier (`"enemies"`, `"entities"`, …) |
243
- | `GodotConnectionSceneName` | `keyof GodotConnections` | Scene paths that have `[connection]` entries |
371
+ The Godot-typed `load()`, `preload()`, `get_node()`, and autoload singletons all index these under the hood.
244
372
 
245
- `keyof` is resolved lazily, so each alias automatically picks up new entries as more files are converted. Typos in resource paths or group names become compile-time errors instead of silent runtime failures:
373
+ That types are resolved lazily, so each alias automatically picks up new entries as more files are converted. Typos in resource paths or group names become compile-time errors instead of silent runtime failures:
246
374
 
247
375
  ```typescript
248
376
  class AssetLoader extends Node {
@@ -256,9 +384,9 @@ class AssetLoader extends Node {
256
384
 
257
385
  _ready() {
258
386
  this.preload_asset('res://Player.tscn'); // ✅ typed
259
- this.preload_asset('res://does_not_exist.png'); // ❌ TS2345
387
+ this.preload_asset('res://does_not_exist.png'); // ❌ error
260
388
  this.count_in_group('enemies'); // ✅ typed
261
- this.count_in_group('typo'); // ❌ TS2345
389
+ this.count_in_group('typo'); // ❌ error
262
390
  }
263
391
  }
264
392
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/cli/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiN7D"}
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/cli/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgO7D"}
@@ -11,6 +11,8 @@ export function registerConvertCommand(program) {
11
11
  program
12
12
  .command('convert')
13
13
  .description('Convert TypeScript file(s) to GDScript. If no files given, converts all .ts files in tsDir. ' +
14
+ 'Converts every file fresh by default — correct even when types in other files changed; ' +
15
+ 'pass --use-cache to skip content-unchanged files (faster, may serve stale output). ' +
14
16
  'After writing, runs full diagnostic check (TS + converter + Godot) unless --no-check is set.')
15
17
  .argument('[files...]', 'TypeScript files or glob patterns to convert')
16
18
  .option('--ts-dir <dir>', 'TypeScript source directory')
@@ -19,7 +21,10 @@ export function registerConvertCommand(program) {
19
21
  .option('--tsconfig <path>', 'Path to tsconfig.json')
20
22
  .option('--godot-path <path>', 'Path to Godot executable (enables GDScript validation)')
21
23
  .option('--project-root <dir>', 'Godot project root for validation')
22
- .option('--no-cache', 'Disable cache (force full reconversion)')
24
+ .option('--use-cache', 'Skip conversion for files with a fresh cache entry. Fast, but can keep ' +
25
+ 'stale .gd output when types in imported files or global typings changed ' +
26
+ '(freshness is judged by file content only)', false)
27
+ .option('--no-cache', 'Disable cache entirely (no reads, no writes)')
23
28
  .option('--emit-on-error', 'Emit output files even when conversion errors occur', false)
24
29
  .option('--no-emit', 'Dry-run: convert in memory, check for stale outputs, do not write files')
25
30
  .option('--no-check', 'Skip the post-convert diagnostic check (TS + Godot)')
@@ -41,8 +46,13 @@ export function registerConvertCommand(program) {
41
46
  // commander: --no-emit sets opts.emit = false, --no-check sets opts.check = false
42
47
  const noEmit = opts.emit === false;
43
48
  const noCheck = opts.check === false;
44
- const useCache = opts.cache !== false;
45
- const cache = useCache ? new ProjectCache(cfg.cacheDir) : null;
49
+ // Cache is write-only by default: every run converts fresh (correct even
50
+ // when types in OTHER files changed content hashes can't see that),
51
+ // but results are still recorded so the watcher / ts-plugin / check
52
+ // phase can reuse them. `--use-cache` opts into the read-side skip;
53
+ // `--no-cache` disables the cache entirely.
54
+ const cache = opts.cache !== false ? new ProjectCache(cfg.cacheDir) : null;
55
+ const useCacheReads = opts.useCache === true && cache !== null;
46
56
  debugLog(`${noEmit ? 'Checking' : 'Converting'} ${resolvedFiles.length} file(s)...`);
47
57
  // Build the ts.Program once and share it across the write loop and the
48
58
  // post-convert checker — avoids re-parsing every .ts file twice.
@@ -59,12 +69,12 @@ export function registerConvertCommand(program) {
59
69
  for (const filePath of resolvedFiles) {
60
70
  const relPath = relative(cfg.tsDir, filePath);
61
71
  const outputPath = resolve(cfg.gdDir, relPath.replace(/\.ts$/, '.gd'));
62
- if (cache?.isTsToGdFresh(filePath, outputPath)) {
72
+ if (useCacheReads && cache?.isTsToGdFresh(filePath, outputPath)) {
63
73
  debugLog(`Skipped (cache): ${outputPath}`);
64
74
  skipped++;
65
75
  continue;
66
76
  }
67
- if (cache && cache.hasFreshCachedGd(filePath)) {
77
+ if (useCacheReads && cache?.hasFreshCachedGd(filePath)) {
68
78
  const promoted = cache.promoteCachedGd(filePath, outputPath);
69
79
  if (promoted && cache.isTsToGdFresh(filePath, outputPath)) {
70
80
  debugLog(`Promoted (cache-folder): ${outputPath}`);
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/cli/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/cli/convert.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,15 @@ export interface TransformContext {
40
40
  * `extends "res://..."` are taken relative to this directory.
41
41
  */
42
42
  projectRoot: string;
43
+ /**
44
+ * Godot class registry. Used to recognise Godot built-in types (classes,
45
+ * value-type constructors, global enums) by name when classifying TS type
46
+ * annotations — see {@link tsTypeNodeToGdType}. May be `undefined` when the
47
+ * registry could not be resolved, in which case classification can only
48
+ * emit types it proves are classes/enums via the checker and drops every
49
+ * other name (Godot built-ins can no longer be recognised by name).
50
+ */
51
+ registry?: GodotClassRegistry;
43
52
  }
44
53
  /**
45
54
  * Sentinel TS class name used for anonymous addon scripts (a `.gd`
@@ -147,12 +156,19 @@ export declare function isFloatType(type: ts.Type, checker: ts.TypeChecker): boo
147
156
  /**
148
157
  * Converts a TypeScript type to its GDScript type annotation string.
149
158
  * Returns null if the type should be omitted.
159
+ *
160
+ * NOTE: unlike {@link tsTypeNodeToGdType}, this `ts.Type`-based variant does
161
+ * NOT classify reference types — it returns the symbol name verbatim for any
162
+ * class-like type, so an `object`/`interface`/unknown type would leak a bogus
163
+ * annotation. It is currently unused for emission (kept only for its own
164
+ * recursion). Do not wire it into an emit path without adding the same
165
+ * class/enum/registry classification `classifyTypeReferenceName` applies.
150
166
  */
151
167
  export declare function tsTypeToGdType(type: ts.Type, checker: ts.TypeChecker): string | null;
152
168
  /**
153
169
  * Converts a TypeScript type annotation node to GDScript type string.
154
170
  */
155
- export declare function tsTypeNodeToGdType(typeNode: ts.TypeNode | undefined, checker: ts.TypeChecker, sourceFile: ts.SourceFile, className?: string): string | null;
171
+ export declare function tsTypeNodeToGdType(typeNode: ts.TypeNode | undefined, checker: ts.TypeChecker, sourceFile: ts.SourceFile, className?: string, registry?: GodotClassRegistry): string | null;
156
172
  /**
157
173
  * True when `gdType` refers to a Godot class (Node, Resource, Material, user
158
174
  * class, ...) — a type that can legitimately hold `null` in GDScript. False
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/converter/common/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/converter/common/index.ts"],"names":[],"mappings":"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"}