blockly 8.0.4-beta.0 → 8.0.5-beta.0

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 (858) hide show
  1. package/blockly.min.js +2421 -2688
  2. package/blockly_compressed.js +1499 -1994
  3. package/blockly_compressed.js.map +1 -1
  4. package/blocks/blocks.js +3 -2
  5. package/blocks/colour.js +3 -1
  6. package/blocks/lists.js +94 -22
  7. package/blocks/logic.js +14 -6
  8. package/blocks/loops.js +5 -3
  9. package/blocks/math.js +3 -1
  10. package/blocks/procedures.js +3 -1
  11. package/blocks/text.js +14 -6
  12. package/blocks/variables.js +3 -1
  13. package/blocks/variables_dynamic.js +3 -1
  14. package/blocks.d.ts +0 -2
  15. package/blocks_compressed.js +189 -171
  16. package/blocks_compressed.js.map +1 -1
  17. package/closure/goog/base.d.ts +1 -0
  18. package/closure/goog/base_minimal.d.ts +18 -0
  19. package/closure/goog/goog.d.ts +25 -0
  20. package/core/any_aliases.d.ts +1 -0
  21. package/core/any_aliases.ts +1 -0
  22. package/core/block.d.ts +779 -0
  23. package/core/{block.js → block.ts} +610 -719
  24. package/core/block_animations.d.ts +33 -0
  25. package/core/{block_animations.js → block_animations.ts} +75 -79
  26. package/core/block_drag_surface.d.ts +111 -0
  27. package/core/{block_drag_surface.js → block_drag_surface.ts} +85 -117
  28. package/core/block_dragger.d.ts +143 -0
  29. package/core/{block_dragger.js → block_dragger.ts} +139 -176
  30. package/core/block_svg.d.ts +588 -0
  31. package/core/{block_svg.js → block_svg.ts} +494 -630
  32. package/core/blockly.d.ts +562 -0
  33. package/core/blockly.js +1 -1
  34. package/core/blockly.ts +749 -0
  35. package/core/blockly_options.d.ts +69 -0
  36. package/core/blockly_options.ts +81 -0
  37. package/core/blocks.d.ts +17 -0
  38. package/core/{blocks.js → blocks.ts} +4 -8
  39. package/core/browser_events.d.ts +85 -0
  40. package/core/{browser_events.js → browser_events.ts} +98 -93
  41. package/core/bubble.d.ts +279 -0
  42. package/core/{bubble.js → bubble.ts} +277 -370
  43. package/core/bubble_dragger.d.ts +73 -0
  44. package/core/bubble_dragger.ts +229 -0
  45. package/core/bump_objects.d.ts +34 -0
  46. package/core/{bump_objects.js → bump_objects.ts} +54 -52
  47. package/core/clipboard.d.ts +42 -0
  48. package/core/clipboard.ts +91 -0
  49. package/core/comment.d.ts +113 -0
  50. package/core/{comment.js → comment.ts} +135 -185
  51. package/core/common.d.ts +129 -0
  52. package/core/{common.js → common.ts} +105 -82
  53. package/core/component_manager.d.ts +91 -0
  54. package/core/component_manager.ts +211 -0
  55. package/core/config.d.ts +23 -0
  56. package/core/{config.js → config.ts} +12 -19
  57. package/core/connection.d.ts +232 -0
  58. package/core/{connection.js → connection.ts} +187 -237
  59. package/core/connection_checker.d.ts +78 -0
  60. package/core/{connection_checker.js → connection_checker.ts} +66 -77
  61. package/core/connection_db.d.ts +91 -0
  62. package/core/{connection_db.js → connection_db.ts} +62 -87
  63. package/core/connection_type.d.ts +15 -0
  64. package/core/{connection_type.js → connection_type.ts} +8 -12
  65. package/core/constants.d.ts +15 -0
  66. package/core/{constants.js → constants.ts} +4 -8
  67. package/core/contextmenu.d.ts +80 -0
  68. package/core/{contextmenu.js → contextmenu.ts} +118 -153
  69. package/core/contextmenu_items.d.ts +77 -0
  70. package/core/contextmenu_items.ts +576 -0
  71. package/core/contextmenu_registry.d.ts +105 -0
  72. package/core/contextmenu_registry.ts +179 -0
  73. package/core/css.d.ts +24 -0
  74. package/core/{css.js → css.ts} +16 -24
  75. package/core/delete_area.d.ts +47 -0
  76. package/core/delete_area.ts +82 -0
  77. package/core/dialog.d.ts +61 -0
  78. package/core/dialog.ts +127 -0
  79. package/core/drag_target.d.ts +63 -0
  80. package/core/drag_target.ts +94 -0
  81. package/core/dropdowndiv.d.ts +155 -0
  82. package/core/{dropdowndiv.js → dropdowndiv.ts} +262 -333
  83. package/core/events/events.d.ts +102 -0
  84. package/core/events/events.ts +123 -0
  85. package/core/events/events_abstract.d.ts +51 -0
  86. package/core/events/events_abstract.ts +112 -0
  87. package/core/events/events_block_base.d.ts +31 -0
  88. package/core/events/events_block_base.ts +65 -0
  89. package/core/events/events_block_change.d.ts +55 -0
  90. package/core/events/{events_block_change.js → events_block_change.ts} +45 -48
  91. package/core/events/events_block_create.d.ts +35 -0
  92. package/core/events/{events_block_create.js → events_block_create.ts} +30 -35
  93. package/core/events/events_block_delete.d.ts +36 -0
  94. package/core/events/{events_block_delete.js → events_block_delete.ts} +34 -39
  95. package/core/events/events_block_drag.d.ts +36 -0
  96. package/core/events/events_block_drag.ts +82 -0
  97. package/core/events/events_block_move.d.ts +51 -0
  98. package/core/events/{events_block_move.js → events_block_move.ts} +54 -50
  99. package/core/events/events_bubble_open.d.ts +35 -0
  100. package/core/events/events_bubble_open.ts +82 -0
  101. package/core/events/events_click.d.ts +36 -0
  102. package/core/events/{events_click.js → events_click.ts} +27 -30
  103. package/core/events/events_comment_base.d.ts +39 -0
  104. package/core/events/events_comment_base.ts +107 -0
  105. package/core/events/events_comment_change.d.ts +43 -0
  106. package/core/events/{events_comment_change.js → events_comment_change.ts} +31 -28
  107. package/core/events/events_comment_create.d.ts +35 -0
  108. package/core/events/{events_comment_create.js → events_comment_create.ts} +24 -26
  109. package/core/events/events_comment_delete.d.ts +35 -0
  110. package/core/events/{events_comment_delete.js → events_comment_delete.ts} +20 -24
  111. package/core/events/events_comment_move.d.ts +55 -0
  112. package/core/events/{events_comment_move.js → events_comment_move.ts} +39 -42
  113. package/core/events/events_marker_move.d.ts +40 -0
  114. package/core/events/events_marker_move.ts +99 -0
  115. package/core/events/events_selected.d.ts +34 -0
  116. package/core/events/events_selected.ts +78 -0
  117. package/core/events/events_theme_change.d.ts +30 -0
  118. package/core/events/{events_theme_change.js → events_theme_change.ts} +19 -24
  119. package/core/events/events_toolbox_item_select.d.ts +34 -0
  120. package/core/events/events_toolbox_item_select.ts +79 -0
  121. package/core/events/events_trashcan_open.d.ts +31 -0
  122. package/core/events/events_trashcan_open.ts +68 -0
  123. package/core/events/events_ui.d.ts +37 -0
  124. package/core/events/{events_ui.js → events_ui.ts} +27 -26
  125. package/core/events/events_ui_base.d.ts +26 -0
  126. package/core/events/{events_ui_base.js → events_ui_base.ts} +17 -26
  127. package/core/events/events_var_base.d.ts +31 -0
  128. package/core/events/events_var_base.ts +65 -0
  129. package/core/events/events_var_create.d.ts +35 -0
  130. package/core/events/{events_var_create.js → events_var_create.ts} +24 -25
  131. package/core/events/events_var_delete.d.ts +35 -0
  132. package/core/events/{events_var_delete.js → events_var_delete.ts} +24 -25
  133. package/core/events/events_var_rename.d.ts +36 -0
  134. package/core/events/{events_var_rename.js → events_var_rename.ts} +25 -26
  135. package/core/events/events_viewport.d.ts +39 -0
  136. package/core/events/events_viewport.ts +100 -0
  137. package/core/events/utils.d.ts +272 -0
  138. package/core/events/{utils.js → utils.ts} +148 -219
  139. package/core/events/workspace_events.d.ts +36 -0
  140. package/core/events/workspace_events.ts +86 -0
  141. package/core/extensions.d.ts +107 -0
  142. package/core/{extensions.js → extensions.ts} +153 -172
  143. package/core/field.d.ts +534 -0
  144. package/core/{field.js → field.ts} +413 -489
  145. package/core/field_angle.d.ts +176 -0
  146. package/core/field_angle.ts +563 -0
  147. package/core/field_checkbox.d.ts +124 -0
  148. package/core/field_checkbox.ts +243 -0
  149. package/core/field_colour.d.ts +200 -0
  150. package/core/field_colour.ts +632 -0
  151. package/core/field_dropdown.d.ts +222 -0
  152. package/core/{field_dropdown.js → field_dropdown.ts} +277 -299
  153. package/core/field_image.d.ts +134 -0
  154. package/core/field_image.ts +282 -0
  155. package/core/field_label.d.ts +71 -0
  156. package/core/field_label.ts +152 -0
  157. package/core/field_label_serializable.d.ts +42 -0
  158. package/core/field_label_serializable.ts +76 -0
  159. package/core/field_multilineinput.d.ts +146 -0
  160. package/core/{field_multilineinput.js → field_multilineinput.ts} +166 -163
  161. package/core/field_number.d.ts +156 -0
  162. package/core/{field_number.js → field_number.ts} +110 -123
  163. package/core/field_registry.d.ts +45 -0
  164. package/core/{field_registry.js → field_registry.ts} +37 -30
  165. package/core/field_textinput.d.ts +219 -0
  166. package/core/field_textinput.ts +591 -0
  167. package/core/field_variable.d.ts +217 -0
  168. package/core/{field_variable.js → field_variable.ts} +174 -187
  169. package/core/flyout_base.d.ts +459 -0
  170. package/core/{flyout_base.js → flyout_base.ts} +429 -518
  171. package/core/flyout_button.d.ts +81 -0
  172. package/core/flyout_button.ts +292 -0
  173. package/core/flyout_horizontal.d.ts +82 -0
  174. package/core/{flyout_horizontal.js → flyout_horizontal.ts} +97 -107
  175. package/core/flyout_metrics_manager.d.ts +40 -0
  176. package/core/{flyout_metrics_manager.js → flyout_metrics_manager.ts} +22 -34
  177. package/core/flyout_vertical.d.ts +83 -0
  178. package/core/{flyout_vertical.js → flyout_vertical.ts} +106 -117
  179. package/core/generator.d.ts +205 -0
  180. package/core/{generator.js → generator.ts} +168 -193
  181. package/core/gesture.d.ts +357 -0
  182. package/core/{gesture.js → gesture.ts} +289 -369
  183. package/core/grid.d.ts +83 -0
  184. package/core/grid.ts +192 -0
  185. package/core/icon.d.ts +78 -0
  186. package/core/icon.ts +189 -0
  187. package/core/inject.d.ts +15 -0
  188. package/core/{inject.js → inject.ts} +101 -100
  189. package/core/input.d.ts +128 -0
  190. package/core/input.ts +309 -0
  191. package/core/input_types.d.ts +14 -0
  192. package/core/{input_types.js → input_types.ts} +8 -12
  193. package/core/insertion_marker_manager.d.ts +212 -0
  194. package/core/{insertion_marker_manager.js → insertion_marker_manager.ts} +234 -236
  195. package/core/interfaces/i_ast_node_location.d.ts +11 -0
  196. package/core/interfaces/{i_ast_node_location.js → i_ast_node_location.ts} +4 -7
  197. package/core/interfaces/i_ast_node_location_svg.d.ts +22 -0
  198. package/core/interfaces/i_ast_node_location_svg.ts +37 -0
  199. package/core/interfaces/i_ast_node_location_with_block.d.ts +18 -0
  200. package/core/interfaces/i_ast_node_location_with_block.ts +38 -0
  201. package/core/interfaces/i_autohideable.d.ts +18 -0
  202. package/core/interfaces/i_autohideable.ts +34 -0
  203. package/core/interfaces/i_block_dragger.d.ts +43 -0
  204. package/core/interfaces/i_block_dragger.ts +67 -0
  205. package/core/interfaces/i_bounded_element.d.ts +24 -0
  206. package/core/interfaces/i_bounded_element.ts +42 -0
  207. package/core/interfaces/i_bubble.d.ts +59 -0
  208. package/core/interfaces/i_bubble.ts +88 -0
  209. package/core/interfaces/i_collapsible_toolbox_item.d.ts +26 -0
  210. package/core/interfaces/i_collapsible_toolbox_item.ts +47 -0
  211. package/core/interfaces/i_component.d.ts +17 -0
  212. package/core/interfaces/{i_component.js → i_component.ts} +9 -14
  213. package/core/interfaces/i_connection_checker.d.ts +69 -0
  214. package/core/interfaces/i_connection_checker.ts +102 -0
  215. package/core/interfaces/i_contextmenu.d.ts +13 -0
  216. package/core/interfaces/i_contextmenu.ts +26 -0
  217. package/core/interfaces/i_copyable.d.ts +24 -0
  218. package/core/interfaces/i_copyable.ts +40 -0
  219. package/core/interfaces/i_deletable.d.ts +16 -0
  220. package/core/interfaces/{i_deletable.js → i_deletable.ts} +9 -13
  221. package/core/interfaces/i_delete_area.d.ts +25 -0
  222. package/core/interfaces/i_delete_area.ts +46 -0
  223. package/core/interfaces/i_drag_target.d.ts +53 -0
  224. package/core/interfaces/i_drag_target.ts +84 -0
  225. package/core/interfaces/i_draggable.d.ts +12 -0
  226. package/core/interfaces/{i_draggable.js → i_draggable.ts} +4 -10
  227. package/core/interfaces/i_flyout.d.ts +134 -0
  228. package/core/interfaces/i_flyout.ts +186 -0
  229. package/core/interfaces/i_keyboard_accessible.d.ts +18 -0
  230. package/core/interfaces/i_keyboard_accessible.ts +35 -0
  231. package/core/interfaces/i_metrics_manager.d.ts +117 -0
  232. package/core/interfaces/i_metrics_manager.ts +151 -0
  233. package/core/interfaces/i_movable.d.ts +16 -0
  234. package/core/interfaces/{i_movable.js → i_movable.ts} +9 -13
  235. package/core/interfaces/i_positionable.d.ts +27 -0
  236. package/core/interfaces/i_positionable.ts +50 -0
  237. package/core/interfaces/i_registrable.d.ts +11 -0
  238. package/core/interfaces/{i_registrable.js → i_registrable.ts} +3 -7
  239. package/core/interfaces/i_registrable_field.d.ts +17 -0
  240. package/core/interfaces/{i_registrable_field.js → i_registrable_field.ts} +8 -16
  241. package/core/interfaces/i_selectable.d.ts +18 -0
  242. package/core/interfaces/i_selectable.ts +34 -0
  243. package/core/interfaces/i_selectable_toolbox_item.d.ts +42 -0
  244. package/core/interfaces/i_selectable_toolbox_item.ts +64 -0
  245. package/core/interfaces/i_serializer.d.ts +42 -0
  246. package/core/interfaces/i_serializer.ts +65 -0
  247. package/core/interfaces/i_styleable.d.ts +21 -0
  248. package/core/interfaces/i_styleable.ts +35 -0
  249. package/core/interfaces/i_toolbox.d.ts +85 -0
  250. package/core/interfaces/i_toolbox.ts +127 -0
  251. package/core/interfaces/i_toolbox_item.d.ts +62 -0
  252. package/core/interfaces/i_toolbox_item.ts +84 -0
  253. package/core/internal_constants.d.ts +40 -0
  254. package/core/{internal_constants.js → internal_constants.ts} +13 -18
  255. package/core/keyboard_nav/ast_node.d.ts +239 -0
  256. package/core/keyboard_nav/{ast_node.js → ast_node.ts} +207 -231
  257. package/core/keyboard_nav/basic_cursor.d.ts +88 -0
  258. package/core/keyboard_nav/{basic_cursor.js → basic_cursor.ts} +55 -66
  259. package/core/keyboard_nav/cursor.d.ts +41 -0
  260. package/core/keyboard_nav/{cursor.js → cursor.ts} +25 -35
  261. package/core/keyboard_nav/marker.d.ts +58 -0
  262. package/core/keyboard_nav/{marker.js → marker.ts} +36 -55
  263. package/core/keyboard_nav/tab_navigate_cursor.d.ts +19 -0
  264. package/core/keyboard_nav/{tab_navigate_cursor.js → tab_navigate_cursor.ts} +11 -15
  265. package/core/main.d.ts +11 -0
  266. package/core/main.js +303 -0
  267. package/core/marker_manager.d.ts +85 -0
  268. package/core/marker_manager.ts +181 -0
  269. package/core/menu.d.ts +149 -0
  270. package/core/{menu.js → menu.ts} +141 -174
  271. package/core/menuitem.d.ts +118 -0
  272. package/core/menuitem.ts +240 -0
  273. package/core/metrics_manager.d.ts +201 -0
  274. package/core/{metrics_manager.js → metrics_manager.ts} +117 -156
  275. package/core/msg.d.ts +9 -0
  276. package/core/{msg.js → msg.ts} +4 -8
  277. package/core/mutator.d.ts +128 -0
  278. package/core/{mutator.js → mutator.ts} +196 -211
  279. package/core/names.d.ts +124 -0
  280. package/core/names.ts +267 -0
  281. package/core/options.d.ts +137 -0
  282. package/core/{options.js → options.ts} +147 -173
  283. package/core/positionable_helpers.d.ts +88 -0
  284. package/core/{positionable_helpers.js → positionable_helpers.ts} +63 -70
  285. package/core/procedures.d.ts +108 -0
  286. package/core/{procedures.js → procedures.ts} +143 -152
  287. package/core/registry.d.ts +137 -0
  288. package/core/registry.ts +339 -0
  289. package/core/rendered_connection.d.ts +191 -0
  290. package/core/{rendered_connection.js → rendered_connection.ts} +164 -184
  291. package/core/renderers/common/block_rendering.d.ts +114 -0
  292. package/core/renderers/common/block_rendering.ts +164 -0
  293. package/core/renderers/common/constants.d.ts +458 -0
  294. package/core/renderers/common/constants.ts +1124 -0
  295. package/core/renderers/common/debug.d.ts +28 -0
  296. package/core/renderers/common/{debug.js → debug.ts} +14 -20
  297. package/core/renderers/common/debugger.d.ts +120 -0
  298. package/core/renderers/common/{debugger.js → debugger.ts} +100 -124
  299. package/core/renderers/common/drawer.d.ts +132 -0
  300. package/core/renderers/common/{drawer.js → drawer.ts} +112 -137
  301. package/core/renderers/common/i_path_object.d.ts +117 -0
  302. package/core/renderers/common/i_path_object.ts +161 -0
  303. package/core/renderers/common/info.d.ts +194 -0
  304. package/core/renderers/common/{info.js → info.ts} +165 -222
  305. package/core/renderers/common/marker_svg.d.ts +220 -0
  306. package/core/renderers/common/marker_svg.ts +680 -0
  307. package/core/renderers/common/path_object.d.ts +146 -0
  308. package/core/renderers/common/path_object.ts +272 -0
  309. package/core/renderers/common/renderer.d.ts +157 -0
  310. package/core/renderers/common/renderer.ts +271 -0
  311. package/core/renderers/geras/constants.d.ts +23 -0
  312. package/core/renderers/geras/constants.ts +61 -0
  313. package/core/renderers/geras/drawer.d.ts +43 -0
  314. package/core/renderers/geras/{drawer.js → drawer.ts} +40 -84
  315. package/core/renderers/geras/geras.d.ts +11 -0
  316. package/core/renderers/geras/geras.ts +37 -0
  317. package/core/renderers/geras/highlight_constants.d.ts +108 -0
  318. package/core/renderers/geras/{highlight_constants.js → highlight_constants.ts} +107 -69
  319. package/core/renderers/geras/highlighter.d.ts +98 -0
  320. package/core/renderers/geras/{highlighter.js → highlighter.ts} +81 -86
  321. package/core/renderers/geras/info.d.ts +45 -0
  322. package/core/renderers/geras/{info.js → info.ts} +61 -99
  323. package/core/renderers/geras/measurables/inline_input.d.ts +23 -0
  324. package/core/renderers/geras/measurables/inline_input.ts +51 -0
  325. package/core/renderers/geras/measurables/statement_input.d.ts +23 -0
  326. package/core/renderers/geras/measurables/statement_input.ts +50 -0
  327. package/core/renderers/geras/path_object.d.ts +47 -0
  328. package/core/renderers/geras/{path_object.js → path_object.ts} +46 -74
  329. package/core/renderers/geras/renderer.d.ts +69 -0
  330. package/core/renderers/geras/renderer.ts +126 -0
  331. package/core/renderers/measurables/base.d.ts +27 -0
  332. package/core/renderers/measurables/base.ts +53 -0
  333. package/core/renderers/measurables/bottom_row.d.ts +61 -0
  334. package/core/renderers/measurables/bottom_row.ts +120 -0
  335. package/core/renderers/measurables/connection.d.ts +25 -0
  336. package/core/renderers/measurables/connection.ts +52 -0
  337. package/core/renderers/measurables/external_value_input.d.ts +27 -0
  338. package/core/renderers/measurables/external_value_input.ts +65 -0
  339. package/core/renderers/measurables/field.d.ts +30 -0
  340. package/core/renderers/measurables/field.ts +63 -0
  341. package/core/renderers/measurables/hat.d.ts +21 -0
  342. package/core/renderers/measurables/{hat.js → hat.ts} +12 -14
  343. package/core/renderers/measurables/icon.d.ts +26 -0
  344. package/core/renderers/measurables/{icon.js → icon.ts} +14 -18
  345. package/core/renderers/measurables/in_row_spacer.d.ts +21 -0
  346. package/core/renderers/measurables/in_row_spacer.ts +44 -0
  347. package/core/renderers/measurables/inline_input.d.ts +24 -0
  348. package/core/renderers/measurables/{inline_input.js → inline_input.ts} +22 -26
  349. package/core/renderers/measurables/input_connection.d.ts +29 -0
  350. package/core/renderers/measurables/input_connection.ts +66 -0
  351. package/core/renderers/measurables/input_row.d.ts +30 -0
  352. package/core/renderers/measurables/{input_row.js → input_row.ts} +24 -31
  353. package/core/renderers/measurables/jagged_edge.d.ts +20 -0
  354. package/core/renderers/measurables/{jagged_edge.js → jagged_edge.ts} +10 -13
  355. package/core/renderers/measurables/next_connection.d.ts +23 -0
  356. package/core/renderers/measurables/next_connection.ts +47 -0
  357. package/core/renderers/measurables/output_connection.d.ts +26 -0
  358. package/core/renderers/measurables/output_connection.ts +56 -0
  359. package/core/renderers/measurables/previous_connection.d.ts +23 -0
  360. package/core/renderers/measurables/previous_connection.ts +47 -0
  361. package/core/renderers/measurables/round_corner.d.ts +21 -0
  362. package/core/renderers/measurables/round_corner.ts +49 -0
  363. package/core/renderers/measurables/row.d.ts +141 -0
  364. package/core/renderers/measurables/row.ts +225 -0
  365. package/core/renderers/measurables/spacer_row.d.ts +29 -0
  366. package/core/renderers/measurables/spacer_row.ts +55 -0
  367. package/core/renderers/measurables/square_corner.d.ts +21 -0
  368. package/core/renderers/measurables/square_corner.ts +47 -0
  369. package/core/renderers/measurables/statement_input.d.ts +22 -0
  370. package/core/renderers/measurables/{statement_input.js → statement_input.ts} +14 -18
  371. package/core/renderers/measurables/top_row.d.ts +56 -0
  372. package/core/renderers/measurables/top_row.ts +122 -0
  373. package/core/renderers/measurables/types.d.ts +235 -0
  374. package/core/renderers/measurables/types.ts +332 -0
  375. package/core/renderers/minimalist/constants.d.ts +14 -0
  376. package/core/renderers/minimalist/{constants.js → constants.ts} +5 -10
  377. package/core/renderers/minimalist/drawer.d.ts +21 -0
  378. package/core/renderers/minimalist/drawer.ts +38 -0
  379. package/core/renderers/minimalist/info.d.ts +30 -0
  380. package/core/renderers/minimalist/info.ts +52 -0
  381. package/core/renderers/minimalist/minimalist.d.ts +6 -0
  382. package/core/renderers/minimalist/minimalist.ts +22 -0
  383. package/core/renderers/minimalist/renderer.d.ts +41 -0
  384. package/core/renderers/minimalist/renderer.ts +71 -0
  385. package/core/renderers/thrasos/info.d.ts +40 -0
  386. package/core/renderers/thrasos/{info.js → info.ts} +66 -67
  387. package/core/renderers/thrasos/renderer.d.ts +25 -0
  388. package/core/renderers/thrasos/renderer.ts +48 -0
  389. package/core/renderers/thrasos/thrasos.d.ts +4 -0
  390. package/core/renderers/thrasos/thrasos.ts +20 -0
  391. package/core/renderers/zelos/constants.d.ts +186 -0
  392. package/core/renderers/zelos/{constants.js → constants.ts} +294 -441
  393. package/core/renderers/zelos/drawer.d.ts +47 -0
  394. package/core/renderers/zelos/{drawer.js → drawer.ts} +73 -95
  395. package/core/renderers/zelos/info.d.ts +88 -0
  396. package/core/renderers/zelos/{info.js → info.ts} +111 -142
  397. package/core/renderers/zelos/marker_svg.d.ts +46 -0
  398. package/core/renderers/zelos/marker_svg.ts +151 -0
  399. package/core/renderers/zelos/measurables/bottom_row.d.ts +27 -0
  400. package/core/renderers/zelos/measurables/bottom_row.ts +53 -0
  401. package/core/renderers/zelos/measurables/inputs.d.ts +23 -0
  402. package/core/renderers/zelos/measurables/{inputs.js → inputs.ts} +14 -15
  403. package/core/renderers/zelos/measurables/row_elements.d.ts +21 -0
  404. package/core/renderers/zelos/measurables/row_elements.ts +45 -0
  405. package/core/renderers/zelos/measurables/top_row.d.ts +29 -0
  406. package/core/renderers/zelos/measurables/{top_row.js → top_row.ts} +14 -27
  407. package/core/renderers/zelos/path_object.d.ts +77 -0
  408. package/core/renderers/zelos/path_object.ts +215 -0
  409. package/core/renderers/zelos/renderer.d.ts +74 -0
  410. package/core/renderers/zelos/renderer.ts +142 -0
  411. package/core/renderers/zelos/zelos.d.ts +12 -0
  412. package/core/renderers/zelos/zelos.ts +39 -0
  413. package/core/scrollbar.d.ts +277 -0
  414. package/core/{scrollbar.js → scrollbar.ts} +307 -328
  415. package/core/scrollbar_pair.d.ts +105 -0
  416. package/core/{scrollbar_pair.js → scrollbar_pair.ts} +71 -79
  417. package/core/serialization/blocks.d.ts +98 -0
  418. package/core/serialization/{blocks.js → blocks.ts} +229 -228
  419. package/core/serialization/exceptions.d.ts +73 -0
  420. package/core/serialization/exceptions.ts +98 -0
  421. package/core/serialization/priorities.d.ts +15 -0
  422. package/core/serialization/{priorities.js → priorities.ts} +4 -10
  423. package/core/serialization/registry.d.ts +20 -0
  424. package/core/serialization/{registry.js → registry.ts} +11 -13
  425. package/core/serialization/variables.d.ts +14 -0
  426. package/core/serialization/{variables.js → variables.ts} +30 -32
  427. package/core/serialization/workspaces.d.ts +28 -0
  428. package/core/serialization/{workspaces.js → workspaces.ts} +30 -27
  429. package/core/shortcut_items.d.ts +61 -0
  430. package/core/{shortcut_items.js → shortcut_items.ts} +121 -157
  431. package/core/shortcut_registry.d.ts +151 -0
  432. package/core/shortcut_registry.ts +355 -0
  433. package/core/sprites.d.ts +19 -0
  434. package/core/{sprites.js → sprites.ts} +4 -6
  435. package/core/theme/classic.d.ts +12 -0
  436. package/core/theme/{classic.js → classic.ts} +5 -7
  437. package/core/theme/themes.d.ts +8 -0
  438. package/core/theme/themes.ts +22 -0
  439. package/core/theme/zelos.d.ts +11 -0
  440. package/core/theme/{zelos.js → zelos.ts} +4 -7
  441. package/core/theme.d.ts +142 -0
  442. package/core/theme.ts +221 -0
  443. package/core/theme_manager.d.ts +81 -0
  444. package/core/theme_manager.ts +186 -0
  445. package/core/toolbox/category.d.ts +239 -0
  446. package/core/toolbox/category.ts +679 -0
  447. package/core/toolbox/collapsible_category.d.ts +91 -0
  448. package/core/toolbox/collapsible_category.ts +273 -0
  449. package/core/toolbox/separator.d.ts +39 -0
  450. package/core/toolbox/separator.ts +105 -0
  451. package/core/toolbox/toolbox.d.ts +352 -0
  452. package/core/toolbox/{toolbox.js → toolbox.ts} +316 -432
  453. package/core/toolbox/toolbox_item.d.ts +85 -0
  454. package/core/toolbox/toolbox_item.ts +147 -0
  455. package/core/tooltip.d.ts +126 -0
  456. package/core/{tooltip.js → tooltip.ts} +136 -214
  457. package/core/touch.d.ts +121 -0
  458. package/core/touch.ts +306 -0
  459. package/core/touch_gesture.d.ts +115 -0
  460. package/core/{touch_gesture.js → touch_gesture.ts} +87 -125
  461. package/core/trashcan.d.ts +195 -0
  462. package/core/{trashcan.js → trashcan.ts} +226 -312
  463. package/core/utils/aria.d.ts +67 -0
  464. package/core/utils/{aria.js → aria.ts} +47 -61
  465. package/core/utils/array.d.ts +14 -0
  466. package/core/utils/{array.js → array.ts} +10 -12
  467. package/core/utils/colour.d.ts +103 -0
  468. package/core/utils/{colour.js → colour.ts} +60 -72
  469. package/core/utils/coordinate.d.ts +72 -0
  470. package/core/utils/coordinate.ts +124 -0
  471. package/core/utils/deprecation.d.ts +17 -0
  472. package/core/utils/{deprecation.js → deprecation.ts} +11 -11
  473. package/core/utils/dom.d.ts +165 -0
  474. package/core/utils/{dom.js → dom.ts} +125 -147
  475. package/core/utils/idgenerator.d.ts +25 -0
  476. package/core/utils/{idgenerator.js → idgenerator.ts} +15 -18
  477. package/core/utils/keycodes.d.ts +137 -0
  478. package/core/utils/keycodes.ts +169 -0
  479. package/core/utils/math.d.ts +30 -0
  480. package/core/utils/{math.js → math.ts} +17 -19
  481. package/core/utils/metrics.d.ts +64 -0
  482. package/core/utils/metrics.ts +97 -0
  483. package/core/utils/object.d.ts +35 -0
  484. package/core/utils/{object.js → object.ts} +30 -26
  485. package/core/utils/parsing.d.ts +50 -0
  486. package/core/utils/{parsing.js → parsing.ts} +50 -50
  487. package/core/utils/rect.d.ts +38 -0
  488. package/core/utils/{rect.js → rect.ts} +18 -31
  489. package/core/utils/sentinel.d.ts +11 -0
  490. package/core/utils/{sentinel.js → sentinel.ts} +3 -5
  491. package/core/utils/size.d.ts +27 -0
  492. package/core/utils/{size.js → size.ts} +12 -26
  493. package/core/utils/string.d.ts +55 -0
  494. package/core/utils/{string.js → string.ts} +64 -61
  495. package/core/utils/style.d.ts +127 -0
  496. package/core/utils/{style.js → style.ts} +102 -92
  497. package/core/utils/svg.d.ts +68 -0
  498. package/core/utils/svg.ts +88 -0
  499. package/core/utils/svg_math.d.ts +70 -0
  500. package/core/utils/{svg_math.js → svg_math.ts} +72 -71
  501. package/core/utils/svg_paths.d.ts +101 -0
  502. package/core/utils/{svg_paths.js → svg_paths.ts} +56 -65
  503. package/core/utils/toolbox.d.ts +193 -0
  504. package/core/utils/toolbox.ts +433 -0
  505. package/core/utils/useragent.d.ts +33 -0
  506. package/core/utils/useragent.ts +135 -0
  507. package/core/utils/xml.d.ts +52 -0
  508. package/core/utils/{xml.js → xml.ts} +26 -36
  509. package/core/utils.d.ts +217 -0
  510. package/core/utils.ts +428 -0
  511. package/core/variable_map.d.ts +141 -0
  512. package/core/{variable_map.js → variable_map.ts} +131 -149
  513. package/core/variable_model.d.ts +40 -0
  514. package/core/variable_model.ts +82 -0
  515. package/core/variables.d.ts +181 -0
  516. package/core/{variables.js → variables.ts} +206 -188
  517. package/core/variables_dynamic.d.ts +38 -0
  518. package/core/{variables_dynamic.js → variables_dynamic.ts} +47 -43
  519. package/core/warning.d.ts +50 -0
  520. package/core/{warning.js → warning.ts} +52 -66
  521. package/core/widgetdiv.d.ts +69 -0
  522. package/core/widgetdiv.ts +257 -0
  523. package/core/workspace.d.ts +386 -0
  524. package/core/workspace.ts +801 -0
  525. package/core/workspace_audio.d.ts +47 -0
  526. package/core/{workspace_audio.js → workspace_audio.ts} +47 -60
  527. package/core/workspace_comment.d.ts +170 -0
  528. package/core/workspace_comment.ts +398 -0
  529. package/core/workspace_comment_svg.d.ts +329 -0
  530. package/core/{workspace_comment_svg.js → workspace_comment_svg.ts} +347 -444
  531. package/core/workspace_drag_surface_svg.d.ts +68 -0
  532. package/core/{workspace_drag_surface_svg.js → workspace_drag_surface_svg.ts} +75 -82
  533. package/core/workspace_dragger.d.ts +48 -0
  534. package/core/workspace_dragger.ts +104 -0
  535. package/core/workspace_svg.d.ts +920 -0
  536. package/core/{workspace_svg.js → workspace_svg.ts} +855 -935
  537. package/core/xml.d.ts +117 -0
  538. package/core/{xml.js → xml.ts} +306 -326
  539. package/core/zoom_controls.d.ts +130 -0
  540. package/core/{zoom_controls.js → zoom_controls.ts} +185 -251
  541. package/core.d.ts +1 -3
  542. package/core.js +1 -2
  543. package/dart.d.ts +0 -3
  544. package/dart_compressed.js +387 -99
  545. package/dart_compressed.js.map +1 -1
  546. package/generators/dart/all.js +2 -0
  547. package/generators/dart/colour.js +1 -1
  548. package/generators/dart/lists.js +1 -1
  549. package/generators/dart/logic.js +1 -1
  550. package/generators/dart/loops.js +1 -1
  551. package/generators/dart/math.js +1 -1
  552. package/generators/dart/procedures.js +1 -1
  553. package/generators/dart/text.js +1 -1
  554. package/generators/dart/variables.js +1 -1
  555. package/generators/dart/variables_dynamic.js +1 -1
  556. package/generators/dart.js +1 -2
  557. package/generators/javascript/all.js +2 -0
  558. package/generators/javascript/colour.js +1 -1
  559. package/generators/javascript/lists.js +1 -1
  560. package/generators/javascript/logic.js +1 -1
  561. package/generators/javascript/loops.js +1 -1
  562. package/generators/javascript/math.js +4 -4
  563. package/generators/javascript/procedures.js +1 -1
  564. package/generators/javascript/text.js +2 -2
  565. package/generators/javascript/variables.js +1 -1
  566. package/generators/javascript/variables_dynamic.js +1 -1
  567. package/generators/javascript.js +1 -3
  568. package/generators/lua/all.js +2 -0
  569. package/generators/lua/colour.js +1 -1
  570. package/generators/lua/lists.js +1 -1
  571. package/generators/lua/logic.js +1 -1
  572. package/generators/lua/loops.js +1 -1
  573. package/generators/lua/math.js +1 -1
  574. package/generators/lua/procedures.js +1 -1
  575. package/generators/lua/text.js +1 -1
  576. package/generators/lua/variables.js +1 -1
  577. package/generators/lua/variables_dynamic.js +1 -1
  578. package/generators/lua.js +1 -2
  579. package/generators/php/all.js +2 -0
  580. package/generators/php/colour.js +1 -1
  581. package/generators/php/lists.js +1 -2
  582. package/generators/php/logic.js +1 -1
  583. package/generators/php/loops.js +1 -1
  584. package/generators/php/math.js +1 -1
  585. package/generators/php/procedures.js +1 -1
  586. package/generators/php/text.js +1 -1
  587. package/generators/php/variables.js +1 -1
  588. package/generators/php/variables_dynamic.js +1 -1
  589. package/generators/php.js +1 -2
  590. package/generators/python/all.js +2 -0
  591. package/generators/python/colour.js +3 -3
  592. package/generators/python/lists.js +1 -1
  593. package/generators/python/logic.js +1 -1
  594. package/generators/python/loops.js +4 -7
  595. package/generators/python/math.js +1 -1
  596. package/generators/python/procedures.js +1 -1
  597. package/generators/python/text.js +1 -1
  598. package/generators/python/variables.js +1 -1
  599. package/generators/python/variables_dynamic.js +1 -1
  600. package/generators/python.js +1 -2
  601. package/index.d.ts +2 -8
  602. package/javascript.d.ts +0 -3
  603. package/javascript_compressed.js +314 -104
  604. package/javascript_compressed.js.map +1 -1
  605. package/lua.d.ts +0 -3
  606. package/lua_compressed.js +399 -81
  607. package/lua_compressed.js.map +1 -1
  608. package/msg/ab.js +421 -421
  609. package/msg/ace.js +421 -421
  610. package/msg/af.js +421 -421
  611. package/msg/am.js +421 -421
  612. package/msg/ar.js +421 -421
  613. package/msg/ast.js +421 -421
  614. package/msg/az.js +421 -421
  615. package/msg/ba.js +421 -421
  616. package/msg/bcc.js +421 -421
  617. package/msg/be-tarask.js +421 -421
  618. package/msg/be.js +421 -421
  619. package/msg/bg.js +421 -421
  620. package/msg/bn.js +421 -421
  621. package/msg/br.js +421 -421
  622. package/msg/bs.js +421 -421
  623. package/msg/ca.js +421 -421
  624. package/msg/cdo.js +421 -421
  625. package/msg/cs.js +421 -421
  626. package/msg/da.js +421 -421
  627. package/msg/de.js +421 -421
  628. package/msg/diq.js +421 -421
  629. package/msg/dty.js +421 -421
  630. package/msg/ee.js +421 -421
  631. package/msg/el.js +421 -421
  632. package/msg/en-gb.js +421 -421
  633. package/msg/en.js +421 -421
  634. package/msg/eo.js +421 -421
  635. package/msg/es.js +421 -421
  636. package/msg/et.js +421 -421
  637. package/msg/eu.js +421 -421
  638. package/msg/fa.js +421 -421
  639. package/msg/fi.js +421 -421
  640. package/msg/fo.js +421 -421
  641. package/msg/fr.js +421 -421
  642. package/msg/frr.js +421 -421
  643. package/msg/gl.js +421 -421
  644. package/msg/gn.js +421 -421
  645. package/msg/gor.js +421 -421
  646. package/msg/ha.js +421 -421
  647. package/msg/hak.js +421 -421
  648. package/msg/he.js +421 -421
  649. package/msg/hi.js +421 -421
  650. package/msg/hr.js +421 -421
  651. package/msg/hrx.js +421 -421
  652. package/msg/hu.js +421 -421
  653. package/msg/hy.js +421 -421
  654. package/msg/ia.js +421 -421
  655. package/msg/id.js +421 -421
  656. package/msg/ig.js +421 -421
  657. package/msg/inh.js +421 -421
  658. package/msg/is.js +421 -421
  659. package/msg/it.js +421 -421
  660. package/msg/ja.js +421 -421
  661. package/msg/ka.js +421 -421
  662. package/msg/kab.js +421 -421
  663. package/msg/kbd-cyrl.js +421 -421
  664. package/msg/km.js +421 -421
  665. package/msg/kn.js +421 -421
  666. package/msg/ko.js +421 -421
  667. package/msg/ksh.js +421 -421
  668. package/msg/ku-latn.js +421 -421
  669. package/msg/ky.js +421 -421
  670. package/msg/la.js +421 -421
  671. package/msg/lb.js +421 -421
  672. package/msg/lki.js +421 -421
  673. package/msg/lo.js +421 -421
  674. package/msg/lrc.js +421 -421
  675. package/msg/lt.js +421 -421
  676. package/msg/lv.js +421 -421
  677. package/msg/mg.js +421 -421
  678. package/msg/mk.js +421 -421
  679. package/msg/ml.js +421 -421
  680. package/msg/mnw.js +421 -421
  681. package/msg/ms.js +421 -421
  682. package/msg/my.js +421 -421
  683. package/msg/mzn.js +421 -421
  684. package/msg/nb.js +421 -421
  685. package/msg/ne.js +421 -421
  686. package/msg/nl.js +421 -421
  687. package/msg/oc.js +421 -421
  688. package/msg/olo.js +421 -421
  689. package/msg/pa.js +421 -421
  690. package/msg/pl.js +421 -421
  691. package/msg/pms.js +421 -421
  692. package/msg/ps.js +421 -421
  693. package/msg/pt-br.js +421 -421
  694. package/msg/pt.js +421 -421
  695. package/msg/ro.js +421 -421
  696. package/msg/ru.js +421 -421
  697. package/msg/sc.js +421 -421
  698. package/msg/sco.js +421 -421
  699. package/msg/sd.js +421 -421
  700. package/msg/shn.js +421 -421
  701. package/msg/si.js +421 -421
  702. package/msg/sk.js +421 -421
  703. package/msg/skr-arab.js +421 -421
  704. package/msg/sl.js +421 -421
  705. package/msg/smn.js +421 -421
  706. package/msg/sq.js +421 -421
  707. package/msg/sr-latn.js +421 -421
  708. package/msg/sr.js +421 -421
  709. package/msg/sv.js +421 -421
  710. package/msg/sw.js +421 -421
  711. package/msg/ta.js +421 -421
  712. package/msg/tcy.js +421 -421
  713. package/msg/te.js +421 -421
  714. package/msg/th.js +421 -421
  715. package/msg/ti.js +421 -421
  716. package/msg/tl.js +421 -421
  717. package/msg/tlh.js +421 -421
  718. package/msg/tr.js +421 -421
  719. package/msg/ug-arab.js +421 -421
  720. package/msg/uk.js +421 -421
  721. package/msg/ur.js +421 -421
  722. package/msg/uz.js +421 -421
  723. package/msg/vi.js +421 -421
  724. package/msg/xmf.js +421 -421
  725. package/msg/yo.js +421 -421
  726. package/msg/yue.js +421 -421
  727. package/msg/zgh.js +421 -421
  728. package/msg/zh-hans.js +421 -421
  729. package/msg/zh-hant.js +421 -421
  730. package/package.json +5 -5
  731. package/php.d.ts +0 -3
  732. package/php_compressed.js +322 -93
  733. package/php_compressed.js.map +1 -1
  734. package/python.d.ts +0 -3
  735. package/python_compressed.js +237 -90
  736. package/python_compressed.js.map +1 -1
  737. package/blockly.d.ts +0 -26127
  738. package/core/blockly_options.js +0 -28
  739. package/core/bubble_dragger.js +0 -298
  740. package/core/clipboard.js +0 -80
  741. package/core/component_manager.js +0 -263
  742. package/core/contextmenu_items.js +0 -651
  743. package/core/contextmenu_registry.js +0 -178
  744. package/core/delete_area.js +0 -87
  745. package/core/dialog.js +0 -107
  746. package/core/drag_target.js +0 -98
  747. package/core/events/events.js +0 -147
  748. package/core/events/events_abstract.js +0 -133
  749. package/core/events/events_block_base.js +0 -70
  750. package/core/events/events_block_drag.js +0 -89
  751. package/core/events/events_bubble_open.js +0 -90
  752. package/core/events/events_comment_base.js +0 -121
  753. package/core/events/events_marker_move.js +0 -110
  754. package/core/events/events_selected.js +0 -83
  755. package/core/events/events_toolbox_item_select.js +0 -84
  756. package/core/events/events_trashcan_open.js +0 -73
  757. package/core/events/events_var_base.js +0 -70
  758. package/core/events/events_viewport.js +0 -107
  759. package/core/events/workspace_events.js +0 -93
  760. package/core/field_angle.js +0 -591
  761. package/core/field_checkbox.js +0 -255
  762. package/core/field_colour.js +0 -717
  763. package/core/field_image.js +0 -304
  764. package/core/field_label.js +0 -149
  765. package/core/field_label_serializable.js +0 -80
  766. package/core/field_textinput.js +0 -619
  767. package/core/flyout_button.js +0 -356
  768. package/core/grid.js +0 -226
  769. package/core/icon.js +0 -225
  770. package/core/input.js +0 -335
  771. package/core/interfaces/i_ast_node_location_svg.js +0 -45
  772. package/core/interfaces/i_ast_node_location_with_block.js +0 -41
  773. package/core/interfaces/i_autohideable.js +0 -40
  774. package/core/interfaces/i_block_dragger.js +0 -66
  775. package/core/interfaces/i_bounded_element.js +0 -45
  776. package/core/interfaces/i_bubble.js +0 -95
  777. package/core/interfaces/i_collapsible_toolbox_item.js +0 -53
  778. package/core/interfaces/i_connection_checker.js +0 -104
  779. package/core/interfaces/i_contextmenu.js +0 -32
  780. package/core/interfaces/i_copyable.js +0 -49
  781. package/core/interfaces/i_delete_area.js +0 -50
  782. package/core/interfaces/i_drag_target.js +0 -88
  783. package/core/interfaces/i_flyout.js +0 -201
  784. package/core/interfaces/i_keyboard_accessible.js +0 -38
  785. package/core/interfaces/i_metrics_manager.js +0 -154
  786. package/core/interfaces/i_positionable.js +0 -51
  787. package/core/interfaces/i_selectable.js +0 -51
  788. package/core/interfaces/i_selectable_toolbox_item.js +0 -73
  789. package/core/interfaces/i_serializer.js +0 -77
  790. package/core/interfaces/i_styleable.js +0 -39
  791. package/core/interfaces/i_toolbox.js +0 -142
  792. package/core/interfaces/i_toolbox_item.js +0 -85
  793. package/core/marker_manager.js +0 -213
  794. package/core/menuitem.js +0 -292
  795. package/core/names.js +0 -293
  796. package/core/registry.js +0 -384
  797. package/core/renderers/common/block_rendering.js +0 -170
  798. package/core/renderers/common/constants.js +0 -1250
  799. package/core/renderers/common/i_path_object.js +0 -162
  800. package/core/renderers/common/marker_svg.js +0 -721
  801. package/core/renderers/common/path_object.js +0 -283
  802. package/core/renderers/common/renderer.js +0 -305
  803. package/core/renderers/geras/constants.js +0 -73
  804. package/core/renderers/geras/geras.js +0 -36
  805. package/core/renderers/geras/measurables/inline_input.js +0 -58
  806. package/core/renderers/geras/measurables/statement_input.js +0 -57
  807. package/core/renderers/geras/renderer.js +0 -149
  808. package/core/renderers/measurables/base.js +0 -64
  809. package/core/renderers/measurables/bottom_row.js +0 -138
  810. package/core/renderers/measurables/connection.js +0 -56
  811. package/core/renderers/measurables/external_value_input.js +0 -70
  812. package/core/renderers/measurables/field.js +0 -71
  813. package/core/renderers/measurables/in_row_spacer.js +0 -47
  814. package/core/renderers/measurables/input_connection.js +0 -75
  815. package/core/renderers/measurables/next_connection.js +0 -50
  816. package/core/renderers/measurables/output_connection.js +0 -61
  817. package/core/renderers/measurables/previous_connection.js +0 -50
  818. package/core/renderers/measurables/round_corner.js +0 -52
  819. package/core/renderers/measurables/row.js +0 -247
  820. package/core/renderers/measurables/spacer_row.js +0 -69
  821. package/core/renderers/measurables/square_corner.js +0 -50
  822. package/core/renderers/measurables/top_row.js +0 -143
  823. package/core/renderers/measurables/types.js +0 -353
  824. package/core/renderers/minimalist/drawer.js +0 -42
  825. package/core/renderers/minimalist/info.js +0 -54
  826. package/core/renderers/minimalist/minimalist.js +0 -26
  827. package/core/renderers/minimalist/renderer.js +0 -80
  828. package/core/renderers/thrasos/renderer.js +0 -53
  829. package/core/renderers/thrasos/thrasos.js +0 -22
  830. package/core/renderers/zelos/marker_svg.js +0 -179
  831. package/core/renderers/zelos/measurables/bottom_row.js +0 -66
  832. package/core/renderers/zelos/measurables/row_elements.js +0 -46
  833. package/core/renderers/zelos/path_object.js +0 -247
  834. package/core/renderers/zelos/renderer.js +0 -147
  835. package/core/renderers/zelos/zelos.js +0 -38
  836. package/core/serialization/exceptions.js +0 -144
  837. package/core/shortcut_registry.js +0 -366
  838. package/core/theme/themes.js +0 -23
  839. package/core/theme.js +0 -228
  840. package/core/theme_manager.js +0 -211
  841. package/core/toolbox/category.js +0 -751
  842. package/core/toolbox/collapsible_category.js +0 -311
  843. package/core/toolbox/separator.js +0 -133
  844. package/core/toolbox/toolbox_item.js +0 -173
  845. package/core/touch.js +0 -285
  846. package/core/utils/coordinate.js +0 -138
  847. package/core/utils/global.js +0 -41
  848. package/core/utils/keycodes.js +0 -172
  849. package/core/utils/metrics.js +0 -154
  850. package/core/utils/svg.js +0 -186
  851. package/core/utils/toolbox.js +0 -459
  852. package/core/utils/useragent.js +0 -197
  853. package/core/utils.js +0 -383
  854. package/core/variable_model.js +0 -96
  855. package/core/widgetdiv.js +0 -290
  856. package/core/workspace.js +0 -836
  857. package/core/workspace_comment.js +0 -400
  858. package/core/workspace_dragger.js +0 -115
