blockly 7.20211209.4 → 8.0.1

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 (231) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +5 -4
  3. package/blockly_compressed.js +4 -3
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +45 -32
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +1 -1
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +26 -10
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/generators/dart/colour.js +56 -64
  208. package/generators/dart/lists.js +61 -50
  209. package/generators/dart/math.js +160 -148
  210. package/generators/dart/text.js +83 -61
  211. package/generators/javascript/colour.js +37 -34
  212. package/generators/javascript/lists.js +50 -43
  213. package/generators/javascript/math.js +123 -139
  214. package/generators/javascript/text.js +67 -81
  215. package/generators/lua/colour.js +25 -23
  216. package/generators/lua/lists.js +97 -69
  217. package/generators/lua/logic.js +1 -2
  218. package/generators/lua/math.js +182 -144
  219. package/generators/lua/text.js +116 -99
  220. package/generators/php/colour.js +38 -32
  221. package/generators/php/lists.js +109 -89
  222. package/generators/php/math.js +90 -81
  223. package/generators/php/text.js +63 -61
  224. package/generators/python/colour.js +18 -18
  225. package/generators/python/lists.js +38 -30
  226. package/generators/python/loops.js +12 -8
  227. package/generators/python/math.js +104 -106
  228. package/generators/python/text.js +34 -30
  229. package/msg/smn.js +436 -0
  230. package/package.json +7 -6
  231. package/blocks/all.js +0 -23
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2021 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview All the blocks. (Entry point for blocks_compressed.js.)
9
+ * @suppress {extraRequire}
10
+ */
11
+ 'use strict';
12
+
13
+ goog.module('Blockly.libraryBlocks');
14
+ goog.module.declareLegacyNamespace();
15
+
16
+ const colour = goog.require('Blockly.libraryBlocks.colour');
17
+ const lists = goog.require('Blockly.libraryBlocks.lists');
18
+ const logic = goog.require('Blockly.libraryBlocks.logic');
19
+ const loops = goog.require('Blockly.libraryBlocks.loops');
20
+ const math = goog.require('Blockly.libraryBlocks.math');
21
+ const procedures = goog.require('Blockly.libraryBlocks.procedures');
22
+ const texts = goog.require('Blockly.libraryBlocks.texts');
23
+ const variables = goog.require('Blockly.libraryBlocks.variables');
24
+ const variablesDynamic = goog.require('Blockly.libraryBlocks.variablesDynamic');
25
+ /* eslint-disable-next-line no-unused-vars */
26
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
27
+
28
+
29
+ exports.colour = colour;
30
+ exports.lists = lists;
31
+ exports.logic = logic;
32
+ exports.loops = loops;
33
+ exports.math = math;
34
+ exports.procedures = procedures;
35
+ exports.texts = texts;
36
+ exports.variables = variables;
37
+ exports.variablesDynamic = variablesDynamic;
38
+
39
+ /**
40
+ * A dictionary of the block definitions provided by all the
41
+ * Blockly.libraryBlocks.* modules.
42
+ * @type {!Object<string, !BlockDefinition>}
43
+ */
44
+ const blocks = Object.assign(
45
+ {}, colour.blocks, lists.blocks, logic.blocks, loops.blocks, math.blocks,
46
+ procedures.blocks, variables.blocks, variablesDynamic.blocks);
47
+ exports.blocks = blocks;
package/blocks/colour.js CHANGED
@@ -9,14 +9,20 @@
9
9
  */
10
10
  'use strict';
11
11
 
12
- goog.module('Blockly.blocks.colour');
12
+ goog.module('Blockly.libraryBlocks.colour');
13
13
 
