@wordpress/block-editor 7.0.4 → 8.0.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 (347) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +31 -0
  3. package/build/components/alignment-control/ui.js +1 -2
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-icon/index.js +5 -1
  6. package/build/components/block-icon/index.js.map +1 -1
  7. package/build/components/block-inspector/index.js +4 -0
  8. package/build/components/block-inspector/index.js.map +1 -1
  9. package/build/components/block-list/index.native.js +1 -1
  10. package/build/components/block-list/index.native.js.map +1 -1
  11. package/build/components/block-list/use-block-props/use-multi-selection.js +21 -8
  12. package/build/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  13. package/build/components/block-navigation/dropdown.js +0 -1
  14. package/build/components/block-navigation/dropdown.js.map +1 -1
  15. package/build/components/block-patterns-list/index.js +1 -8
  16. package/build/components/block-patterns-list/index.js.map +1 -1
  17. package/build/components/block-settings/container.native.js +5 -2
  18. package/build/components/block-settings/container.native.js.map +1 -1
  19. package/build/components/block-settings-menu/block-settings-dropdown.js +22 -2
  20. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  21. package/build/components/block-styles/preview.native.js +2 -2
  22. package/build/components/block-styles/preview.native.js.map +1 -1
  23. package/build/components/colors-gradients/control.js +8 -47
  24. package/build/components/colors-gradients/control.js.map +1 -1
  25. package/build/components/colors-gradients/panel-color-gradient-settings.js +81 -6
  26. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  27. package/build/components/duotone-control/index.js +5 -2
  28. package/build/components/duotone-control/index.js.map +1 -1
  29. package/build/components/font-appearance-control/index.js +27 -15
  30. package/build/components/font-appearance-control/index.js.map +1 -1
  31. package/build/components/iframe/index.js +1 -1
  32. package/build/components/iframe/index.js.map +1 -1
  33. package/build/components/index.js +20 -2
  34. package/build/components/index.js.map +1 -1
  35. package/build/components/index.native.js +2 -2
  36. package/build/components/index.native.js.map +1 -1
  37. package/build/components/inner-blocks/index.js +5 -4
  38. package/build/components/inner-blocks/index.js.map +1 -1
  39. package/build/components/inner-blocks/index.native.js +4 -3
  40. package/build/components/inner-blocks/index.native.js.map +1 -1
  41. package/build/components/inserter/block-patterns-explorer/explorer.js +62 -0
  42. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  43. package/build/components/inserter/block-patterns-explorer/patterns-list.js +111 -0
  44. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  45. package/build/components/inserter/block-patterns-explorer/sidebar.js +78 -0
  46. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  47. package/build/components/inserter/block-patterns-tab.js +74 -45
  48. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  49. package/build/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  50. package/build/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  51. package/build/components/inserter/pattern-panel.js +19 -10
  52. package/build/components/inserter/pattern-panel.js.map +1 -1
  53. package/build/components/inspector-controls/groups.js +3 -1
  54. package/build/components/inspector-controls/groups.js.map +1 -1
  55. package/build/components/letter-spacing-control/index.js +9 -6
  56. package/build/components/letter-spacing-control/index.js.map +1 -1
  57. package/build/components/link-control/index.js +88 -35
  58. package/build/components/link-control/index.js.map +1 -1
  59. package/build/components/link-control/link-preview.js +19 -6
  60. package/build/components/link-control/link-preview.js.map +1 -1
  61. package/build/components/link-control/search-input.js +12 -3
  62. package/build/components/link-control/search-input.js.map +1 -1
  63. package/build/components/list-view/block.js +49 -23
  64. package/build/components/list-view/block.js.map +1 -1
  65. package/build/components/list-view/branch.js +92 -73
  66. package/build/components/list-view/branch.js.map +1 -1
  67. package/build/components/list-view/index.js +39 -16
  68. package/build/components/list-view/index.js.map +1 -1
  69. package/build/components/list-view/leaf.js +1 -1
  70. package/build/components/list-view/leaf.js.map +1 -1
  71. package/build/components/list-view/use-list-view-client-ids.js +8 -58
  72. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  73. package/build/components/rich-text/embed-handler-picker.native.js +1 -0
  74. package/build/components/rich-text/embed-handler-picker.native.js.map +1 -1
  75. package/build/components/rich-text/format-edit.js +28 -2
  76. package/build/components/rich-text/format-edit.js.map +1 -1
  77. package/build/components/rich-text/format-toolbar/index.js +2 -1
  78. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  79. package/build/components/url-input/index.js +11 -4
  80. package/build/components/url-input/index.js.map +1 -1
  81. package/build/components/use-setting/index.js +48 -9
  82. package/build/components/use-setting/index.js.map +1 -1
  83. package/build/hooks/border.js +5 -5
  84. package/build/hooks/border.js.map +1 -1
  85. package/build/hooks/color-panel.js +2 -1
  86. package/build/hooks/color-panel.js.map +1 -1
  87. package/build/hooks/duotone.js +16 -5
  88. package/build/hooks/duotone.js.map +1 -1
  89. package/build/hooks/font-appearance.js +49 -6
  90. package/build/hooks/font-appearance.js.map +1 -1
  91. package/build/hooks/font-family.js +37 -16
  92. package/build/hooks/font-family.js.map +1 -1
  93. package/build/hooks/font-size.js +51 -9
  94. package/build/hooks/font-size.js.map +1 -1
  95. package/build/hooks/index.js +8 -0
  96. package/build/hooks/index.js.map +1 -1
  97. package/build/hooks/index.native.js +8 -0
  98. package/build/hooks/index.native.js.map +1 -1
  99. package/build/hooks/letter-spacing.js +44 -7
  100. package/build/hooks/letter-spacing.js.map +1 -1
  101. package/build/hooks/line-height.js +45 -8
  102. package/build/hooks/line-height.js.map +1 -1
  103. package/build/hooks/margin.js +1 -1
  104. package/build/hooks/margin.js.map +1 -1
  105. package/build/hooks/padding.js +1 -1
  106. package/build/hooks/padding.js.map +1 -1
  107. package/build/hooks/text-decoration.js +42 -6
  108. package/build/hooks/text-decoration.js.map +1 -1
  109. package/build/hooks/text-transform.js +42 -6
  110. package/build/hooks/text-transform.js.map +1 -1
  111. package/build/hooks/typography.js +108 -8
  112. package/build/hooks/typography.js.map +1 -1
  113. package/build/hooks/use-cached-truthy.js +29 -0
  114. package/build/hooks/use-cached-truthy.js.map +1 -0
  115. package/build/index.js +7 -0
  116. package/build/index.js.map +1 -1
  117. package/build/layouts/flex.js +120 -28
  118. package/build/layouts/flex.js.map +1 -1
  119. package/build/store/actions.js +303 -265
  120. package/build/store/actions.js.map +1 -1
  121. package/build/store/index.js +1 -3
  122. package/build/store/index.js.map +1 -1
  123. package/build/store/reducer.js +23 -22
  124. package/build/store/reducer.js.map +1 -1
  125. package/build/store/selectors.js +44 -35
  126. package/build/store/selectors.js.map +1 -1
  127. package/build-module/components/alignment-control/ui.js +1 -2
  128. package/build-module/components/alignment-control/ui.js.map +1 -1
  129. package/build-module/components/block-icon/index.js +5 -1
  130. package/build-module/components/block-icon/index.js.map +1 -1
  131. package/build-module/components/block-inspector/index.js +4 -0
  132. package/build-module/components/block-inspector/index.js.map +1 -1
  133. package/build-module/components/block-list/index.native.js +1 -1
  134. package/build-module/components/block-list/index.native.js.map +1 -1
  135. package/build-module/components/block-list/use-block-props/use-multi-selection.js +21 -8
  136. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  137. package/build-module/components/block-navigation/dropdown.js +0 -1
  138. package/build-module/components/block-navigation/dropdown.js.map +1 -1
  139. package/build-module/components/block-patterns-list/index.js +1 -6
  140. package/build-module/components/block-patterns-list/index.js.map +1 -1
  141. package/build-module/components/block-settings/container.native.js +6 -3
  142. package/build-module/components/block-settings/container.native.js.map +1 -1
  143. package/build-module/components/block-settings-menu/block-settings-dropdown.js +24 -4
  144. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  145. package/build-module/components/block-styles/preview.native.js +2 -2
  146. package/build-module/components/block-styles/preview.native.js.map +1 -1
  147. package/build-module/components/colors-gradients/control.js +12 -53
  148. package/build-module/components/colors-gradients/control.js.map +1 -1
  149. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +82 -6
  150. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  151. package/build-module/components/duotone-control/index.js +5 -2
  152. package/build-module/components/duotone-control/index.js.map +1 -1
  153. package/build-module/components/font-appearance-control/index.js +23 -15
  154. package/build-module/components/font-appearance-control/index.js.map +1 -1
  155. package/build-module/components/iframe/index.js +1 -1
  156. package/build-module/components/iframe/index.js.map +1 -1
  157. package/build-module/components/index.js +3 -1
  158. package/build-module/components/index.js.map +1 -1
  159. package/build-module/components/index.native.js +1 -1
  160. package/build-module/components/index.native.js.map +1 -1
  161. package/build-module/components/inner-blocks/index.js +6 -5
  162. package/build-module/components/inner-blocks/index.js.map +1 -1
  163. package/build-module/components/inner-blocks/index.native.js +5 -4
  164. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  165. package/build-module/components/inserter/block-patterns-explorer/explorer.js +50 -0
  166. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  167. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +92 -0
  168. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  169. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +69 -0
  170. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  171. package/build-module/components/inserter/block-patterns-tab.js +75 -46
  172. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  173. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  174. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  175. package/build-module/components/inserter/pattern-panel.js +21 -13
  176. package/build-module/components/inserter/pattern-panel.js.map +1 -1
  177. package/build-module/components/inspector-controls/groups.js +3 -1
  178. package/build-module/components/inspector-controls/groups.js.map +1 -1
  179. package/build-module/components/letter-spacing-control/index.js +9 -6
  180. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  181. package/build-module/components/link-control/index.js +88 -36
  182. package/build-module/components/link-control/index.js.map +1 -1
  183. package/build-module/components/link-control/link-preview.js +19 -7
  184. package/build-module/components/link-control/link-preview.js.map +1 -1
  185. package/build-module/components/link-control/search-input.js +11 -3
  186. package/build-module/components/link-control/search-input.js.map +1 -1
  187. package/build-module/components/list-view/block.js +49 -24
  188. package/build-module/components/list-view/block.js.map +1 -1
  189. package/build-module/components/list-view/branch.js +92 -73
  190. package/build-module/components/list-view/branch.js.map +1 -1
  191. package/build-module/components/list-view/index.js +41 -18
  192. package/build-module/components/list-view/index.js.map +1 -1
  193. package/build-module/components/list-view/leaf.js +1 -1
  194. package/build-module/components/list-view/leaf.js.map +1 -1
  195. package/build-module/components/list-view/use-list-view-client-ids.js +8 -58
  196. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  197. package/build-module/components/rich-text/embed-handler-picker.native.js +1 -0
  198. package/build-module/components/rich-text/embed-handler-picker.native.js.map +1 -1
  199. package/build-module/components/rich-text/format-edit.js +28 -3
  200. package/build-module/components/rich-text/format-edit.js.map +1 -1
  201. package/build-module/components/rich-text/format-toolbar/index.js +2 -1
  202. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  203. package/build-module/components/url-input/index.js +11 -4
  204. package/build-module/components/url-input/index.js.map +1 -1
  205. package/build-module/components/use-setting/index.js +48 -9
  206. package/build-module/components/use-setting/index.js.map +1 -1
  207. package/build-module/hooks/border.js +5 -5
  208. package/build-module/hooks/border.js.map +1 -1
  209. package/build-module/hooks/color-panel.js +2 -1
  210. package/build-module/hooks/color-panel.js.map +1 -1
  211. package/build-module/hooks/duotone.js +16 -5
  212. package/build-module/hooks/duotone.js.map +1 -1
  213. package/build-module/hooks/font-appearance.js +45 -6
  214. package/build-module/hooks/font-appearance.js.map +1 -1
  215. package/build-module/hooks/font-family.js +33 -16
  216. package/build-module/hooks/font-family.js.map +1 -1
  217. package/build-module/hooks/font-size.js +47 -9
  218. package/build-module/hooks/font-size.js.map +1 -1
  219. package/build-module/hooks/index.js +1 -0
  220. package/build-module/hooks/index.js.map +1 -1
  221. package/build-module/hooks/index.native.js +1 -0
  222. package/build-module/hooks/index.native.js.map +1 -1
  223. package/build-module/hooks/letter-spacing.js +40 -7
  224. package/build-module/hooks/letter-spacing.js.map +1 -1
  225. package/build-module/hooks/line-height.js +41 -8
  226. package/build-module/hooks/line-height.js.map +1 -1
  227. package/build-module/hooks/margin.js +1 -1
  228. package/build-module/hooks/margin.js.map +1 -1
  229. package/build-module/hooks/padding.js +1 -1
  230. package/build-module/hooks/padding.js.map +1 -1
  231. package/build-module/hooks/text-decoration.js +38 -6
  232. package/build-module/hooks/text-decoration.js.map +1 -1
  233. package/build-module/hooks/text-transform.js +38 -6
  234. package/build-module/hooks/text-transform.js.map +1 -1
  235. package/build-module/hooks/typography.js +117 -17
  236. package/build-module/hooks/typography.js.map +1 -1
  237. package/build-module/hooks/use-cached-truthy.js +21 -0
  238. package/build-module/hooks/use-cached-truthy.js.map +1 -0
  239. package/build-module/index.js +1 -1
  240. package/build-module/index.js.map +1 -1
  241. package/build-module/layouts/flex.js +124 -32
  242. package/build-module/layouts/flex.js.map +1 -1
  243. package/build-module/store/actions.js +266 -241
  244. package/build-module/store/actions.js.map +1 -1
  245. package/build-module/store/index.js +1 -2
  246. package/build-module/store/index.js.map +1 -1
  247. package/build-module/store/reducer.js +23 -22
  248. package/build-module/store/reducer.js.map +1 -1
  249. package/build-module/store/selectors.js +42 -30
  250. package/build-module/store/selectors.js.map +1 -1
  251. package/build-style/style-rtl.css +160 -57
  252. package/build-style/style.css +160 -57
  253. package/package.json +13 -14
  254. package/src/components/alignment-control/test/__snapshots__/index.js.snap +0 -2
  255. package/src/components/alignment-control/ui.js +1 -4
  256. package/src/components/block-draggable/style.scss +19 -4
  257. package/src/components/block-icon/index.js +4 -1
  258. package/src/components/block-inspector/index.js +5 -0
  259. package/src/components/block-list/index.native.js +1 -1
  260. package/src/components/block-list/use-block-props/use-multi-selection.js +27 -7
  261. package/src/components/block-navigation/dropdown.js +0 -1
  262. package/src/components/block-patterns-list/index.js +1 -8
  263. package/src/components/block-patterns-list/style.scss +22 -12
  264. package/src/components/block-settings/container.native.js +7 -0
  265. package/src/components/block-settings-menu/block-settings-dropdown.js +19 -7
  266. package/src/components/block-styles/preview.native.js +2 -2
  267. package/src/components/block-switcher/test/__snapshots__/index.js.snap +1 -1
  268. package/src/components/color-palette/test/__snapshots__/control.js.snap +88 -63
  269. package/src/components/colors-gradients/control.js +19 -62
  270. package/src/components/colors-gradients/panel-color-gradient-settings.js +76 -6
  271. package/src/components/colors-gradients/style.scss +3 -14
  272. package/src/components/colors-gradients/test/control.js +0 -16
  273. package/src/components/duotone-control/index.js +6 -0
  274. package/src/components/duotone-control/style.scss +27 -12
  275. package/src/components/font-appearance-control/index.js +22 -14
  276. package/src/components/iframe/index.js +1 -1
  277. package/src/components/index.js +3 -4
  278. package/src/components/index.native.js +1 -4
  279. package/src/components/inner-blocks/index.js +4 -4
  280. package/src/components/inner-blocks/index.native.js +7 -4
  281. package/src/components/inserter/block-patterns-explorer/explorer.js +50 -0
  282. package/src/components/inserter/block-patterns-explorer/patterns-list.js +122 -0
  283. package/src/components/inserter/block-patterns-explorer/sidebar.js +73 -0
  284. package/src/components/inserter/block-patterns-tab.js +107 -80
  285. package/src/components/inserter/hooks/use-block-type-impressions.native.js +14 -21
  286. package/src/components/inserter/pattern-panel.js +33 -16
  287. package/src/components/inserter/style.scss +64 -1
  288. package/src/components/inserter/test/block-types-tab.native.js +1 -1
  289. package/src/components/inserter/test/fixtures/index.native.js +12 -0
  290. package/src/components/inspector-controls/groups.js +4 -0
  291. package/src/components/letter-spacing-control/index.js +12 -6
  292. package/src/components/link-control/README.md +7 -0
  293. package/src/components/link-control/index.js +99 -34
  294. package/src/components/link-control/link-preview.js +21 -9
  295. package/src/components/link-control/search-input.js +9 -3
  296. package/src/components/link-control/style.scss +32 -16
  297. package/src/components/link-control/test/index.js +179 -4
  298. package/src/components/list-view/block.js +67 -23
  299. package/src/components/list-view/branch.js +113 -91
  300. package/src/components/list-view/index.js +58 -19
  301. package/src/components/list-view/leaf.js +1 -1
  302. package/src/components/list-view/style.scss +14 -3
  303. package/src/components/list-view/use-list-view-client-ids.js +7 -66
  304. package/src/components/rich-text/embed-handler-picker.native.js +1 -0
  305. package/src/components/rich-text/format-edit.js +36 -2
  306. package/src/components/rich-text/format-toolbar/index.js +3 -0
  307. package/src/components/url-input/index.js +14 -4
  308. package/src/components/use-setting/index.js +49 -11
  309. package/src/hooks/border.js +8 -11
  310. package/src/hooks/color-panel.js +1 -0
  311. package/src/hooks/duotone.js +21 -7
  312. package/src/hooks/font-appearance.js +38 -7
  313. package/src/hooks/font-family.js +29 -13
  314. package/src/hooks/font-size.js +42 -6
  315. package/src/hooks/index.js +1 -0
  316. package/src/hooks/index.native.js +1 -0
  317. package/src/hooks/layout.scss +3 -1
  318. package/src/hooks/letter-spacing.js +35 -7
  319. package/src/hooks/line-height.js +37 -9
  320. package/src/hooks/margin.js +1 -1
  321. package/src/hooks/padding.js +1 -1
  322. package/src/hooks/text-decoration.js +34 -6
  323. package/src/hooks/text-transform.js +34 -6
  324. package/src/hooks/typography.js +165 -15
  325. package/src/hooks/typography.scss +16 -0
  326. package/src/hooks/use-cached-truthy.js +20 -0
  327. package/src/index.js +1 -0
  328. package/src/layouts/flex.js +137 -41
  329. package/src/store/actions.js +223 -391
  330. package/src/store/index.js +1 -2
  331. package/src/store/reducer.js +36 -18
  332. package/src/store/selectors.js +52 -47
  333. package/src/store/test/actions.js +395 -694
  334. package/src/store/test/selectors.js +79 -21
  335. package/src/style.scss +1 -1
  336. package/src/utils/test/parse-css-unit-to-px.js +127 -167
  337. package/build/components/text-decoration-and-transform/index.js +0 -39
  338. package/build/components/text-decoration-and-transform/index.js.map +0 -1
  339. package/build/store/controls.js +0 -44
  340. package/build/store/controls.js.map +0 -1
  341. package/build-module/components/text-decoration-and-transform/index.js +0 -30
  342. package/build-module/components/text-decoration-and-transform/index.js.map +0 -1
  343. package/build-module/store/controls.js +0 -32
  344. package/build-module/store/controls.js.map +0 -1
  345. package/src/components/text-decoration-and-transform/index.js +0 -36
  346. package/src/components/text-decoration-and-transform/style.scss +0 -3
  347. package/src/store/controls.js +0 -39