@@ -7,341 +7,270 @@
7
7
  /**
8
8
  * @fileoverview The class representing one block.
9
9
  */
10
- 'use strict';
11
10
 
12
11
  /**
13
12
  * The class representing one block.
14
13
  * @class
15
14
  */
16
- goog.module('Blockly.Block');
17
-
18
- const Extensions = goog.require('Blockly.Extensions');
19
- const Tooltip = goog.require('Blockly.Tooltip');
20
- const arrayUtils = goog.require('Blockly.utils.array');
21
- const common = goog.require('Blockly.common');
22
- const constants = goog.require('Blockly.constants');
23
- const eventUtils = goog.require('Blockly.Events.utils');
24
- const fieldRegistry = goog.require('Blockly.fieldRegistry');
25
- const idGenerator = goog.require('Blockly.utils.idGenerator');
26
- const object = goog.require('Blockly.utils.object');
27
- const parsing = goog.require('Blockly.utils.parsing');
28
- /* eslint-disable-next-line no-unused-vars */
29
- const {Abstract} = goog.requireType('Blockly.Events.Abstract');
30
- const {Align, Input} = goog.require('Blockly.Input');
31
- const {ASTNode} = goog.require('Blockly.ASTNode');
32
- /* eslint-disable-next-line no-unused-vars */
33
- const {BlockMove} = goog.requireType('Blockly.Events.BlockMove');
34
- const {Blocks} = goog.require('Blockly.blocks');
35
- /* eslint-disable-next-line no-unused-vars */
36
- const {Comment} = goog.requireType('Blockly.Comment');
37
- const {ConnectionType} = goog.require('Blockly.ConnectionType');
38
- const {Connection} = goog.require('Blockly.Connection');
39
- const {Coordinate} = goog.require('Blockly.utils.Coordinate');
40
- /* eslint-disable-next-line no-unused-vars */
41
- const {Field} = goog.requireType('Blockly.Field');
42
- /* eslint-disable-next-line no-unused-vars */
43
- const {IASTNodeLocation} = goog.require('Blockly.IASTNodeLocation');
44
- /* eslint-disable-next-line no-unused-vars */
45
- const {IDeletable} = goog.require('Blockly.IDeletable');
46
- /* eslint-disable-next-line no-unused-vars */
47
- const {Mutator} = goog.requireType('Blockly.Mutator');
48
- const {Size} = goog.require('Blockly.utils.Size');
49
- /* eslint-disable-next-line no-unused-vars */
50
- const {VariableModel} = goog.requireType('Blockly.VariableModel');
51
- /* eslint-disable-next-line no-unused-vars */
52
- const {Workspace} = goog.requireType('Blockly.Workspace');
53
- const {inputTypes} = goog.require('Blockly.inputTypes');
54
- /** @suppress {extraRequire} */
55
- goog.require('Blockly.Events.BlockChange');
56
- /** @suppress {extraRequire} */
57
- goog.require('Blockly.Events.BlockCreate');
58
- /** @suppress {extraRequire} */
59
- goog.require('Blockly.Events.BlockDelete');
60
- /** @suppress {extraRequire} */
61
- goog.require('Blockly.Events.BlockMove');
15
+ import * as goog from '../closure/goog/goog.js';
16
+ goog.declareModuleId('Blockly.Block');
17
+
18
+ // Unused import preserved for side-effects. Remove if unneeded.
19
+ import './events/events_block_change.js';
20
+ // Unused import preserved for side-effects. Remove if unneeded.
21
+ import './events/events_block_create.js';
22
+ // Unused import preserved for side-effects. Remove if unneeded.
23
+ import './events/events_block_delete.js';
24
+
25
+ import {Blocks} from './blocks.js';
26
+ import type {Comment} from './comment.js';
27
+ import * as common from './common.js';
28
+ import {Connection} from './connection.js';
29
+ import {ConnectionType} from './connection_type.js';
30
+ import * as constants from './constants.js';
31
+ import type {Abstract} from './events/events_abstract.js';
32
+ import type {BlockMove} from './events/events_block_move.js';
33
+ import * as eventUtils from './events/utils.js';
34
+ import * as Extensions from './extensions.js';
35
+ import type {Field} from './field.js';
36
+ import * as fieldRegistry from './field_registry.js';
37
+ import {Align, Input} from './input.js';
38
+ import {inputTypes} from './input_types.js';
39
+ import type {IASTNodeLocation} from './interfaces/i_ast_node_location.js';
40
+ import type {IDeletable} from './interfaces/i_deletable.js';
41
+ import {ASTNode} from './keyboard_nav/ast_node.js';
42
+ import type {Mutator} from './mutator.js';
43
+ import * as Tooltip from './tooltip.js';
44
+ import * as arrayUtils from './utils/array.js';
45
+ import {Coordinate} from './utils/coordinate.js';
46
+ import * as idGenerator from './utils/idgenerator.js';
47
+ import * as parsing from './utils/parsing.js';
48
+ import {Size} from './utils/size.js';
49
+ import type {VariableModel} from './variable_model.js';
50
+ import type {Workspace} from './workspace.js';
62
51
 