14
- const {defineBlocksWithJsonArray} = goog.require('Blockly.common');
14
+ /* eslint-disable-next-line no-unused-vars */
15
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
16
+ const {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');
15
17
  /** @suppress {extraRequire} */
16
18
  goog.require('Blockly.FieldColour');
17
19
 
18
20
 
19
- defineBlocksWithJsonArray([
21
+ /**
22
+ * A dictionary of the block definitions provided by this module.
23
+ * @type {!Object<string, !BlockDefinition>}
24
+ */
25
+ const blocks = createBlockDefinitionsFromJsonArray([
20
26
  // Block for colour picker.
21
27
  {
22
28
  'type': 'colour_picker',
@@ -107,3 +113,7 @@ defineBlocksWithJsonArray([
107
113
  'tooltip': '%{BKY_COLOUR_BLEND_TOOLTIP}',
108
114
  },
109
115
  ]);
116
+ exports.blocks = blocks;
117
+
118
+ // Register provided blocks.
119
+ defineBlocks(blocks);
package/blocks/lists.js CHANGED
@@ -10,25 +10,30 @@
10
10
  */
11
11
  'use strict';
12
12
 
13
- goog.module('Blockly.blocks.lists');
13
+ goog.module('Blockly.libraryBlocks.lists');
14
14
 
15
15
  const xmlUtils = goog.require('Blockly.utils.xml');
16
16
  const {Align} = goog.require('Blockly.Input');
17
17
  /* eslint-disable-next-line no-unused-vars */
18
18
  const {Block} = goog.requireType('Blockly.Block');
19
- const {Blocks} = goog.require('Blockly.blocks');
19
+ /* eslint-disable-next-line no-unused-vars */
20
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
20
21
  const {ConnectionType} = goog.require('Blockly.ConnectionType');
21
22
  const {FieldDropdown} = goog.require('Blockly.FieldDropdown');
22
23
  const {Msg} = goog.require('Blockly.Msg');
23
24
  const {Mutator} = goog.require('Blockly.Mutator');
24
25
  /* eslint-disable-next-line no-unused-vars */
25
26
  const {Workspace} = goog.requireType('Blockly.Workspace');
26
- const {defineBlocksWithJsonArray} = goog.require('Blockly.common');
27
+ const {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');
27
28
  /** @suppress {extraRequire} */
28
29
  goog.require('Blockly.FieldDropdown');
29
30
 
30
31
 
31
- defineBlocksWithJsonArray([
32
+ /**
33
+ * A dictionary of the block definitions provided by this module.
34
+ * @type {!Object<string, !BlockDefinition>}
35
+ */
36
+ const blocks = createBlockDefinitionsFromJsonArray([
32
37
  // Block for creating an empty list
33
38
  // The 'list_create_with' block is preferred as it is more flexible.
34
39
  // <block type="lists_create_with">
@@ -112,8 +117,9 @@ defineBlocksWithJsonArray([
112
117
  'helpUrl': '%{BKY_LISTS_LENGTH_HELPURL}',
113
118
  },
114
119
  ]);
120
+ exports.blocks = blocks;
115
121
 
116
- Blocks['lists_create_with'] = {
122
+ blocks['lists_create_with'] = {
117
123
  /**
118
124
  * Block for creating a list with any number of elements of any type.
119
125
  * @this {Block}
@@ -255,7 +261,7 @@ Blocks['lists_create_with'] = {
255
261
  },
256
262
  };
257
263
 
258
- Blocks['lists_create_with_container'] = {
264
+ blocks['lists_create_with_container'] = {
259
265
  /**
260
266
  * Mutator block for list container.
261
267
  * @this {Block}
@@ -270,7 +276,7 @@ Blocks['lists_create_with_container'] = {
270
276
  },
271
277
  };
272
278
 
273
- Blocks['lists_create_with_item'] = {
279
+ blocks['lists_create_with_item'] = {
274
280
  /**
275
281
  * Mutator block for adding items.
276
282
  * @this {Block}
@@ -285,7 +291,7 @@ Blocks['lists_create_with_item'] = {
285
291
  },
286
292
  };
287
293
 
288
- Blocks['lists_indexOf'] = {
294
+ blocks['lists_indexOf'] = {
289
295
  /**
290
296
  * Block for finding an item in the list.
291
297
  * @this {Block}
@@ -312,7 +318,7 @@ Blocks['lists_indexOf'] = {
312
318
  },
313
319
  };
314
320
 
315
- Blocks['lists_getIndex'] = {
321
+ blocks['lists_getIndex'] = {
316
322
  /**
317
323
  * Block for getting element at index.
318
324
  * @this {Block}
@@ -516,7 +522,7 @@ Blocks['lists_getIndex'] = {
516
522
  },
517
523
  };
518
524
 
519
- Blocks['lists_setIndex'] = {
525
+ blocks['lists_setIndex'] = {
520
526
  /**
521
527
  * Block for setting the element at index.
522
528
  * @this {Block}
@@ -668,7 +674,7 @@ Blocks['lists_setIndex'] = {
668
674
  },
669
675
  };
670
676
 
671
- Blocks['lists_getSublist'] = {
677
+ blocks['lists_getSublist'] = {
672
678
  /**
673
679
  * Block for getting sublist.
674
680
  * @this {Block}
@@ -786,7 +792,7 @@ Blocks['lists_getSublist'] = {
786
792
  },
787
793
  };
788
794
 
789
- Blocks['lists_sort'] = {
795
+ blocks['lists_sort'] = {
790
796
  /**
791
797
  * Block for sorting a list.
792
798
  * @this {Block}
@@ -826,7 +832,7 @@ Blocks['lists_sort'] = {
826
832
  },
827
833
  };
828
834
 
829
- Blocks['lists_split'] = {
835
+ blocks['lists_split'] = {
830
836
  /**
831
837
  * Block for splitting text into a list, or joining a list into text.
832
838
  * @this {Block}
@@ -913,3 +919,6 @@ Blocks['lists_split'] = {
913
919
  // dropdown values.
914
920
  // XML hooks are kept for backwards compatibility.
915
921
  };
922
+
923
+ // Register provided blocks.
924
+ defineBlocks(blocks);
package/blocks/logic.js CHANGED
@@ -10,7 +10,7 @@
10
10
  */
11
11
  'use strict';
12
12
 
13
- goog.module('Blockly.blocks.logic');
13
+ goog.module('Blockly.libraryBlocks.logic');
14
14
 
15
15
  /* eslint-disable-next-line no-unused-vars */
16
16
  const AbstractEvent = goog.requireType('Blockly.Events.Abstract');
@@ -19,20 +19,26 @@ const Extensions = goog.require('Blockly.Extensions');
19
19
  const xmlUtils = goog.require('Blockly.utils.xml');
20
20
  /* eslint-disable-next-line no-unused-vars */
21
21
  const {Block} = goog.requireType('Blockly.Block');
22
+ /* eslint-disable-next-line no-unused-vars */
23
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
22
24
  const {Msg} = goog.require('Blockly.Msg');
23
25
  const {Mutator} = goog.require('Blockly.Mutator');
24
26
  /* eslint-disable-next-line no-unused-vars */
25
27
  const {RenderedConnection} = goog.requireType('Blockly.RenderedConnection');
26
28
  /* eslint-disable-next-line no-unused-vars */
27
29
  const {Workspace} = goog.requireType('Blockly.Workspace');
28
- const {defineBlocksWithJsonArray} = goog.require('Blockly.common');
30
+ const {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');
29
31
  /** @suppress {extraRequire} */
30
32
  goog.require('Blockly.FieldDropdown');
31
33
  /** @suppress {extraRequire} */
32
34
  goog.require('Blockly.FieldLabel');
33
35
 
34
36
 
35
- defineBlocksWithJsonArray([
37
+ /**
38
+ * A dictionary of the block definitions provided by this module.
39
+ * @type {!Object<string, !BlockDefinition>}
40
+ */
41
+ const blocks = createBlockDefinitionsFromJsonArray([
36
42
  // Block for boolean data type: true and false.
37
43
  {
38
44
  'type': 'logic_boolean',
@@ -258,6 +264,7 @@ defineBlocksWithJsonArray([
258
264
  'tooltip': '%{BKY_CONTROLS_IF_ELSE_TOOLTIP}',
259
265
  },
260
266
  ]);
267
+ exports.blocks = blocks;
261
268
 
262
269
  /**
263
270
  * Tooltip text, keyed by block OP value. Used by logic_compare and
@@ -645,3 +652,6 @@ const LOGIC_TERNARY_ONCHANGE_MIXIN = {
645
652
  };
646
653
 
647
654
  Extensions.registerMixin('logic_ternary', LOGIC_TERNARY_ONCHANGE_MIXIN);
655
+
656
+ // Register provided blocks.
657
+ defineBlocks(blocks);
package/blocks/loops.js CHANGED
@@ -10,7 +10,7 @@
10
10
  */
11
11
  'use strict';
12
12
 
13
- goog.module('Blockly.blocks.loops');
13
+ goog.module('Blockly.libraryBlocks.loops');
14
14
 
15
15
  /* eslint-disable-next-line no-unused-vars */
16
16
  const AbstractEvent = goog.requireType('Blockly.Events.Abstract');
@@ -18,11 +18,13 @@ const ContextMenu = goog.require('Blockly.ContextMenu');
18
18
  const Events = goog.require('Blockly.Events');
19
19
  const Extensions = goog.require('Blockly.Extensions');
20
20
  const Variables = goog.require('Blockly.Variables');
21
- const common = goog.require('Blockly.common');
22
21
  const xmlUtils = goog.require('Blockly.utils.xml');
23
22
  /* eslint-disable-next-line no-unused-vars */
24
23
  const {Block} = goog.requireType('Blockly.Block');
24
+ /* eslint-disable-next-line no-unused-vars */
25
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
25
26
  const {Msg} = goog.require('Blockly.Msg');
27
+ const {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');
26
28
  /** @suppress {extraRequire} */
27
29
  goog.require('Blockly.FieldDropdown');
28
30
  /** @suppress {extraRequire} */
@@ -35,7 +37,11 @@ goog.require('Blockly.FieldVariable');
35
37
  goog.require('Blockly.Warning');
36
38
 
37
39
 
38
- common.defineBlocksWithJsonArray([
40
+ /**
41
+ * A dictionary of the block definitions provided by this module.
42
+ * @type {!Object<string, !BlockDefinition>}
43
+ */
44
+ const blocks = createBlockDefinitionsFromJsonArray([
39
45
  // Block for repeat n times (external number).
40
46
  {
41
47
  'type': 'controls_repeat_ext',
@@ -205,6 +211,7 @@ common.defineBlocksWithJsonArray([
205
211
  ],
206
212
  },
207
213
  ]);
214
+ exports.blocks = blocks;
208
215
 
209
216
  /**
210
217
  * Tooltips for the 'controls_whileUntil' block, keyed by MODE value.
@@ -287,21 +294,24 @@ Extensions.register(
287
294
  *
288
295
  * // If using the Blockly npm package and es6 import syntax:
289
296
  * import {loopTypes} from 'blockly/blocks';
290
- * loopTypes.push('custom_loop');
297
+ * loopTypes.add('custom_loop');
291
298
  *
292
299
  * // Else if using Closure Compiler and goog.modules:
293
- * const {loopTypes} = goog.require('Blockly.blocks.loops');
294
- * loopTypes.push('custom_loop');
300
+ * const {loopTypes} = goog.require('Blockly.libraryBlocks.loops');
301
+ * loopTypes.add('custom_loop');
295
302
  *
296
- * @type {!Array<string>}
303
+ * // Else if using blockly_compressed + blockss_compressed.js in browser:
304
+ * Blockly.libraryBlocks.loopTypes.add('custom_loop');
305
+ *
306
+ * @type {!Set<string>}
297
307
  */
298
- const loopTypes = [
308
+ const loopTypes = new Set([
299
309
  'controls_repeat',
300
310
  'controls_repeat_ext',
301
311
  'controls_forEach',
302
312
  'controls_for',
303
313
  'controls_whileUntil',
304
- ];
314
+ ]);
305
315
  exports.loopTypes = loopTypes;
306
316
 
307
317
  /**
@@ -321,7 +331,7 @@ const CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = {
321
331
  getSurroundLoop: function() {
322
332
  let block = this;
323
333
  do {
324
- if (loopTypes.includes(block.type)) {
334
+ if (loopTypes.has(block.type)) {
325
335
  return block;
326
336
  }
327
337
  block = block.getSurroundParent();
@@ -332,7 +342,7 @@ const CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = {
332
342
  /**
333
343
  * Called whenever anything on the workspace changes.
334
344
  * Add warning if this flow block is not nested inside a loop.
335
- * @param {!AbstractEvent} e Change event.
345
+ * @param {!AbstractEvent} e Move event.
336
346
  * @this {Block}
337
347
  */
338
348
  onchange: function(e) {
@@ -358,3 +368,6 @@ const CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = {
358
368
 
359
369
  Extensions.registerMixin(
360
370
  'controls_flow_in_loop_check', CONTROL_FLOW_IN_LOOP_CHECK_MIXIN);
371
+
372
+ // Register provided blocks.
373
+ defineBlocks(blocks);
package/blocks/math.js CHANGED
@@ -10,7 +10,7 @@
10
10
  */
11
11
  'use strict';
12
12
 
13
- goog.module('Blockly.blocks.math');
13
+ goog.module('Blockly.libraryBlocks.math');
14
14
 
15
15
  const Extensions = goog.require('Blockly.Extensions');
16
16
  // N.B.: Blockly.FieldDropdown needed for type AND side-effects.
@@ -20,7 +20,8 @@ const xmlUtils = goog.require('Blockly.utils.xml');
20
20
  /* eslint-disable-next-line no-unused-vars */
21
21
  const {Block} = goog.requireType('Blockly.Block');
22
22
  /* eslint-disable-next-line no-unused-vars */
23
- const {defineBlocksWithJsonArray} = goog.require('Blockly.common');
23
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
24
+ const {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common');
24
25
  /** @suppress {extraRequire} */
25
26
  goog.require('Blockly.FieldLabel');
26
27
  /** @suppress {extraRequire} */
@@ -29,7 +30,11 @@ goog.require('Blockly.FieldNumber');
29
30
  goog.require('Blockly.FieldVariable');
30
31
 
31
32
 
32
- defineBlocksWithJsonArray([
33
+ /**
34
+ * A dictionary of the block definitions provided by this module.
35
+ * @type {!Object<string, !BlockDefinition>}
36
+ */
37
+ const blocks = createBlockDefinitionsFromJsonArray([
33
38
  // Block for numeric value.
34
39
  {
35
40
  'type': 'math_number',
@@ -384,6 +389,7 @@ defineBlocksWithJsonArray([
384
389
  'helpUrl': '%{BKY_MATH_ATAN2_HELPURL}',
385
390
  },
386
391
  ]);
392
+ exports.blocks = blocks;
387
393
 
388
394
  /**
389
395
  * Mapping of math block OP value to tooltip message for blocks
@@ -581,3 +587,6 @@ const LIST_MODES_MUTATOR_EXTENSION = function() {
581
587
  Extensions.registerMutator(
582
588
  'math_modes_of_list_mutator', LIST_MODES_MUTATOR_MIXIN,
583
589
  LIST_MODES_MUTATOR_EXTENSION);
590
+
591
+ // Register provided blocks.
592
+ defineBlocks(blocks);
@@ -10,7 +10,7 @@
10
10
  */
11
11
  'use strict';
12
12
 
13
- goog.module('Blockly.blocks.procedures');
13
+ goog.module('Blockly.libraryBlocks.procedures');
14
14
 
15
15
  /* eslint-disable-next-line no-unused-vars */
16
16
  const AbstractEvent = goog.requireType('Blockly.Events.Abstract');
@@ -19,12 +19,13 @@ const Events = goog.require('Blockly.Events');
19
19
  const Procedures = goog.require('Blockly.Procedures');
20
20
  const Variables = goog.require('Blockly.Variables');
21
21
  const Xml = goog.require('Blockly.Xml');
22
- const internalConstants = goog.require('Blockly.internalConstants');
23
22
  const xmlUtils = goog.require('Blockly.utils.xml');
24
23
  const {Align} = goog.require('Blockly.Input');
25
24
  /* eslint-disable-next-line no-unused-vars */
26
25
  const {Block} = goog.requireType('Blockly.Block');
27
- const {Blocks} = goog.require('Blockly.blocks');
26
+ /* eslint-disable-next-line no-unused-vars */
27
+ const {BlockDefinition} = goog.requireType('Blockly.blocks');
28
+ const {config} = goog.require('Blockly.config');
28
29
  /* eslint-disable-next-line no-unused-vars */
29
30
  const {FieldCheckbox} = goog.require('Blockly.FieldCheckbox');
30
31
  const {FieldLabel} = goog.require('Blockly.FieldLabel');
@@ -36,12 +37,20 @@ const {Names} = goog.require('Blockly.Names');
36
37
  const {VariableModel} = goog.requireType('Blockly.VariableModel');
37
38
  /* eslint-disable-next-line no-unused-vars */
38
39
  const {Workspace} = goog.requireType('Blockly.Workspace');
40
+ const {defineBlocks} = goog.require('Blockly.common');
39
41
  /** @suppress {extraRequire} */
40
42
  goog.require('Blockly.Comment');
41
43
  /** @suppress {extraRequire} */
42
44
  goog.require('Blockly.Warning');
43
45
 
44
46
 
47
+ /**
48
+ * A dictionary of the block definitions provided by this module.
49
+ * @type {!Object<string, !BlockDefinition>}
50
+ */
51
+ const blocks = {};
52
+ exports.blocks = blocks;
53
+
45
54
  /**
46
55
  * Common properties for the procedure_defnoreturn and
47
56
  * procedure_defreturn blocks.
@@ -434,10 +443,9 @@ const PROCEDURE_DEF_COMMON = {
434
443
  }
435
444
  }
436
445
  },
437
- callType_: 'procedures_callnoreturn',
438
446
  };
439
447
 
440
- Blocks['procedures_defnoreturn'] = {
448
+ blocks['procedures_defnoreturn'] = {
441
449
  ...PROCEDURE_DEF_COMMON,
442
450
  /**
443
451
  * Block for defining a procedure with no return value.
@@ -477,9 +485,10 @@ Blocks['procedures_defnoreturn'] = {
477
485
  getProcedureDef: function() {
478
486
  return [this.getFieldValue('NAME'), this.arguments_, false];
479
487
  },
488
+ callType_: 'procedures_callnoreturn',
480
489
  };
481
490
 
482
- Blocks['procedures_defreturn'] = {
491
+ blocks['procedures_defreturn'] = {
483
492
  ...PROCEDURE_DEF_COMMON,
484
493
  /**
485
494
  * Block for defining a procedure with a return value.
@@ -522,9 +531,10 @@ Blocks['procedures_defreturn'] = {
522
531
  getProcedureDef: function() {
523
532
  return [this.getFieldValue('NAME'), this.arguments_, true];
524
533
  },
534
+ callType_: 'procedures_callreturn',
525
535
  };
526
536
 
527
- Blocks['procedures_mutatorcontainer'] = {
537
+ blocks['procedures_mutatorcontainer'] = {
528
538
  /**
529
539
  * Mutator block for procedure container.
530
540
  * @this {Block}
@@ -542,7 +552,7 @@ Blocks['procedures_mutatorcontainer'] = {
542
552
  },
543
553
  };
544
554
 
545
- Blocks['procedures_mutatorarg'] = {
555
+ blocks['procedures_mutatorarg'] = {
546
556
  /**
547
557
  * Mutator block for procedure argument.
548
558
  * @this {Block}
@@ -711,10 +721,10 @@ const PROCEDURE_CALL_COMMON = {
711
721
  if (!mutatorOpen) {
712
722
  this.quarkConnections_ = {};
713
723
  this.quarkIds_ = null;
714
- }
715
- if (!paramIds) {
716
- // Reset the quarks (a mutator is about to open).
717
- return;
724
+ } else {
725
+ // fix #6091 - this call could cause an error when outside if-else
726
+ // expanding block while mutating prevents another error (ancient fix)
727
+ this.setCollapsed(false);
718
728
  }
719
729
  // Test arguments (arrays of strings) for changes. '\n' is not a valid
720
730
  // argument name character, so it is a valid delimiter here.
@@ -726,7 +736,6 @@ const PROCEDURE_CALL_COMMON = {
726
736
  if (paramIds.length !== paramNames.length) {
727
737
  throw RangeError('paramNames and paramIds must be the same length.');
728
738
  }
729
- this.setCollapsed(false);
730
739
  if (!this.quarkIds_) {
731
740
  // Initialize tracking for this block.
732
741
  this.quarkConnections_ = {};
@@ -950,19 +959,18 @@ const PROCEDURE_CALL_COMMON = {
950
959
  const block = xmlUtils.createElement('block');
951
960
  block.setAttribute('type', this.defType_);
952
961
  const xy = this.getRelativeToSurfaceXY();
953
- const x = xy.x + internalConstants.SNAP_RADIUS * (this.RTL ? -1 : 1);
954
- const y = xy.y + internalConstants.SNAP_RADIUS * 2;
962
+ const x = xy.x + config.snapRadius * (this.RTL ? -1 : 1);
963
+ const y = xy.y + config.snapRadius * 2;
955
964
  block.setAttribute('x', x);
956
965
  block.setAttribute('y', y);
957
966
  const mutation = this.mutationToDom();
958
967
  block.appendChild(mutation);
959
968
  const field = xmlUtils.createElement('field');
960
969
  field.setAttribute('name', 'NAME');
961
- let callName = this.getProcedureCall();
962
- if (!callName) {
963
- // Rename if name is empty string.
964
- callName = Procedures.findLegalName('', this);
965
- this.renameProcedure('', callName);
970
+ const callName = this.getProcedureCall();
971
+ const newName = Procedures.findLegalName(callName, this);
972
+ if (callName !== newName) {
973
+ this.renameProcedure(callName, newName);
966
974
  }
967
975
  field.appendChild(xmlUtils.createTextNode(callName));
968
976
  block.appendChild(field);
@@ -1033,7 +1041,7 @@ const PROCEDURE_CALL_COMMON = {
1033
1041
  },
1034
1042
  };
1035
1043
 
1036
- Blocks['procedures_callnoreturn'] = {
1044
+ blocks['procedures_callnoreturn'] = {
1037
1045
  ...PROCEDURE_CALL_COMMON,
1038
1046
  /**
1039
1047
  * Block for calling a procedure with no return value.
@@ -1056,7 +1064,7 @@ Blocks['procedures_callnoreturn'] = {
1056
1064
  defType_: 'procedures_defnoreturn',
1057
1065
  };
1058
1066
 
1059
- Blocks['procedures_callreturn'] = {
1067
+ blocks['procedures_callreturn'] = {
1060
1068
  ...PROCEDURE_CALL_COMMON,
1061
1069
  /**
1062
1070
  * Block for calling a procedure with a return value.
@@ -1078,7 +1086,7 @@ Blocks['procedures_callreturn'] = {
1078
1086
  defType_: 'procedures_defreturn',
1079
1087
  };
1080
1088
 
1081
- Blocks['procedures_ifreturn'] = {
1089
+ blocks['procedures_ifreturn'] = {
1082
1090
  /**
1083
1091
  * Block for conditionally returning a value from a procedure.
1084
1092
  * @this {Block}
@@ -1130,11 +1138,12 @@ Blocks['procedures_ifreturn'] = {
1130
1138
  /**
1131
1139
  * Called whenever anything on the workspace changes.
1132
1140
  * Add warning if this flow block is not nested inside a loop.
1133
- * @param {!AbstractEvent} _e Change event.
1141
+ * @param {!AbstractEvent} e Move event.
1134
1142
  * @this {Block}
1135
1143
  */
1136
- onchange: function(_e) {
1137
- if (this.workspace.isDragging && this.workspace.isDragging()) {
1144
+ onchange: function(e) {
1145
+ if (this.workspace.isDragging && this.workspace.isDragging() ||
1146
+ e.type !== Events.BLOCK_MOVE) {
1138
1147
  return; // Don't change state at the start of a drag.
1139
1148
  }
1140
1149
  let legal = false;
@@ -1162,14 +1171,15 @@ Blocks['procedures_ifreturn'] = {
1162
1171
  this.hasReturnValue_ = true;
1163
1172
  }
1164
1173
  this.setWarningText(null);
1165
- if (!this.isInFlyout) {
1166
- this.setEnabled(true);
1167
- }
1168
1174
  } else {
1169
1175
  this.setWarningText(Msg['PROCEDURES_IFRETURN_WARNING']);
1170
- if (!this.isInFlyout && !this.getInheritedDisabled()) {
1171
- this.setEnabled(false);
1172
- }
1176
+ }
1177
+ if (!this.isInFlyout) {
1178
+ const group = Events.getGroup();
1179
+ // Makes it so the move and the disable event get undone together.
1180
+ Events.setGroup(e.group);
1181
+ this.setEnabled(legal);
1182
+ Events.setGroup(group);
1173
1183
  }
1174
1184
  },
1175
1185
  /**
@@ -1179,3 +1189,6 @@ Blocks['procedures_ifreturn'] = {
1179
1189
  */
1180
1190
  FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn'],
1181
1191
  };
1192
+
1193
+ // Register provided blocks.
1194
+ defineBlocks(blocks);