@@ -7,7 +7,7 @@ import deepFreeze from 'deep-freeze';
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
- import { controls, createRegistry } from '@wordpress/data';
10
+ import { createRegistry } from '@wordpress/data';
11
11
  import {
12
12
  getBlockTypes,
13
13
  unregisterBlockType,
@@ -41,7 +41,6 @@ const {
41
41
  replaceInnerBlocks,
42
42
  resetBlocks,
43
43
  selectBlock,
44
- selectPreviousBlock,
45
44
  showInsertionPoint,
46
45
  startMultiSelect,
47
46
  startTyping,
@@ -55,7 +54,6 @@ const {
55
54
  updateBlockAttributes,
56
55
  updateBlockListSettings,
57
56
  updateSettings,
58
- selectionChange,
59
57
  validateBlocksToTemplate,
60
58
  } = actions;
61
59
 
@@ -70,10 +68,11 @@ describe( 'actions', () => {
70
68
  };
71
69
 
72
70
  describe( 'resetBlocks', () => {
73
- it( 'should yield the RESET_BLOCKS actions', () => {
71
+ it( 'should dispatch the RESET_BLOCKS action', () => {
72
+ const dispatch = jest.fn();
74
73
  const blocks = [];
75
- const fulfillment = resetBlocks( blocks );
76
- expect( fulfillment.next().value ).toEqual( {
74
+ resetBlocks( blocks )( { dispatch } );
75
+ expect( dispatch ).toHaveBeenCalledWith( {
77
76
  type: 'RESET_BLOCKS',
78
77
  blocks,
79
78
  } );
@@ -147,59 +146,51 @@ describe( 'actions', () => {
147
146
  } );
148
147
  } );
149
148
  describe( 'multiSelect', () => {
150
- it( 'should return MULTI_SELECT action if blocks have the same root client id', () => {
149
+ it( 'should dispatch MULTI_SELECT action if blocks have the same root client id', () => {
151
150
  const start = 'start';
152
151
  const end = 'end';
153
- const multiSelectGenerator = multiSelect( start, end );
154
-
155
- expect( multiSelectGenerator.next().value ).toEqual(
156
- controls.select(
157
- blockEditorStoreName,
158
- 'getBlockRootClientId',
159
- start
160
- )
161
- );
152
+ const select = {
153
+ getBlockRootClientId() {
154
+ return 'parent'; // for all client IDs
155
+ },
156
+ getSelectedBlockCount() {
157
+ return 0;
158
+ },
159
+ };
160
+ const dispatch = jest.fn();
162
161
 
163
- expect( multiSelectGenerator.next( 'parent' ).value ).toEqual(
164
- controls.select(
165
- blockEditorStoreName,
166
- 'getBlockRootClientId',
167
- end
168
- )
169
- );
162
+ multiSelect( start, end )( { select, dispatch } );
170
163
 
171
- expect( multiSelectGenerator.next( 'parent' ).value ).toEqual( {
164
+ expect( dispatch ).toHaveBeenCalledWith( {
172
165
  type: 'MULTI_SELECT',
173
166
  start,
174
167
  end,
175
168
  } );
176
169
  } );
177
170
 
178
- it( 'should return undefined if blocks have different root client ids', () => {
171
+ it( 'should do nothing if blocks have different root client ids', () => {
179
172
  const start = 'start';
180
173
  const end = 'end';
181
- const multiSelectGenerator = multiSelect( start, end );
182
-
183
- expect( multiSelectGenerator.next().value ).toEqual(
184
- controls.select(
185
- blockEditorStoreName,
186
- 'getBlockRootClientId',
187
- start
188
- )
189
- );
174
+ const select = {
175
+ getBlockRootClientId( clientId ) {
176
+ switch ( clientId ) {
177
+ case start:
178
+ return 'parent';
179
+ case end:
180
+ return 'another parent';
181
+ default:
182
+ return null;
183
+ }
184
+ },
185
+ getSelectedBlockCount() {
186
+ return 0;
187
+ },
188
+ };
189
+ const dispatch = jest.fn();
190
190
 
191
- expect( multiSelectGenerator.next( 'parent' ).value ).toEqual(
192
- controls.select(
193
- blockEditorStoreName,
194
- 'getBlockRootClientId',
195
- end
196
- )
197
- );
191
+ multiSelect( start, end )( { select, dispatch } );
198
192
 
199
- expect( multiSelectGenerator.next( 'another parent' ) ).toEqual( {
200
- done: true,
201
- value: undefined,
202
- } );
193
+ expect( dispatch ).not.toHaveBeenCalled();
203
194
  } );
204
195
  } );
205
196
 
@@ -212,55 +203,34 @@ describe( 'actions', () => {
212
203
  } );
213
204
 
214
205
  describe( 'replaceBlock', () => {
215
- it( 'should yield the REPLACE_BLOCKS action if the new block can be inserted in the destination root block', () => {
206
+ it( 'should dispatch the REPLACE_BLOCKS action if the new block can be inserted in the destination root block', () => {
216
207
  const block = {
217
208
  clientId: 'ribs',
218
209
  name: 'core/test-block',
219
210
  };
220
211
 
221
- const replaceBlockGenerator = replaceBlock( 'chicken', block );
222
-
223
- // Skip getSettings select.
224
- replaceBlockGenerator.next();
225
-
226
- expect( replaceBlockGenerator.next().value ).toEqual(
227
- controls.select(
228
- blockEditorStoreName,
229
- 'getBlockRootClientId',
230
- 'chicken'
231
- )
232
- );
212
+ const select = {
213
+ getSettings: () => null,
214
+ getBlockRootClientId: () => null,
215
+ canInsertBlockType: () => true,
216
+ getBlockCount: () => 1,
217
+ };
218
+ const dispatch = jest.fn();
233
219
 
234
- expect( replaceBlockGenerator.next().value ).toEqual(
235
- controls.select(
236
- blockEditorStoreName,
237
- 'canInsertBlockType',
238
- 'core/test-block',
239
- undefined
240
- )
241
- );
220
+ replaceBlock( 'chicken', block )( { select, dispatch } );
242
221
 
243
- expect( replaceBlockGenerator.next( true ).value ).toEqual( {
222
+ expect( dispatch ).toHaveBeenCalledWith( {
244
223
  type: 'REPLACE_BLOCKS',
245
224
  clientIds: [ 'chicken' ],
246
225
  blocks: [ block ],
247
226
  time: expect.any( Number ),
248
227
  initialPosition: 0,
249
228
  } );
250
-
251
- expect( replaceBlockGenerator.next().value ).toEqual(
252
- controls.select( blockEditorStoreName, 'getBlockCount' )
253
- );
254
-
255
- expect( replaceBlockGenerator.next( 1 ) ).toEqual( {
256
- value: undefined,
257
- done: true,
258
- } );
259
229
  } );
260
230
  } );
261
231
 
262
232
  describe( 'replaceBlocks', () => {
263
- it( 'should not yield the REPLACE_BLOCKS action if the replacement is not possible', () => {
233
+ it( 'should not dispatch the REPLACE_BLOCKS action if the replacement is not possible', () => {
264
234
  const blocks = [
265
235
  {
266
236
  clientId: 'ribs',
@@ -272,48 +242,27 @@ describe( 'actions', () => {
272
242
  },
273
243
  ];
274
244
 
275
- const replaceBlockGenerator = replaceBlocks(
276
- [ 'chicken' ],
277
- blocks
278
- );
279
-
280
- expect( replaceBlockGenerator.next().value ).toEqual(
281
- controls.select( blockEditorStoreName, 'getSettings' )
282
- );
283
-
284
- expect( replaceBlockGenerator.next().value ).toEqual(
285
- controls.select(
286
- blockEditorStoreName,
287
- 'getBlockRootClientId',
288
- 'chicken'
289
- )
290
- );
291
-
292
- expect( replaceBlockGenerator.next().value ).toEqual(
293
- controls.select(
294
- blockEditorStoreName,
295
- 'canInsertBlockType',
296
- 'core/test-ribs',
297
- undefined
298
- )
299
- );
245
+ const select = {
246
+ getSettings: () => null,
247
+ getBlockRootClientId: () => null,
248
+ canInsertBlockType: ( clientId ) => {
249
+ switch ( clientId ) {
250
+ case 'core/test-ribs':
251
+ return true;
252
+ case 'core/test-chicken':
253
+ default:
254
+ return false;
255
+ }
256
+ },
257
+ };
258
+ const dispatch = jest.fn();
300
259
 
301
- expect( replaceBlockGenerator.next( true ).value ).toEqual(
302
- controls.select(
303
- blockEditorStoreName,
304
- 'canInsertBlockType',
305
- 'core/test-chicken',
306
- undefined
307
- )
308
- );
260
+ replaceBlocks( [ 'chicken' ], blocks )( { select, dispatch } );
309
261
 
310
- expect( replaceBlockGenerator.next( false ) ).toEqual( {
311
- value: undefined,
312
- done: true,
313
- } );
262
+ expect( dispatch ).not.toHaveBeenCalled();
314
263
  } );
315
264
 
316
- it( 'should yield the REPLACE_BLOCKS action if the all the replacement blocks can be inserted in the parent block', () => {
265
+ it( 'should dispatch the REPLACE_BLOCKS action if the all the replacement blocks can be inserted in the parent block', () => {
317
266
  const blocks = [
318
267
  {
319
268
  clientId: 'ribs',
@@ -325,56 +274,23 @@ describe( 'actions', () => {
325
274
  },
326
275
  ];
327
276
 
328
- const replaceBlockGenerator = replaceBlocks(
329
- [ 'chicken' ],
330
- blocks
331
- );
332
-
333
- // Skip getSettings select.
334
- replaceBlockGenerator.next();
335
-
336
- expect( replaceBlockGenerator.next().value ).toEqual(
337
- controls.select(
338
- blockEditorStoreName,
339
- 'getBlockRootClientId',
340
- 'chicken'
341
- )
342
- );
277
+ const select = {
278
+ getSettings: () => null,
279
+ getBlockRootClientId: () => null,
280
+ canInsertBlockType: () => true,
281
+ getBlockCount: () => 1,
282
+ };
283
+ const dispatch = jest.fn();
343
284
 
344
- expect( replaceBlockGenerator.next().value ).toEqual(
345
- controls.select(
346
- blockEditorStoreName,
347
- 'canInsertBlockType',
348
- 'core/test-ribs',
349
- undefined
350
- )
351
- );
285
+ replaceBlocks( [ 'chicken' ], blocks )( { select, dispatch } );
352
286
 
353
- expect( replaceBlockGenerator.next( true ).value ).toEqual(
354
- controls.select(
355
- blockEditorStoreName,
356
- 'canInsertBlockType',
357
- 'core/test-chicken',
358
- undefined
359
- )
360
- );
361
-
362
- expect( replaceBlockGenerator.next( true ).value ).toEqual( {
287
+ expect( dispatch ).toHaveBeenCalledWith( {
363
288
  type: 'REPLACE_BLOCKS',
364
289
  clientIds: [ 'chicken' ],
365
290
  blocks,
366
291
  time: expect.any( Number ),
367
292
  initialPosition: 0,
368
293
  } );
369
-
370
- expect( replaceBlockGenerator.next().value ).toEqual(
371
- controls.select( blockEditorStoreName, 'getBlockCount' )
372
- );
373
-
374
- expect( replaceBlockGenerator.next( 1 ) ).toEqual( {
375
- value: undefined,
376
- done: true,
377
- } );
378
294
  } );
379
295
 
380
296
  it( 'should pass patternName through metadata to REPLACE_BLOCKS action', () => {
@@ -391,21 +307,23 @@ describe( 'actions', () => {
391
307
 
392
308
  const meta = { patternName: 'core/chicken-ribs-pattern' };
393
309
 
394
- const replaceBlockGenerator = replaceBlocks(
310
+ const select = {
311
+ getSettings: () => null,
312
+ getBlockRootClientId: () => null,
313
+ canInsertBlockType: () => true,
314
+ getBlockCount: () => 1,
315
+ };
316
+ const dispatch = jest.fn();
317
+
318
+ replaceBlocks(
395
319
  [ 'chicken' ],
396
320
  blocks,
397
321
  null,
398
322
  null,
399
323
  meta
400
- );
324
+ )( { select, dispatch } );
401
325
 
402
- // Skip to action yield.
403
- replaceBlockGenerator.next();
404
- replaceBlockGenerator.next();
405
- replaceBlockGenerator.next();
406
- replaceBlockGenerator.next( true );
407
-
408
- expect( replaceBlockGenerator.next( true ).value ).toEqual( {
326
+ expect( dispatch ).toHaveBeenCalledWith( {
409
327
  type: 'REPLACE_BLOCKS',
410
328
  clientIds: [ 'chicken' ],
411
329
  blocks,
@@ -425,36 +343,27 @@ describe( 'actions', () => {
425
343
  };
426
344
  const index = 5;
427
345
 
428
- const insertBlockGenerator = insertBlock(
346
+ const select = {
347
+ getSettings: () => null,
348
+ canInsertBlockType: () => true,
349
+ };
350
+ const dispatch = jest.fn();
351
+
352
+ insertBlock(
429
353
  block,
430
354
  index,
431
355
  'testclientid',
432
356
  true
433
- );
434
-
435
- // Skip getSettings select.
436
- insertBlockGenerator.next();
357
+ )( { select, dispatch } );
437
358
 
438
- expect( insertBlockGenerator.next().value ).toEqual(
439
- controls.select(
440
- blockEditorStoreName,
441
- 'canInsertBlockType',
442
- 'core/test-block',
443
- 'testclientid'
444
- )
445
- );
446
-
447
- expect( insertBlockGenerator.next( true ) ).toEqual( {
448
- done: true,
449
- value: {
450
- type: 'INSERT_BLOCKS',
451
- blocks: [ block ],
452
- index,
453
- rootClientId: 'testclientid',
454
- time: expect.any( Number ),
455
- updateSelection: true,
456
- initialPosition: 0,
457
- },
359
+ expect( dispatch ).toHaveBeenCalledWith( {
360
+ type: 'INSERT_BLOCKS',
361
+ blocks: [ block ],
362
+ index,
363
+ rootClientId: 'testclientid',
364
+ time: expect.any( Number ),
365
+ updateSelection: true,
366
+ initialPosition: 0,
458
367
  } );
459
368
  } );
460
369
  } );
@@ -475,74 +384,44 @@ describe( 'actions', () => {
475
384
  };
476
385
  const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ];
477
386
 
478
- const insertBlocksGenerator = insertBlocks(
479
- blocks,
480
- 5,
481
- 'testrootid',
482
- false
483
- );
484
-
485
- expect( insertBlocksGenerator.next().value ).toEqual(
486
- controls.select( blockEditorStoreName, 'getSettings' )
487
- );
488
-
489
- expect(
490
- insertBlocksGenerator.next( {
387
+ const select = {
388
+ getSettings: () => ( {
491
389
  __experimentalPreferredStyleVariations: {
492
390
  value: {
493
391
  'core/test-ribs': 'squared',
494
392
  'core/test-chicken-ribs': 'colorful',
495
393
  },
496
394
  },
497
- } ).value
498
- ).toEqual(
499
- controls.select(
500
- blockEditorStoreName,
501
- 'canInsertBlockType',
502
- 'core/test-ribs',
503
- 'testrootid'
504
- )
505
- );
506
-
507
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
508
- controls.select(
509
- blockEditorStoreName,
510
- 'canInsertBlockType',
511
- 'core/test-chicken',
512
- 'testrootid'
513
- )
514
- );
395
+ } ),
396
+ canInsertBlockType: () => true,
397
+ };
398
+ const dispatch = jest.fn();
515
399
 
516
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
517
- controls.select(
518
- blockEditorStoreName,
519
- 'canInsertBlockType',
520
- 'core/test-chicken-ribs',
521
- 'testrootid'
522
- )
523
- );
400
+ insertBlocks(
401
+ blocks,
402
+ 5,
403
+ 'testrootid',
404
+ false
405
+ )( { select, dispatch } );
524
406
 
525
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
526
- done: true,
527
- value: {
528
- type: 'INSERT_BLOCKS',
529
- blocks: [
530
- {
531
- ...ribsBlock,
532
- attributes: { className: 'is-style-squared' },
533
- },
534
- chickenBlock,
535
- {
536
- ...chickenRibsBlock,
537
- attributes: { className: 'is-style-colorful' },
538
- },
539
- ],
540
- index: 5,
541
- rootClientId: 'testrootid',
542
- time: expect.any( Number ),
543
- updateSelection: false,
544
- initialPosition: null,
545
- },
407
+ expect( dispatch ).toHaveBeenCalledWith( {
408
+ type: 'INSERT_BLOCKS',
409
+ blocks: [
410
+ {
411
+ ...ribsBlock,
412
+ attributes: { className: 'is-style-squared' },
413
+ },
414
+ chickenBlock,
415
+ {
416
+ ...chickenRibsBlock,
417
+ attributes: { className: 'is-style-colorful' },
418
+ },
419
+ ],
420
+ index: 5,
421
+ rootClientId: 'testrootid',
422
+ time: expect.any( Number ),
423
+ updateSelection: false,
424
+ initialPosition: null,
546
425
  } );
547
426
  } );
548
427
 
@@ -556,52 +435,41 @@ describe( 'actions', () => {
556
435
  };
557
436
  const blocks = [ ribsWithStyleBlock ];
558
437
 
559
- const insertBlocksGenerator = insertBlocks(
560
- blocks,
561
- 5,
562
- 'testrootid',
563
- false
564
- );
565
-
566
- expect( insertBlocksGenerator.next().value ).toEqual(
567
- controls.select( blockEditorStoreName, 'getSettings' )
568
- );
569
-
570
- expect(
571
- insertBlocksGenerator.next( {
438
+ const select = {
439
+ getSettings: () => ( {
572
440
  __experimentalPreferredStyleVariations: {
573
441
  value: {
574
442
  'core/test-ribs': 'squared',
575
443
  },
576
444
  },
577
- } ).value
578
- ).toEqual(
579
- controls.select(
580
- blockEditorStoreName,
581
- 'canInsertBlockType',
582
- 'core/test-ribs',
583
- 'testrootid'
584
- )
585
- );
445
+ } ),
446
+ canInsertBlockType: () => true,
447
+ };
448
+ const dispatch = jest.fn();
586
449
 
587
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
588
- done: true,
589
- value: {
590
- type: 'INSERT_BLOCKS',
591
- blocks: [
592
- {
593
- ...ribsWithStyleBlock,
594
- attributes: { className: 'is-style-colorful' },
595
- },
596
- ],
597
- index: 5,
598
- rootClientId: 'testrootid',
599
- time: expect.any( Number ),
600
- updateSelection: false,
601
- initialPosition: null,
602
- },
450
+ insertBlocks(
451
+ blocks,
452
+ 5,
453
+ 'testrootid',
454
+ false
455
+ )( { select, dispatch } );
456
+
457
+ expect( dispatch ).toHaveBeenCalledWith( {
458
+ type: 'INSERT_BLOCKS',
459
+ blocks: [
460
+ {
461
+ ...ribsWithStyleBlock,
462
+ attributes: { className: 'is-style-colorful' },
463
+ },
464
+ ],
465
+ index: 5,
466
+ rootClientId: 'testrootid',
467
+ time: expect.any( Number ),
468
+ updateSelection: false,
469
+ initialPosition: null,
603
470
  } );
604
471
  } );
472
+
605
473
  it( 'should filter the allowed blocks in INSERT_BLOCKS action', () => {
606
474
  const ribsBlock = {
607
475
  clientId: 'ribs',
@@ -617,58 +485,42 @@ describe( 'actions', () => {
617
485
  };
618
486
  const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ];
619
487
 
620
- const insertBlocksGenerator = insertBlocks(
488
+ const select = {
489
+ getSettings: () => null,
490
+ canInsertBlockType: ( clientId ) => {
491
+ switch ( clientId ) {
492
+ case 'core/test-ribs':
493
+ return true;
494
+ case 'core/test-chicken':
495
+ return false;
496
+ case 'core/test-chicken-ribs':
497
+ return true;
498
+ default:
499
+ return false;
500
+ }
501
+ },
502
+ };
503
+ const dispatch = jest.fn();
504
+
505
+ insertBlocks(
621
506
  blocks,
622
507
  5,
623
508
  'testrootid',
624
509
  false
625
- );
626
-
627
- // Skip getSettings select.
628
- insertBlocksGenerator.next();
629
-
630
- expect( insertBlocksGenerator.next().value ).toEqual(
631
- controls.select(
632
- blockEditorStoreName,
633
- 'canInsertBlockType',
634
- 'core/test-ribs',
635
- 'testrootid'
636
- )
637
- );
638
-
639
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
640
- controls.select(
641
- blockEditorStoreName,
642
- 'canInsertBlockType',
643
- 'core/test-chicken',
644
- 'testrootid'
645
- )
646
- );
647
-
648
- expect( insertBlocksGenerator.next( false ).value ).toEqual(
649
- controls.select(
650
- blockEditorStoreName,
651
- 'canInsertBlockType',
652
- 'core/test-chicken-ribs',
653
- 'testrootid'
654
- )
655
- );
510
+ )( { select, dispatch } );
656
511
 
657
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
658
- done: true,
659
- value: {
660
- type: 'INSERT_BLOCKS',
661
- blocks: [ ribsBlock, chickenRibsBlock ],
662
- index: 5,
663
- rootClientId: 'testrootid',
664
- time: expect.any( Number ),
665
- updateSelection: false,
666
- initialPosition: null,
667
- },
512
+ expect( dispatch ).toHaveBeenCalledWith( {
513
+ type: 'INSERT_BLOCKS',
514
+ blocks: [ ribsBlock, chickenRibsBlock ],
515
+ index: 5,
516
+ rootClientId: 'testrootid',
517
+ time: expect.any( Number ),
518
+ updateSelection: false,
519
+ initialPosition: null,
668
520
  } );
669
521
  } );
670
522
 
671
- it( 'does not yield INSERT_BLOCKS action if all the blocks are impossible to insert', () => {
523
+ it( 'does not dispatch INSERT_BLOCKS action if all the blocks are impossible to insert', () => {
672
524
  const ribsBlock = {
673
525
  clientId: 'ribs',
674
526
  name: 'core/test-ribs',
@@ -679,38 +531,20 @@ describe( 'actions', () => {
679
531
  };
680
532
  const blocks = [ ribsBlock, chickenBlock ];
681
533
 
682
- const insertBlocksGenerator = insertBlocks(
534
+ const select = {
535
+ getSettings: () => null,
536
+ canInsertBlockType: () => false,
537
+ };
538
+ const dispatch = jest.fn();
539
+
540
+ insertBlocks(
683
541
  blocks,
684
542
  5,
685
543
  'testrootid',
686
544
  false
687
- );
688
-
689
- // Skip getSettings select.
690
- insertBlocksGenerator.next();
691
-
692
- expect( insertBlocksGenerator.next().value ).toEqual(
693
- controls.select(
694
- blockEditorStoreName,
695
- 'canInsertBlockType',
696
- 'core/test-ribs',
697
- 'testrootid'
698
- )
699
- );
700
-
701
- expect( insertBlocksGenerator.next( false ).value ).toEqual(
702
- controls.select(
703
- blockEditorStoreName,
704
- 'canInsertBlockType',
705
- 'core/test-chicken',
706
- 'testrootid'
707
- )
708
- );
545
+ )( { select, dispatch } );
709
546
 
710
- expect( insertBlocksGenerator.next( false ) ).toEqual( {
711
- done: true,
712
- value: undefined,
713
- } );
547
+ expect( dispatch ).not.toHaveBeenCalled();
714
548
  } );
715
549
 
716
550
  it( 'should pass patternName through metadata to INSERT_BLOCKS action', () => {
@@ -729,57 +563,41 @@ describe( 'actions', () => {
729
563
  const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ];
730
564
  const meta = { patternName: 'core/chicken-ribs-pattern' };
731
565
 
732
- const insertBlocksGenerator = insertBlocks(
566
+ const select = {
567
+ getSettings: () => null,
568
+ canInsertBlockType: ( clientId ) => {
569
+ switch ( clientId ) {
570
+ case 'core/test-ribs':
571
+ return true;
572
+ case 'core/test-chicken':
573
+ return false;
574
+ case 'core/test-chicken-ribs':
575
+ return true;
576
+ default:
577
+ return false;
578
+ }
579
+ },
580
+ };
581
+ const dispatch = jest.fn();
582
+
583
+ insertBlocks(
733
584
  blocks,
734
585
  5,
735
586
  'testrootid',
736
587
  false,
737
588
  0,
738
589
  meta
739
- );
740
-
741
- // Skip getSettings select.
742
- insertBlocksGenerator.next();
743
-
744
- expect( insertBlocksGenerator.next().value ).toEqual(
745
- controls.select(
746
- blockEditorStoreName,
747
- 'canInsertBlockType',
748
- 'core/test-ribs',
749
- 'testrootid'
750
- )
751
- );
590
+ )( { select, dispatch } );
752
591
 
753
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
754
- controls.select(
755
- blockEditorStoreName,
756
- 'canInsertBlockType',
757
- 'core/test-chicken',
758
- 'testrootid'
759
- )
760
- );
761
-
762
- expect( insertBlocksGenerator.next( false ).value ).toEqual(
763
- controls.select(
764
- blockEditorStoreName,
765
- 'canInsertBlockType',
766
- 'core/test-chicken-ribs',
767
- 'testrootid'
768
- )
769
- );
770
-
771
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
772
- done: true,
773
- value: {
774
- type: 'INSERT_BLOCKS',
775
- blocks: [ ribsBlock, chickenRibsBlock ],
776
- index: 5,
777
- rootClientId: 'testrootid',
778
- time: expect.any( Number ),
779
- updateSelection: false,
780
- initialPosition: null,
781
- meta: { patternName: 'core/chicken-ribs-pattern' },
782
- },
592
+ expect( dispatch ).toHaveBeenCalledWith( {
593
+ type: 'INSERT_BLOCKS',
594
+ blocks: [ ribsBlock, chickenRibsBlock ],
595
+ index: 5,
596
+ rootClientId: 'testrootid',
597
+ time: expect.any( Number ),
598
+ updateSelection: false,
599
+ initialPosition: null,
600
+ meta: { patternName: 'core/chicken-ribs-pattern' },
783
601
  } );
784
602
  } );
785
603
  } );
@@ -801,32 +619,25 @@ describe( 'actions', () => {
801
619
  } );
802
620
 
803
621
  describe( 'removeBlocks', () => {
804
- it( 'should return REMOVE_BLOCKS action', () => {
622
+ it( 'should dispatch REMOVE_BLOCKS action', () => {
805
623
  const clientId = 'clientId';
806
624
  const clientIds = [ clientId ];
807
625
 
808
- const removeBlocksGenerator = removeBlocks( clientIds );
626
+ const select = {
627
+ getBlockRootClientId: () => undefined,
628
+ canRemoveBlocks: () => true,
629
+ };
630
+ const dispatch = Object.assign( jest.fn(), {
631
+ selectPreviousBlock: jest.fn(),
632
+ } );
633
+
634
+ removeBlocks( clientIds )( { select, dispatch } );
809
635
 
810
- expect( removeBlocksGenerator.next().value ).toEqual(
811
- controls.select(
812
- blockEditorStoreName,
813
- 'getBlockRootClientId',
814
- clientId
815
- )
816
- );
817
- expect( removeBlocksGenerator.next().value ).toEqual(
818
- controls.select(
819
- blockEditorStoreName,
820
- 'canRemoveBlocks',
821
- clientIds,
822
- undefined
823
- )
824
- );
825
- expect( removeBlocksGenerator.next( true ).value ).toEqual(
826
- selectPreviousBlock( clientId )
636
+ expect( dispatch.selectPreviousBlock ).toHaveBeenCalledWith(
637
+ clientId
827
638
  );
828
639
 
829
- expect( removeBlocksGenerator.next().value ).toEqual( {
640
+ expect( dispatch ).toHaveBeenCalledWith( {
830
641
  type: 'REMOVE_BLOCKS',
831
642
  clientIds,
832
643
  } );
@@ -834,225 +645,129 @@ describe( 'actions', () => {
834
645
  } );
835
646
 
836
647
  describe( 'moveBlocksToPosition', () => {
837
- it( 'should not yield MOVE_BLOCKS_TO_POSITION action if locking is all', () => {
838
- const moveBlockToPositionGenerator = moveBlocksToPosition(
648
+ it( 'should not dispatch MOVE_BLOCKS_TO_POSITION action if locking is all', () => {
649
+ const select = {
650
+ canMoveBlocks: () => false,
651
+ };
652
+ const dispatch = jest.fn();
653
+
654
+ moveBlocksToPosition(
839
655
  [ 'chicken' ],
840
656
  'ribs',
841
657
  'ribs',
842
658
  5
843
- );
844
-
845
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual(
846
- controls.select(
847
- blockEditorStoreName,
848
- 'canMoveBlocks',
849
- [ 'chicken' ],
850
- 'ribs'
851
- )
852
- );
853
-
854
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
855
- controls.select(
856
- blockEditorStoreName,
857
- 'canRemoveBlocks',
858
- [ 'chicken' ],
859
- 'ribs'
860
- )
861
- );
659
+ )( { select, dispatch } );
862
660
 
863
- expect( moveBlockToPositionGenerator.next() ).toEqual( {
864
- done: true,
865
- value: undefined,
866
- } );
661
+ expect( dispatch ).not.toHaveBeenCalled();
867
662
  } );
868
663
 
869
- it( 'should yield MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
870
- const moveBlockToPositionGenerator = moveBlocksToPosition(
664
+ it( 'should dispatch MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
665
+ const select = {
666
+ canMoveBlocks: () => true,
667
+ canRemoveBlocks: () => true,
668
+ canInsertBlocks: () => true,
669
+ };
670
+ const dispatch = jest.fn();
671
+
672
+ moveBlocksToPosition(
871
673
  [ 'chicken' ],
872
674
  'ribs',
873
675
  'chicken-ribs',
874
676
  5
875
- );
876
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
877
- controls.select(
878
- blockEditorStoreName,
879
- 'canMoveBlocks',
880
- [ 'chicken' ],
881
- 'ribs'
882
- )
883
- );
677
+ )( { select, dispatch } );
884
678
 
885
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual(
886
- controls.select(
887
- blockEditorStoreName,
888
- 'canRemoveBlocks',
889
- [ 'chicken' ],
890
- 'ribs'
891
- )
892
- );
893
-
894
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual(
895
- controls.select(
896
- blockEditorStoreName,
897
- 'canInsertBlocks',
898
- [ 'chicken' ],
899
- 'chicken-ribs'
900
- )
901
- );
902
-
903
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual( {
679
+ expect( dispatch ).toHaveBeenCalledWith( {
904
680
  type: 'MOVE_BLOCKS_TO_POSITION',
905
681
  fromRootClientId: 'ribs',
906
682
  toRootClientId: 'chicken-ribs',
907
683
  clientIds: [ 'chicken' ],
908
684
  index: 5,
909
685
  } );
910
-
911
- expect( moveBlockToPositionGenerator.next() ).toEqual( {
912
- done: true,
913
- value: undefined,
914
- } );
915
686
  } );
916
687
 
917
- it( 'should not yield MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
918
- const moveBlockToPositionGenerator = moveBlocksToPosition(
688
+ it( 'should not dispatch MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
689
+ const select = {
690
+ canMoveBlocks: () => true,
691
+ canRemoveBlocks: () => true,
692
+ canInsertBlocks: () => false,
693
+ };
694
+ const dispatch = jest.fn();
695
+
696
+ moveBlocksToPosition(
919
697
  [ 'chicken' ],
920
698
  'ribs',
921
699
  'chicken-ribs',
922
700
  5
923
- );
924
-
925
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
926
- controls.select(
927
- blockEditorStoreName,
928
- 'canMoveBlocks',
929
- [ 'chicken' ],
930
- 'ribs'
931
- )
932
- );
933
-
934
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual(
935
- controls.select(
936
- blockEditorStoreName,
937
- 'canRemoveBlocks',
938
- [ 'chicken' ],
939
- 'ribs'
940
- )
941
- );
942
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual(
943
- controls.select(
944
- blockEditorStoreName,
945
- 'canInsertBlocks',
946
- [ 'chicken' ],
947
- 'chicken-ribs'
948
- )
949
- );
701
+ )( { select, dispatch } );
950
702
 
951
- expect( moveBlockToPositionGenerator.next( false ) ).toEqual( {
952
- done: true,
953
- value: undefined,
954
- } );
703
+ expect( dispatch ).not.toHaveBeenCalled();
955
704
  } );
956
705
  } );
957
706
 
958
707
  describe( 'moveBlockToPosition', () => {
959
- it( 'should yield MOVE_BLOCKS_TO_POSITION action with a single block', () => {
960
- const moveBlockToPositionGenerator = moveBlocksToPosition(
708
+ it( 'should dispatch MOVE_BLOCKS_TO_POSITION action with a single block', () => {
709
+ const select = {
710
+ canMoveBlocks: () => true,
711
+ };
712
+ const dispatch = jest.fn();
713
+
714
+ moveBlocksToPosition(
961
715
  'chicken',
962
716
  'ribs',
963
717
  'ribs',
964
718
  5
965
- );
719
+ )( { select, dispatch } );
966
720
 
967
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
968
- controls.select(
969
- blockEditorStoreName,
970
- 'canMoveBlocks',
971
- 'chicken',
972
- 'ribs'
973
- )
974
- );
975
-
976
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual(
977
- controls.select(
978
- blockEditorStoreName,
979
- 'canRemoveBlocks',
980
- 'chicken',
981
- 'ribs'
982
- )
983
- );
984
-
985
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual( {
721
+ expect( dispatch ).toHaveBeenCalledWith( {
986
722
  type: 'MOVE_BLOCKS_TO_POSITION',
987
723
  fromRootClientId: 'ribs',
988
724
  toRootClientId: 'ribs',
989
725
  clientIds: 'chicken',
990
726
  index: 5,
991
727
  } );
992
-
993
- expect( moveBlockToPositionGenerator.next().done ).toBe( true );
994
728
  } );
995
729
  } );
996
730
 
997
731
  describe( 'removeBlock', () => {
998
- it( 'should return REMOVE_BLOCKS action', () => {
732
+ it( 'should dispatch REMOVE_BLOCKS action', () => {
999
733
  const clientId = 'myclientid';
1000
734
 
1001
- const removeBlockGenerator = removeBlock( clientId );
1002
- expect( removeBlockGenerator.next().value ).toEqual(
1003
- controls.select(
1004
- blockEditorStoreName,
1005
- 'getBlockRootClientId',
1006
- clientId
1007
- )
1008
- );
1009
- expect( removeBlockGenerator.next().value ).toEqual(
1010
- controls.select(
1011
- blockEditorStoreName,
1012
- 'canRemoveBlocks',
1013
- [ clientId ],
1014
- undefined
1015
- )
1016
- );
1017
- expect( removeBlockGenerator.next( true ).value ).toEqual(
1018
- selectPreviousBlock( clientId )
735
+ const select = {
736
+ getBlockRootClientId: () => null,
737
+ canRemoveBlocks: () => true,
738
+ };
739
+ const dispatch = Object.assign( jest.fn(), {
740
+ selectPreviousBlock: jest.fn(),
741
+ } );
742
+
743
+ removeBlock( clientId )( { select, dispatch } );
744
+
745
+ expect( dispatch.selectPreviousBlock ).toHaveBeenCalledWith(
746
+ clientId
1019
747
  );
1020
748
 
1021
- expect( removeBlockGenerator.next().value ).toEqual( {
749
+ expect( dispatch ).toHaveBeenCalledWith( {
1022
750
  type: 'REMOVE_BLOCKS',
1023
751
  clientIds: [ clientId ],
1024
752
  } );
1025
753
  } );
1026
754
 
1027
- it( 'should return REMOVE_BLOCKS action, opting out of select previous', () => {
755
+ it( 'should dispatch REMOVE_BLOCKS action, opting out of select previous', () => {
1028
756
  const clientId = 'myclientid';
1029
757
 
1030
- const removeBlocksGenerator = removeBlocks( [ clientId ], false );
758
+ const select = {
759
+ getBlockRootClientId: () => null,
760
+ canRemoveBlocks: () => true,
761
+ };
762
+ const dispatch = Object.assign( jest.fn(), {
763
+ selectPreviousBlock: jest.fn(),
764
+ } );
1031
765
 
1032
- expect( removeBlocksGenerator.next().value ).toEqual(
1033
- controls.select(
1034
- blockEditorStoreName,
1035
- 'getBlockRootClientId',
1036
- clientId
1037
- )
1038
- );
1039
- expect( removeBlocksGenerator.next().value ).toEqual(
1040
- controls.select(
1041
- blockEditorStoreName,
1042
- 'canRemoveBlocks',
1043
- [ clientId ],
1044
- undefined
1045
- )
1046
- );
1047
- expect( removeBlocksGenerator.next( true ).value ).toEqual(
1048
- controls.select(
1049
- blockEditorStoreName,
1050
- 'getPreviousBlockClientId',
1051
- clientId
1052
- )
1053
- );
766
+ removeBlocks( [ clientId ], false )( { select, dispatch } );
767
+
768
+ expect( dispatch.selectPreviousBlock ).not.toHaveBeenCalled();
1054
769
 
1055
- expect( removeBlocksGenerator.next().value ).toEqual( {
770
+ expect( dispatch ).toHaveBeenCalledWith( {
1056
771
  type: 'REMOVE_BLOCKS',
1057
772
  clientIds: [ clientId ],
1058
773
  } );
@@ -1197,19 +912,6 @@ describe( 'actions', () => {
1197
912
  } );
1198
913
  } );
1199
914
 
1200
- it( 'should return MERGE_BLOCKS action', () => {
1201
- const firstBlockClientId = 'blockA';
1202
- const secondBlockClientId = 'blockB';
1203
- const fulfillment = mergeBlocks(
1204
- firstBlockClientId,
1205
- secondBlockClientId
1206
- );
1207
- expect( fulfillment.next().value ).toEqual( {
1208
- type: 'MERGE_BLOCKS',
1209
- blocks: [ firstBlockClientId, secondBlockClientId ],
1210
- } );
1211
- } );
1212
-
1213
915
  it( 'should only focus the blockA if the blockA has no merge function', () => {
1214
916
  registerBlockType( 'core/test-block', defaultBlockSettings );
1215
917
  const blockA = deepFreeze( {
@@ -1221,20 +923,24 @@ describe( 'actions', () => {
1221
923
  name: 'core/test-block',
1222
924
  } );
1223
925
 
1224
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1225
- expect( fulfillment.next() ).toEqual( {
1226
- done: false,
1227
- value: {
1228
- type: 'MERGE_BLOCKS',
1229
- blocks: [ blockA.clientId, blockB.clientId ],
1230
- },
926
+ const select = {
927
+ getBlock: ( clientId ) =>
928
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
929
+ };
930
+ const dispatch = Object.assign( jest.fn(), {
931
+ selectBlock: jest.fn(),
1231
932
  } );
1232
- fulfillment.next();
1233
- expect( fulfillment.next( blockA ) ).toEqual( {
1234
- done: false,
1235
- value: selectBlock( 'chicken' ),
933
+
934
+ mergeBlocks(
935
+ blockA.clientId,
936
+ blockB.clientId
937
+ )( { select, dispatch } );
938
+
939
+ expect( dispatch ).toHaveBeenCalledWith( {
940
+ type: 'MERGE_BLOCKS',
941
+ blocks: [ blockA.clientId, blockB.clientId ],
1236
942
  } );
1237
- expect( fulfillment.next( blockA ).done ).toEqual( true );
943
+ expect( dispatch.selectBlock ).toHaveBeenCalledWith( 'chicken' );
1238
944
  } );
1239
945
 
1240
946
  it( 'should merge the blocks if blocks of the same type', () => {
@@ -1267,42 +973,43 @@ describe( 'actions', () => {
1267
973
  innerBlocks: [],
1268
974
  } );
1269
975
 
1270
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1271
- // MERGE_BLOCKS
1272
- fulfillment.next();
1273
- // getBlock A
1274
- fulfillment.next();
1275
- fulfillment.next( blockA );
1276
- // getBlock B
1277
- fulfillment.next( blockB );
1278
- // getSelectionStart
1279
- fulfillment.next( {
1280
- clientId: blockB.clientId,
1281
- attributeKey: 'content',
1282
- offset: 0,
976
+ const select = {
977
+ getBlock: ( clientId ) =>
978
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
979
+ getSelectionStart: () => ( {
980
+ clientId: blockB.clientId,
981
+ attributeKey: 'content',
982
+ offset: 0,
983
+ } ),
984
+ };
985
+ const dispatch = Object.assign( jest.fn(), {
986
+ replaceBlocks: jest.fn(),
987
+ selectionChange: jest.fn(),
1283
988
  } );
1284
- // selectionChange
1285
- fulfillment.next(
1286
- selectionChange(
1287
- blockA.clientId,
1288
- 'content',
1289
- 'chicken'.length + 1,
1290
- 'chicken'.length + 1
1291
- )
989
+
990
+ mergeBlocks(
991
+ blockA.clientId,
992
+ blockB.clientId
993
+ )( { select, dispatch } );
994
+
995
+ expect( dispatch.selectionChange ).toHaveBeenCalledWith(
996
+ blockA.clientId,
997
+ 'content',
998
+ 'chicken'.length + 1,
999
+ 'chicken'.length + 1
1292
1000
  );
1293
- fulfillment.next();
1294
- fulfillment.next();
1295
- expect( fulfillment.next( blockA ).value ).toMatchObject( {
1296
- type: 'REPLACE_BLOCKS',
1297
- clientIds: [ 'chicken', 'ribs' ],
1298
- blocks: [
1299
- {
1001
+
1002
+ expect( dispatch.replaceBlocks ).toHaveBeenCalledWith(
1003
+ [ 'chicken', 'ribs' ],
1004
+ [
1005
+ expect.objectContaining( {
1300
1006
  clientId: 'chicken',
1301
1007
  name: 'core/test-block',
1302
1008
  attributes: { content: 'chicken ribs' },
1303
- },
1009
+ } ),
1304
1010
  ],
1305
- } );
1011
+ 0
1012
+ );
1306
1013
  } );
1307
1014
 
1308
1015
  it( 'should not merge the blocks have different types without transformation', () => {
@@ -1336,27 +1043,25 @@ describe( 'actions', () => {
1336
1043
  innerBlocks: [],
1337
1044
  } );
1338
1045
 
1339
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1340
- // MERGE_BLOCKS
1341
- fulfillment.next();
1342
- // getBlock A
1343
- fulfillment.next();
1344
- fulfillment.next( blockA );
1345
- // getBlock B
1346
- expect( fulfillment.next( blockB ).value ).toEqual( {
1347
- args: [],
1348
- selectorName: 'getSelectionStart',
1349
- storeKey: blockEditorStoreName,
1350
- type: '@@data/SELECT',
1351
- } );
1352
- // getSelectionStart
1353
- const next = fulfillment.next( {
1354
- clientId: blockB.clientId,
1355
- attributeKey: 'content',
1356
- offset: 0,
1046
+ const select = {
1047
+ getBlock: ( clientId ) =>
1048
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
1049
+ getSelectionStart: () => ( {
1050
+ clientId: blockB.clientId,
1051
+ attributeKey: 'content',
1052
+ offset: 0,
1053
+ } ),
1054
+ };
1055
+ const dispatch = Object.assign( jest.fn(), {
1056
+ replaceBlocks: jest.fn(),
1357
1057
  } );
1358
- expect( next.value ).toEqual( undefined );
1359
- expect( next.done ).toBe( true );
1058
+
1059
+ mergeBlocks(
1060
+ blockA.clientId,
1061
+ blockB.clientId
1062
+ )( { select, dispatch } );
1063
+
1064
+ expect( dispatch.replaceBlocks ).not.toHaveBeenCalled();
1360
1065
  } );
1361
1066
 
1362
1067
  it( 'should transform and merge the blocks', () => {
@@ -1414,48 +1119,43 @@ describe( 'actions', () => {
1414
1119
  innerBlocks: [],
1415
1120
  } );
1416
1121
 
1417
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1418
- // MERGE_BLOCKS
1419
- fulfillment.next();
1420
- // getBlock A
1421
- fulfillment.next();
1422
- fulfillment.next( blockA );
1423
- // getBlock B
1424
- expect( fulfillment.next( blockB ).value ).toEqual( {
1425
- args: [],
1426
- selectorName: 'getSelectionStart',
1427
- storeKey: blockEditorStoreName,
1428
- type: '@@data/SELECT',
1429
- } );
1430
- expect(
1431
- fulfillment.next( {
1122
+ const select = {
1123
+ getBlock: ( clientId ) =>
1124
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
1125
+ getSelectionStart: () => ( {
1432
1126
  clientId: blockB.clientId,
1433
1127
  attributeKey: 'content2',
1434
1128
  offset: 0,
1435
- } ).value
1436
- ).toEqual(
1437
- selectionChange(
1438
- blockA.clientId,
1439
- 'content',
1440
- 'chicken'.length + 1,
1441
- 'chicken'.length + 1
1442
- )
1129
+ } ),
1130
+ };
1131
+ const dispatch = Object.assign( jest.fn(), {
1132
+ replaceBlocks: jest.fn(),
1133
+ selectionChange: jest.fn(),
1134
+ } );
1135
+
1136
+ mergeBlocks(
1137
+ blockA.clientId,
1138
+ blockB.clientId
1139
+ )( { select, dispatch } );
1140
+
1141
+ expect( dispatch.selectionChange ).toHaveBeenCalledWith(
1142
+ blockA.clientId,
1143
+ 'content',
1144
+ 'chicken'.length + 1,
1145
+ 'chicken'.length + 1
1443
1146
  );
1444
1147
 
1445
- fulfillment.next();
1446
- fulfillment.next();
1447
- fulfillment.next();
1448
- expect( fulfillment.next( blockA ).value ).toMatchObject( {
1449
- type: 'REPLACE_BLOCKS',
1450
- clientIds: [ 'chicken', 'ribs' ],
1451
- blocks: [
1452
- {
1148
+ expect( dispatch.replaceBlocks ).toHaveBeenCalledWith(
1149
+ [ 'chicken', 'ribs' ],
1150
+ [
1151
+ expect.objectContaining( {
1453
1152
  clientId: 'chicken',
1454
1153
  name: 'core/test-block',
1455
1154
  attributes: { content: 'chicken ribs' },
1456
- },
1155
+ } ),
1457
1156
  ],
1458
- } );
1157
+ 0
1158
+ );
1459
1159
  } );
1460
1160
  } );
1461
1161
 
@@ -1466,6 +1166,7 @@ describe( 'actions', () => {
1466
1166
  actions,
1467
1167
  selectors,
1468
1168
  reducer,
1169
+ __experimentalUseThunks: true,
1469
1170
  } );
1470
1171
 
1471
1172
  registerBlockType( 'core/test-block', defaultBlockSettings );