iobroker.javascript 10.0.0 → 10.1.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 (180) hide show
  1. package/README.md +48 -12
  2. package/admin/assets/AiChatPanel-C_WbKMGX.js +242 -0
  3. package/admin/assets/AiDiffView-BtXbDWZ8.js +1 -0
  4. package/admin/assets/Debugger-DAdJnEhw.js +15 -0
  5. package/admin/assets/Error-DQ1pzKcf.js +1 -0
  6. package/admin/assets/Import-BjMtH6Gk.js +1 -0
  7. package/admin/assets/RulesEditor-dDRPHw4X.js +1 -0
  8. package/admin/assets/RulesEditor-k-DMHotH.css +1 -0
  9. package/admin/assets/{ScriptEditor-BGIuoNei.js → ScriptEditor-CZSc7rwE.js} +2 -2
  10. package/admin/assets/ScriptEditorVanillaMonaco-DEKg14_A.js +3 -0
  11. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DPmwd_G2.js +1 -0
  12. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-C8inUeKt.js +1243 -0
  13. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-VcQjt7_9.js +9 -0
  14. package/admin/assets/aiPromptBuilder-D5FDo74i.js +1 -0
  15. package/admin/assets/blockly-DBw-ytY1.js +1047 -0
  16. package/admin/assets/blocks_action-BqfWEwpf.js +1 -0
  17. package/admin/assets/blocks_convert-CX0i-JfS.js +3 -0
  18. package/admin/assets/blocks_logic-D-QSzw95.js +1 -0
  19. package/admin/assets/blocks_number-D7JuNYsw.js +1 -0
  20. package/admin/assets/blocks_object-C9DzAlc7.js +1 -0
  21. package/admin/assets/blocks_procedures-BJMz6HWW.js +3 -0
  22. package/admin/assets/blocks_sendto-DRh7lk9o.js +5 -0
  23. package/admin/assets/blocks_switch-BfmboMex.js +2 -0
  24. package/admin/assets/blocks_system-B-78JfAc.js +1 -0
  25. package/admin/assets/blocks_text-CGbR0Ozw.js +1 -0
  26. package/admin/assets/blocks_time-5vS2geJg.js +1 -0
  27. package/admin/assets/blocks_timeout-BdaTywfN.js +1 -0
  28. package/admin/assets/blocks_trigger-D8kgHKbg.js +2 -0
  29. package/admin/assets/blocks_words-BhHIf_1o.js +1 -0
  30. package/admin/assets/{cronHoverProvider-pKJkSevo.js → cronHoverProvider-DpgESCox.js} +1 -1
  31. package/admin/assets/dist-CaOsN0XW.js +4 -0
  32. package/admin/assets/field_cron-B40zwSfJ.js +1 -0
  33. package/admin/assets/field_oid-KfoBnEM9.js +1 -0
  34. package/admin/assets/field_script-yXhe1iCp.js +1 -0
  35. package/admin/assets/helpers-B0ByElPJ.js +1 -0
  36. package/admin/assets/hostInit-9REPDUe7.js +1 -0
  37. package/admin/assets/index-07o_WKsX.js +726 -0
  38. package/admin/assets/index-Z8Hkv58g.css +1 -0
  39. package/admin/assets/{inlineChatWidget-ZaisTOLh.js → inlineChatWidget-B9y_gQcH.js} +2 -2
  40. package/admin/assets/{inlineDiffController-hTwHHqcc.js → inlineDiffController-C07CdIFo.js} +2 -2
  41. package/admin/assets/{mf-entry-bootstrap-0-d6052b31.js → mf-entry-bootstrap-0-efcb49d3.js} +7 -2
  42. package/admin/assets/stateHoverProvider-CqeoOjXs.js +9 -0
  43. package/admin/assets/{virtualExposes-Ed0lGq7k.js → virtualExposes-DgGB-18P.js} +1 -1
  44. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BwSvIKEV.js +1 -0
  45. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-ChiJXsfH.js +1 -0
  46. package/admin/custom/assets/Components-BCQTjBgm.js +1 -0
  47. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-BuAc8OyX.js +1 -0
  48. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BGJv4zZP.js +1 -0
  49. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CGb5Cofy.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-B4E6MFJ4.js} +1 -1
  50. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BVCIAgbo.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-aRlxyEhq.js} +78 -78
  51. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DQwzYx75.js +1494 -0
  52. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-h-rCw3iz.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-n2zIPi0L.js} +1 -1
  53. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-xxszBNje.js +9 -0
  54. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Cb5TR7FB.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Tq7tesSS.js} +1 -1
  55. package/admin/custom/assets/{_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-DARUoA03.js → _virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-BeF0jEWM.js} +1 -1
  56. package/admin/custom/assets/hostInit-CHwrowP4.js +1 -0
  57. package/admin/custom/assets/{index-uEKAoVT7.js → index-Cm6xl9K4.js} +1 -1
  58. package/admin/custom/assets/{lib-Yj8cfN0A.js → lib-bhrFL6jR.js} +1 -1
  59. package/admin/custom/assets/{mf-entry-bootstrap-0-77793feb.js → mf-entry-bootstrap-0-f08941e2.js} +7 -2
  60. package/admin/custom/assets/{setYear-DJ9FbdkO.js → setYear-DzTZ2h9A.js} +1 -1
  61. package/admin/custom/assets/virtualExposes-B5LJmnfO.js +1 -0
  62. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-ML-chjs6.js +1 -0
  63. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-C3ImybiM.js +2 -0
  64. package/admin/custom/customComponents.js +12 -1
  65. package/admin/custom/i18n/de.json +11 -1
  66. package/admin/custom/i18n/en.json +11 -1
  67. package/admin/custom/i18n/es.json +11 -1
  68. package/admin/custom/i18n/fr.json +11 -1
  69. package/admin/custom/i18n/it.json +11 -1
  70. package/admin/custom/i18n/nl.json +11 -1
  71. package/admin/custom/i18n/pl.json +11 -1
  72. package/admin/custom/i18n/pt.json +11 -1
  73. package/admin/custom/i18n/ru.json +11 -1
  74. package/admin/custom/i18n/uk.json +11 -1
  75. package/admin/custom/i18n/zh-cn.json +11 -1
  76. package/admin/google-blockly/VERSION +1 -0
  77. package/admin/google-blockly/media/drop.mp3 +0 -0
  78. package/admin/google-blockly/msg/js/de.js +332 -56
  79. package/admin/google-blockly/msg/js/en.js +319 -43
  80. package/admin/google-blockly/msg/js/es.js +319 -42
  81. package/admin/google-blockly/msg/js/fr.js +315 -39
  82. package/admin/google-blockly/msg/js/it.js +327 -51
  83. package/admin/google-blockly/msg/js/nl.js +376 -100
  84. package/admin/google-blockly/msg/js/pl.js +318 -42
  85. package/admin/google-blockly/msg/js/pt.js +318 -42
  86. package/admin/google-blockly/msg/js/ru.js +320 -44
  87. package/admin/google-blockly/msg/js/uk.js +326 -50
  88. package/admin/google-blockly/msg/js/zh-cn.js +322 -46
  89. package/admin/i18n/de.json +51 -26
  90. package/admin/i18n/en.json +50 -25
  91. package/admin/i18n/es.json +51 -18
  92. package/admin/i18n/fr.json +50 -17
  93. package/admin/i18n/it.json +50 -17
  94. package/admin/i18n/nl.json +50 -17
  95. package/admin/i18n/pl.json +51 -18
  96. package/admin/i18n/pt.json +50 -17
  97. package/admin/i18n/ru.json +50 -17
  98. package/admin/i18n/uk.json +50 -17
  99. package/admin/i18n/zh-cn.json +50 -17
  100. package/admin/jsonConfig.json +398 -0
  101. package/admin/mf-manifest.json +1 -1
  102. package/admin/mf-stats.json +1 -1
  103. package/admin/remoteEntry.js +12 -1
  104. package/admin/tab.html +6 -98
  105. package/build/lib/javascript.d.ts +48 -0
  106. package/build/lib/mirror.js +9 -0
  107. package/build/lib/mirror.js.map +1 -1
  108. package/build/lib/sandbox.js +37 -0
  109. package/build/lib/sandbox.js.map +1 -1
  110. package/build/lib/secrets.js +220 -0
  111. package/build/lib/secrets.js.map +1 -0
  112. package/build/lib/typescriptSettings.js +112 -2
  113. package/build/lib/typescriptSettings.js.map +1 -1
  114. package/build/lib/typescriptTools.js +168 -43
  115. package/build/lib/typescriptTools.js.map +1 -1
  116. package/build/main.js +61 -5
  117. package/build/main.js.map +1 -1
  118. package/build/types.d.ts +48 -0
  119. package/docs/en/blockly.md +29 -0
  120. package/docs/en/javascript.md +72 -0
  121. package/docs/en/upgrade-guide.md +3 -0
  122. package/io-package.json +59 -28
  123. package/package.json +8 -3
  124. package/admin/assets/AiChatPanel-p0KAg6Cs.js +0 -237
  125. package/admin/assets/AiDiffView-BPTLnNx1.js +0 -1
  126. package/admin/assets/AiScriptAnalyzer--BHML2rN.js +0 -9
  127. package/admin/assets/BlocklyEditor-CAjVMhYT.js +0 -81
  128. package/admin/assets/ContextWrapper-BVc8wTK_.css +0 -1
  129. package/admin/assets/ContextWrapper-D9CrnNKs.js +0 -127
  130. package/admin/assets/Debugger-SjROokFI.js +0 -15
  131. package/admin/assets/Error-DDfrxAt2.js +0 -1
  132. package/admin/assets/Import-DpTg1Jow.js +0 -1
  133. package/admin/assets/RulesEditor-BSRFWpEm.css +0 -1
  134. package/admin/assets/RulesEditor-D0hgrcBc.js +0 -1
  135. package/admin/assets/ScriptEditorVanillaMonaco-DyMQtoTQ.js +0 -3
  136. package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DWJotR1B.js +0 -1
  137. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-CxICLr5Z.js +0 -1243
  138. package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BBAXJaqI.js +0 -9
  139. package/admin/assets/aiCodeLensProvider-hyAmut0e.js +0 -4
  140. package/admin/assets/aiPromptBuilder-Bs27qOHT.js +0 -7
  141. package/admin/assets/blocklyDarkTheme-DEiAX5DT.js +0 -1
  142. package/admin/assets/dist-uw5orDgd.js +0 -4
  143. package/admin/assets/hostInit-BFg5u9hY.js +0 -1
  144. package/admin/assets/index-B1gICjdq.js +0 -192
  145. package/admin/assets/index-BHhhebRG.css +0 -1
  146. package/admin/assets/mjs-DWqivHEk.js +0 -90
  147. package/admin/assets/stateHoverProvider-C7DawIs-.js +0 -9
  148. package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BYs71IQF.js +0 -1
  149. package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-DnnXQRkG.js +0 -1
  150. package/admin/custom/assets/Components-BrDyDHXh.js +0 -1
  151. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-CyYJM2-v.js +0 -1
  152. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BdzCssLn.js +0 -1
  153. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-BkB0anQX.js +0 -1494
  154. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BotqDuw-.js +0 -9
  155. package/admin/custom/assets/hostInit-DJx2uXXy.js +0 -1
  156. package/admin/custom/assets/virtualExposes-CxDjLoYu.js +0 -1
  157. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BU-ugy_7.js +0 -1
  158. package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BEfZbrf7.js +0 -2
  159. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CTeZ0Jpm.js +0 -2
  160. package/admin/google-blockly/blockly_compressed.js +0 -1679
  161. package/admin/google-blockly/blocks_compressed.js +0 -193
  162. package/admin/google-blockly/javascript_compressed.js +0 -264
  163. package/admin/google-blockly/msg/messages.js +0 -1630
  164. package/admin/google-blockly/own/blocks_action.js +0 -765
  165. package/admin/google-blockly/own/blocks_convert.js +0 -480
  166. package/admin/google-blockly/own/blocks_logic.js +0 -459
  167. package/admin/google-blockly/own/blocks_number.js +0 -30
  168. package/admin/google-blockly/own/blocks_object.js +0 -402
  169. package/admin/google-blockly/own/blocks_procedures.js +0 -688
  170. package/admin/google-blockly/own/blocks_sendto.js +0 -702
  171. package/admin/google-blockly/own/blocks_switch.js +0 -257
  172. package/admin/google-blockly/own/blocks_system.js +0 -1409
  173. package/admin/google-blockly/own/blocks_text.js +0 -104
  174. package/admin/google-blockly/own/blocks_time.js +0 -639
  175. package/admin/google-blockly/own/blocks_timeout.js +0 -551
  176. package/admin/google-blockly/own/blocks_trigger.js +0 -1791
  177. package/admin/google-blockly/own/blocks_words.js +0 -708
  178. package/admin/google-blockly/own/field_cron.js +0 -158
  179. package/admin/google-blockly/own/field_oid.js +0 -642
  180. package/admin/google-blockly/own/field_script.js +0 -159