63
52
 
64
53
  /**
65
54
  * Class for one block.
66
55
  * Not normally called directly, workspace.newBlock() is preferred.
67
- * @implements {IASTNodeLocation}
68
- * @implements {IDeletable}
69
56
  * @unrestricted
70
57
  * @alias Blockly.Block
71
58
  */
72
- class Block {
59
+ export class Block implements IASTNodeLocation, IDeletable {
73
60
  /**
74
- * @param {!Workspace} workspace The block's workspace.
75
- * @param {!string} prototypeName Name of the language object containing
76
- * type-specific functions for this block.
77
- * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise
78
- * create a new ID.
79
- * @throws When the prototypeName is not valid or not allowed.
61
+ * An optional callback method to use whenever the block's parent workspace
62
+ * changes. This is usually only called from the constructor, the block type
63
+ * initializer function, or an extension initializer function.
80
64
  */
81
- constructor(workspace, prototypeName, opt_id) {
82
- const {Generator} = goog.module.get('Blockly.Generator');
83
- if (Generator &&
84
- typeof Generator.prototype[prototypeName] !== 'undefined') {
85
- // Occluding Generator class members is not allowed.
86
- throw Error(
87
- 'Block prototypeName "' + prototypeName +
88
- '" conflicts with Blockly.Generator members.');
89
- }
65
+ onchange?: ((p1: Abstract) => AnyDuringMigration)|null;
90
66
 
91
- /**
92
- * Optional text data that round-trips between blocks and XML.
93
- * Has no effect. May be used by 3rd parties for meta information.
94
- * @type {?string}
95
- */
96
- this.data = null;
67
+ /** The language-neutral ID given to the collapsed input. */
68
+ static readonly COLLAPSED_INPUT_NAME: string = constants.COLLAPSED_INPUT_NAME;
97
69
 
98
- /**
99
- * Has this block been disposed of?
100
- * @type {boolean}
101
- * @package
102
- */
103
- this.disposed = false;
70
+ /** The language-neutral ID given to the collapsed field. */
71
+ static readonly COLLAPSED_FIELD_NAME: string = constants.COLLAPSED_FIELD_NAME;
104
72
 
105
- /**
106
- * Colour of the block as HSV hue value (0-360)
107
- * This may be null if the block colour was not set via a hue number.
108
- * @type {?number}
109
- * @private
110
- */
111
- this.hue_ = null;
73
+ /**
74
+ * Optional text data that round-trips between blocks and XML.
75
+ * Has no effect. May be used by 3rd parties for meta information.
76
+ */
77
+ data: string|null = null;
112
78
 
113
- /**
114
- * Colour of the block in '#RRGGBB' format.
115
- * @type {string}
116
- * @protected
117
- */
118
- this.colour_ = '#000000';
79
+ /**
80
+ * Has this block been disposed of?
81
+ * @internal
82
+ */
83
+ disposed = false;
119
84
 
120
- /**
121
- * Name of the block style.
122
- * @type {string}
123
- * @protected
124
- */
125
- this.styleName_ = '';
85
+ /**
86
+ * Colour of the block as HSV hue value (0-360)
87
+ * This may be null if the block colour was not set via a hue number.
88
+ */
89
+ private hue_: number|null = null;
126
90
 
127
- /**
128
- * An optional method called during initialization.
129
- * @type {undefined|?function()}
130
- */
131
- this.init = undefined;
91
+ /** Colour of the block in '#RRGGBB' format. */
92
+ protected colour_ = '#000000';
132
93
 
133
- /**
134
- * An optional serialization method for defining how to serialize the
135
- * mutation state to XML. This must be coupled with defining
136
- * `domToMutation`.
137
- * @type {undefined|?function(...):!Element}
138
- */
139
- this.mutationToDom = undefined;
94
+ /** Name of the block style. */
95
+ protected styleName_ = '';
140
96
 
141
- /**
142
- * An optional deserialization method for defining how to deserialize the
143
- * mutation state from XML. This must be coupled with defining
144
- * `mutationToDom`.
145
- * @type {undefined|?function(!Element)}
146
- */
147
- this.domToMutation = undefined;
97
+ /** An optional method called during initialization. */
98
+ init?: (() => AnyDuringMigration)|null = undefined;
148
99
 
149
- /**
150
- * An optional serialization method for defining how to serialize the
151
- * block's extra state (eg mutation state) to something JSON compatible.
152
- * This must be coupled with defining `loadExtraState`.
153
- * @type {undefined|?function(): *}
154
- */
155
- this.saveExtraState = undefined;
100
+ /**
101
+ * An optional serialization method for defining how to serialize the
102
+ * mutation state to XML. This must be coupled with defining
103
+ * `domToMutation`.
104
+ */
105
+ mutationToDom?: ((...p1: AnyDuringMigration[]) => Element)|null = undefined;
156
106
 
157
- /**
158
- * An optional serialization method for defining how to deserialize the
159
- * block's extra state (eg mutation state) from something JSON compatible.
160
- * This must be coupled with defining `saveExtraState`.
161
- * @type {undefined|?function(*)}
162
- */
163
- this.loadExtraState = undefined;
107
+ /**
108
+ * An optional deserialization method for defining how to deserialize the
109
+ * mutation state from XML. This must be coupled with defining
110
+ * `mutationToDom`.
111
+ */
112
+ domToMutation?: ((p1: Element) => AnyDuringMigration)|null = undefined;
164
113
 
114
+ /**
115
+ * An optional serialization method for defining how to serialize the
116
+ * block's extra state (eg mutation state) to something JSON compatible.
117
+ * This must be coupled with defining `loadExtraState`.
118
+ */
119
+ saveExtraState?: (() => AnyDuringMigration)|null = undefined;
165
120
 
166
- /**
167
- * An optional property for suppressing adding STATEMENT_PREFIX and
168
- * STATEMENT_SUFFIX to generated code.
169
- * @type {?boolean}
170
- */
171
- this.suppressPrefixSuffix = false;
121
+ /**
122
+ * An optional serialization method for defining how to deserialize the
123
+ * block's extra state (eg mutation state) from something JSON compatible.
124
+ * This must be coupled with defining `saveExtraState`.
125
+ */
126
+ loadExtraState?:
127
+ ((p1: AnyDuringMigration) => AnyDuringMigration)|null = undefined;
172
128
 
173
- /**
174
- * An optional property for declaring developer variables. Return a list of
175
- * variable names for use by generators. Developer variables are never
176
- * shown to the user, but are declared as global variables in the generated
177
- * code.
178
- * @type {undefined|?function():!Array<string>}
179
- */
180
- this.getDeveloperVariables = undefined;
129
+ /**
130
+ * An optional property for suppressing adding STATEMENT_PREFIX and
131
+ * STATEMENT_SUFFIX to generated code.
132
+ */
133
+ suppressPrefixSuffix: boolean|null = false;
181
134
 
182
- /** @type {string} */
183
- this.id = (opt_id && !workspace.getBlockById(opt_id)) ?
184
- opt_id :
185
- idGenerator.genUid();
186
- workspace.setBlockById(this.id, this);
187
- /** @type {Connection} */
188
- this.outputConnection = null;
189
- /** @type {Connection} */
190
- this.nextConnection = null;
191
- /** @type {Connection} */
192
- this.previousConnection = null;
193
- /** @type {!Array<!Input>} */
194
- this.inputList = [];
195
- /** @type {boolean|undefined} */
196
- this.inputsInline = undefined;
197
- /**
198
- * @type {boolean}
199
- * @private
200
- */
201
- this.disabled = false;
202
- /** @type {!Tooltip.TipInfo} */
203
- this.tooltip = '';
204
- /** @type {boolean} */
205
- this.contextMenu = true;
135
+ /**
136
+ * An optional property for declaring developer variables. Return a list of
137
+ * variable names for use by generators. Developer variables are never
138
+ * shown to the user, but are declared as global variables in the generated
139
+ * code.
140
+ */
141
+ getDeveloperVariables?: (() => string[]) = undefined;
206
142
 
207
- /**
208
- * @type {Block}
209
- * @protected
210
- */
211
- this.parentBlock_ = null;
143
+ /**
144
+ * An optional function that reconfigures the block based on the contents of
145
+ * the mutator dialog.
146
+ */
147
+ compose?: ((p1: Block) => void) = undefined;
212
148
 
213
- /**
214
- * @type {!Array<!Block>}
215
- * @protected
216
- */
217
- this.childBlocks_ = [];
149
+ /**
150
+ * An optional function that populates the mutator's dialog with
151
+ * this block's components.
152
+ */
153
+ decompose?: ((p1: Workspace) => Block) = undefined;
154
+ id: string;
155
+ // AnyDuringMigration because: Type 'null' is not assignable to type
156
+ // 'Connection'.
157
+ outputConnection: Connection = null as AnyDuringMigration;
158
+ // AnyDuringMigration because: Type 'null' is not assignable to type
159
+ // 'Connection'.
160
+ nextConnection: Connection = null as AnyDuringMigration;
161
+ // AnyDuringMigration because: Type 'null' is not assignable to type
162
+ // 'Connection'.
163
+ previousConnection: Connection = null as AnyDuringMigration;
164
+ inputList: Input[] = [];
165
+ inputsInline?: boolean = undefined;
166
+ private disabled = false;
167
+ tooltip: Tooltip.TipInfo = '';
168
+ contextMenu = true;
218
169
 
219
- /**
220
- * @type {boolean}
221
- * @private
222
- */
223
- this.deletable_ = true;
170
+ protected parentBlock_: this|null = null;
224
171
 
225
- /**
226
- * @type {boolean}
227
- * @private
228
- */
229
- this.movable_ = true;
172
+ protected childBlocks_: this[] = [];
230
173
 
231
- /**
232
- * @type {boolean}
233
- * @private
234
- */
235
- this.editable_ = true;
174
+ private deletable_ = true;
236
175
 
237
- /**
238
- * @type {boolean}
239
- * @private
240
- */
241
- this.isShadow_ = false;
176
+ private movable_ = true;
242
177
 
243
- /**
244
- * @type {boolean}
245
- * @protected
246
- */
247
- this.collapsed_ = false;
178
+ private editable_ = true;
248
179
 
249
- /**
250
- * @type {?number}
251
- * @protected
252
- */
253
- this.outputShape_ = null;
180
+ private isShadow_ = false;
254
181
 
255
- /**
256
- * A string representing the comment attached to this block.
257
- * @type {string|Comment}
258
- * @deprecated August 2019. Use getCommentText instead.
259
- */
260
- this.comment = null;
182
+ protected collapsed_ = false;
183
+ protected outputShape_: number|null = null;
261
184
 
262
- /**
263
- * A model of the comment attached to this block.
264
- * @type {!Block.CommentModel}
265
- * @package
266
- */
267
- this.commentModel = {text: null, pinned: false, size: new Size(160, 80)};
185
+ /**
186
+ * A string representing the comment attached to this block.
187
+ * @deprecated August 2019. Use getCommentText instead.
188
+ */
189
+ comment: string|Comment|null = null;
190
+ /** @internal */
191
+ commentModel: CommentModel;
192
+ private readonly xy_: Coordinate;
193
+ isInFlyout: boolean;
194
+ isInMutator: boolean;
195
+ RTL: boolean;
268
196
 
269
- /**
270
- * The block's position in workspace units. (0, 0) is at the workspace's
271
- * origin; scale does not change this value.
272
- * @type {!Coordinate}
273
- * @private
274
- */
275
- this.xy_ = new Coordinate(0, 0);
197
+ /** True if this block is an insertion marker. */
198
+ protected isInsertionMarker_ = false;
276
199
 
277
- /** @type {!Workspace} */
278
- this.workspace = workspace;
279
- /** @type {boolean} */
280
- this.isInFlyout = workspace.isFlyout;
281
- /** @type {boolean} */
282
- this.isInMutator = workspace.isMutator;
200
+ /** Name of the type of hat. */
201
+ hat?: string = undefined;
283
202
 
284
- /** @type {boolean} */
285
- this.RTL = workspace.RTL;
203
+ rendered: boolean|null = null;
286
204
 
287
- /**
288
- * True if this block is an insertion marker.
289
- * @type {boolean}
290
- * @protected
291
- */
292
- this.isInsertionMarker_ = false;
205
+ /**
206
+ * String for block help, or function that returns a URL. Null for no help.
207
+ */
208
+ // AnyDuringMigration because: Type 'null' is not assignable to type 'string
209
+ // | Function'.
210
+ helpUrl: string|Function = null as AnyDuringMigration;
293
211
 
294
- /**
295
- * Name of the type of hat.
296
- * @type {string|undefined}
297
- */
298
- this.hat = undefined;
212
+ /** A bound callback function to use when the parent workspace changes. */
213
+ private onchangeWrapper_: ((p1: Abstract) => AnyDuringMigration)|null = null;
299
214
 
300
- /** @type {?boolean} */
301
- this.rendered = null;
215
+ /**
216
+ * A count of statement inputs on the block.
217
+ * @internal
218
+ */
219
+ statementInputCount = 0;
220
+ // TODO(b/109816955): remove '!', see go/strict-prop-init-fix.
221
+ type!: string;
222
+ // Record initial inline state.
223
+ inputsInlineDefault?: boolean;
224
+ workspace: Workspace;
302
225
 
303
- /**
304
- * String for block help, or function that returns a URL. Null for no help.
305
- * @type {string|Function}
306
- */
307
- this.helpUrl = null;
226
+ /**
227
+ * @param workspace The block's workspace.
228
+ * @param prototypeName Name of the language object containing type-specific
229
+ * functions for this block.
230
+ * @param opt_id Optional ID. Use this ID if provided, otherwise create a new
231
+ * ID.
232
+ * @throws When the prototypeName is not valid or not allowed.
233
+ */
234
+ constructor(workspace: Workspace, prototypeName: string, opt_id?: string) {
235
+ this.workspace = workspace;
308
236
 
309
- /**
310
- * A bound callback function to use when the parent workspace changes.
311
- * @type {?function(Abstract)}
312
- * @private
313
- */
314
- this.onchangeWrapper_ = null;
237
+ this.id = opt_id && !workspace.getBlockById(opt_id) ? opt_id :
238
+ idGenerator.genUid();
239
+ workspace.setBlockById(this.id, this);
240
+
241
+ /** A model of the comment attached to this block. */
242
+ this.commentModel = {text: null, pinned: false, size: new Size(160, 80)};
315
243
 
316
244
  /**
317
- * A count of statement inputs on the block.
318
- * @type {number}
319
- * @package
245
+ * The block's position in workspace units. (0, 0) is at the workspace's
246
+ * origin; scale does not change this value.
320
247
  */
321
- this.statementInputCount = 0;
248
+ this.xy_ = new Coordinate(0, 0);
249
+ this.isInFlyout = workspace.isFlyout;
250
+ this.isInMutator = workspace.isMutator;
251
+
252
+ this.RTL = workspace.RTL;
322
253
 
323
254
  // Copy the type-specific functions and data from the prototype.
324
255
  if (prototypeName) {
325
- /** @type {string} */
326
256
  this.type = prototypeName;
327
257
  const prototype = Blocks[prototypeName];
328
258
  if (!prototype || typeof prototype !== 'object') {
329
259
  throw TypeError('Invalid block definition for type: ' + prototypeName);
330
260
  }
331
- object.mixin(this, prototype);
261
+ Object.assign(this, prototype);
332
262
  }
333
263
 
334
264
  workspace.addTopBlock(this);
335
265
  workspace.addTypedBlock(this);
336
266
 
337
- if (new.target === Block) this.doInit_();
267
+ if (new.target === Block) {
268
+ this.doInit_();
269
+ }
338
270
  }
339
271
 
340
- /**
341
- * Calls the init() function and handles associated event firing, etc.
342
- * @protected
343
- */
344
- doInit_() {
272
+ /** Calls the init() function and handles associated event firing, etc. */
273
+ protected doInit_() {
345
274
  // All events fired should be part of the same group.
346
275
  // Any events fired during init should not be undoable,
347
276
  // so that block creation is atomic.
@@ -361,7 +290,7 @@ class Block {
361
290
 
362
291
  // Fire a create event.
363
292
  if (eventUtils.isEnabled()) {
364
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))(this));
293
+ eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))!(this));
365
294
  }
