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