@@ -1,688 +0,0 @@
1
- if (Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.indexOf('procedures_defcustomreturn') === -1) {
2
- Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('procedures_defcustomreturn');
3
- }
4
- if (Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.indexOf('procedures_defcustomnoreturn') === -1) {
5
- Blockly.Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('procedures_defcustomnoreturn');
6
- }
7
- // derived from core/procedures.js
8
- /**
9
- * Find all user-created procedure definitions in a workspace.
10
- * @param {!Blockly.Workspace} root Root workspace.
11
- * @return {!Array.<!Array.<!Array>>} Pair of arrays, the
12
- * first contains procedures without return variables, the second with.
13
- * Each procedure is defined by a three-element list of name, parameter
14
- * list, and return value boolean.
15
- */
16
- Blockly.Procedures.allProceduresNew = function (root) {
17
- const result = Blockly.Procedures.allProcedures(root);
18
-
19
- const proceduresCustomNoReturn = root
20
- .getProcedureMap()
21
- .getProcedures()
22
- .filter((p) => !!p.getReturnTypes())
23
- .map((p) => [
24
- p.getName(),
25
- p.getParameters().map((pa) => pa.getName()),
26
- true,
27
- ]);
28
-
29
- root.getBlocksByType('procedures_defcustomnoreturn', false).forEach((b) => {
30
- if (!Blockly.Procedures.isProcedureBlock(b)) {
31
- proceduresCustomNoReturn.push(b.getProcedureDef());
32
- }
33
- });
34
-
35
- const proceduresCustomReturn = root
36
- .getProcedureMap()
37
- .getProcedures()
38
- .filter((p) => !!p.getReturnTypes())
39
- .map((p) => [
40
- p.getName(),
41
- p.getParameters().map((pa) => pa.getName()),
42
- true,
43
- ]);
44
-
45
- root.getBlocksByType('procedures_defcustomreturn', false).forEach((b) => {
46
- if (!Blockly.Procedures.isProcedureBlock(b)) {
47
- proceduresCustomReturn.push(b.getProcedureDef());
48
- }
49
- });
50
-
51
- return result.concat([proceduresCustomNoReturn, proceduresCustomReturn]);
52
- };
53
-
54
- /**
55
- * Construct the blocks required by the flyout for the procedure category.
56
- * @param {!Blockly.Workspace} workspace The workspace containing procedures.
57
- * @return {!Array.<!Element>} Array of XML block elements.
58
- */
59
- Blockly.Procedures.flyoutCategoryNew = function (workspace) {
60
- const xmlList = [];
61
- const utils = (Blockly.Xml.utils ? Blockly.Xml.utils : Blockly.utils.xml);
62
- if (Blockly.Blocks['procedures_defnoreturn']) {
63
- // <block type="procedures_defnoreturn" gap="16">
64
- // <field name="NAME">do something</field>
65
- // </block>
66
- const block = utils.createElement('block');
67
- block.setAttribute('type', 'procedures_defnoreturn');
68
- block.setAttribute('gap', '16');
69
- const nameField = utils.createElement('field');
70
- nameField.setAttribute('name', 'NAME');
71
- nameField.appendChild(
72
- utils.createTextNode(Blockly.Msg['PROCEDURES_DEFNORETURN_PROCEDURE']));
73
- block.appendChild(nameField);
74
- xmlList.push(block);
75
- }
76
- if (Blockly.Blocks['procedures_defreturn']) {
77
- // <block type="procedures_defreturn" gap="16">
78
- // <field name="NAME">do something</field>
79
- // </block>
80
- const block = utils.createElement('block');
81
- block.setAttribute('type', 'procedures_defreturn');
82
- block.setAttribute('gap', '16');
83
- const nameField = utils.createElement('field');
84
- nameField.setAttribute('name', 'NAME');
85
- nameField.appendChild(
86
- utils.createTextNode(Blockly.Msg['PROCEDURES_DEFRETURN_PROCEDURE']));
87
- block.appendChild(nameField);
88
- xmlList.push(block);
89
- }
90
- if (Blockly.Blocks['procedures_ifreturn']) {
91
- // <block type="procedures_ifreturn" gap="16"></block>
92
- const block = utils.createElement('block');
93
- block.setAttribute('type', 'procedures_ifreturn');
94
- block.setAttribute('gap', '16');
95
-
96
- xmlList.push(block);
97
- }
98
- if (Blockly.Blocks['procedures_return']) {
99
- // <block type="procedures_ifreturn" gap="16"></block>
100
- const block = utils.createElement('block');
101
- block.setAttribute('type', 'procedures_return');
102
- block.setAttribute('gap', '16');
103
-
104
- xmlList.push(block);
105
- }
106
- if (Blockly.Blocks['procedures_defcustomnoreturn']) {
107
- // <block type="procedures_defcustomnoreturn" gap="16">
108
- // <field name="NAME">do something</field>
109
- // </block>
110
- const block = utils.createElement('block');
111
- block.setAttribute('type', 'procedures_defcustomnoreturn');
112
- block.setAttribute('gap', '16');
113
- const nameField = utils.createElement('field');
114
- nameField.setAttribute('name', 'NAME');
115
- nameField.appendChild(utils.createTextNode(
116
- Blockly.Msg['PROCEDURES_DEFNORETURN_PROCEDURE']));
117
- block.appendChild(nameField);
118
- xmlList.push(block);
119
- }
120
- if (Blockly.Blocks['procedures_defcustomreturn']) {
121
- // <block type="procedures_defcustomreturn" gap="16">
122
- // <field name="NAME">do something</field>
123
- // </block>
124
- const block = utils.createElement('block');
125
- block.setAttribute('type', 'procedures_defcustomreturn');
126
- block.setAttribute('gap', '16');
127
- const nameField = utils.createElement('field');
128
- nameField.setAttribute('name', 'NAME');
129
- nameField.appendChild(utils.createTextNode(
130
- Blockly.Msg['PROCEDURES_DEFRETURN_PROCEDURE']));
131
- block.appendChild(nameField);
132
- xmlList.push(block);
133
- }
134
- if (xmlList.length) {
135
- // Add slightly larger gap between system blocks and user calls.
136
- xmlList[xmlList.length - 1].setAttribute('gap', '24');
137
- }
138
-
139
- /**
140
- * Add items to xmlList for each listed procedure.
141
- *
142
- * @param procedureList A list of procedures, each of which is defined by a
143
- * three-element list of name, parameter list, and return value boolean.
144
- * @param templateName The type of the block to generate.
145
- */
146
- function populateProcedures(procedureList, templateName) {
147
- const utils = (Blockly.Xml.utils ? Blockly.Xml.utils : Blockly.utils.xml);
148
- for (let i = 0; i < procedureList.length; i++) {
149
- const name = procedureList[i][0];
150
- const args = procedureList[i][1];
151
- // <block type="procedures_callnoreturn" gap="16">
152
- // <mutation name="do something">
153
- // <arg name="x"></arg>
154
- // </mutation>
155
- // </block>
156
- const block = utils.createElement('block');
157
- block.setAttribute('type', templateName);
158
- block.setAttribute('gap', '16');
159
- const mutation = utils.createElement('mutation');
160
- mutation.setAttribute('name', name);
161
- block.appendChild(mutation);
162
- for (let j = 0; j < args.length; j++) {
163
- const arg = utils.createElement('arg');
164
- arg.setAttribute('name', args[j]);
165
- mutation.appendChild(arg);
166
- }
167
- xmlList.push(block);
168
- }
169
- }
170
-
171
- const tuple = Blockly.Procedures.allProceduresNew(workspace);
172
- populateProcedures(tuple[0], 'procedures_callnoreturn');
173
- populateProcedures(tuple[1], 'procedures_callreturn');
174
- populateProcedures(tuple[2], 'procedures_callcustomnoreturn');
175
- populateProcedures(tuple[3], 'procedures_callcustomreturn');
176
-
177
- return xmlList;
178
- };
179
-
180
- // ---------------------- patch for async functions ------------------------------
181
- // taken from javascript/procedures.js https://github.com/google/blockly/blob/blockly-v10.1.3/generators/javascript/procedures.js
182
- Blockly.JavaScript.forBlock['procedures_defreturn'] = function (block) {
183
- // Define a procedure with a return value.
184
- const funcName = Blockly.JavaScript.nameDB_.getName(
185
- block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME);
186
- let xfix1 = '';
187
- if (Blockly.JavaScript.STATEMENT_PREFIX) {
188
- xfix1 += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, block);
189
- }
190
- if (Blockly.JavaScript.STATEMENT_SUFFIX) {
191
- xfix1 += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, block);
192
- }
193
- if (xfix1) {
194
- xfix1 = Blockly.JavaScript.prefixLines(xfix1, Blockly.JavaScript.INDENT);
195
- }
196
- let loopTrap = '';
197
- if (Blockly.JavaScript.INFINITE_LOOP_TRAP) {
198
- loopTrap = Blockly.JavaScript.prefixLines(
199
- Blockly.JavaScript.injectId(Blockly.JavaScript.INFINITE_LOOP_TRAP, block),
200
- Blockly.JavaScript.INDENT,
201
- );
202
- }
203
- let returnValue = '';
204
- let xfix2 = '';
205
- const branch = Blockly.JavaScript.statementToCode(block, 'STACK');
206
- try {
207
- returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', Blockly.JavaScript.ORDER_NONE) || '';
208
- if (branch && returnValue) {
209
- // After executing the function body, revisit this block for the return.
210
- xfix2 = xfix1;
211
- }
212
- if (returnValue) {
213
- returnValue = Blockly.JavaScript.INDENT + 'return ' + returnValue + ';\n';
214
- }
215
- } catch (e) {
216
- // This function is without a return value.
217
- }
218
-
219
- const args = [];
220
- const variables = block.getVars();
221
- for (let i = 0; i < variables.length; i++) {
222
- args[i] = Blockly.JavaScript.nameDB_.getName(variables[i], Blockly.VARIABLE_CATEGORY_NAME);
223
- }
224
- let code = 'async function ' + funcName + '(' + args.join(', ') + ') {\n' + xfix1 +
225
- loopTrap + branch + xfix2 + returnValue + '}';
226
- code = Blockly.JavaScript.scrub_(block, code);
227
- // Add % so as not to collide with helper functions in the definitions list.
228
- Blockly.JavaScript.definitions_['%' + funcName] = code;
229
- return null;
230
- };
231
-
232
- Blockly.JavaScript.forBlock['procedures_defnoreturn'] = Blockly.JavaScript.forBlock['procedures_defreturn'];
233
-
234
- Blockly.JavaScript.forBlock['procedures_callreturn'] = function (block) {
235
- // Call a procedure with a return value.
236
- const funcName = Blockly.JavaScript.nameDB_.getName(
237
- block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME);
238
- const args = [];
239
- const variables = block.getVars();
240
- for (let i = 0; i < variables.length; i++) {
241
- args[i] = Blockly.JavaScript.valueToCode(block, 'ARG' + i, Blockly.JavaScript.ORDER_NONE) || 'null';
242
- }
243
- const code = 'await ' + funcName + '(' + args.join(', ') + ')';
244
- return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL];
245
- };
246
-
247
- // ---------------------- custom function with return ------------------------------
248
-
249
- Blockly.Blocks['procedures_defcustomreturn'] = {
250
- getProcedureModel() {
251
- return this.model;
252
- },
253
- isProcedureDef() {
254
- return true;
255
- },
256
- /**
257
- * Block for defining a procedure with a return value.
258
- * @this Blockly.Block
259
- */
260
- init: function () {
261
- const nameField = new Blockly.FieldTextInput('',
262
- Blockly.Procedures.rename);
263
-
264
- nameField.setSpellcheck(false);
265
- this.appendDummyInput()
266
- // .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_TITLE'])
267
- .appendField(Blockly.Translate('procedures_defcustomreturn_name'))
268
- .appendField(nameField, 'NAME')
269
- .appendField('', 'PARAMS');
270
- /*this.appendValueInput('RETURN')
271
- .setAlign(Blockly.ALIGN_RIGHT)
272
- .appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);*/
273
- this.setMutator(new Blockly.icons.MutatorIcon(['procedures_mutatorarg'], this));
274
- if ((this.workspace.options.comments ||
275
- (this.workspace.options.parentWorkspace &&
276
- this.workspace.options.parentWorkspace.options.comments)) &&
277
- Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']) {
278
- this.setCommentText(Blockly.Msg['PROCEDURES_DEFRETURN_COMMENT']);
279
- }
280
- this.setStyle('procedure_blocks');
281
- this.setTooltip(Blockly.Msg['PROCEDURES_DEFRETURN_TOOLTIP']);
282
- this.setHelpUrl(Blockly.Msg['PROCEDURES_DEFRETURN_HELPURL']);
283
- this.arguments_ = [];
284
- this.argumentVarModels_ = [];
285
- this.setStatements_(true);
286
- this.statementConnection_ = null;
287
-
288
- this.appendDummyInput('SCRIPT')
289
- .appendField(new Blockly.FieldScript(btoa('return 0;')), 'SCRIPT');
290
-
291
- this.setInputsInline(true);
292
- this.setStatements_(false);
293
- },
294
- setStatements_: Blockly.Blocks['procedures_defreturn'].setStatements_,
295
- updateParams_: Blockly.Blocks['procedures_defreturn'].updateParams_,
296
- mutationToDom: Blockly.Blocks['procedures_defreturn'].mutationToDom,
297
- domToMutation: Blockly.Blocks['procedures_defreturn'].domToMutation,
298
- /**
299
- * Populate the mutator's dialog with this block's components.
300
- * @param {!Blockly.Workspace} workspace Mutator's workspace.
301
- * @return {!Blockly.Block} Root block in mutator.
302
- * @this Blockly.Block
303
- */
304
- decompose: function (workspace) {
305
- const containerBlock = workspace.newBlock('procedures_mutatorcontainer');
306
- containerBlock.initSvg();
307
-
308
- // Check/uncheck the allow statement box.
309
- /*
310
- if (this.getInput('RETURN')) {
311
- containerBlock.setFieldValue(
312
- this.hasStatements_ ? 'TRUE' : 'FALSE', 'STATEMENTS');
313
- } else {
314
- containerBlock.getInput('STATEMENT_INPUT').setVisible(false);
315
- }
316
- */
317
- containerBlock.getInput('STATEMENT_INPUT').setVisible(false);
318
-
319
- // Parameter list.
320
- let connection = containerBlock.getInput('STACK').connection;
321
- for (let i = 0; i < this.arguments_.length; i++) {
322
- const paramBlock = workspace.newBlock('procedures_mutatorarg');
323
- paramBlock.initSvg();
324
- paramBlock.setFieldValue(this.arguments_[i], 'NAME');
325
- // Store the old location.
326
- paramBlock.oldLocation = i;
327
- connection.connect(paramBlock.previousConnection);
328
- connection = paramBlock.nextConnection;
329
- }
330
- // Initialize procedure's callers with blank IDs.
331
- Blockly.Procedures.mutateCallers(this);
332
- return containerBlock;
333
- },
334
- /**
335
- * Reconfigure this block based on the mutator dialog's components.
336
- * @param {!Blockly.Block} containerBlock Root block in mutator.
337
- * @this Blockly.Block
338
- */
339
- compose: function (containerBlock) {
340
- // Parameter list.
341
- this.arguments_ = [];
342
- this.paramIds_ = [];
343
- this.argumentVarModels_ = [];
344
- let paramBlock = containerBlock.getInputTargetBlock('STACK');
345
- while (paramBlock) {
346
- const varName = paramBlock.getFieldValue('NAME');
347
- this.arguments_.push(varName);
348
- const variable = this.workspace.getVariable(varName, '');
349
- if (variable != null) {
350
- this.argumentVarModels_.push(variable);
351
- } else {
352
- console.log('Failed to get variable named ' + varName + ', ignoring.');
353
- }
354
-
355
- this.paramIds_.push(paramBlock.id);
356
- paramBlock = paramBlock.nextConnection &&
357
- paramBlock.nextConnection.targetBlock();
358
- }
359
- this.updateParams_();
360
- Blockly.Procedures.mutateCallers(this);
361
- /*
362
- // Show/hide the statement input.
363
- let hasStatements = containerBlock.getFieldValue('STATEMENTS');
364
- if (hasStatements !== null) {
365
- hasStatements = hasStatements == 'TRUE';
366
- if (this.hasStatements_ != hasStatements) {
367
- if (hasStatements) {
368
- this.setStatements_(true);
369
- // Restore the stack, if one was saved.
370
- Blockly.icons.MutatorIcon.reconnect(this.statementConnection_, this, 'STACK');
371
- this.statementConnection_ = null;
372
- } else {
373
- // Save the stack, then disconnect it.
374
- const stackConnection = this.getInput('STACK').connection;
375
- this.statementConnection_ = stackConnection.targetConnection;
376
- if (this.statementConnection_) {
377
- const stackBlock = stackConnection.targetBlock();
378
- stackBlock.unplug();
379
- stackBlock.bumpNeighbours_();
380
- }
381
- this.setStatements_(false);
382
- }
383
- }
384
- }
385
- */
386
- },
387
- /**
388
- * Return the signature of this procedure definition.
389
- * @return {!Array} Tuple containing three elements:
390
- * - the name of the defined procedure,
391
- * - a list of all its arguments,
392
- * - that it DOES NOT have a return value.
393
- * @this Blockly.Block
394
- */
395
- getProcedureDef: function () {
396
- return [this.getFieldValue('NAME'), this.arguments_, true, true];
397
- },
398
- getVars: Blockly.Blocks['procedures_defreturn'].getVars,
399
- getVarModels: Blockly.Blocks['procedures_defreturn'].getVarModels,
400
- renameVarById: Blockly.Blocks['procedures_defreturn'].renameVarById,
401
- updateVarName: Blockly.Blocks['procedures_defreturn'].updateVarName,
402
- displayRenamedVar_: Blockly.Blocks['procedures_defreturn'].displayRenamedVar_,
403
- customContextMenu: Blockly.Blocks['procedures_defreturn'].customContextMenu,
404
- callType_: 'procedures_callcustomreturn'
405
- };
406
-
407
- Blockly.JavaScript.forBlock['procedures_defcustomreturn'] = function (block) {
408
- // Define a procedure with a return value.
409
- const funcName = Blockly.JavaScript.nameDB_.getName(
410
- block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME);
411
-
412
- const args = [];
413
- for (let i = 0; i < block.arguments_.length; i++) {
414
- args[i] = Blockly.JavaScript.nameDB_.getName(block.arguments_[i], Blockly.VARIABLE_CATEGORY_NAME);
415
- }
416
-
417
- const script = Blockly.b64DecodeUnicode(block.getFieldValue('SCRIPT') || '');
418
- const lines = script.split('\n');
419
- for (let l = 0; l < lines.length; l++) {
420
- lines[l] = ' ' + lines[l];
421
- }
422
-
423
- let code = 'async function ' + funcName + '(' + args.join(', ') + ') {\n' +
424
- lines.join('\n') + '\n}';
425
-
426
- code = Blockly.JavaScript.scrub_(block, code);
427
- // Add % so as not to collide with helper functions in definitions list.
428
- Blockly.JavaScript.definitions_['%' + funcName] = code;
429
-
430
- return null;
431
- };
432
-
433
- Blockly.Blocks['procedures_callcustomreturn'] = {
434
- init: Blockly.Blocks['procedures_callreturn'].init,
435
- getProcedureCall: Blockly.Blocks['procedures_callreturn'].getProcedureCall,
436
- renameProcedure: Blockly.Blocks['procedures_callreturn'].renameProcedure,
437
- setProcedureParameters_: Blockly.Blocks['procedures_callreturn'].setProcedureParameters_,
438
- updateShape_: Blockly.Blocks['procedures_callreturn'].updateShape_,
439
- mutationToDom: Blockly.Blocks['procedures_callreturn'].mutationToDom,
440
- domToMutation: Blockly.Blocks['procedures_callreturn'].domToMutation,
441
- getVars: Blockly.Blocks['procedures_callreturn'].getVars,
442
- getVarModels: Blockly.Blocks['procedures_callreturn'].getVarModels,
443
- onchange: Blockly.Blocks['procedures_callreturn'].onchange,
444
- customContextMenu: Blockly.Blocks['procedures_callreturn'].customContextMenu,
445
- defType_: 'procedures_defcustomreturn'
446
- };
447
-
448
- Blockly.JavaScript.forBlock['procedures_callcustomreturn'] = Blockly.JavaScript.forBlock['procedures_callreturn'];
449
-
450
- // ---------------------- custom function with no return ------------------------------
451
- // This was modified, so the shadow condition block is created in the init function
452
- Blockly.Blocks['procedures_ifreturn'].init = function () {
453
- const __input = this.appendValueInput('CONDITION')
454
- .setCheck('Boolean')
455
- .appendField(Blockly.Msg['CONTROLS_IF_MSG_IF']);
456
-
457
- const _shadow = this.workspace.newBlock('logic_boolean');
458
- _shadow.setShadow(true);
459
- _shadow.setFieldValue('TRUE', 'BOOL');
460
- _shadow.outputConnection.connect(__input.connection);
461
-
462
- this.appendValueInput('VALUE').appendField(Blockly.Msg['PROCEDURES_DEFRETURN_RETURN']);
463
- this.setInputsInline(true);
464
- this.setPreviousStatement(true);
465
- this.setNextStatement(true);
466
- this.setStyle('procedure_blocks');
467
- this.setTooltip(Blockly.Msg['PROCEDURES_IFRETURN_TOOLTIP']);
468
- this.setHelpUrl(Blockly.Msg['PROCEDURES_IFRETURN_HELPURL']);
469
- this.hasReturnValue_ = true;
470
- };
471
-
472
- Blockly.Blocks['procedures_defcustomnoreturn'] = {
473
- getProcedureModel() {
474
- return this.model;
475
- },
476
- isProcedureDef() {
477
- return true;
478
- },
479
- init: function () {
480
- const nameField = new Blockly.FieldTextInput('', Blockly.Procedures.rename);
481
- nameField.setSpellcheck(false);
482
-
483
- this.appendDummyInput()
484
- .appendField(Blockly.Translate('procedures_defcustomnoreturn_name'))
485
- .appendField(nameField, 'NAME')
486
- .appendField('', 'PARAMS');
487
-
488
- this.setMutator(new Blockly.icons.MutatorIcon(['procedures_mutatorarg'], this));
489
-
490
- if ((this.workspace.options.comments ||
491
- (this.workspace.options.parentWorkspace && this.workspace.options.parentWorkspace.options.comments)) &&
492
- Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']) {
493
- this.setCommentText(Blockly.Msg['PROCEDURES_DEFNORETURN_COMMENT']);
494
- }
495
-
496
- this.setStyle('procedure_blocks');
497
- this.setColour(Blockly.Msg['PROCEDURES_HUE']);
498
- this.setTooltip(Blockly.Msg['PROCEDURES_DEFNORETURN_TOOLTIP']);
499
- this.setHelpUrl(Blockly.Msg['PROCEDURES_DEFNORETURN_HELPURL']);
500
-
501
- this.arguments_ = [];
502
- this.argumentVarModels_ = [];
503
-
504
- this.setStatements_(true);
505
- this.statementConnection_ = null;
506
-
507
- this.appendDummyInput('SCRIPT')
508
- .appendField(new Blockly.FieldScript(''), 'SCRIPT');
509
-
510
- this.setInputsInline(true);
511
- this.setStatements_(false);
512
- },
513
- setStatements_: Blockly.Blocks['procedures_defnoreturn'].setStatements_,
514
- updateParams_: Blockly.Blocks['procedures_defnoreturn'].updateParams_,
515
- mutationToDom: Blockly.Blocks['procedures_defnoreturn'].mutationToDom,
516
- domToMutation: Blockly.Blocks['procedures_defnoreturn'].domToMutation,
517
- decompose: Blockly.Blocks['procedures_defcustomreturn'].decompose,
518
- compose: Blockly.Blocks['procedures_defcustomreturn'].compose,
519
- getProcedureDef: function () {
520
- return [this.getFieldValue('NAME'), this.arguments_, false, true];
521
- },
522
- getVars: Blockly.Blocks['procedures_defnoreturn'].getVars,
523
- getVarModels: Blockly.Blocks['procedures_defnoreturn'].getVarModels,
524
- renameVarById: Blockly.Blocks['procedures_defnoreturn'].renameVarById,
525
- updateVarName: Blockly.Blocks['procedures_defnoreturn'].updateVarName,
526
- displayRenamedVar_: Blockly.Blocks['procedures_defnoreturn'].displayRenamedVar_,
527
- customContextMenu: Blockly.Blocks['procedures_defnoreturn'].customContextMenu,
528
- callType_: 'procedures_callcustomnoreturn'
529
- };
530
-
531
- Blockly.JavaScript.forBlock['procedures_defcustomnoreturn'] = Blockly.JavaScript.forBlock['procedures_defcustomreturn'];
532
-
533
- Blockly.Blocks['procedures_callcustomnoreturn'] = {
534
- init: Blockly.Blocks['procedures_callnoreturn'].init,
535
- getProcedureCall: Blockly.Blocks['procedures_callnoreturn'].getProcedureCall,
536
- renameProcedure: Blockly.Blocks['procedures_callnoreturn'].renameProcedure,
537
- setProcedureParameters_: Blockly.Blocks['procedures_callnoreturn'].setProcedureParameters_,
538
- updateShape_: Blockly.Blocks['procedures_callnoreturn'].updateShape_,
539
- mutationToDom: Blockly.Blocks['procedures_callnoreturn'].mutationToDom,
540
- domToMutation: Blockly.Blocks['procedures_callnoreturn'].domToMutation,
541
- getVars: Blockly.Blocks['procedures_callnoreturn'].getVars,
542
- getVarModels: Blockly.Blocks['procedures_callnoreturn'].getVarModels,
543
- onchange: Blockly.Blocks['procedures_callnoreturn'].onchange,
544
- customContextMenu: Blockly.Blocks['procedures_callnoreturn'].customContextMenu,
545
- defType_: 'procedures_defcustomnoreturn'
546
- };
547
-
548
- Blockly.JavaScript.forBlock['procedures_callcustomnoreturn'] = function (block) {
549
- // Call a procedure with no return value.
550
- // Generated code is for a function call as a statement is the same as a
551
- // function call as a value, with the addition of line ending.
552
- const tuple = Blockly.JavaScript.forBlock['procedures_callcustomreturn'](block);
553
- return tuple[0] + ';\n';
554
- };
555
-
556
- Blockly.Blocks['procedures_return'] = {
557
- /**
558
- * Block for conditionally returning a value from a procedure.
559
- */
560
- init: function () {
561
- this.appendValueInput('VALUE').appendField(
562
- Blockly.Msg['PROCEDURES_DEFRETURN_RETURN'],
563
- );
564
- this.setInputsInline(true);
565
- this.setPreviousStatement(true);
566
- this.setNextStatement(true);
567
- this.setStyle('procedure_blocks');
568
- this.setTooltip(Blockly.Msg['PROCEDURES_IFRETURN_TOOLTIP']);
569
- this.setHelpUrl(Blockly.Msg['PROCEDURES_IFRETURN_HELPURL']);
570
- this.hasReturnValue_ = true;
571
- },
572
- /**
573
- * Create XML to represent whether this block has a return value.
574
- *
575
- * @returns XML storage element.
576
- */
577
- mutationToDom: function () {
578
- const utils = Blockly.Xml.utils ? Blockly.Xml.utils : Blockly.utils.xml;
579
- const container = utils.createElement('mutation');
580
- container.setAttribute('value', String(Number(this.hasReturnValue_)));
581
- return container;
582
- },
583
- /**
584
- * Parse XML to restore whether this block has a return value.
585
- *
586
- * @param xmlElement XML storage element.
587
- */
588
- domToMutation: function (xmlElement) {
589
- const value = xmlElement.getAttribute('value');
590
- this.hasReturnValue_ = value === '1';
591
- if (!this.hasReturnValue_) {
592
- this.removeInput('VALUE');
593
- this.appendDummyInput('VALUE').appendField(
594
- Blockly.Msg['PROCEDURES_DEFRETURN_RETURN'],
595
- );
596
- }
597
- },
598
-
599
- // This block does not need JSO serialization hooks (saveExtraState and
600
- // loadExtraState) because the state of this block is already encoded in the
601
- // block's position in the workspace.
602
- // XML hooks are kept for backwards compatibility.
603
-
604
- /**
605
- * Called whenever anything on the workspace changes.
606
- * Add warning if this flow block is not nested inside a loop.
607
- *
608
- * @param e Move event.
609
- */
610
- onchange: function (e) {
611
- if (
612
- (this.workspace.isDragging && this.workspace.isDragging()) ||
613
- (e.type !== 'move' && e.type !== 'create')
614
- ) {
615
- return; // Don't change state at the start of a drag.
616
- }
617
- let legal = false;
618
- // Is the block nested in a procedure?
619
- let block = this; // eslint-disable-line @typescript-eslint/no-this-alias
620
- do {
621
- if (this.FUNCTION_TYPES.includes(block.type)) {
622
- legal = true;
623
- break;
624
- }
625
- block = block.getSurroundParent();
626
- } while (block);
627
- if (legal) {
628
- // If needed, toggle whether this block has a return value.
629
- if (block.type === 'procedures_defnoreturn' && this.hasReturnValue_) {
630
- this.removeInput('VALUE');
631
- this.appendDummyInput('VALUE').appendField(
632
- Blockly.Msg['PROCEDURES_DEFRETURN_RETURN'],
633
- );
634
- this.hasReturnValue_ = false;
635
- } else if (
636
- block.type === 'procedures_defreturn' &&
637
- !this.hasReturnValue_
638
- ) {
639
- this.removeInput('VALUE');
640
- this.appendValueInput('VALUE').appendField(
641
- Blockly.Msg['PROCEDURES_DEFRETURN_RETURN'],
642
- );
643
- this.hasReturnValue_ = true;
644
- }
645
- this.setWarningText(null);
646
- } else {
647
- this.setWarningText(Blockly.Msg['PROCEDURES_IFRETURN_WARNING']);
648
- }
649
-
650
- if (!this.isInFlyout) {
651
- // const utils = Blockly.Xml.utils ? Blockly.Xml.utils : Blockly.utils.xml;
652
- try {
653
- // There is no need to record the enable/disable change on the undo/redo
654
- // list since the change will be automatically recreated when replayed.
655
- //utils.setRecordUndo(false);
656
- this.setDisabledReason(!legal, 'UNPARENTED_IFRETURN');
657
- } finally {
658
- //utils.setRecordUndo(true);
659
- }
660
- }
661
- },
662
- /**
663
- * List of block types that are functions and thus do not need warnings.
664
- * To add a new function type add this to your code:
665
- * Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('custom_func');
666
- */
667
- FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn', 'procedures_defcustomreturn', 'procedures_defcustomnoreturn'],
668
- };
669
-
670
- Blockly.JavaScript.forBlock['procedures_return'] = function (block, generator) {
671
- // Conditionally return value from a procedure.
672
- let code = '';
673
- if (generator.STATEMENT_SUFFIX) {
674
- // Inject any statement suffix here since the regular one at the end
675
- // will not get executed if the return is triggered.
676
- code += generator.prefixLines(
677
- generator.injectId(generator.STATEMENT_SUFFIX, block),
678
- generator.INDENT,
679
- );
680
- }
681
- if (block.hasReturnValue_) {
682
- const value = generator.valueToCode(block, 'VALUE', 99 /* Order.NONE */) || 'null';
683
- code += generator.INDENT + 'return ' + value + ';\n';
684
- } else {
685
- code += generator.INDENT + 'return;\n';
686
- }
687
- return code;
688
- };