366
295
  } finally {
367
296
  if (!existingGroup) {
@@ -370,9 +299,6 @@ class Block {
370
299
  // In case init threw, recordUndo flag should still be reset.
371
300
  eventUtils.setRecordUndo(initialUndoFlag);
372
301
  }
373
-
374
- // Record initial inline state.
375
- /** @type {boolean|undefined} */
376
302
  this.inputsInlineDefault = this.inputsInline;
377
303
 
378
304
  // Bind an onchange function, if it exists.
@@ -383,13 +309,13 @@ class Block {
383
309
 
384
310
  /**
385
311
  * Dispose of this block.
386
- * @param {boolean} healStack If true, then try to heal any gap by connecting
387
- * the next statement with the previous statement. Otherwise, dispose of
388
- * all children of this block.
312
+ * @param healStack If true, then try to heal any gap by connecting the next
313
+ * statement with the previous statement. Otherwise, dispose of all
314
+ * children of this block.
389
315
  * @suppress {checkTypes}
390
316
  */
391
- dispose(healStack) {
392
- if (!this.workspace) {
317
+ dispose(healStack: boolean) {
318
+ if (this.disposed) {
393
319
  // Already deleted.
394
320
  return;
395
321
  }
@@ -400,28 +326,17 @@ class Block {
400
326
 
401
327
  this.unplug(healStack);
402
328
  if (eventUtils.isEnabled()) {
403
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))(this));
329
+ eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))!(this));
404
330
  }
405
331
  eventUtils.disable();
406
332
 
407
333
  try {
408
334
  // This block is now at the top of the workspace.
409
335
  // Remove this block from the workspace's list of top-most blocks.
410
- if (this.workspace) {
411
- this.workspace.removeTopBlock(this);
412
- this.workspace.removeTypedBlock(this);
413
- // Remove from block database.
414
- this.workspace.removeBlockById(this.id);
415
- this.workspace = null;
416
- }
417
-
418
- // Just deleting this block from the DOM would result in a memory leak as
419
- // well as corruption of the connection database. Therefore we must
420
- // methodically step through the blocks and carefully disassemble them.
421
-
422
- if (common.getSelected() === this) {
423
- common.setSelected(null);
424
- }
336
+ this.workspace.removeTopBlock(this);
337
+ this.workspace.removeTypedBlock(this);
338
+ // Remove from block database.
339
+ this.workspace.removeBlockById(this.id);
425
340
 
426
341
  // First, dispose of all my children.
427
342
  for (let i = this.childBlocks_.length - 1; i >= 0; i--) {
@@ -429,13 +344,13 @@ class Block {
429
344
  }
430
345
  // Then dispose of myself.
431
346
  // Dispose of all inputs and their fields.
432
- for (let i = 0, input; (input = this.inputList[i]); i++) {
347
+ for (let i = 0, input; input = this.inputList[i]; i++) {
433
348
  input.dispose();
434
349
  }
435
350
  this.inputList.length = 0;
436
351
  // Dispose of any remaining connections (next/previous/output).
437
352
  const connections = this.getConnections_(true);
438
- for (let i = 0, connection; (connection = connections[i]); i++) {
353
+ for (let i = 0, connection; connection = connections[i]; i++) {
439
354
  connection.dispose();
440
355
  }
441
356
  } finally {
@@ -451,11 +366,10 @@ class Block {
451
366
  * before the first interaction with it. Interactions include UI actions
452
367
  * (e.g. clicking and dragging) and firing events (e.g. create, delete, and
453
368
  * change).
454
- * @public
455
369
  */
456
370
  initModel() {
457
- for (let i = 0, input; (input = this.inputList[i]); i++) {
458
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
371
+ for (let i = 0, input; input = this.inputList[i]; i++) {
372
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
459
373
  if (field.initModel) {
460
374
  field.initModel();
461
375
  }
@@ -466,10 +380,10 @@ class Block {
466
380
  /**
467
381
  * Unplug this block from its superior block. If this block is a statement,
468
382
  * optionally reconnect the block underneath with the block on top.
469
- * @param {boolean=} opt_healStack Disconnect child statement and reconnect
470
- * stack. Defaults to false.
383
+ * @param opt_healStack Disconnect child statement and reconnect stack.
384
+ * Defaults to false.
471
385
  */
472
- unplug(opt_healStack) {
386
+ unplug(opt_healStack?: boolean) {
473
387
  if (this.outputConnection) {
474
388
  this.unplugFromRow_(opt_healStack);
475
389
  }
@@ -481,11 +395,10 @@ class Block {
481
395
  /**
482
396
  * Unplug this block's output from an input on another block. Optionally
483
397
  * reconnect the block's parent to the only child block, if possible.
484
- * @param {boolean=} opt_healStack Disconnect right-side block and connect to
485
- * left-side block. Defaults to false.
486
- * @private
398
+ * @param opt_healStack Disconnect right-side block and connect to left-side
399
+ * block. Defaults to false.
487
400
  */
488
- unplugFromRow_(opt_healStack) {
401
+ private unplugFromRow_(opt_healStack?: boolean) {
489
402
  let parentConnection = null;
490
403
  if (this.outputConnection.isConnected()) {
491
404
  parentConnection = this.outputConnection.targetConnection;
@@ -500,7 +413,7 @@ class Block {
500
413
 
501
414
  const thisConnection = this.getOnlyValueConnection_();
502
415
  if (!thisConnection || !thisConnection.isConnected() ||
503
- thisConnection.targetBlock().isShadow()) {
416
+ thisConnection.targetBlock()!.isShadow()) {
504
417
  // Too many or too few possible connections on this block, or there's
505
418
  // nothing on the other side of this connection.
506
419
  return;
@@ -508,13 +421,13 @@ class Block {
508
421
 
509
422
  const childConnection = thisConnection.targetConnection;
510
423
  // Disconnect the child block.
511
- childConnection.disconnect();
424
+ childConnection?.disconnect();
512
425
  // Connect child to the parent if possible, otherwise bump away.
513
426
  if (this.workspace.connectionChecker.canConnect(
514
427
  childConnection, parentConnection, false)) {
515
- parentConnection.connect(childConnection);
428
+ parentConnection.connect(childConnection!);
516
429
  } else {
517
- childConnection.onFailedConnect(parentConnection);
430
+ childConnection?.onFailedConnect(parentConnection);
518
431
  }
519
432
  }
520
433
 
@@ -525,10 +438,9 @@ class Block {
525
438
  * Since only one block can be displaced and attached to the insertion marker
526
439
  * this should only ever return one connection.
527
440
  *
528
- * @return {?Connection} The connection on the value input, or null.
529
- * @private
441
+ * @return The connection on the value input, or null.
530
442
  */
531
- getOnlyValueConnection_() {
443
+ private getOnlyValueConnection_(): Connection|null {
532
444
  let connection = null;
533
445
  for (let i = 0; i < this.inputList.length; i++) {
534
446
  const thisConnection = this.inputList[i].connection;
@@ -547,11 +459,10 @@ class Block {
547
459
  /**
548
460
  * Unplug this statement block from its superior block. Optionally reconnect
549
461
  * the block underneath with the block on top.
550
- * @param {boolean=} opt_healStack Disconnect child statement and reconnect
551
- * stack. Defaults to false.
552
- * @private
462
+ * @param opt_healStack Disconnect child statement and reconnect stack.
463
+ * Defaults to false.
553
464
  */
554
- unplugFromStack_(opt_healStack) {
465
+ private unplugFromStack_(opt_healStack?: boolean) {
555
466
  let previousTarget = null;
556
467
  if (this.previousConnection.isConnected()) {
557
468
  // Remember the connection that any next statements need to connect to.
@@ -563,23 +474,23 @@ class Block {
563
474
  if (opt_healStack && nextBlock && !nextBlock.isShadow()) {
564
475
  // Disconnect the next statement.
565
476
  const nextTarget = this.nextConnection.targetConnection;
566
- nextTarget.disconnect();
477
+ nextTarget?.disconnect();
567
478
  if (previousTarget &&
568
479
  this.workspace.connectionChecker.canConnect(
569
480
  previousTarget, nextTarget, false)) {
570
481
  // Attach the next statement to the previous statement.
571
- previousTarget.connect(nextTarget);
482
+ previousTarget.connect(nextTarget!);
572
483
  }
573
484
  }
574
485
  }
575
486
 
576
487
  /**
577
488
  * Returns all connections originating from this block.
578
- * @param {boolean} _all If true, return all connections even hidden ones.
579
- * @return {!Array<!Connection>} Array of connections.
580
- * @package
489
+ * @param _all If true, return all connections even hidden ones.
490
+ * @return Array of connections.
491
+ * @internal
581
492
  */
582
- getConnections_(_all) {
493
+ getConnections_(_all: boolean): Connection[] {
583
494
  const myConnections = [];
584
495
  if (this.outputConnection) {
585
496
  myConnections.push(this.outputConnection);
@@ -590,7 +501,7 @@ class Block {
590
501
  if (this.nextConnection) {
591
502
  myConnections.push(this.nextConnection);
592
503
  }
593
- for (let i = 0, input; (input = this.inputList[i]); i++) {
504
+ for (let i = 0, input; input = this.inputList[i]; i++) {
594
505
  if (input.connection) {
595
506
  myConnections.push(input.connection);
596
507
  }
@@ -601,17 +512,17 @@ class Block {
601
512
  /**
602
513
  * Walks down a stack of blocks and finds the last next connection on the
603
514
  * stack.
604
- * @param {boolean} ignoreShadows If true,the last connection on a non-shadow
605
- * block will be returned. If false, this will follow shadows to find the
606
- * last connection.
607
- * @return {?Connection} The last next connection on the stack, or null.
608
- * @package
515
+ * @param ignoreShadows If true,the last connection on a non-shadow block will
516
+ * be returned. If false, this will follow shadows to find the last
517
+ * connection.
518
+ * @return The last next connection on the stack, or null.
519
+ * @internal
609
520
  */
610
- lastConnectionInStack(ignoreShadows) {
521
+ lastConnectionInStack(ignoreShadows: boolean): Connection|null {
611
522
  let nextConnection = this.nextConnection;
612
523
  while (nextConnection) {
613
524
  const nextBlock = nextConnection.targetBlock();
614
- if (!nextBlock || (ignoreShadows && nextBlock.isShadow())) {
525
+ if (!nextBlock || ignoreShadows && nextBlock.isShadow()) {
615
526
  return nextConnection;
616
527
  }
617
528
  nextConnection = nextBlock.nextConnection;
@@ -623,29 +534,27 @@ class Block {
623
534
  * Bump unconnected blocks out of alignment. Two blocks which aren't actually
624
535
  * connected should not coincidentally line up on screen.
625
536
  */
626
- bumpNeighbours() {
627
- // noop.
628
- }
537
+ bumpNeighbours() {}
538
+ // noop.
629
539
 
630
540
  /**
631
541
  * Return the parent block or null if this block is at the top level. The
632
542
  * parent block is either the block connected to the previous connection (for
633
543
  * a statement block) or the block connected to the output connection (for a
634
544
  * value block).
635
- * @return {?Block} The block (if any) that holds the current block.
545
+ * @return The block (if any) that holds the current block.
636
546
  */
637
- getParent() {
547
+ getParent(): this|null {
638
548
  return this.parentBlock_;
639
549
  }
640
550
 
641
551
  /**
642
552
  * Return the input that connects to the specified block.
643
- * @param {!Block} block A block connected to an input on this block.
644
- * @return {?Input} The input (if any) that connects to the specified
645
- * block.
553
+ * @param block A block connected to an input on this block.
554
+ * @return The input (if any) that connects to the specified block.
646
555
  */
647
- getInputWithBlock(block) {
648
- for (let i = 0, input; (input = this.inputList[i]); i++) {
556
+ getInputWithBlock(block: Block): Input|null {
557
+ for (let i = 0, input; input = this.inputList[i]; i++) {
649
558
  if (input.connection && input.connection.targetBlock() === block) {
650
559
  return input;
651
560
  }
@@ -658,14 +567,16 @@ class Block {
658
567
  * block has no surrounding block. A parent block might just be the previous
659
568
  * statement, whereas the surrounding block is an if statement, while loop,
660
569
  * etc.
661
- * @return {?Block} The block (if any) that surrounds the current block.
570
+ * @return The block (if any) that surrounds the current block.
662
571
  */
663
- getSurroundParent() {
572
+ getSurroundParent(): this|null {
664
573
  let block = this;
665
574
  let prevBlock;
666
575
  do {
667
576
  prevBlock = block;
668
- block = block.getParent();
577
+ // AnyDuringMigration because: Type 'Block | null' is not assignable to
578
+ // type 'this'.
579
+ block = block.getParent() as AnyDuringMigration;
669
580
  if (!block) {
670
581
  // Ran off the top.
671
582
  return null;
@@ -677,28 +588,28 @@ class Block {
677
588
 
678
589
  /**
679
590
  * Return the next statement block directly connected to this block.
680
- * @return {?Block} The next statement block or null.
591
+ * @return The next statement block or null.
681
592
  */
682
- getNextBlock() {
593
+ getNextBlock(): Block|null {
683
594
  return this.nextConnection && this.nextConnection.targetBlock();
684
595
  }
685
596
 
686
597
  /**
687
598
  * Returns the block connected to the previous connection.
688
- * @return {?Block} The previous statement block or null.
599
+ * @return The previous statement block or null.
689
600
  */
690
- getPreviousBlock() {
601
+ getPreviousBlock(): Block|null {
691
602
  return this.previousConnection && this.previousConnection.targetBlock();
692
603
  }
693
604
 
694
605
  /**
695
606
  * Return the connection on the first statement input on this block, or null
696
607
  * if there are none.
697
- * @return {?Connection} The first statement connection or null.
698
- * @package
608
+ * @return The first statement connection or null.
609
+ * @internal
699
610
  */
700
- getFirstStatementConnection() {
701
- for (let i = 0, input; (input = this.inputList[i]); i++) {
611
+ getFirstStatementConnection(): Connection|null {
612
+ for (let i = 0, input; input = this.inputList[i]; i++) {
702
613
  if (input.connection &&
703
614
  input.connection.type === ConnectionType.NEXT_STATEMENT) {
704
615
  return input.connection;
@@ -710,11 +621,11 @@ class Block {
710
621
  /**
711
622
  * Return the top-most block in this block's tree.
712
623
  * This will return itself if this block is at the top level.
713
- * @return {!Block} The root block.
624
+ * @return The root block.
714
625
  */
715
- getRootBlock() {
716
- let rootBlock;
717
- let block = this;
626
+ getRootBlock(): this {
627
+ let rootBlock: this;
628
+ let block: this|null = this;
718
629
  do {
719
630
  rootBlock = block;
720
631
  block = rootBlock.parentBlock_;
@@ -726,16 +637,18 @@ class Block {
726
637
  * Walk up from the given block up through the stack of blocks to find
727
638
  * the top block of the sub stack. If we are nested in a statement input only
728
639
  * find the top-most nested block. Do not go all the way to the root block.
729
- * @return {!Block} The top block in a stack.
730
- * @package
640
+ * @return The top block in a stack.
641
+ * @internal
731
642
  */
732
- getTopStackBlock() {
643
+ getTopStackBlock(): this {
733
644
  let block = this;
734
645
  let previous;
735
646
  do {
736
647
  previous = block.getPreviousBlock();
648
+ // AnyDuringMigration because: Type 'Block' is not assignable to type
649
+ // 'this'.
737
650
  } while (previous && previous.getNextBlock() === block &&
738
- (block = previous));
651
+ (block = previous as AnyDuringMigration));
739
652
  return block;
740
653
  }
741
654
 
@@ -744,15 +657,15 @@ class Block {
744
657
  * Includes value and statement inputs, as well as any following statement.
745
658
  * Excludes any connection on an output tab or any preceding statement.
746
659
  * Blocks are optionally sorted by position; top to bottom.
747
- * @param {boolean} ordered Sort the list if true.
748
- * @return {!Array<!Block>} Array of blocks.
660
+ * @param ordered Sort the list if true.
661
+ * @return Array of blocks.
749
662
  */
750
- getChildren(ordered) {
663
+ getChildren(ordered: boolean): Block[] {
751
664
  if (!ordered) {
752
665
  return this.childBlocks_;
753
666
  }
754
667
  const blocks = [];
755
- for (let i = 0, input; (input = this.inputList[i]); i++) {
668
+ for (let i = 0, input; input = this.inputList[i]; i++) {
756
669
  if (input.connection) {
757
670
  const child = input.connection.targetBlock();
758
671
  if (child) {
@@ -769,10 +682,10 @@ class Block {
769
682
 
770
683
  /**
771
684
  * Set parent of this block to be a new block or null.
772
- * @param {Block} newParent New parent block.
773
- * @package
685
+ * @param newParent New parent block.
686
+ * @internal
774
687
  */
775
- setParent(newParent) {
688
+ setParent(newParent: this|null) {
776
689
  if (newParent === this.parentBlock_) {
777
690
  return;
778
691
  }
@@ -780,8 +693,8 @@ class Block {
780
693
  // Check that block is connected to new parent if new parent is not null and
781
694
  // that block is not connected to superior one if new parent is null.
782
695
  const targetBlock =
783
- (this.previousConnection && this.previousConnection.targetBlock()) ||
784
- (this.outputConnection && this.outputConnection.targetBlock());
696
+ this.previousConnection && this.previousConnection.targetBlock() ||
697
+ this.outputConnection && this.outputConnection.targetBlock();
785
698
  const isConnected = !!targetBlock;
786
699
 
787
700
  if (isConnected && newParent && targetBlock !== newParent) {
@@ -794,13 +707,12 @@ class Block {
794
707
  ' superior block.');
795
708
  }
796
709
 
710
+ // This block hasn't actually moved on-screen, so there's no need to
711
+ // update
712
+ // its connection locations.
797
713
  if (this.parentBlock_) {
798
714
  // Remove this block from the old parent's child list.
799
715
  arrayUtils.removeElem(this.parentBlock_.childBlocks_, this);
800
-
801
- // This block hasn't actually moved on-screen, so there's no need to
802
- // update
803
- // its connection locations.
804
716
  } else {
805
717
  // New parent must be non-null so remove this block from the workspace's
806
718
  // list of top-most blocks.
@@ -822,49 +734,52 @@ class Block {
822
734
  * Includes value and statement inputs, as well as any following statements.
823
735
  * Excludes any connection on an output tab or any preceding statements.
824
736
  * Blocks are optionally sorted by position; top to bottom.
825
- * @param {boolean} ordered Sort the list if true.
826
- * @return {!Array<!Block>} Flattened array of blocks.
737
+ * @param ordered Sort the list if true.
738
+ * @return Flattened array of blocks.
827
739
  */
828
- getDescendants(ordered) {
740
+ getDescendants(ordered: boolean): this[] {
829
741
  const blocks = [this];
830
742
  const childBlocks = this.getChildren(ordered);
831
- for (let child, i = 0; (child = childBlocks[i]); i++) {
832
- blocks.push.apply(blocks, child.getDescendants(ordered));
743
+ for (let child, i = 0; child = childBlocks[i]; i++) {
744
+ // AnyDuringMigration because: Argument of type 'Block[]' is not
745
+ // assignable to parameter of type 'this[]'.
746
+ blocks.push.apply(
747
+ blocks, child.getDescendants(ordered) as AnyDuringMigration);
833
748
  }
834
749
  return blocks;
835
750
  }
836
751
 
837
752
  /**
838
753
  * Get whether this block is deletable or not.
839
- * @return {boolean} True if deletable.
754
+ * @return True if deletable.
840
755
  */
841
- isDeletable() {
842
- return this.deletable_ && !this.isShadow_ &&
843
- !(this.workspace && this.workspace.options.readOnly);
756
+ isDeletable(): boolean {
757
+ return this.deletable_ && !this.isShadow_ && !this.disposed &&
758
+ !this.workspace.options.readOnly;
844
759
  }
845
760
 
846
761
  /**
847
762
  * Set whether this block is deletable or not.
848
- * @param {boolean} deletable True if deletable.
763
+ * @param deletable True if deletable.
849
764
  */
850
- setDeletable(deletable) {
765
+ setDeletable(deletable: boolean) {
851
766
  this.deletable_ = deletable;
852
767
  }
853
768
 
854
769
  /**
855
770
  * Get whether this block is movable or not.
856
- * @return {boolean} True if movable.
771
+ * @return True if movable.
857
772
  */
858
- isMovable() {
859
- return this.movable_ && !this.isShadow_ &&
860
- !(this.workspace && this.workspace.options.readOnly);
773
+ isMovable(): boolean {
774
+ return this.movable_ && !this.isShadow_ && !this.disposed &&
775
+ !this.workspace.options.readOnly;
861
776
  }
862
777
 
863
778
  /**
864
779
  * Set whether this block is movable or not.
865
- * @param {boolean} movable True if movable.
780
+ * @param movable True if movable.
866
781
  */
867
- setMovable(movable) {
782
+ setMovable(movable: boolean) {
868
783
  this.movable_ = movable;
869
784
  }
870
785
 
@@ -873,9 +788,9 @@ class Block {
873
788
  * descendants will put this block over the workspace's capacity this block is
874
789
  * not duplicatable. If duplicating this block and descendants will put any
875
790
  * type over their maxInstances this block is not duplicatable.
876
- * @return {boolean} True if duplicatable.
791
+ * @return True if duplicatable.
877
792
  */
878
- isDuplicatable() {
793
+ isDuplicatable(): boolean {
879
794
  if (!this.workspace.hasBlockLimits()) {
880
795
  return true;
881
796
  }
@@ -885,56 +800,55 @@ class Block {
885
800
 
886
801
  /**
887
802
  * Get whether this block is a shadow block or not.
888
- * @return {boolean} True if a shadow.
803
+ * @return True if a shadow.
889
804
  */
890
- isShadow() {
805
+ isShadow(): boolean {
891
806
  return this.isShadow_;
892
807
  }
893
808
 
894
809
  /**
895
810
  * Set whether this block is a shadow block or not.
896
- * @param {boolean} shadow True if a shadow.
897
- * @package
811
+ * @param shadow True if a shadow.
812
+ * @internal
898
813
  */
899
- setShadow(shadow) {
814
+ setShadow(shadow: boolean) {
900
815
  this.isShadow_ = shadow;
901
816
  }
902
817
 
903
818
  /**
904
819
  * Get whether this block is an insertion marker block or not.
905
- * @return {boolean} True if an insertion marker.
820
+ * @return True if an insertion marker.
906
821
  */
907
- isInsertionMarker() {
822
+ isInsertionMarker(): boolean {
908
823
  return this.isInsertionMarker_;
909
824
  }
910
825
 
911
826
  /**
912
827
  * Set whether this block is an insertion marker block or not.
913
828
  * Once set this cannot be unset.
914
- * @param {boolean} insertionMarker True if an insertion marker.
915
- * @package
829
+ * @param insertionMarker True if an insertion marker.
830
+ * @internal
916
831
  */
917
- setInsertionMarker(insertionMarker) {
832
+ setInsertionMarker(insertionMarker: boolean) {
918
833
  this.isInsertionMarker_ = insertionMarker;
919
834
  }
920
835
 
921
836
  /**
922
837
  * Get whether this block is editable or not.
923
- * @return {boolean} True if editable.
838
+ * @return True if editable.
924
839
  */
925
- isEditable() {
926
- return this.editable_ &&
927
- !(this.workspace && this.workspace.options.readOnly);
840
+ isEditable(): boolean {
841
+ return this.editable_ && !this.disposed && !this.workspace.options.readOnly;
928
842
  }
929
843
 
930
844
  /**
931
845
  * Set whether this block is editable or not.
932
- * @param {boolean} editable True if editable.
846
+ * @param editable True if editable.
933
847
  */
934
- setEditable(editable) {
848
+ setEditable(editable: boolean) {
935
849
  this.editable_ = editable;
936
- for (let i = 0, input; (input = this.inputList[i]); i++) {
937
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
850
+ for (let i = 0, input; input = this.inputList[i]; i++) {
851
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
938
852
  field.updateEditable();
939
853
  }
940
854
  }
@@ -942,9 +856,9 @@ class Block {
942
856
 
943
857
  /**
944
858
  * Returns if this block has been disposed of / deleted.
945
- * @return {boolean} True if this block has been disposed of / deleted.
859
+ * @return True if this block has been disposed of / deleted.
946
860
  */
947
- isDisposed() {
861
+ isDisposed(): boolean {
948
862
  return this.disposed;
949
863
  }
950
864
 
@@ -952,12 +866,12 @@ class Block {
952
866
  * Find the connection on this block that corresponds to the given connection
953
867
  * on the other block.
954
868
  * Used to match connections between a block and its insertion marker.
955
- * @param {!Block} otherBlock The other block to match against.
956
- * @param {!Connection} conn The other connection to match.
957
- * @return {?Connection} The matching connection on this block, or null.
958
- * @package
869
+ * @param otherBlock The other block to match against.
870
+ * @param conn The other connection to match.
871
+ * @return The matching connection on this block, or null.
872
+ * @internal
959
873
  */
960
- getMatchingConnection(otherBlock, conn) {
874
+ getMatchingConnection(otherBlock: Block, conn: Connection): Connection|null {
961
875
  const connections = this.getConnections_(true);
962
876
  const otherConnections = otherBlock.getConnections_(true);
963
877
  if (connections.length !== otherConnections.length) {
@@ -973,61 +887,61 @@ class Block {
973
887
 
974
888
  /**
975
889
  * Set the URL of this block's help page.
976
- * @param {string|Function} url URL string for block help, or function that
977
- * returns a URL. Null for no help.
890
+ * @param url URL string for block help, or function that returns a URL. Null
891
+ * for no help.
978
892
  */
979
- setHelpUrl(url) {
893
+ setHelpUrl(url: string|Function) {
980
894
  this.helpUrl = url;
981
895
  }
982
896
 
983
897
  /**
984
898
  * Sets the tooltip for this block.
985
- * @param {!Tooltip.TipInfo} newTip The text for the tooltip, a function
986
- * that returns the text for the tooltip, or a parent object whose tooltip
987
- * will be used. To not display a tooltip pass the empty string.
899
+ * @param newTip The text for the tooltip, a function that returns the text
900
+ * for the tooltip, or a parent object whose tooltip will be used. To not
901
+ * display a tooltip pass the empty string.
988
902
  */
989
- setTooltip(newTip) {
903
+ setTooltip(newTip: Tooltip.TipInfo) {
990
904
  this.tooltip = newTip;
991
905
  }
992
906
 
993
907
  /**
994
908
  * Returns the tooltip text for this block.
995
- * @return {!string} The tooltip text for this block.
909
+ * @return The tooltip text for this block.
996
910
  */
997
- getTooltip() {
911
+ getTooltip(): string {
998
912
  return Tooltip.getTooltipOfObject(this);
999
913
  }
1000
914
 
1001
915
  /**
1002
916
  * Get the colour of a block.
1003
- * @return {string} #RRGGBB string.
917
+ * @return #RRGGBB string.
1004
918
  */
1005
- getColour() {
919
+ getColour(): string {
1006
920
  return this.colour_;
1007
921
  }
1008
922
 
1009
923
  /**
1010
924
  * Get the name of the block style.
1011
- * @return {string} Name of the block style.
925
+ * @return Name of the block style.
1012
926
  */
1013
- getStyleName() {
927
+ getStyleName(): string {
1014
928
  return this.styleName_;
1015
929
  }
1016
930
 
1017
931
  /**
1018
932
  * Get the HSV hue value of a block. Null if hue not set.
1019
- * @return {?number} Hue value (0-360).
933
+ * @return Hue value (0-360).
1020
934
  */
1021
- getHue() {
935
+ getHue(): number|null {
1022
936
  return this.hue_;
1023
937
  }
1024
938
 
1025
939
  /**
1026
940
  * Change the colour of a block.
1027
- * @param {number|string} colour HSV hue value (0 to 360), #RRGGBB string,
1028
- * or a message reference string pointing to one of those two values.
941
+ * @param colour HSV hue value (0 to 360), #RRGGBB string, or a message
942
+ * reference string pointing to one of those two values.
1029
943
  */
1030
- setColour(colour) {
944
+ setColour(colour: number|string) {
1031
945
  const parsed = parsing.parseBlockColour(colour);
1032
946
  this.hue_ = parsed.hue;
1033
947
  this.colour_ = parsed.hex;
@@ -1035,9 +949,9 @@ class Block {
1035
949
 
1036
950
  /**
1037
951
  * Set the style and colour values of a block.
1038
- * @param {string} blockStyleName Name of the block style.
952
+ * @param blockStyleName Name of the block style.
1039
953
  */
1040
- setStyle(blockStyleName) {
954
+ setStyle(blockStyleName: string) {
1041
955
  this.styleName_ = blockStyleName;
1042
956
  }
1043
957
 
@@ -1046,11 +960,10 @@ class Block {
1046
960
  * changes, replacing any prior onchange handler. This is usually only called
1047
961
  * from the constructor, the block type initializer function, or an extension
1048
962
  * initializer function.
1049
- * @param {function(Abstract)} onchangeFn The callback to call
1050
- * when the block's workspace changes.
963
+ * @param onchangeFn The callback to call when the block's workspace changes.
1051
964
  * @throws {Error} if onchangeFn is not falsey and not a function.
1052
965
  */
1053
- setOnChange(onchangeFn) {
966
+ setOnChange(onchangeFn: (p1: Abstract) => AnyDuringMigration) {
1054
967
  if (onchangeFn && typeof onchangeFn !== 'function') {
1055
968
  throw Error('onchange must be a function.');
1056
969
  }
@@ -1058,18 +971,16 @@ class Block {
1058
971
  this.workspace.removeChangeListener(this.onchangeWrapper_);
1059
972
  }
1060
973
  this.onchange = onchangeFn;
1061
- if (this.onchange) {
1062
- this.onchangeWrapper_ = onchangeFn.bind(this);
1063
- this.workspace.addChangeListener(this.onchangeWrapper_);
1064
- }
974
+ this.onchangeWrapper_ = onchangeFn.bind(this);
975
+ this.workspace.addChangeListener(this.onchangeWrapper_);
1065
976
  }
1066
977
 
1067
978
  /**
1068
979
  * Returns the named field from a block.
1069
- * @param {string} name The name of the field.
1070
- * @return {?Field} Named field, or null if field does not exist.
980
+ * @param name The name of the field.
981
+ * @return Named field, or null if field does not exist.
1071
982
  */
1072
- getField(name) {
983
+ getField(name: string): Field|null {
1073
984
  if (typeof name !== 'string') {
1074
985
  throw TypeError(
1075
986
  'Block.prototype.getField expects a string ' +
@@ -1077,8 +988,8 @@ class Block {
1077
988
  (name === undefined ? 'nothing' : name + ' of type ' + typeof name) +
1078
989
  ' instead');
1079
990
  }
1080
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1081
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
991
+ for (let i = 0, input; input = this.inputList[i]; i++) {
992
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
1082
993
  if (field.name === name) {
1083
994
  return field;
1084
995
  }
@@ -1089,12 +1000,12 @@ class Block {
1089
1000
 
1090
1001
  /**
1091
1002
  * Return all variables referenced by this block.
1092
- * @return {!Array<string>} List of variable ids.
1003
+ * @return List of variable ids.
1093
1004
  */
1094
- getVars() {
1005
+ getVars(): string[] {
1095
1006
  const vars = [];
1096
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1097
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
1007
+ for (let i = 0, input; input = this.inputList[i]; i++) {
1008
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
1098
1009
  if (field.referencesVariables()) {
1099
1010
  vars.push(field.getValue());
1100
1011
  }
@@ -1105,16 +1016,16 @@ class Block {
1105
1016
 
1106
1017
  /**
1107
1018
  * Return all variables referenced by this block.
1108
- * @return {!Array<!VariableModel>} List of variable models.
1109
- * @package
1019
+ * @return List of variable models.
1020
+ * @internal
1110
1021
  */
1111
- getVarModels() {
1022
+ getVarModels(): VariableModel[] {
1112
1023
  const vars = [];
1113
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1114
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
1024
+ for (let i = 0, input; input = this.inputList[i]; i++) {
1025
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
1115
1026
  if (field.referencesVariables()) {
1116
- const model = this.workspace.getVariableById(
1117
- /** @type {string} */ (field.getValue()));
1027
+ const model =
1028
+ this.workspace.getVariableById(field.getValue() as string);
1118
1029
  // Check if the variable actually exists (and isn't just a potential
1119
1030
  // variable).
1120
1031
  if (model) {
@@ -1129,12 +1040,12 @@ class Block {
1129
1040
  /**
1130
1041
  * Notification that a variable is renaming but keeping the same ID. If the
1131
1042
  * variable is in use on this block, rerender to show the new name.
1132
- * @param {!VariableModel} variable The variable being renamed.
1133
- * @package
1043
+ * @param variable The variable being renamed.
1044
+ * @internal
1134
1045
  */
1135
- updateVarName(variable) {
1136
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1137
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
1046
+ updateVarName(variable: VariableModel) {
1047
+ for (let i = 0, input; input = this.inputList[i]; i++) {
1048
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
1138
1049
  if (field.referencesVariables() &&
1139
1050
  variable.getId() === field.getValue()) {
1140
1051
  field.refreshVariableName();
@@ -1146,13 +1057,13 @@ class Block {
1146
1057
  /**
1147
1058
  * Notification that a variable is renaming.
1148
1059
  * If the ID matches one of this block's variables, rename it.
1149
- * @param {string} oldId ID of variable to rename.
1150
- * @param {string} newId ID of new variable. May be the same as oldId, but
1151
- * with an updated name.
1060
+ * @param oldId ID of variable to rename.
1061
+ * @param newId ID of new variable. May be the same as oldId, but with an
1062
+ * updated name.
1152
1063
  */
1153
- renameVarById(oldId, newId) {
1154
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1155
- for (let j = 0, field; (field = input.fieldRow[j]); j++) {
1064
+ renameVarById(oldId: string, newId: string) {
1065
+ for (let i = 0, input; input = this.inputList[i]; i++) {
1066
+ for (let j = 0, field; field = input.fieldRow[j]; j++) {
1156
1067
  if (field.referencesVariables() && oldId === field.getValue()) {
1157
1068
  field.setValue(newId);
1158
1069
  }
@@ -1162,10 +1073,10 @@ class Block {
1162
1073
 
1163
1074
  /**
1164
1075
  * Returns the language-neutral value of the given field.
1165
- * @param {string} name The name of the field.
1166
- * @return {*} Value of the field or null if field does not exist.
1076
+ * @param name The name of the field.
1077
+ * @return Value of the field or null if field does not exist.
1167
1078
  */
1168
- getFieldValue(name) {
1079
+ getFieldValue(name: string): AnyDuringMigration {
1169
1080
  const field = this.getField(name);
1170
1081
  if (field) {
1171
1082
  return field.getValue();
@@ -1175,10 +1086,10 @@ class Block {
1175
1086
 
1176
1087
  /**
1177
1088
  * Sets the value of the given field for this block.
1178
- * @param {*} newValue The value to set.
1179
- * @param {string} name The name of the field to set the value of.
1089
+ * @param newValue The value to set.
1090
+ * @param name The name of the field to set the value of.
1180
1091
  */
1181
- setFieldValue(newValue, name) {
1092
+ setFieldValue(newValue: AnyDuringMigration, name: string) {
1182
1093
  const field = this.getField(name);
1183
1094
  if (!field) {
1184
1095
  throw Error('Field "' + name + '" not found.');
@@ -1188,12 +1099,11 @@ class Block {
1188
1099
 
1189
1100
  /**
1190
1101
  * Set whether this block can chain onto the bottom of another block.
1191
- * @param {boolean} newBoolean True if there can be a previous statement.
1192
- * @param {(string|Array<string>|null)=} opt_check Statement type or
1193
- * list of statement types. Null/undefined if any type could be
1194
- * connected.
1102
+ * @param newBoolean True if there can be a previous statement.
1103
+ * @param opt_check Statement type or list of statement types. Null/undefined
1104
+ * if any type could be connected.
1195
1105
  */
1196
- setPreviousStatement(newBoolean, opt_check) {
1106
+ setPreviousStatement(newBoolean: boolean, opt_check?: string|string[]|null) {
1197
1107
  if (newBoolean) {
1198
1108
  if (opt_check === undefined) {
1199
1109
  opt_check = null;
@@ -1211,19 +1121,20 @@ class Block {
1211
1121
  'connection.');
1212
1122
  }
1213
1123
  this.previousConnection.dispose();
1214
- this.previousConnection = null;
1124
+ // AnyDuringMigration because: Type 'null' is not assignable to type
1125
+ // 'Connection'.
1126
+ this.previousConnection = null as AnyDuringMigration;
1215
1127
  }
1216
1128
  }
1217
1129
  }
1218
1130
 
1219
1131
  /**
1220
1132
  * Set whether another block can chain onto the bottom of this block.
1221
- * @param {boolean} newBoolean True if there can be a next statement.
1222
- * @param {(string|Array<string>|null)=} opt_check Statement type or
1223
- * list of statement types. Null/undefined if any type could be
1224
- * connected.
1133
+ * @param newBoolean True if there can be a next statement.
1134
+ * @param opt_check Statement type or list of statement types. Null/undefined
1135
+ * if any type could be connected.
1225
1136
  */
1226
- setNextStatement(newBoolean, opt_check) {
1137
+ setNextStatement(newBoolean: boolean, opt_check?: string|string[]|null) {
1227
1138
  if (newBoolean) {
1228
1139
  if (opt_check === undefined) {
1229
1140
  opt_check = null;
@@ -1241,19 +1152,20 @@ class Block {
1241
1152
  'connection.');
1242
1153
  }
1243
1154
  this.nextConnection.dispose();
1244
- this.nextConnection = null;
1155
+ // AnyDuringMigration because: Type 'null' is not assignable to type
1156
+ // 'Connection'.
1157
+ this.nextConnection = null as AnyDuringMigration;
1245
1158
  }
1246
1159
  }
1247
1160
  }
1248
1161
 
1249
1162
  /**
1250
1163
  * Set whether this block returns a value.
1251
- * @param {boolean} newBoolean True if there is an output.
1252
- * @param {(string|Array<string>|null)=} opt_check Returned type or list
1253
- * of returned types. Null or undefined if any type could be returned
1254
- * (e.g. variable get).
1164
+ * @param newBoolean True if there is an output.
1165
+ * @param opt_check Returned type or list of returned types. Null or
1166
+ * undefined if any type could be returned (e.g. variable get).
1255
1167
  */
1256
- setOutput(newBoolean, opt_check) {
1168
+ setOutput(newBoolean: boolean, opt_check?: string|string[]|null) {
1257
1169
  if (newBoolean) {
1258
1170
  if (opt_check === undefined) {
1259
1171
  opt_check = null;
@@ -1270,28 +1182,30 @@ class Block {
1270
1182
  'Must disconnect output value before removing connection.');
1271
1183
  }
1272
1184
  this.outputConnection.dispose();
1273
- this.outputConnection = null;
1185
+ // AnyDuringMigration because: Type 'null' is not assignable to type
1186
+ // 'Connection'.
1187
+ this.outputConnection = null as AnyDuringMigration;
1274
1188
  }
1275
1189
  }
1276
1190
  }
1277
1191
 
1278
1192
  /**
1279
1193
  * Set whether value inputs are arranged horizontally or vertically.
1280
- * @param {boolean} newBoolean True if inputs are horizontal.
1194
+ * @param newBoolean True if inputs are horizontal.
1281
1195
  */
1282
- setInputsInline(newBoolean) {
1196
+ setInputsInline(newBoolean: boolean) {
1283
1197
  if (this.inputsInline !== newBoolean) {
1284
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))(
1285
- this, 'inline', null, this.inputsInline, newBoolean));
1198
+ eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
1199
+ (this, 'inline', null, this.inputsInline, newBoolean));
1286
1200
  this.inputsInline = newBoolean;
1287
1201
  }
1288
1202
  }
1289
1203
 
1290
1204
  /**
1291
1205
  * Get whether value inputs are arranged horizontally or vertically.
1292
- * @return {boolean} True if inputs are horizontal.
1206
+ * @return True if inputs are horizontal.
1293
1207
  */
1294
- getInputsInline() {
1208
+ getInputsInline(): boolean {
1295
1209
  if (this.inputsInline !== undefined) {
1296
1210
  // Set explicitly.
1297
1211
  return this.inputsInline;
@@ -1316,47 +1230,47 @@ class Block {
1316
1230
 
1317
1231
  /**
1318
1232
  * Set the block's output shape.
1319
- * @param {?number} outputShape Value representing an output shape.
1233
+ * @param outputShape Value representing an output shape.
1320
1234
  */
1321
- setOutputShape(outputShape) {
1235
+ setOutputShape(outputShape: number|null) {
1322
1236
  this.outputShape_ = outputShape;
1323
1237
  }
1324
1238
 
1325
1239
  /**
1326
1240
  * Get the block's output shape.
1327
- * @return {?number} Value representing output shape if one exists.
1241
+ * @return Value representing output shape if one exists.
1328
1242
  */
1329
- getOutputShape() {
1243
+ getOutputShape(): number|null {
1330
1244
  return this.outputShape_;
1331
1245
  }
1332
1246
 
1333
1247
  /**
1334
1248
  * Get whether this block is enabled or not.
1335
- * @return {boolean} True if enabled.
1249
+ * @return True if enabled.
1336
1250
  */
1337
- isEnabled() {
1251
+ isEnabled(): boolean {
1338
1252
  return !this.disabled;
1339
1253
  }
1340
1254
 
1341
1255
  /**
1342
1256
  * Set whether the block is enabled or not.
1343
- * @param {boolean} enabled True if enabled.
1257
+ * @param enabled True if enabled.
1344
1258
  */
1345
- setEnabled(enabled) {
1259
+ setEnabled(enabled: boolean) {
1346
1260
  if (this.isEnabled() !== enabled) {
1347
1261
  const oldValue = this.disabled;
1348
1262
  this.disabled = !enabled;
1349
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))(
1350
- this, 'disabled', null, oldValue, !enabled));
1263
+ eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
1264
+ (this, 'disabled', null, oldValue, !enabled));
1351
1265
  }
1352
1266
  }
1353
1267
 
1354
1268
  /**
1355
1269
  * Get whether the block is disabled or not due to parents.
1356
1270
  * The block's own disabled property is not considered.
1357
- * @return {boolean} True if disabled.
1271
+ * @return True if disabled.
1358
1272
  */
1359
- getInheritedDisabled() {
1273
+ getInheritedDisabled(): boolean {
1360
1274
  let ancestor = this.getSurroundParent();
1361
1275
  while (ancestor) {
1362
1276
  if (ancestor.disabled) {
@@ -1370,32 +1284,32 @@ class Block {
1370
1284
 
1371
1285
  /**
1372
1286
  * Get whether the block is collapsed or not.
1373
- * @return {boolean} True if collapsed.
1287
+ * @return True if collapsed.
1374
1288
  */
1375
- isCollapsed() {
1289
+ isCollapsed(): boolean {
1376
1290
  return this.collapsed_;
1377
1291
  }
1378
1292
 
1379
1293
  /**
1380
1294
  * Set whether the block is collapsed or not.
1381
- * @param {boolean} collapsed True if collapsed.
1295
+ * @param collapsed True if collapsed.
1382
1296
  */
1383
- setCollapsed(collapsed) {
1297
+ setCollapsed(collapsed: boolean) {
1384
1298
  if (this.collapsed_ !== collapsed) {
1385
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))(
1386
- this, 'collapsed', null, this.collapsed_, collapsed));
1299
+ eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
1300
+ (this, 'collapsed', null, this.collapsed_, collapsed));
1387
1301
  this.collapsed_ = collapsed;
1388
1302
  }
1389
1303
  }
1390
1304
 
1391
1305
  /**
1392
1306
  * Create a human-readable text representation of this block and any children.
1393
- * @param {number=} opt_maxLength Truncate the string to this length.
1394
- * @param {string=} opt_emptyToken The placeholder string used to denote an
1395
- * empty field. If not specified, '?' is used.
1396
- * @return {string} Text of block.
1307
+ * @param opt_maxLength Truncate the string to this length.
1308
+ * @param opt_emptyToken The placeholder string used to denote an empty field.
1309
+ * If not specified, '?' is used.
1310
+ * @return Text of block.
1397
1311
  */
1398
- toString(opt_maxLength, opt_emptyToken) {
1312
+ toString(opt_maxLength?: number, opt_emptyToken?: string): string {
1399
1313
  let text = [];
1400
1314
  const emptyFieldPlaceholder = opt_emptyToken || '?';
1401
1315
 
@@ -1408,10 +1322,10 @@ class Block {
1408
1322
 
1409
1323
  /**
1410
1324
  * Whether or not to add parentheses around an input.
1411
- * @param {!Connection} connection The connection.
1412
- * @return {boolean} True if we should add parentheses around the input.
1325
+ * @param connection The connection.
1326
+ * @return True if we should add parentheses around the input.
1413
1327
  */
1414
- function shouldAddParentheses(connection) {
1328
+ function shouldAddParentheses(connection: Connection): boolean {
1415
1329
  let checks = connection.getCheck();
1416
1330
  if (!checks && connection.targetConnection) {
1417
1331
  checks = connection.targetConnection.getCheck();
@@ -1420,12 +1334,10 @@ class Block {
1420
1334
  (checks.indexOf('Boolean') !== -1 || checks.indexOf('Number') !== -1);
1421
1335
  }
1422
1336
 
1423
- /**
1424
- * Check that we haven't circled back to the original root node.
1425
- */
1337
+ /** Check that we haven't circled back to the original root node. */
1426
1338
  function checkRoot() {
1427
- if (node && node.getType() === rootNode.getType() &&
1428
- node.getLocation() === rootNode.getLocation()) {
1339
+ if (node && node.getType() === rootNode?.getType() &&
1340
+ node.getLocation() === rootNode?.getLocation()) {
1429
1341
  node = null;
1430
1342
  }
1431
1343
  }
@@ -1434,7 +1346,7 @@ class Block {
1434
1346
  while (node) {
1435
1347
  switch (node.getType()) {
1436
1348
  case ASTNode.types.INPUT: {
1437
- const connection = /** @type {!Connection} */ (node.getLocation());
1349
+ const connection = node.getLocation() as Connection;
1438
1350
  if (!node.in()) {
1439
1351
  text.push(emptyFieldPlaceholder);
1440
1352
  } else if (shouldAddParentheses(connection)) {
@@ -1443,7 +1355,7 @@ class Block {
1443
1355
  break;
1444
1356
  }
1445
1357
  case ASTNode.types.FIELD: {
1446
- const field = /** @type {Field} */ (node.getLocation());
1358
+ const field = node.getLocation() as Field;
1447
1359
  if (field.name !== constants.COLLAPSED_FIELD_NAME) {
1448
1360
  text.push(field.getText());
1449
1361
  }
@@ -1462,8 +1374,7 @@ class Block {
1462
1374
  checkRoot();
1463
1375
  // If we hit an input on the way up, possibly close out parentheses.
1464
1376
  if (node && node.getType() === ASTNode.types.INPUT &&
1465
- shouldAddParentheses(
1466
- /** @type {!Connection} */ (node.getLocation()))) {
1377
+ shouldAddParentheses(node.getLocation() as Connection)) {
1467
1378
  text.push(')');
1468
1379
  }
1469
1380
  }
@@ -1487,17 +1398,23 @@ class Block {
1487
1398
  }
1488
1399
 
1489
1400
  // Join the text array, removing spaces around added parentheses.
1401
+ // AnyDuringMigration because: Type 'string' is not assignable to type
1402
+ // 'any[]'.
1490
1403
  text = text.reduce(function(acc, value) {
1491
- return acc + ((acc.substr(-1) === '(' || value === ')') ? '' : ' ') +
1492
- value;
1493
- }, '');
1494
- text = text.trim() || '???';
1404
+ return acc + (acc.substr(-1) === '(' || value === ')' ? '' : ' ') + value;
1405
+ }, '') as AnyDuringMigration;
1406
+ // AnyDuringMigration because: Property 'trim' does not exist on type
1407
+ // 'any[]'.
1408
+ text = (text as AnyDuringMigration).trim() || '???';
1495
1409
  if (opt_maxLength) {
1496
1410
  // TODO: Improve truncation so that text from this block is given
1497
1411
  // priority. E.g. "1+2+3+4+5+6+7+8+9=0" should be "...6+7+8+9=0", not
1498
1412
  // "1+2+3+4+5...". E.g. "1+2+3+4+5=6+7+8+9+0" should be "...4+5=6+7...".
1499
1413
  if (text.length > opt_maxLength) {
1500
- text = text.substring(0, opt_maxLength - 3) + '...';
1414
+ // AnyDuringMigration because: Type 'string' is not assignable to type
1415
+ // 'any[]'.
1416
+ text = (text.substring(0, opt_maxLength - 3) + '...') as
1417
+ AnyDuringMigration;
1501
1418
  }
1502
1419
  }
1503
1420
  return text;
@@ -1505,40 +1422,40 @@ class Block {
1505
1422
 
1506
1423
  /**
1507
1424
  * Shortcut for appending a value input row.
1508
- * @param {string} name Language-neutral identifier which may used to find
1509
- * this input again. Should be unique to this block.
1510
- * @return {!Input} The input object created.
1425
+ * @param name Language-neutral identifier which may used to find this input
1426
+ * again. Should be unique to this block.
1427
+ * @return The input object created.
1511
1428
  */
1512
- appendValueInput(name) {
1429
+ appendValueInput(name: string): Input {
1513
1430
  return this.appendInput_(inputTypes.VALUE, name);
1514
1431
  }
1515
1432
 
1516
1433
  /**
1517
1434
  * Shortcut for appending a statement input row.
1518
- * @param {string} name Language-neutral identifier which may used to find
1519
- * this input again. Should be unique to this block.
1520
- * @return {!Input} The input object created.
1435
+ * @param name Language-neutral identifier which may used to find this input
1436
+ * again. Should be unique to this block.
1437
+ * @return The input object created.
1521
1438
  */
1522
- appendStatementInput(name) {
1439
+ appendStatementInput(name: string): Input {
1523
1440
  return this.appendInput_(inputTypes.STATEMENT, name);
1524
1441
  }
1525
1442
 
1526
1443
  /**
1527
1444
  * Shortcut for appending a dummy input row.
1528
- * @param {string=} opt_name Language-neutral identifier which may used to
1529
- * find this input again. Should be unique to this block.
1530
- * @return {!Input} The input object created.
1445
+ * @param opt_name Language-neutral identifier which may used to find this
1446
+ * input again. Should be unique to this block.
1447
+ * @return The input object created.
1531
1448
  */
1532
- appendDummyInput(opt_name) {
1449
+ appendDummyInput(opt_name?: string): Input {
1533
1450
  return this.appendInput_(inputTypes.DUMMY, opt_name || '');
1534
1451
  }
1535
1452
 
1536
1453
  /**
1537
1454
  * Initialize this block using a cross-platform, internationalization-friendly
1538
1455
  * JSON description.
1539
- * @param {!Object} json Structured data describing the block.
1456
+ * @param json Structured data describing the block.
1540
1457
  */
1541
- jsonInit(json) {
1458
+ jsonInit(json: AnyDuringMigration) {
1542
1459
  const warningPrefix = json['type'] ? 'Block "' + json['type'] + '": ' : '';
1543
1460
 
1544
1461
  // Validate inputs.
@@ -1630,11 +1547,10 @@ class Block {
1630
1547
 
1631
1548
  /**
1632
1549
  * Initialize the colour of this block from the JSON description.
1633
- * @param {!Object} json Structured data describing the block.
1634
- * @param {string} warningPrefix Warning prefix string identifying block.
1635
- * @private
1550
+ * @param json Structured data describing the block.
1551
+ * @param warningPrefix Warning prefix string identifying block.
1636
1552
  */
1637
- jsonInitColour_(json, warningPrefix) {
1553
+ private jsonInitColour_(json: AnyDuringMigration, warningPrefix: string) {
1638
1554
  if ('colour' in json) {
1639
1555
  if (json['colour'] === undefined) {
1640
1556
  console.warn(warningPrefix + 'Undefined colour value.');
@@ -1651,11 +1567,10 @@ class Block {
1651
1567
 
1652
1568
  /**
1653
1569
  * Initialize the style of this block from the JSON description.
1654
- * @param {!Object} json Structured data describing the block.
1655
- * @param {string} warningPrefix Warning prefix string identifying block.
1656
- * @private
1570
+ * @param json Structured data describing the block.
1571
+ * @param warningPrefix Warning prefix string identifying block.
1657
1572
  */
1658
- jsonInitStyle_(json, warningPrefix) {
1573
+ private jsonInitStyle_(json: AnyDuringMigration, warningPrefix: string) {
1659
1574
  const blockStyleName = json['style'];
1660
1575
  try {
1661
1576
  this.setStyle(blockStyleName);
@@ -1670,10 +1585,10 @@ class Block {
1670
1585
  * the block, including prototype values. This provides some insurance against
1671
1586
  * mixin / extension incompatibilities with future block features. This check
1672
1587
  * can be disabled by passing true as the second argument.
1673
- * @param {!Object} mixinObj The key/values pairs to add to this block object.
1674
- * @param {boolean=} opt_disableCheck Option flag to disable overwrite checks.
1588
+ * @param mixinObj The key/values pairs to add to this block object.
1589
+ * @param opt_disableCheck Option flag to disable overwrite checks.
1675
1590
  */
1676
- mixin(mixinObj, opt_disableCheck) {
1591
+ mixin(mixinObj: AnyDuringMigration, opt_disableCheck?: boolean) {
1677
1592
  if (opt_disableCheck !== undefined &&
1678
1593
  typeof opt_disableCheck !== 'boolean') {
1679
1594
  throw Error('opt_disableCheck must be a boolean if provided');
@@ -1681,7 +1596,7 @@ class Block {
1681
1596
  if (!opt_disableCheck) {
1682
1597
  const overwrites = [];
1683
1598
  for (const key in mixinObj) {
1684
- if (this[key] !== undefined) {
1599
+ if ((this as AnyDuringMigration)[key] !== undefined) {
1685
1600
  overwrites.push(key);
1686
1601
  }
1687
1602
  }
@@ -1691,32 +1606,33 @@ class Block {
1691
1606
  JSON.stringify(overwrites));
1692
1607
  }
1693
1608
  }
1694
- object.mixin(this, mixinObj);
1609
+ Object.assign(this, mixinObj);
1695
1610
  }
1696
1611
 
1697
1612
  /**
1698
1613
  * Interpolate a message description onto the block.
1699
- * @param {string} message Text contains interpolation tokens (%1, %2, ...)
1700
- * that match with fields or inputs defined in the args array.
1701
- * @param {!Array} args Array of arguments to be interpolated.
1702
- * @param {string|undefined} lastDummyAlign If a dummy input is added at the
1703
- * end, how should it be aligned?
1704
- * @param {string} warningPrefix Warning prefix string identifying block.
1705
- * @private
1706
- */
1707
- interpolate_(message, args, lastDummyAlign, warningPrefix) {
1614
+ * @param message Text contains interpolation tokens (%1, %2, ...) that match
1615
+ * with fields or inputs defined in the args array.
1616
+ * @param args Array of arguments to be interpolated.
1617
+ * @param lastDummyAlign If a dummy input is added at the end, how should it
1618
+ * be aligned?
1619
+ * @param warningPrefix Warning prefix string identifying block.
1620
+ */
1621
+ private interpolate_(
1622
+ message: string, args: AnyDuringMigration[],
1623
+ lastDummyAlign: string|undefined, warningPrefix: string) {
1708
1624
  const tokens = parsing.tokenizeInterpolation(message);
1709
1625
  this.validateTokens_(tokens, args.length);
1710
1626
  const elements = this.interpolateArguments_(tokens, args, lastDummyAlign);
1711
1627
 
1712
1628
  // An array of [field, fieldName] tuples.
1713
1629
  const fieldStack = [];
1714
- for (let i = 0, element; (element = elements[i]); i++) {
1630
+ for (let i = 0, element; element = elements[i]; i++) {
1715
1631
  if (this.isInputKeyword_(element['type'])) {
1716
1632
  const input = this.inputFromJson_(element, warningPrefix);
1717
1633
  // Should never be null, but just in case.
1718
1634
  if (input) {
1719
- for (let j = 0, tuple; (tuple = fieldStack[j]); j++) {
1635
+ for (let j = 0, tuple; tuple = fieldStack[j]; j++) {
1720
1636
  input.appendField(tuple[0], tuple[1]);
1721
1637
  }
1722
1638
  fieldStack.length = 0;
@@ -1736,11 +1652,10 @@ class Block {
1736
1652
  * Validates that the tokens are within the correct bounds, with no
1737
1653
  * duplicates, and that all of the arguments are referred to. Throws errors if
1738
1654
  * any of these things are not true.
1739
- * @param {!Array<string|number>} tokens An array of tokens to validate
1740
- * @param {number} argsCount The number of args that need to be referred to.
1741
- * @private
1655
+ * @param tokens An array of tokens to validate
1656
+ * @param argsCount The number of args that need to be referred to.
1742
1657
  */
1743
- validateTokens_(tokens, argsCount) {
1658
+ private validateTokens_(tokens: Array<string|number>, argsCount: number) {
1744
1659
  const visitedArgsHash = [];
1745
1660
  let visitedArgsCount = 0;
1746
1661
  for (let i = 0; i < tokens.length; i++) {
@@ -1772,15 +1687,15 @@ class Block {
1772
1687
  * Inserts args in place of numerical tokens. String args are converted to
1773
1688
  * JSON that defines a label field. If necessary an extra dummy input is added
1774
1689
  * to the end of the elements.
1775
- * @param {!Array<!string|number>} tokens The tokens to interpolate
1776
- * @param {!Array<!Object|string>} args The arguments to insert.
1777
- * @param {string|undefined} lastDummyAlign The alignment the added dummy
1778
- * input should have, if we are required to add one.
1779
- * @return {!Array<!Object>} The JSON definitions of field and inputs to add
1780
- * to the block.
1781
- * @private
1782
- */
1783
- interpolateArguments_(tokens, args, lastDummyAlign) {
1690
+ * @param tokens The tokens to interpolate
1691
+ * @param args The arguments to insert.
1692
+ * @param lastDummyAlign The alignment the added dummy input should have, if
1693
+ * we are required to add one.
1694
+ * @return The JSON definitions of field and inputs to add to the block.
1695
+ */
1696
+ private interpolateArguments_(
1697
+ tokens: Array<string|number>, args: Array<AnyDuringMigration|string>,
1698
+ lastDummyAlign: string|undefined): AnyDuringMigration[] {
1784
1699
  const elements = [];
1785
1700
  for (let i = 0; i < tokens.length; i++) {
1786
1701
  let element = tokens[i];
@@ -1789,7 +1704,9 @@ class Block {
1789
1704
  }
1790
1705
  // Args can be strings, which is why this isn't elseif.
1791
1706
  if (typeof element === 'string') {
1792
- element = this.stringToFieldJson_(element);
1707
+ // AnyDuringMigration because: Type '{ text: string; type: string; } |
1708
+ // null' is not assignable to type 'string | number'.
1709
+ element = this.stringToFieldJson_(element) as AnyDuringMigration;
1793
1710
  if (!element) {
1794
1711
  continue;
1795
1712
  }
@@ -1798,10 +1715,12 @@ class Block {
1798
1715
  }
1799
1716
 
1800
1717
  const length = elements.length;
1801
- if (length && !this.isInputKeyword_(elements[length - 1]['type'])) {
1718
+ if (length &&
1719
+ !this.isInputKeyword_(
1720
+ (elements as AnyDuringMigration)[length - 1]['type'])) {
1802
1721
  const dummyInput = {'type': 'input_dummy'};
1803
1722
  if (lastDummyAlign) {
1804
- dummyInput['align'] = lastDummyAlign;
1723
+ (dummyInput as AnyDuringMigration)['align'] = lastDummyAlign;
1805
1724
  }
1806
1725
  elements.push(dummyInput);
1807
1726
  }
@@ -1813,13 +1732,11 @@ class Block {
1813
1732
  * Creates a field from the JSON definition of a field. If a field with the
1814
1733
  * given type cannot be found, this attempts to create a different field using
1815
1734
  * the 'alt' property of the JSON definition (if it exists).
1816
- * @param {{alt:(string|undefined)}} element The element to try to turn into a
1817
- * field.
1818
- * @return {?Field} The field defined by the JSON, or null if one
1819
- * couldn't be created.
1820
- * @private
1735
+ * @param element The element to try to turn into a field.
1736
+ * @return The field defined by the JSON, or null if one couldn't be created.
1821
1737
  */
1822
- fieldFromJson_(element) {
1738
+ private fieldFromJson_(element: {alt?: string, type?: string, text?: string}):
1739
+ Field|null {
1823
1740
  const field = fieldRegistry.fromJson(element);
1824
1741
  if (!field && element['alt']) {
1825
1742
  if (typeof element['alt'] === 'string') {
@@ -1834,14 +1751,14 @@ class Block {
1834
1751
  /**
1835
1752
  * Creates an input from the JSON definition of an input. Sets the input's
1836
1753
  * check and alignment if they are provided.
1837
- * @param {!Object} element The JSON to turn into an input.
1838
- * @param {string} warningPrefix The prefix to add to warnings to help the
1839
- * developer debug.
1840
- * @return {?Input} The input that has been created, or null if one
1841
- * could not be created for some reason (should never happen).
1842
- * @private
1843
- */
1844
- inputFromJson_(element, warningPrefix) {
1754
+ * @param element The JSON to turn into an input.
1755
+ * @param warningPrefix The prefix to add to warnings to help the developer
1756
+ * debug.
1757
+ * @return The input that has been created, or null if one could not be
1758
+ * created for some reason (should never happen).
1759
+ */
1760
+ private inputFromJson_(element: AnyDuringMigration, warningPrefix: string):
1761
+ Input|null {
1845
1762
  const alignmentLookup = {
1846
1763
  'LEFT': Align.LEFT,
1847
1764
  'RIGHT': Align.RIGHT,
@@ -1870,7 +1787,9 @@ class Block {
1870
1787
  input.setCheck(element['check']);
1871
1788
  }
1872
1789
  if (element['align']) {
1873
- const alignment = alignmentLookup[element['align'].toUpperCase()];
1790
+ const alignment =
1791
+ (alignmentLookup as
1792
+ AnyDuringMigration)[element['align'].toUpperCase()];
1874
1793
  if (alignment === undefined) {
1875
1794
  console.warn(warningPrefix + 'Illegal align value: ', element['align']);
1876
1795
  } else {
@@ -1882,12 +1801,11 @@ class Block {
1882
1801
 
1883
1802
  /**
1884
1803
  * Returns true if the given string matches one of the input keywords.
1885
- * @param {string} str The string to check.
1886
- * @return {boolean} True if the given string matches one of the input
1887
- * keywords, false otherwise.
1888
- * @private
1804
+ * @param str The string to check.
1805
+ * @return True if the given string matches one of the input keywords, false
1806
+ * otherwise.
1889
1807
  */
1890
- isInputKeyword_(str) {
1808
+ private isInputKeyword_(str: string): boolean {
1891
1809
  return str === 'input_value' || str === 'input_statement' ||
1892
1810
  str === 'input_dummy';
1893
1811
  }
@@ -1895,12 +1813,10 @@ class Block {
1895
1813
  /**
1896
1814
  * Turns a string into the JSON definition of a label field. If the string
1897
1815
  * becomes an empty string when trimmed, this returns null.
1898
- * @param {string} str String to turn into the JSON definition of a label
1899
- * field.
1900
- * @return {?{text: string, type: string}} The JSON definition or null.
1901
- * @private
1816
+ * @param str String to turn into the JSON definition of a label field.
1817
+ * @return The JSON definition or null.
1902
1818
  */
1903
- stringToFieldJson_(str) {
1819
+ private stringToFieldJson_(str: string): {text: string, type: string}|null {
1904
1820
  str = str.trim();
1905
1821
  if (str) {
1906
1822
  return {
@@ -1913,13 +1829,12 @@ class Block {
1913
1829
 
1914
1830
  /**
1915
1831
  * Add a value input, statement input or local variable to this block.
1916
- * @param {number} type One of Blockly.inputTypes.
1917
- * @param {string} name Language-neutral identifier which may used to find
1918
- * this input again. Should be unique to this block.
1919
- * @return {!Input} The input object created.
1920
- * @protected
1832
+ * @param type One of Blockly.inputTypes.
1833
+ * @param name Language-neutral identifier which may used to find this input
1834
+ * again. Should be unique to this block.
1835
+ * @return The input object created.
1921
1836
  */
1922
- appendInput_(type, name) {
1837
+ protected appendInput_(type: number, name: string): Input {
1923
1838
  let connection = null;
1924
1839
  if (type === inputTypes.VALUE || type === inputTypes.STATEMENT) {
1925
1840
  connection = this.makeConnection_(type);
@@ -1927,7 +1842,10 @@ class Block {
1927
1842
  if (type === inputTypes.STATEMENT) {
1928
1843
  this.statementInputCount++;
1929
1844
  }
1930
- const input = new Input(type, name, this, connection);
1845
+ // AnyDuringMigration because: Argument of type 'Connection | null' is not
1846
+ // assignable to parameter of type 'Connection'.
1847
+ const input =
1848
+ new Input(type, name, this, (connection as AnyDuringMigration));
1931
1849
  // Append input to list.
1932
1850
  this.inputList.push(input);
1933
1851
  return input;
@@ -1935,19 +1853,18 @@ class Block {
1935
1853
 
1936
1854
  /**
1937
1855
  * Move a named input to a different location on this block.
1938
- * @param {string} name The name of the input to move.
1939
- * @param {?string} refName Name of input that should be after the moved
1940
- * input,
1941
- * or null to be the input at the end.
1856
+ * @param name The name of the input to move.
1857
+ * @param refName Name of input that should be after the moved input, or null
1858
+ * to be the input at the end.
1942
1859
  */
1943
- moveInputBefore(name, refName) {
1860
+ moveInputBefore(name: string, refName: string|null) {
1944
1861
  if (name === refName) {
1945
1862
  return;
1946
1863
  }
1947
1864
  // Find both inputs.
1948
1865
  let inputIndex = -1;
1949
1866
  let refIndex = refName ? -1 : this.inputList.length;
1950
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1867
+ for (let i = 0, input; input = this.inputList[i]; i++) {
1951
1868
  if (input.name === name) {
1952
1869
  inputIndex = i;
1953
1870
  if (refIndex !== -1) {
@@ -1971,11 +1888,10 @@ class Block {
1971
1888
 
1972
1889
  /**
1973
1890
  * Move a numbered input to a different location on this block.
1974
- * @param {number} inputIndex Index of the input to move.
1975
- * @param {number} refIndex Index of input that should be after the moved
1976
- * input.
1891
+ * @param inputIndex Index of the input to move.
1892
+ * @param refIndex Index of input that should be after the moved input.
1977
1893
  */
1978
- moveNumberedInputBefore(inputIndex, refIndex) {
1894
+ moveNumberedInputBefore(inputIndex: number, refIndex: number) {
1979
1895
  // Validate arguments.
1980
1896
  if (inputIndex === refIndex) {
1981
1897
  throw Error('Can\'t move input to itself.');
@@ -1998,15 +1914,14 @@ class Block {
1998
1914
 
1999
1915
  /**
2000
1916
  * Remove an input from this block.
2001
- * @param {string} name The name of the input.
2002
- * @param {boolean=} opt_quiet True to prevent an error if input is not
2003
- * present.
2004
- * @return {boolean} True if operation succeeds, false if input is not present
2005
- * and opt_quiet is true.
1917
+ * @param name The name of the input.
1918
+ * @param opt_quiet True to prevent an error if input is not present.
1919
+ * @return True if operation succeeds, false if input is not present and
1920
+ * opt_quiet is true.
2006
1921
  * @throws {Error} if the input is not present and opt_quiet is not true.
2007
1922
  */
2008
- removeInput(name, opt_quiet) {
2009
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1923
+ removeInput(name: string, opt_quiet?: boolean): boolean {
1924
+ for (let i = 0, input; input = this.inputList[i]; i++) {
2010
1925
  if (input.name === name) {
2011
1926
  if (input.type === inputTypes.STATEMENT) {
2012
1927
  this.statementInputCount--;
@@ -2024,11 +1939,11 @@ class Block {
2024
1939
 
2025
1940
  /**
2026
1941
  * Fetches the named input object.
2027
- * @param {string} name The name of the input.
2028
- * @return {?Input} The input object, or null if input does not exist.
1942
+ * @param name The name of the input.
1943
+ * @return The input object, or null if input does not exist.
2029
1944
  */
2030
- getInput(name) {
2031
- for (let i = 0, input; (input = this.inputList[i]); i++) {
1945
+ getInput(name: string): Input|null {
1946
+ for (let i = 0, input; input = this.inputList[i]; i++) {
2032
1947
  if (input.name === name) {
2033
1948
  return input;
2034
1949
  }
@@ -2039,76 +1954,75 @@ class Block {
2039
1954
 
2040
1955
  /**
2041
1956
  * Fetches the block attached to the named input.
2042
- * @param {string} name The name of the input.
2043
- * @return {?Block} The attached value block, or null if the input is
2044
- * either disconnected or if the input does not exist.
1957
+ * @param name The name of the input.
1958
+ * @return The attached value block, or null if the input is either
1959
+ * disconnected or if the input does not exist.
2045
1960
  */
2046
- getInputTargetBlock(name) {
1961
+ getInputTargetBlock(name: string): Block|null {
2047
1962
  const input = this.getInput(name);
2048
1963
  return input && input.connection && input.connection.targetBlock();
2049
1964
  }
2050
1965
 
2051
1966
  /**
2052
1967
  * Returns the comment on this block (or null if there is no comment).
2053
- * @return {?string} Block's comment.
1968
+ * @return Block's comment.
2054
1969
  */
2055
- getCommentText() {
1970
+ getCommentText(): string|null {
2056
1971
  return this.commentModel.text;
2057
1972
  }
2058
1973
 
2059
1974
  /**
2060
1975
  * Set this block's comment text.
2061
- * @param {?string} text The text, or null to delete.
1976
+ * @param text The text, or null to delete.
2062
1977
  */
2063
- setCommentText(text) {
1978
+ setCommentText(text: string|null) {
2064
1979
  if (this.commentModel.text === text) {
2065
1980
  return;
2066
1981
  }
2067
- eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))(
2068
- this, 'comment', null, this.commentModel.text, text));
1982
+ eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))!
1983
+ (this, 'comment', null, this.commentModel.text, text));
2069
1984
  this.commentModel.text = text;
2070
- this.comment = text; // For backwards compatibility.
1985
+ // AnyDuringMigration because: Type 'string | null' is not assignable to
1986
+ // type 'string | Comment'.
1987
+ this.comment = text as AnyDuringMigration; // For backwards compatibility.
2071
1988
  }
2072
1989
 
2073
1990
  /**
2074
1991
  * Set this block's warning text.
2075
- * @param {?string} _text The text, or null to delete.
2076
- * @param {string=} _opt_id An optional ID for the warning text to be able to
2077
- * maintain multiple warnings.
1992
+ * @param _text The text, or null to delete.
1993
+ * @param _opt_id An optional ID for the warning text to be able to maintain
1994
+ * multiple warnings.
2078
1995
  */
2079
- setWarningText(_text, _opt_id) {
2080
- // NOP.
2081
- }
1996
+ setWarningText(_text: string|null, _opt_id?: string) {}
1997
+ // NOP.
2082
1998
 
2083
1999
  /**
2084
2000
  * Give this block a mutator dialog.
2085
- * @param {Mutator} _mutator A mutator dialog instance or null to
2086
- * remove.
2001
+ * @param _mutator A mutator dialog instance or null to remove.
2087
2002
  */
2088
- setMutator(_mutator) {
2089
- // NOP.
2090
- }
2003
+ setMutator(_mutator: Mutator) {}
2004
+ // NOP.
2091
2005
 
2092
2006
  /**
2093
2007
  * Return the coordinates of the top-left corner of this block relative to the
2094
2008
  * drawing surface's origin (0,0), in workspace units.
2095
- * @return {!Coordinate} Object with .x and .y properties.
2009
+ * @return Object with .x and .y properties.
2096
2010
  */
2097
- getRelativeToSurfaceXY() {
2011
+ getRelativeToSurfaceXY(): Coordinate {
2098
2012
  return this.xy_;
2099
2013
  }
2100
2014
 
2101
2015
  /**
2102
2016
  * Move a block by a relative offset.
2103
- * @param {number} dx Horizontal offset, in workspace units.
2104
- * @param {number} dy Vertical offset, in workspace units.
2017
+ * @param dx Horizontal offset, in workspace units.
2018
+ * @param dy Vertical offset, in workspace units.
2105
2019
  */
2106
- moveBy(dx, dy) {
2020
+ moveBy(dx: number, dy: number) {
2107
2021
  if (this.parentBlock_) {
2108
2022
  throw Error('Block has parent.');
2109
2023
  }
2110
- const event = /** @type {!BlockMove} */ (
2111
- new (eventUtils.get(eventUtils.BLOCK_MOVE))(this));
2024
+ const event =
2025
+ new (eventUtils.get(eventUtils.BLOCK_MOVE))!(this) as BlockMove;
2112
2026
  this.xy_.translate(dx, dy);
2113
2027
  event.recordNew();
2114
2028
  eventUtils.fire(event);
@@ -2116,23 +2030,21 @@ class Block {
2116
2030
 
2117
2031
  /**
2118
2032
  * Create a connection of the specified type.
2119
- * @param {number} type The type of the connection to create.
2120
- * @return {!Connection} A new connection of the specified type.
2121
- * @protected
2033
+ * @param type The type of the connection to create.
2034
+ * @return A new connection of the specified type.
2122
2035
  */
2123
- makeConnection_(type) {
2036
+ protected makeConnection_(type: number): Connection {
2124
2037
  return new Connection(this, type);
2125
2038
  }
2126
2039
 
2127
2040
  /**
2128
2041
  * Recursively checks whether all statement and value inputs are filled with
2129
2042
  * blocks. Also checks all following statement blocks in this stack.
2130
- * @param {boolean=} opt_shadowBlocksAreFilled An optional argument
2131
- * controlling whether shadow blocks are counted as filled. Defaults to
2132
- * true.
2133
- * @return {boolean} True if all inputs are filled, false otherwise.
2043
+ * @param opt_shadowBlocksAreFilled An optional argument controlling whether
2044
+ * shadow blocks are counted as filled. Defaults to true.
2045
+ * @return True if all inputs are filled, false otherwise.
2134
2046
  */
2135
- allInputsFilled(opt_shadowBlocksAreFilled) {
2047
+ allInputsFilled(opt_shadowBlocksAreFilled?: boolean): boolean {
2136
2048
  // Account for the shadow block filledness toggle.
2137
2049
  if (opt_shadowBlocksAreFilled === undefined) {
2138
2050
  opt_shadowBlocksAreFilled = true;
@@ -2142,7 +2054,7 @@ class Block {
2142
2054
  }
2143
2055
 
2144
2056
  // Recursively check each input block of the current block.
2145
- for (let i = 0, input; (input = this.inputList[i]); i++) {
2057
+ for (let i = 0, input; input = this.inputList[i]; i++) {
2146
2058
  if (!input.connection) {
2147
2059
  continue;
2148
2060
  }
@@ -2168,9 +2080,9 @@ class Block {
2168
2080
  * Intended to on be used in console logs and errors. If you need a string
2169
2081
  * that uses the user's native language (including block text, field values,
2170
2082
  * and child blocks), use [toString()]{@link Block#toString}.
2171
- * @return {string} The description.
2083
+ * @return The description.
2172
2084
  */
2173
- toDevString() {
2085
+ toDevString(): string {
2174
2086
  let msg = this.type ? '"' + this.type + '" block' : 'Block';
2175
2087
  if (this.id) {
2176
2088
  msg += ' (id="' + this.id + '")';
@@ -2179,33 +2091,12 @@ class Block {
2179
2091
  }
2180
2092
  }
2181
2093
 
2182
- /**
2183
- * @typedef {{
2184
- * text:?string,
2185
- * pinned:boolean,
2186
- * size:Size
2187
- * }}
2188
- */
2189
- Block.CommentModel;
2190
-
2191
- /**
2192
- * An optional callback method to use whenever the block's parent workspace
2193
- * changes. This is usually only called from the constructor, the block type
2194
- * initializer function, or an extension initializer function.
2195
- * @type {undefined|?function(Abstract)}
2196
- */
2197
- Block.prototype.onchange;
2198
-
2199
- /**
2200
- * The language-neutral ID given to the collapsed input.
2201
- * @const {string}
2202
- */
2203
- Block.COLLAPSED_INPUT_NAME = constants.COLLAPSED_INPUT_NAME;
2204
-
2205
- /**
2206
- * The language-neutral ID given to the collapsed field.
2207
- * @const {string}
2208
- */
2209
- Block.COLLAPSED_FIELD_NAME = constants.COLLAPSED_FIELD_NAME;
2094
+ export namespace Block {
2095
+ export interface CommentModel {
2096
+ text: string|null;
2097
+ pinned: boolean;
2098
+ size: Size;
2099
+ }
2100
+ }
2210
2101
 
2211
- exports.Block = Block;
2102
+ export type CommentModel = Block.CommentModel;