@wordpress/block-editor 10.4.0 → 11.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 (638) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +0 -1
  3. package/build/autocompleters/block.js +2 -6
  4. package/build/autocompleters/block.js.map +1 -1
  5. package/build/autocompleters/link.js +2 -0
  6. package/build/autocompleters/link.js.map +1 -1
  7. package/build/components/block-card/index.js +51 -3
  8. package/build/components/block-card/index.js.map +1 -1
  9. package/build/components/block-draggable/index.native.js +46 -39
  10. package/build/components/block-draggable/index.native.js.map +1 -1
  11. package/build/components/block-edit/edit.js +4 -3
  12. package/build/components/block-edit/edit.js.map +1 -1
  13. package/build/components/block-edit/edit.native.js +4 -7
  14. package/build/components/block-edit/edit.native.js.map +1 -1
  15. package/build/components/block-inspector/index.js +35 -33
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/block-list-context.native.js +5 -8
  18. package/build/components/block-list/block-list-context.native.js.map +1 -1
  19. package/build/components/block-list/block.js +55 -24
  20. package/build/components/block-list/block.js.map +1 -1
  21. package/build/components/block-list/block.native.js +61 -28
  22. package/build/components/block-list/block.native.js.map +1 -1
  23. package/build/components/block-lock/menu-item.js +1 -1
  24. package/build/components/block-lock/menu-item.js.map +1 -1
  25. package/build/components/block-lock/modal.js +16 -9
  26. package/build/components/block-lock/modal.js.map +1 -1
  27. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +12 -4
  28. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  29. package/build/components/block-pattern-setup/index.js +3 -2
  30. package/build/components/block-pattern-setup/index.js.map +1 -1
  31. package/build/components/block-patterns-list/index.js +33 -11
  32. package/build/components/block-patterns-list/index.js.map +1 -1
  33. package/build/components/block-preview/auto.js +9 -3
  34. package/build/components/block-preview/auto.js.map +1 -1
  35. package/build/components/block-preview/index.js +5 -9
  36. package/build/components/block-preview/index.js.map +1 -1
  37. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -2
  38. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  39. package/build/components/block-styles/utils.js +3 -3
  40. package/build/components/block-styles/utils.js.map +1 -1
  41. package/build/components/block-switcher/index.js +19 -4
  42. package/build/components/block-switcher/index.js.map +1 -1
  43. package/build/components/block-toolbar/index.js +5 -1
  44. package/build/components/block-toolbar/index.js.map +1 -1
  45. package/build/components/block-tools/insertion-point.js +8 -49
  46. package/build/components/block-tools/insertion-point.js.map +1 -1
  47. package/build/components/block-tools/selected-block-popover.js +27 -4
  48. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  49. package/build/components/block-variation-picker/index.js +1 -2
  50. package/build/components/block-variation-picker/index.js.map +1 -1
  51. package/build/components/colors/with-colors.js +4 -3
  52. package/build/components/colors/with-colors.js.map +1 -1
  53. package/build/components/font-sizes/fluid-utils.js +24 -40
  54. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  55. package/build/components/font-sizes/with-font-sizes.js +7 -5
  56. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  57. package/build/components/height-control/index.js +115 -0
  58. package/build/components/height-control/index.js.map +1 -0
  59. package/build/components/iframe/index.js +11 -8
  60. package/build/components/iframe/index.js.map +1 -1
  61. package/build/components/image-editor/use-save-image.js +2 -0
  62. package/build/components/image-editor/use-save-image.js.map +1 -1
  63. package/build/components/image-editor/zoom-dropdown.js +1 -0
  64. package/build/components/image-editor/zoom-dropdown.js.map +1 -1
  65. package/build/components/index.js +18 -0
  66. package/build/components/index.js.map +1 -1
  67. package/build/components/inner-blocks/index.js +25 -9
  68. package/build/components/inner-blocks/index.js.map +1 -1
  69. package/build/components/inner-blocks/use-inner-block-template-sync.js +25 -10
  70. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  71. package/build/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  72. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  73. package/build/components/inserter/block-patterns-tab.js +25 -46
  74. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  75. package/build/components/inserter/block-types-tab.js +3 -1
  76. package/build/components/inserter/block-types-tab.js.map +1 -1
  77. package/build/components/inserter/hooks/use-debounced-input.js +27 -0
  78. package/build/components/inserter/hooks/use-debounced-input.js.map +1 -0
  79. package/build/components/inserter/index.js +8 -3
  80. package/build/components/inserter/index.js.map +1 -1
  81. package/build/components/inserter/index.native.js +3 -4
  82. package/build/components/inserter/index.native.js.map +1 -1
  83. package/build/components/inserter/media-tab/hooks.js +103 -0
  84. package/build/components/inserter/media-tab/hooks.js.map +1 -0
  85. package/build/components/inserter/media-tab/index.js +32 -0
  86. package/build/components/inserter/media-tab/index.js.map +1 -0
  87. package/build/components/inserter/media-tab/media-list.js +100 -0
  88. package/build/components/inserter/media-tab/media-list.js.map +1 -0
  89. package/build/components/inserter/media-tab/media-panel.js +96 -0
  90. package/build/components/inserter/media-tab/media-panel.js.map +1 -0
  91. package/build/components/inserter/media-tab/media-tab.js +120 -0
  92. package/build/components/inserter/media-tab/media-tab.js.map +1 -0
  93. package/build/components/inserter/media-tab/utils.js +54 -0
  94. package/build/components/inserter/media-tab/utils.js.map +1 -0
  95. package/build/components/inserter/menu.js +35 -12
  96. package/build/components/inserter/menu.js.map +1 -1
  97. package/build/components/inserter/mobile-tab-navigation.js +70 -0
  98. package/build/components/inserter/mobile-tab-navigation.js.map +1 -0
  99. package/build/components/inserter/quick-inserter.js +1 -0
  100. package/build/components/inserter/quick-inserter.js.map +1 -1
  101. package/build/components/inserter/reusable-blocks-tab.js +4 -1
  102. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  103. package/build/components/inserter/search-results.js +3 -1
  104. package/build/components/inserter/search-results.js.map +1 -1
  105. package/build/components/inserter/tabs.js +16 -2
  106. package/build/components/inserter/tabs.js.map +1 -1
  107. package/build/components/inserter-list-item/index.js +4 -1
  108. package/build/components/inserter-list-item/index.js.map +1 -1
  109. package/build/components/inspector-controls/groups.js +2 -0
  110. package/build/components/inspector-controls/groups.js.map +1 -1
  111. package/build/components/inspector-controls-tabs/advanced-controls-panel.js +46 -0
  112. package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  113. package/build/components/inspector-controls-tabs/index.js +71 -0
  114. package/build/components/inspector-controls-tabs/index.js.map +1 -0
  115. package/build/components/inspector-controls-tabs/settings-tab.js +28 -0
  116. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  117. package/build/components/inspector-controls-tabs/styles-tab.js +61 -0
  118. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  119. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +97 -0
  120. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  121. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +18 -0
  122. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  123. package/build/components/inspector-controls-tabs/utils.js +37 -0
  124. package/build/components/inspector-controls-tabs/utils.js.map +1 -0
  125. package/build/components/link-control/index.js +19 -34
  126. package/build/components/link-control/index.js.map +1 -1
  127. package/build/components/link-control/search-input.js +1 -2
  128. package/build/components/link-control/search-input.js.map +1 -1
  129. package/build/components/link-control/use-internal-input-value.js +26 -0
  130. package/build/components/link-control/use-internal-input-value.js.map +1 -0
  131. package/build/components/list-view/block.js +10 -5
  132. package/build/components/list-view/block.js.map +1 -1
  133. package/build/components/list-view/branch.js +22 -15
  134. package/build/components/list-view/branch.js.map +1 -1
  135. package/build/components/media-upload/index.native.js +2 -3
  136. package/build/components/media-upload/index.native.js.map +1 -1
  137. package/build/components/off-canvas-editor/appender.js +104 -0
  138. package/build/components/off-canvas-editor/appender.js.map +1 -0
  139. package/build/components/off-canvas-editor/block-contents.js +100 -0
  140. package/build/components/off-canvas-editor/block-contents.js.map +1 -0
  141. package/build/components/off-canvas-editor/block-edit-button.js +50 -0
  142. package/build/components/off-canvas-editor/block-edit-button.js.map +1 -0
  143. package/build/components/off-canvas-editor/block-select-button.js +119 -0
  144. package/build/components/off-canvas-editor/block-select-button.js.map +1 -0
  145. package/build/components/off-canvas-editor/block.js +324 -0
  146. package/build/components/off-canvas-editor/block.js.map +1 -0
  147. package/build/components/off-canvas-editor/branch.js +179 -0
  148. package/build/components/off-canvas-editor/branch.js.map +1 -0
  149. package/build/components/off-canvas-editor/context.js +19 -0
  150. package/build/components/off-canvas-editor/context.js.map +1 -0
  151. package/build/components/off-canvas-editor/drop-indicator.js +118 -0
  152. package/build/components/off-canvas-editor/drop-indicator.js.map +1 -0
  153. package/build/components/off-canvas-editor/expander.js +41 -0
  154. package/build/components/off-canvas-editor/expander.js.map +1 -0
  155. package/build/components/off-canvas-editor/index.js +213 -0
  156. package/build/components/off-canvas-editor/index.js.map +1 -0
  157. package/build/components/off-canvas-editor/leaf.js +60 -0
  158. package/build/components/off-canvas-editor/leaf.js.map +1 -0
  159. package/build/components/off-canvas-editor/link-ui.js +185 -0
  160. package/build/components/off-canvas-editor/link-ui.js.map +1 -0
  161. package/build/components/off-canvas-editor/update-attributes.js +108 -0
  162. package/build/components/off-canvas-editor/update-attributes.js.map +1 -0
  163. package/build/components/off-canvas-editor/use-block-selection.js +139 -0
  164. package/build/components/off-canvas-editor/use-block-selection.js.map +1 -0
  165. package/build/components/off-canvas-editor/use-list-view-client-ids.js +33 -0
  166. package/build/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  167. package/build/components/off-canvas-editor/use-list-view-drop-zone.js +235 -0
  168. package/build/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  169. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js +60 -0
  170. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  171. package/build/components/off-canvas-editor/utils.js +60 -0
  172. package/build/components/off-canvas-editor/utils.js.map +1 -0
  173. package/build/components/rich-text/format-toolbar/index.js +8 -4
  174. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  175. package/build/components/rich-text/index.js +3 -3
  176. package/build/components/rich-text/index.js.map +1 -1
  177. package/build/components/rich-text/index.native.js +0 -2
  178. package/build/components/rich-text/index.native.js.map +1 -1
  179. package/build/components/rich-text/use-insert-replacement-text.js +43 -0
  180. package/build/components/rich-text/use-insert-replacement-text.js.map +1 -0
  181. package/build/components/rich-text/use-undo-automatic-change.js +9 -1
  182. package/build/components/rich-text/use-undo-automatic-change.js.map +1 -1
  183. package/build/components/rich-text/utils.js +1 -19
  184. package/build/components/rich-text/utils.js.map +1 -1
  185. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -3
  186. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  187. package/build/components/ungroup-button/index.native.js +4 -2
  188. package/build/components/ungroup-button/index.native.js.map +1 -1
  189. package/build/components/url-input/index.js +46 -43
  190. package/build/components/url-input/index.js.map +1 -1
  191. package/build/components/url-popover/index.js +31 -2
  192. package/build/components/url-popover/index.js.map +1 -1
  193. package/build/components/use-block-display-information/index.js +8 -4
  194. package/build/components/use-block-display-information/index.js.map +1 -1
  195. package/build/components/use-setting/index.js +10 -2
  196. package/build/components/use-setting/index.js.map +1 -1
  197. package/build/hooks/child-layout.js +209 -0
  198. package/build/hooks/child-layout.js.map +1 -0
  199. package/build/hooks/color-panel.js +17 -1
  200. package/build/hooks/color-panel.js.map +1 -1
  201. package/build/hooks/color.js +1 -1
  202. package/build/hooks/color.js.map +1 -1
  203. package/build/hooks/content-lock-ui.js +14 -7
  204. package/build/hooks/content-lock-ui.js.map +1 -1
  205. package/build/hooks/dimensions.js +65 -16
  206. package/build/hooks/dimensions.js.map +1 -1
  207. package/build/hooks/layout.js +59 -3
  208. package/build/hooks/layout.js.map +1 -1
  209. package/build/hooks/margin.js +4 -2
  210. package/build/hooks/margin.js.map +1 -1
  211. package/build/hooks/min-height.js +139 -0
  212. package/build/hooks/min-height.js.map +1 -0
  213. package/build/hooks/padding.js +4 -2
  214. package/build/hooks/padding.js.map +1 -1
  215. package/build/hooks/style.js +3 -2
  216. package/build/hooks/style.js.map +1 -1
  217. package/build/layouts/flex.js +22 -21
  218. package/build/layouts/flex.js.map +1 -1
  219. package/build/store/actions.js +26 -0
  220. package/build/store/actions.js.map +1 -1
  221. package/build/store/reducer.js +420 -265
  222. package/build/store/reducer.js.map +1 -1
  223. package/build/store/selectors.js +73 -49
  224. package/build/store/selectors.js.map +1 -1
  225. package/build/utils/sorting.js +63 -0
  226. package/build/utils/sorting.js.map +1 -0
  227. package/build-module/autocompleters/block.js +2 -6
  228. package/build-module/autocompleters/block.js.map +1 -1
  229. package/build-module/autocompleters/link.js +2 -0
  230. package/build-module/autocompleters/link.js.map +1 -1
  231. package/build-module/components/block-card/index.js +45 -3
  232. package/build-module/components/block-card/index.js.map +1 -1
  233. package/build-module/components/block-draggable/index.native.js +40 -31
  234. package/build-module/components/block-draggable/index.native.js.map +1 -1
  235. package/build-module/components/block-edit/edit.js +4 -2
  236. package/build-module/components/block-edit/edit.js.map +1 -1
  237. package/build-module/components/block-edit/edit.native.js +4 -6
  238. package/build-module/components/block-edit/edit.native.js.map +1 -1
  239. package/build-module/components/block-inspector/index.js +32 -30
  240. package/build-module/components/block-inspector/index.js.map +1 -1
  241. package/build-module/components/block-list/block-list-context.native.js +5 -8
  242. package/build-module/components/block-list/block-list-context.native.js.map +1 -1
  243. package/build-module/components/block-list/block.js +55 -25
  244. package/build-module/components/block-list/block.js.map +1 -1
  245. package/build-module/components/block-list/block.native.js +61 -28
  246. package/build-module/components/block-list/block.native.js.map +1 -1
  247. package/build-module/components/block-lock/menu-item.js +2 -2
  248. package/build-module/components/block-lock/menu-item.js.map +1 -1
  249. package/build-module/components/block-lock/modal.js +17 -10
  250. package/build-module/components/block-lock/modal.js.map +1 -1
  251. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +13 -6
  252. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  253. package/build-module/components/block-pattern-setup/index.js +3 -2
  254. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  255. package/build-module/components/block-patterns-list/index.js +35 -13
  256. package/build-module/components/block-patterns-list/index.js.map +1 -1
  257. package/build-module/components/block-preview/auto.js +9 -3
  258. package/build-module/components/block-preview/auto.js.map +1 -1
  259. package/build-module/components/block-preview/index.js +5 -8
  260. package/build-module/components/block-preview/index.js.map +1 -1
  261. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -2
  262. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  263. package/build-module/components/block-styles/utils.js +3 -3
  264. package/build-module/components/block-styles/utils.js.map +1 -1
  265. package/build-module/components/block-switcher/index.js +19 -4
  266. package/build-module/components/block-switcher/index.js.map +1 -1
  267. package/build-module/components/block-toolbar/index.js +6 -2
  268. package/build-module/components/block-toolbar/index.js.map +1 -1
  269. package/build-module/components/block-tools/insertion-point.js +8 -49
  270. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  271. package/build-module/components/block-tools/selected-block-popover.js +27 -5
  272. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  273. package/build-module/components/block-variation-picker/index.js +1 -2
  274. package/build-module/components/block-variation-picker/index.js.map +1 -1
  275. package/build-module/components/colors/with-colors.js +5 -4
  276. package/build-module/components/colors/with-colors.js.map +1 -1
  277. package/build-module/components/font-sizes/fluid-utils.js +24 -40
  278. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  279. package/build-module/components/font-sizes/with-font-sizes.js +8 -6
  280. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  281. package/build-module/components/height-control/index.js +103 -0
  282. package/build-module/components/height-control/index.js.map +1 -0
  283. package/build-module/components/iframe/index.js +11 -8
  284. package/build-module/components/iframe/index.js.map +1 -1
  285. package/build-module/components/image-editor/use-save-image.js +2 -0
  286. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  287. package/build-module/components/image-editor/zoom-dropdown.js +1 -0
  288. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -1
  289. package/build-module/components/index.js +2 -0
  290. package/build-module/components/index.js.map +1 -1
  291. package/build-module/components/inner-blocks/index.js +27 -11
  292. package/build-module/components/inner-blocks/index.js.map +1 -1
  293. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +23 -10
  294. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  295. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  296. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  297. package/build-module/components/inserter/block-patterns-tab.js +27 -49
  298. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  299. package/build-module/components/inserter/block-types-tab.js +3 -2
  300. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  301. package/build-module/components/inserter/hooks/use-debounced-input.js +18 -0
  302. package/build-module/components/inserter/hooks/use-debounced-input.js.map +1 -0
  303. package/build-module/components/inserter/index.js +8 -3
  304. package/build-module/components/inserter/index.js.map +1 -1
  305. package/build-module/components/inserter/index.native.js +3 -5
  306. package/build-module/components/inserter/index.native.js.map +1 -1
  307. package/build-module/components/inserter/media-tab/hooks.js +89 -0
  308. package/build-module/components/inserter/media-tab/hooks.js.map +1 -0
  309. package/build-module/components/inserter/media-tab/index.js +4 -0
  310. package/build-module/components/inserter/media-tab/index.js.map +1 -0
  311. package/build-module/components/inserter/media-tab/media-list.js +86 -0
  312. package/build-module/components/inserter/media-tab/media-list.js.map +1 -0
  313. package/build-module/components/inserter/media-tab/media-panel.js +77 -0
  314. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -0
  315. package/build-module/components/inserter/media-tab/media-tab.js +100 -0
  316. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -0
  317. package/build-module/components/inserter/media-tab/utils.js +45 -0
  318. package/build-module/components/inserter/media-tab/utils.js.map +1 -0
  319. package/build-module/components/inserter/menu.js +33 -12
  320. package/build-module/components/inserter/menu.js.map +1 -1
  321. package/build-module/components/inserter/mobile-tab-navigation.js +61 -0
  322. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -0
  323. package/build-module/components/inserter/quick-inserter.js +1 -0
  324. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  325. package/build-module/components/inserter/reusable-blocks-tab.js +3 -1
  326. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  327. package/build-module/components/inserter/search-results.js +3 -2
  328. package/build-module/components/inserter/search-results.js.map +1 -1
  329. package/build-module/components/inserter/tabs.js +15 -2
  330. package/build-module/components/inserter/tabs.js.map +1 -1
  331. package/build-module/components/inserter-list-item/index.js +5 -2
  332. package/build-module/components/inserter-list-item/index.js.map +1 -1
  333. package/build-module/components/inspector-controls/groups.js +2 -0
  334. package/build-module/components/inspector-controls/groups.js.map +1 -1
  335. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +32 -0
  336. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  337. package/build-module/components/inspector-controls-tabs/index.js +56 -0
  338. package/build-module/components/inspector-controls-tabs/index.js.map +1 -0
  339. package/build-module/components/inspector-controls-tabs/settings-tab.js +17 -0
  340. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  341. package/build-module/components/inspector-controls-tabs/styles-tab.js +46 -0
  342. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  343. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +81 -0
  344. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  345. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +8 -0
  346. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  347. package/build-module/components/inspector-controls-tabs/utils.js +26 -0
  348. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -0
  349. package/build-module/components/link-control/index.js +18 -34
  350. package/build-module/components/link-control/index.js.map +1 -1
  351. package/build-module/components/link-control/search-input.js +1 -2
  352. package/build-module/components/link-control/search-input.js.map +1 -1
  353. package/build-module/components/link-control/use-internal-input-value.js +18 -0
  354. package/build-module/components/link-control/use-internal-input-value.js.map +1 -0
  355. package/build-module/components/list-view/block.js +10 -5
  356. package/build-module/components/list-view/block.js.map +1 -1
  357. package/build-module/components/list-view/branch.js +21 -14
  358. package/build-module/components/list-view/branch.js.map +1 -1
  359. package/build-module/components/media-upload/index.native.js +2 -4
  360. package/build-module/components/media-upload/index.native.js.map +1 -1
  361. package/build-module/components/off-canvas-editor/appender.js +89 -0
  362. package/build-module/components/off-canvas-editor/appender.js.map +1 -0
  363. package/build-module/components/off-canvas-editor/block-contents.js +85 -0
  364. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -0
  365. package/build-module/components/off-canvas-editor/block-edit-button.js +35 -0
  366. package/build-module/components/off-canvas-editor/block-edit-button.js.map +1 -0
  367. package/build-module/components/off-canvas-editor/block-select-button.js +101 -0
  368. package/build-module/components/off-canvas-editor/block-select-button.js.map +1 -0
  369. package/build-module/components/off-canvas-editor/block.js +298 -0
  370. package/build-module/components/off-canvas-editor/block.js.map +1 -0
  371. package/build-module/components/off-canvas-editor/branch.js +164 -0
  372. package/build-module/components/off-canvas-editor/branch.js.map +1 -0
  373. package/build-module/components/off-canvas-editor/context.js +7 -0
  374. package/build-module/components/off-canvas-editor/context.js.map +1 -0
  375. package/build-module/components/off-canvas-editor/drop-indicator.js +111 -0
  376. package/build-module/components/off-canvas-editor/drop-indicator.js.map +1 -0
  377. package/build-module/components/off-canvas-editor/expander.js +32 -0
  378. package/build-module/components/off-canvas-editor/expander.js.map +1 -0
  379. package/build-module/components/off-canvas-editor/index.js +189 -0
  380. package/build-module/components/off-canvas-editor/index.js.map +1 -0
  381. package/build-module/components/off-canvas-editor/leaf.js +45 -0
  382. package/build-module/components/off-canvas-editor/leaf.js.map +1 -0
  383. package/build-module/components/off-canvas-editor/link-ui.js +165 -0
  384. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -0
  385. package/build-module/components/off-canvas-editor/update-attributes.js +97 -0
  386. package/build-module/components/off-canvas-editor/update-attributes.js.map +1 -0
  387. package/build-module/components/off-canvas-editor/use-block-selection.js +124 -0
  388. package/build-module/components/off-canvas-editor/use-block-selection.js.map +1 -0
  389. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js +24 -0
  390. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  391. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js +220 -0
  392. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  393. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js +50 -0
  394. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  395. package/build-module/components/off-canvas-editor/utils.js +44 -0
  396. package/build-module/components/off-canvas-editor/utils.js.map +1 -0
  397. package/build-module/components/rich-text/format-toolbar/index.js +6 -2
  398. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  399. package/build-module/components/rich-text/index.js +2 -3
  400. package/build-module/components/rich-text/index.js.map +1 -1
  401. package/build-module/components/rich-text/index.native.js +0 -2
  402. package/build-module/components/rich-text/index.native.js.map +1 -1
  403. package/build-module/components/rich-text/use-insert-replacement-text.js +33 -0
  404. package/build-module/components/rich-text/use-insert-replacement-text.js.map +1 -0
  405. package/build-module/components/rich-text/use-undo-automatic-change.js +9 -1
  406. package/build-module/components/rich-text/use-undo-automatic-change.js.map +1 -1
  407. package/build-module/components/rich-text/utils.js +1 -16
  408. package/build-module/components/rich-text/utils.js.map +1 -1
  409. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -3
  410. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  411. package/build-module/components/ungroup-button/index.native.js +3 -2
  412. package/build-module/components/ungroup-button/index.native.js.map +1 -1
  413. package/build-module/components/url-input/index.js +46 -43
  414. package/build-module/components/url-input/index.js.map +1 -1
  415. package/build-module/components/url-popover/index.js +30 -3
  416. package/build-module/components/url-popover/index.js.map +1 -1
  417. package/build-module/components/use-block-display-information/index.js +9 -5
  418. package/build-module/components/use-block-display-information/index.js.map +1 -1
  419. package/build-module/components/use-setting/index.js +9 -2
  420. package/build-module/components/use-setting/index.js.map +1 -1
  421. package/build-module/hooks/child-layout.js +189 -0
  422. package/build-module/hooks/child-layout.js.map +1 -0
  423. package/build-module/hooks/color-panel.js +17 -1
  424. package/build-module/hooks/color-panel.js.map +1 -1
  425. package/build-module/hooks/color.js +1 -1
  426. package/build-module/hooks/color.js.map +1 -1
  427. package/build-module/hooks/content-lock-ui.js +16 -9
  428. package/build-module/hooks/content-lock-ui.js.map +1 -1
  429. package/build-module/hooks/dimensions.js +60 -16
  430. package/build-module/hooks/dimensions.js.map +1 -1
  431. package/build-module/hooks/layout.js +57 -2
  432. package/build-module/hooks/layout.js.map +1 -1
  433. package/build-module/hooks/margin.js +4 -2
  434. package/build-module/hooks/margin.js.map +1 -1
  435. package/build-module/hooks/min-height.js +116 -0
  436. package/build-module/hooks/min-height.js.map +1 -0
  437. package/build-module/hooks/padding.js +4 -2
  438. package/build-module/hooks/padding.js.map +1 -1
  439. package/build-module/hooks/style.js +4 -3
  440. package/build-module/hooks/style.js.map +1 -1
  441. package/build-module/layouts/flex.js +23 -22
  442. package/build-module/layouts/flex.js.map +1 -1
  443. package/build-module/store/actions.js +22 -0
  444. package/build-module/store/actions.js.map +1 -1
  445. package/build-module/store/reducer.js +415 -265
  446. package/build-module/store/reducer.js.map +1 -1
  447. package/build-module/store/selectors.js +66 -48
  448. package/build-module/store/selectors.js.map +1 -1
  449. package/build-module/utils/sorting.js +56 -0
  450. package/build-module/utils/sorting.js.map +1 -0
  451. package/build-style/content-rtl.css +701 -0
  452. package/build-style/content.css +701 -0
  453. package/build-style/default-editor-styles-rtl.css +14 -0
  454. package/build-style/default-editor-styles.css +14 -0
  455. package/build-style/style-rtl.css +305 -668
  456. package/build-style/style.css +305 -668
  457. package/package.json +32 -30
  458. package/src/autocompleters/block.js +2 -6
  459. package/src/autocompleters/link.js +2 -0
  460. package/src/components/alignment-control/README.md +1 -1
  461. package/src/components/alignment-control/test/index.js +4 -1
  462. package/src/components/block-alignment-control/test/index.js +4 -1
  463. package/src/components/block-alignment-control/test/index.native.js +4 -4
  464. package/src/components/block-card/index.js +46 -2
  465. package/src/components/block-card/style.scss +4 -0
  466. package/src/components/block-content-overlay/{style.scss → content.scss} +7 -1
  467. package/src/components/block-draggable/content.scss +20 -0
  468. package/src/components/block-draggable/index.native.js +54 -40
  469. package/src/components/block-draggable/style.scss +0 -21
  470. package/src/components/block-draggable/test/helpers.native.js +7 -9
  471. package/src/components/block-draggable/test/index.native.js +35 -45
  472. package/src/components/block-edit/edit.js +5 -2
  473. package/src/components/block-edit/edit.native.js +5 -6
  474. package/src/components/block-inspector/index.js +96 -81
  475. package/src/components/block-inspector/style.scss +9 -1
  476. package/src/components/block-list/block-list-context.native.js +5 -8
  477. package/src/components/block-list/block.js +74 -23
  478. package/src/components/block-list/block.native.js +78 -23
  479. package/src/components/block-list/{style.scss → content.scss} +11 -20
  480. package/src/components/block-list-appender/{style.scss → content.scss} +0 -0
  481. package/src/components/block-lock/menu-item.js +5 -2
  482. package/src/components/block-lock/modal.js +19 -36
  483. package/src/components/block-lock/style.scss +8 -17
  484. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +24 -6
  485. package/src/components/block-mover/style.scss +0 -1
  486. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +0 -2
  487. package/src/components/block-pattern-setup/index.js +2 -1
  488. package/src/components/block-patterns-list/index.js +47 -24
  489. package/src/components/block-popover/style.scss +1 -1
  490. package/src/components/block-preview/README.md +15 -10
  491. package/src/components/block-preview/auto.js +7 -1
  492. package/src/components/block-preview/content.scss +4 -0
  493. package/src/components/block-preview/index.js +7 -12
  494. package/src/components/block-preview/style.scss +0 -7
  495. package/src/components/block-preview/test/index.js +18 -35
  496. package/src/components/block-selection-clearer/test/index.js +12 -12
  497. package/src/components/block-settings-menu/block-settings-dropdown.js +32 -20
  498. package/src/components/block-styles/utils.js +3 -3
  499. package/src/components/block-switcher/index.js +19 -4
  500. package/src/components/block-switcher/test/index.js +4 -0
  501. package/src/components/block-toolbar/index.js +12 -5
  502. package/src/components/block-toolbar/style.scss +10 -0
  503. package/src/components/block-tools/insertion-point.js +3 -47
  504. package/src/components/block-tools/selected-block-popover.js +80 -34
  505. package/src/components/block-tools/style.scss +27 -5
  506. package/src/components/block-variation-picker/index.js +1 -4
  507. package/src/components/block-vertical-alignment-control/test/index.js +4 -1
  508. package/src/components/colors/with-colors.js +13 -23
  509. package/src/components/default-block-appender/{style.scss → content.scss} +1 -0
  510. package/src/components/font-sizes/fluid-utils.js +37 -64
  511. package/src/components/font-sizes/test/fluid-utils.js +5 -5
  512. package/src/components/font-sizes/with-font-sizes.js +14 -11
  513. package/src/components/height-control/index.js +123 -0
  514. package/src/components/height-control/stories/index.js +21 -0
  515. package/src/components/height-control/style.scss +5 -0
  516. package/src/components/iframe/index.js +25 -18
  517. package/src/components/image-editor/use-save-image.js +2 -0
  518. package/src/components/image-editor/zoom-dropdown.js +1 -0
  519. package/src/components/index.js +2 -0
  520. package/src/components/inner-blocks/{style.scss → content.scss} +0 -0
  521. package/src/components/inner-blocks/index.js +30 -10
  522. package/src/components/inner-blocks/use-inner-block-template-sync.js +28 -10
  523. package/src/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  524. package/src/components/inserter/block-patterns-tab.js +28 -71
  525. package/src/components/inserter/block-types-tab.js +3 -2
  526. package/src/components/inserter/hooks/use-debounced-input.js +17 -0
  527. package/src/components/inserter/index.js +10 -2
  528. package/src/components/inserter/index.native.js +1 -1
  529. package/src/components/inserter/media-tab/hooks.js +88 -0
  530. package/src/components/inserter/media-tab/index.js +3 -0
  531. package/src/components/inserter/media-tab/media-list.js +93 -0
  532. package/src/components/inserter/media-tab/media-panel.js +83 -0
  533. package/src/components/inserter/media-tab/media-tab.js +135 -0
  534. package/src/components/inserter/media-tab/utils.js +37 -0
  535. package/src/components/inserter/menu.js +55 -13
  536. package/src/components/inserter/mobile-tab-navigation.js +85 -0
  537. package/src/components/inserter/quick-inserter.js +1 -0
  538. package/src/components/inserter/reusable-blocks-tab.js +4 -2
  539. package/src/components/inserter/search-results.js +3 -2
  540. package/src/components/inserter/stories/index.js +1 -1
  541. package/src/components/inserter/stories/{fixtures.js → utils/fixtures.js} +0 -0
  542. package/src/components/inserter/style.scss +184 -18
  543. package/src/components/inserter/tabs.js +12 -1
  544. package/src/components/inserter/test/reusable-blocks-tab.js +14 -57
  545. package/src/components/inserter-list-item/index.js +11 -1
  546. package/src/components/inserter-list-item/style.scss +26 -0
  547. package/src/components/inspector-controls/groups.js +2 -0
  548. package/src/components/inspector-controls-tabs/advanced-controls-panel.js +37 -0
  549. package/src/components/inspector-controls-tabs/index.js +62 -0
  550. package/src/components/inspector-controls-tabs/settings-tab.js +18 -0
  551. package/src/components/inspector-controls-tabs/styles-tab.js +51 -0
  552. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +89 -0
  553. package/src/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +9 -0
  554. package/src/components/inspector-controls-tabs/utils.js +28 -0
  555. package/src/components/line-height-control/test/index.js +5 -5
  556. package/src/components/link-control/README.md +1 -1
  557. package/src/components/link-control/index.js +24 -39
  558. package/src/components/link-control/search-input.js +1 -2
  559. package/src/components/link-control/test/index.js +400 -582
  560. package/src/components/link-control/use-internal-input-value.js +22 -0
  561. package/src/components/list-view/block.js +7 -3
  562. package/src/components/list-view/branch.js +21 -14
  563. package/src/components/list-view/style.scss +20 -9
  564. package/src/components/media-placeholder/{style.scss → content.scss} +0 -0
  565. package/src/components/media-replace-flow/test/index.js +37 -9
  566. package/src/components/media-upload/test/index.native.js +2 -0
  567. package/src/components/off-canvas-editor/README.md +5 -0
  568. package/src/components/off-canvas-editor/appender.js +93 -0
  569. package/src/components/off-canvas-editor/block-contents.js +89 -0
  570. package/src/components/off-canvas-editor/block-edit-button.js +27 -0
  571. package/src/components/off-canvas-editor/block-select-button.js +113 -0
  572. package/src/components/off-canvas-editor/block.js +401 -0
  573. package/src/components/off-canvas-editor/branch.js +208 -0
  574. package/src/components/off-canvas-editor/context.js +8 -0
  575. package/src/components/off-canvas-editor/drop-indicator.js +126 -0
  576. package/src/components/off-canvas-editor/expander.js +26 -0
  577. package/src/components/off-canvas-editor/index.js +242 -0
  578. package/src/components/off-canvas-editor/leaf.js +52 -0
  579. package/src/components/off-canvas-editor/link-ui.js +166 -0
  580. package/src/components/off-canvas-editor/style.scss +26 -0
  581. package/src/components/off-canvas-editor/test/utils.js +50 -0
  582. package/src/components/off-canvas-editor/update-attributes.js +99 -0
  583. package/src/components/off-canvas-editor/use-block-selection.js +169 -0
  584. package/src/components/off-canvas-editor/use-list-view-client-ids.js +29 -0
  585. package/src/components/off-canvas-editor/use-list-view-drop-zone.js +260 -0
  586. package/src/components/off-canvas-editor/use-list-view-expand-selected-item.js +58 -0
  587. package/src/components/off-canvas-editor/utils.js +58 -0
  588. package/src/components/plain-text/{style.scss → content.scss} +0 -0
  589. package/src/components/recursion-provider/test/index.js +27 -29
  590. package/src/components/responsive-block-control/test/index.js +69 -92
  591. package/src/components/rich-text/content.scss +42 -0
  592. package/src/components/rich-text/format-toolbar/index.js +6 -4
  593. package/src/components/rich-text/index.js +2 -2
  594. package/src/components/rich-text/index.native.js +0 -2
  595. package/src/components/rich-text/style.scss +0 -43
  596. package/src/components/rich-text/use-insert-replacement-text.js +31 -0
  597. package/src/components/rich-text/use-undo-automatic-change.js +7 -1
  598. package/src/components/rich-text/utils.js +2 -21
  599. package/src/components/spacing-sizes-control/spacing-input-control.js +9 -0
  600. package/src/components/ungroup-button/index.native.js +6 -2
  601. package/src/components/url-input/index.js +57 -73
  602. package/src/components/url-popover/README.md +12 -3
  603. package/src/components/url-popover/index.js +33 -3
  604. package/src/components/url-popover/test/__snapshots__/index.js.snap +8 -6
  605. package/src/components/url-popover/test/index.js +21 -9
  606. package/src/components/use-block-display-information/index.js +14 -5
  607. package/src/components/use-setting/index.js +20 -2
  608. package/src/components/use-setting/test/index.js +99 -0
  609. package/src/content.scss +10 -0
  610. package/src/hooks/child-layout.js +190 -0
  611. package/src/hooks/color-panel.js +13 -1
  612. package/src/hooks/color.js +2 -0
  613. package/src/hooks/content-lock-ui.js +47 -35
  614. package/src/hooks/dimensions.js +119 -21
  615. package/src/hooks/layout.js +62 -3
  616. package/src/hooks/margin.js +4 -3
  617. package/src/hooks/min-height.js +104 -0
  618. package/src/hooks/padding.js +4 -3
  619. package/src/hooks/style.js +10 -2
  620. package/src/hooks/test/style.js +4 -0
  621. package/src/hooks/test/use-typography-props.js +1 -1
  622. package/src/layouts/flex.js +43 -38
  623. package/src/store/actions.js +22 -0
  624. package/src/store/reducer.js +480 -434
  625. package/src/store/selectors.js +70 -64
  626. package/src/store/test/actions.js +18 -0
  627. package/src/store/test/performance.js +71 -0
  628. package/src/store/test/reducer.js +662 -490
  629. package/src/store/test/selectors.js +1839 -1306
  630. package/src/style.scss +4 -7
  631. package/src/utils/sorting.js +54 -0
  632. package/src/utils/test/sorting.js +49 -0
  633. package/tsconfig.tsbuildinfo +1 -1
  634. package/build/components/block-preview/live.js +0 -30
  635. package/build/components/block-preview/live.js.map +0 -1
  636. package/build-module/components/block-preview/live.js +0 -20
  637. package/build-module/components/block-preview/live.js.map +0 -1
  638. package/src/components/block-preview/live.js +0 -19
@@ -19,6 +19,7 @@ import {
19
19
  hasSameKeys,
20
20
  isUpdatingSameBlockAttribute,
21
21
  blocks,
22
+ isBlockInterfaceHidden,
22
23
  isTyping,
23
24
  draggedBlocks,
24
25
  selection,
@@ -209,38 +210,48 @@ describe( 'state', () => {
209
210
  } );
210
211
  it( 'can replace a child block', () => {
211
212
  const existingState = deepFreeze( {
212
- byClientId: {
213
- chicken: {
214
- clientId: 'chicken',
215
- name: 'core/test-parent-block',
216
- isValid: true,
217
- },
218
- 'chicken-child': {
219
- clientId: 'chicken-child',
220
- name: 'core/test-child-block',
221
- isValid: true,
222
- },
223
- },
224
- attributes: {
225
- chicken: {},
226
- 'chicken-child': {
227
- attr: true,
228
- },
229
- },
230
- order: {
231
- '': [ 'chicken' ],
232
- chicken: [ 'chicken-child' ],
233
- 'chicken-child': [],
234
- },
235
- parents: {
236
- chicken: '',
237
- 'chicken-child': 'chicken',
238
- },
239
- tree: {
240
- '': {},
241
- chicken: {},
242
- 'chicken-child': {},
243
- },
213
+ byClientId: new Map(
214
+ Object.entries( {
215
+ chicken: {
216
+ clientId: 'chicken',
217
+ name: 'core/test-parent-block',
218
+ isValid: true,
219
+ },
220
+ 'chicken-child': {
221
+ clientId: 'chicken-child',
222
+ name: 'core/test-child-block',
223
+ isValid: true,
224
+ },
225
+ } )
226
+ ),
227
+ attributes: new Map(
228
+ Object.entries( {
229
+ chicken: {},
230
+ 'chicken-child': {
231
+ attr: true,
232
+ },
233
+ } )
234
+ ),
235
+ order: new Map(
236
+ Object.entries( {
237
+ '': [ 'chicken' ],
238
+ chicken: [ 'chicken-child' ],
239
+ 'chicken-child': [],
240
+ } )
241
+ ),
242
+ parents: new Map(
243
+ Object.entries( {
244
+ chicken: '',
245
+ 'chicken-child': 'chicken',
246
+ } )
247
+ ),
248
+ tree: new Map(
249
+ Object.entries( {
250
+ '': {},
251
+ chicken: {},
252
+ 'chicken-child': {},
253
+ } )
254
+ ),
244
255
  controlledInnerBlocks: {},
245
256
  } );
246
257
 
@@ -263,66 +274,84 @@ describe( 'state', () => {
263
274
  expect( restState ).toEqual( {
264
275
  isPersistentChange: true,
265
276
  isIgnoredChange: false,
266
- byClientId: {
267
- chicken: {
268
- clientId: 'chicken',
269
- name: 'core/test-parent-block',
270
- isValid: true,
271
- },
272
- [ newChildBlockId ]: {
273
- clientId: newChildBlockId,
274
- name: 'core/test-child-block',
275
- isValid: true,
276
- },
277
- },
278
- attributes: {
279
- chicken: {},
280
- [ newChildBlockId ]: {
281
- attr: false,
282
- attr2: 'perfect',
283
- },
284
- },
285
- order: {
286
- '': [ 'chicken' ],
287
- chicken: [ newChildBlockId ],
288
- [ newChildBlockId ]: [],
289
- },
290
- parents: {
291
- [ newChildBlockId ]: 'chicken',
292
- chicken: '',
293
- },
277
+ byClientId: new Map(
278
+ Object.entries( {
279
+ chicken: {
280
+ clientId: 'chicken',
281
+ name: 'core/test-parent-block',
282
+ isValid: true,
283
+ },
284
+ [ newChildBlockId ]: {
285
+ clientId: newChildBlockId,
286
+ name: 'core/test-child-block',
287
+ isValid: true,
288
+ },
289
+ } )
290
+ ),
291
+ attributes: new Map(
292
+ Object.entries( {
293
+ chicken: {},
294
+ [ newChildBlockId ]: {
295
+ attr: false,
296
+ attr2: 'perfect',
297
+ },
298
+ } )
299
+ ),
300
+ order: new Map(
301
+ Object.entries( {
302
+ '': [ 'chicken' ],
303
+ chicken: [ newChildBlockId ],
304
+ [ newChildBlockId ]: [],
305
+ } )
306
+ ),
307
+ parents: new Map(
308
+ Object.entries( {
309
+ [ newChildBlockId ]: 'chicken',
310
+ chicken: '',
311
+ } )
312
+ ),
294
313
  controlledInnerBlocks: {},
295
314
  } );
296
- expect( state.tree.chicken ).not.toBe(
297
- existingState.tree.chicken
315
+ expect( state.tree.get( 'chicken' ) ).not.toBe(
316
+ existingState.tree.get( 'chicken' )
298
317
  );
299
318
  } );
300
319
 
301
320
  it( 'can insert a child block', () => {
302
321
  const existingState = deepFreeze( {
303
- byClientId: {
304
- chicken: {
305
- clientId: 'chicken',
306
- name: 'core/test-parent-block',
307
- isValid: true,
308
- },
309
- },
310
- attributes: {
311
- chicken: {},
312
- },
313
- order: {
314
- '': [ 'chicken' ],
315
- chicken: [],
316
- },
317
- parents: {
318
- chicken: '',
319
- },
320
- tree: {
321
- '': {
322
- innerBlocks: [],
323
- },
324
- chicken: {},
325
- },
322
+ byClientId: new Map(
323
+ Object.entries( {
324
+ chicken: {
325
+ clientId: 'chicken',
326
+ name: 'core/test-parent-block',
327
+ isValid: true,
328
+ },
329
+ } )
330
+ ),
331
+ attributes: new Map(
332
+ Object.entries( {
333
+ chicken: {},
334
+ } )
335
+ ),
336
+ order: new Map(
337
+ Object.entries( {
338
+ '': [ 'chicken' ],
339
+ chicken: [],
340
+ } )
341
+ ),
342
+ parents: new Map(
343
+ Object.entries( {
344
+ chicken: '',
345
+ } )
346
+ ),
347
+ tree: new Map(
348
+ Object.entries( {
349
+ '': {
350
+ innerBlocks: [],
351
+ },
352
+ chicken: {},
353
+ } )
354
+ ),
326
355
  controlledInnerBlocks: {},
327
356
  } );
328
357
 
@@ -345,46 +374,54 @@ describe( 'state', () => {
345
374
  expect( restState ).toEqual( {
346
375
  isPersistentChange: true,
347
376
  isIgnoredChange: false,
348
- byClientId: {
349
- chicken: {
350
- clientId: 'chicken',
351
- name: 'core/test-parent-block',
352
- isValid: true,
353
- },
354
- [ newChildBlockId ]: {
355
- clientId: newChildBlockId,
356
- name: 'core/test-child-block',
357
- isValid: true,
358
- },
359
- },
360
- attributes: {
361
- chicken: {},
362
- [ newChildBlockId ]: {
363
- attr: false,
364
- attr2: 'perfect',
365
- },
366
- },
367
- order: {
368
- '': [ 'chicken' ],
369
- chicken: [ newChildBlockId ],
370
- [ newChildBlockId ]: [],
371
- },
372
- parents: {
373
- [ newChildBlockId ]: 'chicken',
374
- chicken: '',
375
- },
377
+ byClientId: new Map(
378
+ Object.entries( {
379
+ chicken: {
380
+ clientId: 'chicken',
381
+ name: 'core/test-parent-block',
382
+ isValid: true,
383
+ },
384
+ [ newChildBlockId ]: {
385
+ clientId: newChildBlockId,
386
+ name: 'core/test-child-block',
387
+ isValid: true,
388
+ },
389
+ } )
390
+ ),
391
+ attributes: new Map(
392
+ Object.entries( {
393
+ chicken: {},
394
+ [ newChildBlockId ]: {
395
+ attr: false,
396
+ attr2: 'perfect',
397
+ },
398
+ } )
399
+ ),
400
+ order: new Map(
401
+ Object.entries( {
402
+ '': [ 'chicken' ],
403
+ chicken: [ newChildBlockId ],
404
+ [ newChildBlockId ]: [],
405
+ } )
406
+ ),
407
+ parents: new Map(
408
+ Object.entries( {
409
+ [ newChildBlockId ]: 'chicken',
410
+ chicken: '',
411
+ } )
412
+ ),
376
413
  controlledInnerBlocks: {},
377
414
  } );
378
- expect( state.tree.chicken ).not.toBe(
379
- existingState.tree.chicken
415
+ expect( state.tree.get( 'chicken' ) ).not.toBe(
416
+ existingState.tree.get( 'chicken' )
380
417
  );
381
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
382
- state.tree.chicken
418
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
419
+ state.tree.get( 'chicken' )
383
420
  );
384
- expect( state.tree.chicken.innerBlocks[ 0 ] ).toBe(
385
- state.tree[ newChildBlockId ]
421
+ expect( state.tree.get( 'chicken' ).innerBlocks[ 0 ] ).toBe(
422
+ state.tree.get( newChildBlockId )
386
423
  );
387
- expect( state.tree[ newChildBlockId ] ).toEqual( {
424
+ expect( state.tree.get( newChildBlockId ) ).toEqual( {
388
425
  clientId: newChildBlockId,
389
426
  innerBlocks: [],
390
427
  isValid: true,
@@ -398,44 +435,52 @@ describe( 'state', () => {
398
435
 
399
436
  it( 'can replace multiple child blocks', () => {
400
437
  const existingState = deepFreeze( {
401
- byClientId: {
402
- chicken: {
403
- clientId: 'chicken',
404
- name: 'core/test-parent-block',
405
- isValid: true,
406
- },
407
- 'chicken-child': {
408
- clientId: 'chicken-child',
409
- name: 'core/test-child-block',
410
- isValid: true,
411
- },
412
- 'chicken-child-2': {
413
- clientId: 'chicken-child',
414
- name: 'core/test-child-block',
415
- isValid: true,
416
- },
417
- },
418
- attributes: {
419
- chicken: {},
420
- 'chicken-child': {
421
- attr: true,
422
- },
423
- 'chicken-child-2': {
424
- attr2: 'ok',
425
- },
426
- },
427
- order: {
428
- '': [ 'chicken' ],
429
- chicken: [ 'chicken-child', 'chicken-child-2' ],
430
- 'chicken-child': [],
431
- 'chicken-child-2': [],
432
- },
433
- parents: {
434
- chicken: '',
435
- 'chicken-child': 'chicken',
436
- 'chicken-child-2': 'chicken',
437
- },
438
- tree: {},
438
+ byClientId: new Map(
439
+ Object.entries( {
440
+ chicken: {
441
+ clientId: 'chicken',
442
+ name: 'core/test-parent-block',
443
+ isValid: true,
444
+ },
445
+ 'chicken-child': {
446
+ clientId: 'chicken-child',
447
+ name: 'core/test-child-block',
448
+ isValid: true,
449
+ },
450
+ 'chicken-child-2': {
451
+ clientId: 'chicken-child',
452
+ name: 'core/test-child-block',
453
+ isValid: true,
454
+ },
455
+ } )
456
+ ),
457
+ attributes: new Map(
458
+ Object.entries( {
459
+ chicken: {},
460
+ 'chicken-child': {
461
+ attr: true,
462
+ },
463
+ 'chicken-child-2': {
464
+ attr2: 'ok',
465
+ },
466
+ } )
467
+ ),
468
+ order: new Map(
469
+ Object.entries( {
470
+ '': [ 'chicken' ],
471
+ chicken: [ 'chicken-child', 'chicken-child-2' ],
472
+ 'chicken-child': [],
473
+ 'chicken-child-2': [],
474
+ } )
475
+ ),
476
+ parents: new Map(
477
+ Object.entries( {
478
+ chicken: '',
479
+ 'chicken-child': 'chicken',
480
+ 'chicken-child-2': 'chicken',
481
+ } )
482
+ ),
483
+ tree: new Map(),
439
484
  controlledInnerBlocks: {},
440
485
  } );
441
486
 
@@ -469,75 +514,83 @@ describe( 'state', () => {
469
514
  expect( restState ).toEqual( {
470
515
  isPersistentChange: true,
471
516
  isIgnoredChange: false,
472
- byClientId: {
473
- chicken: {
474
- clientId: 'chicken',
475
- name: 'core/test-parent-block',
476
- isValid: true,
477
- },
478
- [ newChildBlockId1 ]: {
479
- clientId: newChildBlockId1,
480
- name: 'core/test-child-block',
481
- isValid: true,
482
- },
483
- [ newChildBlockId2 ]: {
484
- clientId: newChildBlockId2,
485
- name: 'core/test-child-block',
486
- isValid: true,
487
- },
488
- [ newChildBlockId3 ]: {
489
- clientId: newChildBlockId3,
490
- name: 'core/test-child-block',
491
- isValid: true,
492
- },
493
- },
494
- attributes: {
495
- chicken: {},
496
- [ newChildBlockId1 ]: {
497
- attr: false,
498
- attr2: 'perfect',
499
- },
500
- [ newChildBlockId2 ]: {
501
- attr: true,
502
- attr2: 'not-perfect',
503
- },
504
- [ newChildBlockId3 ]: {
505
- attr2: 'hello',
506
- },
507
- },
508
- order: {
509
- '': [ 'chicken' ],
510
- chicken: [
511
- newChildBlockId1,
512
- newChildBlockId2,
513
- newChildBlockId3,
514
- ],
515
- [ newChildBlockId1 ]: [],
516
- [ newChildBlockId2 ]: [],
517
- [ newChildBlockId3 ]: [],
518
- },
519
- parents: {
520
- chicken: '',
521
- [ newChildBlockId1 ]: 'chicken',
522
- [ newChildBlockId2 ]: 'chicken',
523
- [ newChildBlockId3 ]: 'chicken',
524
- },
517
+ byClientId: new Map(
518
+ Object.entries( {
519
+ chicken: {
520
+ clientId: 'chicken',
521
+ name: 'core/test-parent-block',
522
+ isValid: true,
523
+ },
524
+ [ newChildBlockId1 ]: {
525
+ clientId: newChildBlockId1,
526
+ name: 'core/test-child-block',
527
+ isValid: true,
528
+ },
529
+ [ newChildBlockId2 ]: {
530
+ clientId: newChildBlockId2,
531
+ name: 'core/test-child-block',
532
+ isValid: true,
533
+ },
534
+ [ newChildBlockId3 ]: {
535
+ clientId: newChildBlockId3,
536
+ name: 'core/test-child-block',
537
+ isValid: true,
538
+ },
539
+ } )
540
+ ),
541
+ attributes: new Map(
542
+ Object.entries( {
543
+ chicken: {},
544
+ [ newChildBlockId1 ]: {
545
+ attr: false,
546
+ attr2: 'perfect',
547
+ },
548
+ [ newChildBlockId2 ]: {
549
+ attr: true,
550
+ attr2: 'not-perfect',
551
+ },
552
+ [ newChildBlockId3 ]: {
553
+ attr2: 'hello',
554
+ },
555
+ } )
556
+ ),
557
+ order: new Map(
558
+ Object.entries( {
559
+ '': [ 'chicken' ],
560
+ chicken: [
561
+ newChildBlockId1,
562
+ newChildBlockId2,
563
+ newChildBlockId3,
564
+ ],
565
+ [ newChildBlockId1 ]: [],
566
+ [ newChildBlockId2 ]: [],
567
+ [ newChildBlockId3 ]: [],
568
+ } )
569
+ ),
570
+ parents: new Map(
571
+ Object.entries( {
572
+ chicken: '',
573
+ [ newChildBlockId1 ]: 'chicken',
574
+ [ newChildBlockId2 ]: 'chicken',
575
+ [ newChildBlockId3 ]: 'chicken',
576
+ } )
577
+ ),
525
578
  controlledInnerBlocks: {},
526
579
  } );
527
580
 
528
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
529
- state.tree.chicken
581
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
582
+ state.tree.get( 'chicken' )
530
583
  );
531
- expect( state.tree.chicken.innerBlocks[ 0 ] ).toBe(
532
- state.tree[ newChildBlockId1 ]
584
+ expect( state.tree.get( 'chicken' ).innerBlocks[ 0 ] ).toBe(
585
+ state.tree.get( newChildBlockId1 )
533
586
  );
534
- expect( state.tree.chicken.innerBlocks[ 1 ] ).toBe(
535
- state.tree[ newChildBlockId2 ]
587
+ expect( state.tree.get( 'chicken' ).innerBlocks[ 1 ] ).toBe(
588
+ state.tree.get( newChildBlockId2 )
536
589
  );
537
- expect( state.tree.chicken.innerBlocks[ 2 ] ).toBe(
538
- state.tree[ newChildBlockId3 ]
590
+ expect( state.tree.get( 'chicken' ).innerBlocks[ 2 ] ).toBe(
591
+ state.tree.get( newChildBlockId3 )
539
592
  );
540
- expect( state.tree[ newChildBlockId1 ] ).toEqual( {
593
+ expect( state.tree.get( newChildBlockId1 ) ).toEqual( {
541
594
  innerBlocks: [],
542
595
  clientId: newChildBlockId1,
543
596
  name: 'core/test-child-block',
@@ -551,42 +604,52 @@ describe( 'state', () => {
551
604
 
552
605
  it( 'can replace a child block that has other children', () => {
553
606
  const existingState = deepFreeze( {
554
- byClientId: {
555
- chicken: {
556
- clientId: 'chicken',
557
- name: 'core/test-parent-block',
558
- isValid: true,
559
- },
560
- 'chicken-child': {
561
- clientId: 'chicken-child',
562
- name: 'core/test-child-block',
563
- isValid: true,
564
- },
565
- 'chicken-grand-child': {
566
- clientId: 'chicken-child',
567
- name: 'core/test-block',
568
- isValid: true,
569
- },
570
- },
571
- attributes: {
572
- chicken: {},
573
- 'chicken-child': {},
574
- 'chicken-grand-child': {},
575
- },
576
- order: {
577
- '': [ 'chicken' ],
578
- chicken: [ 'chicken-child' ],
579
- 'chicken-child': [ 'chicken-grand-child' ],
580
- 'chicken-grand-child': [],
581
- },
582
- parents: {
583
- chicken: '',
584
- 'chicken-child': 'chicken',
585
- 'chicken-grand-child': 'chicken-child',
586
- },
587
- tree: {
588
- chicken: {},
589
- },
607
+ byClientId: new Map(
608
+ Object.entries( {
609
+ chicken: {
610
+ clientId: 'chicken',
611
+ name: 'core/test-parent-block',
612
+ isValid: true,
613
+ },
614
+ 'chicken-child': {
615
+ clientId: 'chicken-child',
616
+ name: 'core/test-child-block',
617
+ isValid: true,
618
+ },
619
+ 'chicken-grand-child': {
620
+ clientId: 'chicken-child',
621
+ name: 'core/test-block',
622
+ isValid: true,
623
+ },
624
+ } )
625
+ ),
626
+ attributes: new Map(
627
+ Object.entries( {
628
+ chicken: {},
629
+ 'chicken-child': {},
630
+ 'chicken-grand-child': {},
631
+ } )
632
+ ),
633
+ order: new Map(
634
+ Object.entries( {
635
+ '': [ 'chicken' ],
636
+ chicken: [ 'chicken-child' ],
637
+ 'chicken-child': [ 'chicken-grand-child' ],
638
+ 'chicken-grand-child': [],
639
+ } )
640
+ ),
641
+ parents: new Map(
642
+ Object.entries( {
643
+ chicken: '',
644
+ 'chicken-child': 'chicken',
645
+ 'chicken-grand-child': 'chicken-child',
646
+ } )
647
+ ),
648
+ tree: new Map(
649
+ Object.entries( {
650
+ chicken: {},
651
+ } )
652
+ ),
590
653
  controlledInnerBlocks: {},
591
654
  } );
592
655
 
@@ -606,37 +669,45 @@ describe( 'state', () => {
606
669
  expect( restState ).toEqual( {
607
670
  isPersistentChange: true,
608
671
  isIgnoredChange: false,
609
- byClientId: {
610
- chicken: {
611
- clientId: 'chicken',
612
- name: 'core/test-parent-block',
613
- isValid: true,
614
- },
615
- [ newChildBlockId ]: {
616
- clientId: newChildBlockId,
617
- name: 'core/test-block',
618
- isValid: true,
619
- },
620
- },
621
- attributes: {
622
- chicken: {},
623
- [ newChildBlockId ]: {},
624
- },
625
- order: {
626
- '': [ 'chicken' ],
627
- chicken: [ newChildBlockId ],
628
- [ newChildBlockId ]: [],
629
- },
630
- parents: {
631
- chicken: '',
632
- [ newChildBlockId ]: 'chicken',
633
- },
672
+ byClientId: new Map(
673
+ Object.entries( {
674
+ chicken: {
675
+ clientId: 'chicken',
676
+ name: 'core/test-parent-block',
677
+ isValid: true,
678
+ },
679
+ [ newChildBlockId ]: {
680
+ clientId: newChildBlockId,
681
+ name: 'core/test-block',
682
+ isValid: true,
683
+ },
684
+ } )
685
+ ),
686
+ attributes: new Map(
687
+ Object.entries( {
688
+ chicken: {},
689
+ [ newChildBlockId ]: {},
690
+ } )
691
+ ),
692
+ order: new Map(
693
+ Object.entries( {
694
+ '': [ 'chicken' ],
695
+ chicken: [ newChildBlockId ],
696
+ [ newChildBlockId ]: [],
697
+ } )
698
+ ),
699
+ parents: new Map(
700
+ Object.entries( {
701
+ chicken: '',
702
+ [ newChildBlockId ]: 'chicken',
703
+ } )
704
+ ),
634
705
  controlledInnerBlocks: {},
635
706
  } );
636
707
 
637
708
  // The block object of the parent should be updated.
638
- expect( state.tree.chicken ).not.toBe(
639
- existingState.tree.chicken
709
+ expect( state.tree.get( 'chicken' ) ).not.toBe(
710
+ existingState.tree.get( 'chicken' )
640
711
  );
641
712
  } );
642
713
  } );
@@ -645,13 +716,13 @@ describe( 'state', () => {
645
716
  const state = blocks( undefined, {} );
646
717
 
647
718
  expect( state ).toEqual( {
648
- byClientId: {},
649
- attributes: {},
650
- order: {},
651
- parents: {},
719
+ byClientId: new Map(),
720
+ attributes: new Map(),
721
+ order: new Map(),
722
+ parents: new Map(),
652
723
  isPersistentChange: true,
653
724
  isIgnoredChange: false,
654
- tree: {},
725
+ tree: new Map(),
655
726
  controlledInnerBlocks: {},
656
727
  } );
657
728
  } );
@@ -663,20 +734,20 @@ describe( 'state', () => {
663
734
  blocks: [ { clientId: 'bananas', innerBlocks: [] } ],
664
735
  } );
665
736
 
666
- expect( Object.keys( state.byClientId ) ).toHaveLength( 1 );
667
- expect( Object.values( state.byClientId )[ 0 ].clientId ).toBe(
737
+ expect( state.byClientId.size ).toBe( 1 );
738
+ expect( state.byClientId.get( 'bananas' ).clientId ).toBe(
668
739
  'bananas'
669
740
  );
670
- expect( state.order ).toEqual( {
741
+ expect( Object.fromEntries( state.order ) ).toEqual( {
671
742
  '': [ 'bananas' ],
672
743
  bananas: [],
673
744
  } );
674
- expect( state.tree.bananas ).toEqual( {
745
+ expect( state.tree.get( 'bananas' ) ).toEqual( {
675
746
  clientId: 'bananas',
676
747
  innerBlocks: [],
677
748
  } );
678
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
679
- state.tree.bananas
749
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
750
+ state.tree.get( 'bananas' )
680
751
  );
681
752
  } );
682
753
  } );
@@ -695,8 +766,8 @@ describe( 'state', () => {
695
766
  ],
696
767
  } );
697
768
 
698
- expect( Object.keys( state.byClientId ) ).toHaveLength( 2 );
699
- expect( state.order ).toEqual( {
769
+ expect( state.byClientId.size ).toBe( 2 );
770
+ expect( Object.fromEntries( state.order ) ).toEqual( {
700
771
  '': [ 'bananas' ],
701
772
  apples: [],
702
773
  bananas: [ 'apples' ],
@@ -726,21 +797,21 @@ describe( 'state', () => {
726
797
  ],
727
798
  } );
728
799
 
729
- expect( Object.keys( state.byClientId ) ).toHaveLength( 2 );
730
- expect( Object.values( state.byClientId )[ 1 ].clientId ).toBe(
731
- 'ribs'
732
- );
733
- expect( state.order ).toEqual( {
800
+ expect( state.byClientId.size ).toBe( 2 );
801
+ expect( state.byClientId.get( 'ribs' ).clientId ).toBe( 'ribs' );
802
+ expect( Object.fromEntries( state.order ) ).toEqual( {
734
803
  '': [ 'chicken', 'ribs' ],
735
804
  chicken: [],
736
805
  ribs: [],
737
806
  } );
738
807
 
739
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
740
- state.tree.chicken
808
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
809
+ state.tree.get( 'chicken' )
741
810
  );
742
- expect( state.tree[ '' ].innerBlocks[ 1 ] ).toBe( state.tree.ribs );
743
- expect( state.tree.chicken ).toEqual( {
811
+ expect( state.tree.get( '' ).innerBlocks[ 1 ] ).toBe(
812
+ state.tree.get( 'ribs' )
813
+ );
814
+ expect( state.tree.get( 'chicken' ) ).toEqual( {
744
815
  clientId: 'chicken',
745
816
  name: 'core/test-block',
746
817
  attributes: {},
@@ -772,24 +843,22 @@ describe( 'state', () => {
772
843
  ],
773
844
  } );
774
845
 
775
- expect( Object.keys( state.byClientId ) ).toHaveLength( 1 );
776
- expect( Object.values( state.byClientId )[ 0 ].name ).toBe(
846
+ expect( state.byClientId.size ).toBe( 1 );
847
+ expect( state.byClientId.get( 'wings' ).name ).toBe(
777
848
  'core/freeform'
778
849
  );
779
- expect( Object.values( state.byClientId )[ 0 ].clientId ).toBe(
780
- 'wings'
781
- );
782
- expect( state.order ).toEqual( {
850
+ expect( state.byClientId.get( 'wings' ).clientId ).toBe( 'wings' );
851
+ expect( Object.fromEntries( state.order ) ).toEqual( {
783
852
  '': [ 'wings' ],
784
853
  wings: [],
785
854
  } );
786
- expect( state.parents ).toEqual( {
855
+ expect( Object.fromEntries( state.parents ) ).toEqual( {
787
856
  wings: '',
788
857
  } );
789
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
790
- state.tree.wings
858
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
859
+ state.tree.get( 'wings' )
791
860
  );
792
- expect( state.tree.wings ).toEqual( {
861
+ expect( state.tree.get( 'wings' ) ).toEqual( {
793
862
  clientId: 'wings',
794
863
  name: 'core/freeform',
795
864
  innerBlocks: [],
@@ -814,8 +883,8 @@ describe( 'state', () => {
814
883
  blocks: [],
815
884
  } );
816
885
 
817
- expect( Object.keys( state.byClientId ) ).toHaveLength( 0 );
818
- expect( state.tree[ '' ].innerBlocks ).toHaveLength( 0 );
886
+ expect( state.byClientId.size ).toBe( 0 );
887
+ expect( state.tree.get( '' ).innerBlocks ).toHaveLength( 0 );
819
888
  } );
820
889
 
821
890
  it( 'should replace the block and remove references to its inner blocks', () => {
@@ -849,18 +918,18 @@ describe( 'state', () => {
849
918
  ],
850
919
  } );
851
920
 
852
- expect( Object.keys( state.byClientId ) ).toHaveLength( 1 );
853
- expect( state.order ).toEqual( {
921
+ expect( state.byClientId.size ).toBe( 1 );
922
+ expect( Object.fromEntries( state.order ) ).toEqual( {
854
923
  '': [ 'wings' ],
855
924
  wings: [],
856
925
  } );
857
- expect( state.parents ).toEqual( {
926
+ expect( Object.fromEntries( state.parents ) ).toEqual( {
858
927
  wings: '',
859
928
  } );
860
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
861
- state.tree.wings
929
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
930
+ state.tree.get( 'wings' )
862
931
  );
863
- expect( state.tree.wings ).toEqual( {
932
+ expect( state.tree.get( 'wings' ) ).toEqual( {
864
933
  clientId: 'wings',
865
934
  name: 'core/freeform',
866
935
  innerBlocks: [],
@@ -884,21 +953,21 @@ describe( 'state', () => {
884
953
  blocks: [ replacementBlock ],
885
954
  } );
886
955
 
887
- expect( state.order ).toEqual( {
956
+ expect( Object.fromEntries( state.order ) ).toEqual( {
888
957
  '': [ wrapperBlock.clientId ],
889
958
  [ wrapperBlock.clientId ]: [ replacementBlock.clientId ],
890
959
  [ replacementBlock.clientId ]: [],
891
960
  } );
892
961
 
893
- expect( state.parents ).toEqual( {
962
+ expect( Object.fromEntries( state.parents ) ).toEqual( {
894
963
  [ wrapperBlock.clientId ]: '',
895
964
  [ replacementBlock.clientId ]: wrapperBlock.clientId,
896
965
  } );
897
966
 
898
- expect( state.tree[ wrapperBlock.clientId ].innerBlocks[ 0 ] ).toBe(
899
- state.tree[ replacementBlock.clientId ]
900
- );
901
- expect( state.tree[ replacementBlock.clientId ] ).toEqual( {
967
+ expect(
968
+ state.tree.get( wrapperBlock.clientId ).innerBlocks[ 0 ]
969
+ ).toBe( state.tree.get( replacementBlock.clientId ) );
970
+ expect( state.tree.get( replacementBlock.clientId ) ).toEqual( {
902
971
  clientId: replacementBlock.clientId,
903
972
  name: 'core/test-block',
904
973
  innerBlocks: [],
@@ -931,22 +1000,22 @@ describe( 'state', () => {
931
1000
  ],
932
1001
  } );
933
1002
 
934
- expect( Object.keys( replacedState.byClientId ) ).toHaveLength( 1 );
935
- expect( Object.values( originalState.byClientId )[ 0 ].name ).toBe(
1003
+ expect( replacedState.byClientId.size ).toBe( 1 );
1004
+ expect( originalState.byClientId.get( 'chicken' ).name ).toBe(
936
1005
  'core/test-block'
937
1006
  );
938
- expect( Object.values( replacedState.byClientId )[ 0 ].name ).toBe(
1007
+ expect( replacedState.byClientId.get( 'chicken' ).name ).toBe(
939
1008
  'core/freeform'
940
1009
  );
941
- expect(
942
- Object.values( replacedState.byClientId )[ 0 ].clientId
943
- ).toBe( 'chicken' );
944
- expect( replacedState.order ).toEqual( {
1010
+ expect( replacedState.byClientId.get( 'chicken' ).clientId ).toBe(
1011
+ 'chicken'
1012
+ );
1013
+ expect( Object.fromEntries( replacedState.order ) ).toEqual( {
945
1014
  '': [ 'chicken' ],
946
1015
  chicken: [],
947
1016
  } );
948
- expect( originalState.tree.chicken ).not.toBe(
949
- replacedState.tree.chicken
1017
+ expect( originalState.tree.get( 'chicken' ) ).not.toBe(
1018
+ replacedState.tree.get( 'chicken' )
950
1019
  );
951
1020
 
952
1021
  const nestedBlock = {
@@ -976,16 +1045,16 @@ describe( 'state', () => {
976
1045
  blocks: [ replacementNestedBlock ],
977
1046
  } );
978
1047
 
979
- expect( replacedNestedState.order ).toEqual( {
1048
+ expect( Object.fromEntries( replacedNestedState.order ) ).toEqual( {
980
1049
  '': [ wrapperBlock.clientId ],
981
1050
  [ wrapperBlock.clientId ]: [ replacementNestedBlock.clientId ],
982
1051
  [ replacementNestedBlock.clientId ]: [],
983
1052
  } );
984
1053
 
985
- expect( originalNestedState.byClientId.chicken.name ).toBe(
1054
+ expect( originalNestedState.byClientId.get( 'chicken' ).name ).toBe(
986
1055
  'core/test-block'
987
1056
  );
988
- expect( replacedNestedState.byClientId.chicken.name ).toBe(
1057
+ expect( replacedNestedState.byClientId.get( 'chicken' ).name ).toBe(
989
1058
  'core/freeform'
990
1059
  );
991
1060
  } );
@@ -1012,19 +1081,19 @@ describe( 'state', () => {
1012
1081
  },
1013
1082
  } );
1014
1083
 
1015
- expect( state.byClientId.chicken ).toEqual( {
1084
+ expect( state.byClientId.get( 'chicken' ) ).toEqual( {
1016
1085
  clientId: 'chicken',
1017
1086
  name: 'core/test-block',
1018
1087
  isValid: true,
1019
1088
  } );
1020
1089
 
1021
- expect( state.attributes.chicken ).toEqual( {
1090
+ expect( state.attributes.get( 'chicken' ) ).toEqual( {
1022
1091
  content: 'ribs',
1023
1092
  } );
1024
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
1025
- state.tree.chicken
1093
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
1094
+ state.tree.get( 'chicken' )
1026
1095
  );
1027
- expect( state.tree.chicken ).toEqual( {
1096
+ expect( state.tree.get( 'chicken' ) ).toEqual( {
1028
1097
  clientId: 'chicken',
1029
1098
  name: 'core/test-block',
1030
1099
  innerBlocks: [],
@@ -1057,20 +1126,20 @@ describe( 'state', () => {
1057
1126
  updatedId: 3,
1058
1127
  } );
1059
1128
 
1060
- expect( state.byClientId.chicken ).toEqual( {
1129
+ expect( state.byClientId.get( 'chicken' ) ).toEqual( {
1061
1130
  clientId: 'chicken',
1062
1131
  name: 'core/block',
1063
1132
  isValid: false,
1064
1133
  } );
1065
1134
 
1066
- expect( state.attributes.chicken ).toEqual( {
1135
+ expect( state.attributes.get( 'chicken' ) ).toEqual( {
1067
1136
  ref: 3,
1068
1137
  } );
1069
1138
 
1070
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe(
1071
- state.tree.chicken
1139
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
1140
+ state.tree.get( 'chicken' )
1072
1141
  );
1073
- expect( state.tree.chicken ).toEqual( {
1142
+ expect( state.tree.get( 'chicken' ) ).toEqual( {
1074
1143
  clientId: 'chicken',
1075
1144
  name: 'core/block',
1076
1145
  isValid: false,
@@ -1104,12 +1173,16 @@ describe( 'state', () => {
1104
1173
  clientIds: [ 'ribs' ],
1105
1174
  } );
1106
1175
 
1107
- expect( state.order[ '' ] ).toEqual( [ 'ribs', 'chicken' ] );
1108
- expect( state.tree[ '' ].innerBlocks[ 0 ] ).toBe( state.tree.ribs );
1109
- expect( state.tree[ '' ].innerBlocks[ 1 ] ).toBe(
1110
- state.tree.chicken
1176
+ expect( state.order.get( '' ) ).toEqual( [ 'ribs', 'chicken' ] );
1177
+ expect( state.tree.get( '' ).innerBlocks[ 0 ] ).toBe(
1178
+ state.tree.get( 'ribs' )
1179
+ );
1180
+ expect( state.tree.get( '' ).innerBlocks[ 1 ] ).toBe(
1181
+ state.tree.get( 'chicken' )
1182
+ );
1183
+ expect( state.tree.get( 'chicken' ) ).toBe(
1184
+ original.tree.get( 'chicken' )
1111
1185
  );
1112
- expect( state.tree.chicken ).toBe( original.tree.chicken );
1113
1186
  } );
1114
1187
 
1115
1188
  it( 'should move the nested block up', () => {
@@ -1129,7 +1202,7 @@ describe( 'state', () => {
1129
1202
  rootClientId: wrapperBlock.clientId,
1130
1203
  } );
1131
1204
 
1132
- expect( state.order ).toEqual( {
1205
+ expect( Object.fromEntries( state.order ) ).toEqual( {
1133
1206
  '': [ wrapperBlock.clientId ],
1134
1207
  [ wrapperBlock.clientId ]: [
1135
1208
  movedBlock.clientId,
@@ -1139,14 +1212,14 @@ describe( 'state', () => {
1139
1212
  [ siblingBlock.clientId ]: [],
1140
1213
  } );
1141
1214
 
1142
- expect( state.tree[ wrapperBlock.clientId ].innerBlocks[ 0 ] ).toBe(
1143
- state.tree[ movedBlock.clientId ]
1144
- );
1145
- expect( state.tree[ wrapperBlock.clientId ].innerBlocks[ 1 ] ).toBe(
1146
- state.tree[ siblingBlock.clientId ]
1147
- );
1148
- expect( state.tree[ movedBlock.clientId ] ).toBe(
1149
- original.tree[ movedBlock.clientId ]
1215
+ expect(
1216
+ state.tree.get( wrapperBlock.clientId ).innerBlocks[ 0 ]
1217
+ ).toBe( state.tree.get( movedBlock.clientId ) );
1218
+ expect(
1219
+ state.tree.get( wrapperBlock.clientId ).innerBlocks[ 1 ]
1220
+ ).toBe( state.tree.get( siblingBlock.clientId ) );
1221
+ expect( state.tree.get( movedBlock.clientId ) ).toBe(
1222
+ original.tree.get( movedBlock.clientId )
1150
1223
  );
1151
1224
  } );
1152
1225
 
@@ -1179,7 +1252,7 @@ describe( 'state', () => {
1179
1252
  clientIds: [ 'ribs', 'veggies' ],
1180
1253
  } );
1181
1254
 
1182
- expect( state.order[ '' ] ).toEqual( [
1255
+ expect( state.order.get( '' ) ).toEqual( [
1183
1256
  'ribs',
1184
1257
  'veggies',
1185
1258
  'chicken',
@@ -1205,7 +1278,7 @@ describe( 'state', () => {
1205
1278
  rootClientId: wrapperBlock.clientId,
1206
1279
  } );
1207
1280
 
1208
- expect( state.order ).toEqual( {
1281
+ expect( Object.fromEntries( state.order ) ).toEqual( {
1209
1282
  '': [ wrapperBlock.clientId ],
1210
1283
  [ wrapperBlock.clientId ]: [
1211
1284
  movedBlockA.clientId,
@@ -1267,7 +1340,7 @@ describe( 'state', () => {
1267
1340
  clientIds: [ 'chicken' ],
1268
1341
  } );
1269
1342
 
1270
- expect( state.order[ '' ] ).toEqual( [ 'ribs', 'chicken' ] );
1343
+ expect( state.order.get( '' ) ).toEqual( [ 'ribs', 'chicken' ] );
1271
1344
  } );
1272
1345
 
1273
1346
  it( 'should move the nested block down', () => {
@@ -1287,7 +1360,7 @@ describe( 'state', () => {
1287
1360
  rootClientId: wrapperBlock.clientId,
1288
1361
  } );
1289
1362
 
1290
- expect( state.order ).toEqual( {
1363
+ expect( Object.fromEntries( state.order ) ).toEqual( {
1291
1364
  '': [ wrapperBlock.clientId ],
1292
1365
  [ wrapperBlock.clientId ]: [
1293
1366
  siblingBlock.clientId,
@@ -1327,7 +1400,7 @@ describe( 'state', () => {
1327
1400
  clientIds: [ 'chicken', 'ribs' ],
1328
1401
  } );
1329
1402
 
1330
- expect( state.order[ '' ] ).toEqual( [
1403
+ expect( state.order.get( '' ) ).toEqual( [
1331
1404
  'veggies',
1332
1405
  'chicken',
1333
1406
  'ribs',
@@ -1353,7 +1426,7 @@ describe( 'state', () => {
1353
1426
  rootClientId: wrapperBlock.clientId,
1354
1427
  } );
1355
1428
 
1356
- expect( state.order ).toEqual( {
1429
+ expect( Object.fromEntries( state.order ) ).toEqual( {
1357
1430
  '': [ wrapperBlock.clientId ],
1358
1431
  [ wrapperBlock.clientId ]: [
1359
1432
  siblingBlock.clientId,
@@ -1415,21 +1488,23 @@ describe( 'state', () => {
1415
1488
  clientIds: [ 'chicken' ],
1416
1489
  } );
1417
1490
 
1418
- expect( state.order[ '' ] ).toEqual( [ 'ribs' ] );
1419
- expect( state.order ).not.toHaveProperty( 'chicken' );
1420
- expect( state.parents ).toEqual( {
1491
+ expect( state.order.get( '' ) ).toEqual( [ 'ribs' ] );
1492
+ expect( Object.fromEntries( state.order ) ).not.toHaveProperty(
1493
+ 'chicken'
1494
+ );
1495
+ expect( Object.fromEntries( state.parents ) ).toEqual( {
1421
1496
  ribs: '',
1422
1497
  } );
1423
- expect( state.byClientId ).toEqual( {
1498
+ expect( Object.fromEntries( state.byClientId ) ).toEqual( {
1424
1499
  ribs: {
1425
1500
  clientId: 'ribs',
1426
1501
  name: 'core/test-block',
1427
1502
  },
1428
1503
  } );
1429
- expect( state.attributes ).toEqual( {
1504
+ expect( Object.fromEntries( state.attributes ) ).toEqual( {
1430
1505
  ribs: {},
1431
1506
  } );
1432
- expect( state.tree[ '' ].innerBlocks ).toHaveLength( 1 );
1507
+ expect( state.tree.get( '' ).innerBlocks ).toHaveLength( 1 );
1433
1508
  } );
1434
1509
 
1435
1510
  it( 'should remove multiple blocks', () => {
@@ -1461,19 +1536,23 @@ describe( 'state', () => {
1461
1536
  clientIds: [ 'chicken', 'veggies' ],
1462
1537
  } );
1463
1538
 
1464
- expect( state.order[ '' ] ).toEqual( [ 'ribs' ] );
1465
- expect( state.order ).not.toHaveProperty( 'chicken' );
1466
- expect( state.order ).not.toHaveProperty( 'veggies' );
1467
- expect( state.parents ).toEqual( {
1539
+ expect( state.order.get( '' ) ).toEqual( [ 'ribs' ] );
1540
+ expect( Object.fromEntries( state.order ) ).not.toHaveProperty(
1541
+ 'chicken'
1542
+ );
1543
+ expect( Object.fromEntries( state.order ) ).not.toHaveProperty(
1544
+ 'veggies'
1545
+ );
1546
+ expect( Object.fromEntries( state.parents ) ).toEqual( {
1468
1547
  ribs: '',
1469
1548
  } );
1470
- expect( state.byClientId ).toEqual( {
1549
+ expect( Object.fromEntries( state.byClientId ) ).toEqual( {
1471
1550
  ribs: {
1472
1551
  clientId: 'ribs',
1473
1552
  name: 'core/test-block',
1474
1553
  },
1475
1554
  } );
1476
- expect( state.attributes ).toEqual( {
1555
+ expect( Object.fromEntries( state.attributes ) ).toEqual( {
1477
1556
  ribs: {},
1478
1557
  } );
1479
1558
  } );
@@ -1495,11 +1574,11 @@ describe( 'state', () => {
1495
1574
  clientIds: [ block.clientId ],
1496
1575
  } );
1497
1576
 
1498
- expect( state.byClientId ).toEqual( {} );
1499
- expect( state.order ).toEqual( {
1577
+ expect( state.byClientId ).toEqual( new Map() );
1578
+ expect( Object.fromEntries( state.order ) ).toEqual( {
1500
1579
  '': [],
1501
1580
  } );
1502
- expect( state.parents ).toEqual( {} );
1581
+ expect( Object.fromEntries( state.parents ) ).toEqual( {} );
1503
1582
  } );
1504
1583
 
1505
1584
  it( 'should insert at the specified index', () => {
@@ -1533,8 +1612,8 @@ describe( 'state', () => {
1533
1612
  ],
1534
1613
  } );
1535
1614
 
1536
- expect( Object.keys( state.byClientId ) ).toHaveLength( 3 );
1537
- expect( state.order[ '' ] ).toEqual( [
1615
+ expect( state.byClientId.size ).toBe( 3 );
1616
+ expect( state.order.get( '' ) ).toEqual( [
1538
1617
  'kumquat',
1539
1618
  'persimmon',
1540
1619
  'loquat',
@@ -1571,7 +1650,7 @@ describe( 'state', () => {
1571
1650
  index: 0,
1572
1651
  } );
1573
1652
 
1574
- expect( state.order[ '' ] ).toEqual( [
1653
+ expect( state.order.get( '' ) ).toEqual( [
1575
1654
  'ribs',
1576
1655
  'chicken',
1577
1656
  'veggies',
@@ -1608,7 +1687,7 @@ describe( 'state', () => {
1608
1687
  index: 2,
1609
1688
  } );
1610
1689
 
1611
- expect( state.order[ '' ] ).toEqual( [
1690
+ expect( state.order.get( '' ) ).toEqual( [
1612
1691
  'chicken',
1613
1692
  'veggies',
1614
1693
  'ribs',
@@ -1645,7 +1724,7 @@ describe( 'state', () => {
1645
1724
  index: 1,
1646
1725
  } );
1647
1726
 
1648
- expect( state.order[ '' ] ).toEqual( [
1727
+ expect( state.order.get( '' ) ).toEqual( [
1649
1728
  'chicken',
1650
1729
  'ribs',
1651
1730
  'veggies',
@@ -1682,7 +1761,7 @@ describe( 'state', () => {
1682
1761
  index: 0,
1683
1762
  } );
1684
1763
 
1685
- expect( state.order[ '' ] ).toEqual( [
1764
+ expect( state.order.get( '' ) ).toEqual( [
1686
1765
  'ribs',
1687
1766
  'veggies',
1688
1767
  'chicken',
@@ -1721,8 +1800,11 @@ describe( 'state', () => {
1721
1800
  index: 0,
1722
1801
  } );
1723
1802
 
1724
- expect( state.order[ '' ] ).toEqual( [ 'chicken' ] );
1725
- expect( state.order.chicken ).toEqual( [ 'ribs', 'veggies' ] );
1803
+ expect( state.order.get( '' ) ).toEqual( [ 'chicken' ] );
1804
+ expect( state.order.get( 'chicken' ) ).toEqual( [
1805
+ 'ribs',
1806
+ 'veggies',
1807
+ ] );
1726
1808
  } );
1727
1809
 
1728
1810
  describe( 'blocks', () => {
@@ -1794,7 +1876,42 @@ describe( 'state', () => {
1794
1876
  },
1795
1877
  } );
1796
1878
 
1797
- expect( state.attributes.kumquat.updated ).toBe( true );
1879
+ expect( state.attributes.get( 'kumquat' ).updated ).toBe(
1880
+ true
1881
+ );
1882
+ } );
1883
+
1884
+ it( 'should not updated equal attributes', () => {
1885
+ const original = deepFreeze(
1886
+ blocks( undefined, {
1887
+ type: 'RESET_BLOCKS',
1888
+ blocks: [
1889
+ {
1890
+ clientId: 'kumquat',
1891
+ attributes: {},
1892
+ innerBlocks: [],
1893
+ },
1894
+ ],
1895
+ } )
1896
+ );
1897
+ const state = blocks( original, {
1898
+ type: 'UPDATE_BLOCK_ATTRIBUTES',
1899
+ clientIds: [ 'kumquat' ],
1900
+ attributes: {
1901
+ updated: true,
1902
+ },
1903
+ } );
1904
+ const updatedState = blocks( state, {
1905
+ type: 'UPDATE_BLOCK_ATTRIBUTES',
1906
+ clientIds: [ 'kumquat' ],
1907
+ attributes: {
1908
+ updated: true,
1909
+ },
1910
+ } );
1911
+
1912
+ expect( state.attributes.get( 'kumquat' ) ).toBe(
1913
+ updatedState.attributes.get( 'kumquat' )
1914
+ );
1798
1915
  } );
1799
1916
 
1800
1917
  it( 'should return with attribute block updates when attributes are unique by block', () => {
@@ -1819,7 +1936,9 @@ describe( 'state', () => {
1819
1936
  uniqueByBlock: true,
1820
1937
  } );
1821
1938
 
1822
- expect( state.attributes.kumquat.updated ).toBe( true );
1939
+ expect( state.attributes.get( 'kumquat' ).updated ).toBe(
1940
+ true
1941
+ );
1823
1942
  } );
1824
1943
 
1825
1944
  it( 'should accumulate attribute block updates', () => {
@@ -1845,7 +1964,7 @@ describe( 'state', () => {
1845
1964
  },
1846
1965
  } );
1847
1966
 
1848
- expect( state.attributes.kumquat ).toEqual( {
1967
+ expect( state.attributes.get( 'kumquat' ) ).toEqual( {
1849
1968
  updated: true,
1850
1969
  moreUpdated: true,
1851
1970
  } );
@@ -1894,6 +2013,27 @@ describe( 'state', () => {
1894
2013
 
1895
2014
  expect( state.attributes ).toBe( state.attributes );
1896
2015
  } );
2016
+
2017
+ it( 'should handle undefined attributes', () => {
2018
+ const original = deepFreeze(
2019
+ blocks( undefined, {
2020
+ type: 'RESET_BLOCKS',
2021
+ blocks: [
2022
+ {
2023
+ clientId: 'kumquat',
2024
+ attributes: {},
2025
+ innerBlocks: [],
2026
+ },
2027
+ ],
2028
+ } )
2029
+ );
2030
+ const state = blocks( original, {
2031
+ type: 'UPDATE_BLOCK_ATTRIBUTES',
2032
+ clientIds: [ 'kumquat' ],
2033
+ } );
2034
+
2035
+ expect( state.attributes.get( 'kumquat' ) ).toEqual( {} );
2036
+ } );
1897
2037
  } );
1898
2038
 
1899
2039
  describe( 'isPersistentChange', () => {
@@ -2089,105 +2229,115 @@ describe( 'state', () => {
2089
2229
  expect( state.controlledInnerBlocks.chicken ).toBe( true );
2090
2230
  // The previous content of the block should be removed
2091
2231
  expect( state.byClientId.child ).toBeUndefined();
2092
- expect( state.tree.child ).toBeUndefined();
2093
- expect( state.tree.chicken.innerBlocks ).toEqual( [] );
2232
+ expect( state.tree.get( 'child' ) ).toBeUndefined();
2233
+ expect( state.tree.get( 'chicken' ).innerBlocks ).toEqual(
2234
+ []
2235
+ );
2094
2236
  } );
2095
2237
  it( 'should preserve the controlled blocks in state and re-attach them in other pieces of state(order, tree, etc..), when we replace inner blocks', () => {
2096
2238
  const initialState = {
2097
- byClientId: {
2098
- 'group-id': {
2099
- clientId: 'group-id',
2100
- name: 'core/group',
2101
- isValid: true,
2102
- },
2103
- 'reusable-id': {
2104
- clientId: 'reusable-id',
2105
- name: 'core/block',
2106
- isValid: true,
2107
- },
2108
- 'paragraph-id': {
2109
- clientId: 'paragraph-id',
2110
- name: 'core/paragraph',
2111
- isValid: true,
2112
- },
2113
- },
2114
- order: {
2115
- '': [ 'group-id' ],
2116
- 'group-id': [ 'reusable-id' ],
2117
- 'reusable-id': [ 'paragraph-id' ],
2118
- 'paragraph-id': [],
2119
- },
2239
+ byClientId: new Map(
2240
+ Object.entries( {
2241
+ 'group-id': {
2242
+ clientId: 'group-id',
2243
+ name: 'core/group',
2244
+ isValid: true,
2245
+ },
2246
+ 'reusable-id': {
2247
+ clientId: 'reusable-id',
2248
+ name: 'core/block',
2249
+ isValid: true,
2250
+ },
2251
+ 'paragraph-id': {
2252
+ clientId: 'paragraph-id',
2253
+ name: 'core/paragraph',
2254
+ isValid: true,
2255
+ },
2256
+ } )
2257
+ ),
2258
+ order: new Map(
2259
+ Object.entries( {
2260
+ '': [ 'group-id' ],
2261
+ 'group-id': [ 'reusable-id' ],
2262
+ 'reusable-id': [ 'paragraph-id' ],
2263
+ 'paragraph-id': [],
2264
+ } )
2265
+ ),
2120
2266
  controlledInnerBlocks: {
2121
2267
  'reusable-id': true,
2122
2268
  },
2123
- parents: {
2124
- 'group-id': '',
2125
- 'reusable-id': 'group-id',
2126
- 'paragraph-id': 'reusable-id',
2127
- },
2128
- tree: {
2129
- 'group-id': {
2130
- clientId: 'group-id',
2131
- name: 'core/group',
2132
- isValid: true,
2133
- innerBlocks: [
2134
- {
2135
- clientId: 'reusable-id',
2136
- name: 'core/block',
2137
- isValid: true,
2138
- attributes: {
2139
- ref: 687,
2269
+ parents: new Map(
2270
+ Object.entries( {
2271
+ 'group-id': '',
2272
+ 'reusable-id': 'group-id',
2273
+ 'paragraph-id': 'reusable-id',
2274
+ } )
2275
+ ),
2276
+ tree: new Map(
2277
+ Object.entries( {
2278
+ 'group-id': {
2279
+ clientId: 'group-id',
2280
+ name: 'core/group',
2281
+ isValid: true,
2282
+ innerBlocks: [
2283
+ {
2284
+ clientId: 'reusable-id',
2285
+ name: 'core/block',
2286
+ isValid: true,
2287
+ attributes: {
2288
+ ref: 687,
2289
+ },
2290
+ innerBlocks: [],
2140
2291
  },
2141
- innerBlocks: [],
2292
+ ],
2293
+ },
2294
+ 'reusable-id': {
2295
+ clientId: 'reusable-id',
2296
+ name: 'core/block',
2297
+ isValid: true,
2298
+ attributes: {
2299
+ ref: 687,
2142
2300
  },
2143
- ],
2144
- },
2145
- 'reusable-id': {
2146
- clientId: 'reusable-id',
2147
- name: 'core/block',
2148
- isValid: true,
2149
- attributes: {
2150
- ref: 687,
2301
+ innerBlocks: [],
2151
2302
  },
2152
- innerBlocks: [],
2153
- },
2154
- '': {
2155
- innerBlocks: [
2156
- {
2157
- clientId: 'group-id',
2158
- name: 'core/group',
2159
- isValid: true,
2160
- innerBlocks: [
2161
- {
2162
- clientId: 'reusable-id',
2163
- name: 'core/block',
2164
- isValid: true,
2165
- attributes: {
2166
- ref: 687,
2303
+ '': {
2304
+ innerBlocks: [
2305
+ {
2306
+ clientId: 'group-id',
2307
+ name: 'core/group',
2308
+ isValid: true,
2309
+ innerBlocks: [
2310
+ {
2311
+ clientId: 'reusable-id',
2312
+ name: 'core/block',
2313
+ isValid: true,
2314
+ attributes: {
2315
+ ref: 687,
2316
+ },
2317
+ innerBlocks: [],
2167
2318
  },
2168
- innerBlocks: [],
2169
- },
2170
- ],
2171
- },
2172
- ],
2173
- },
2174
- 'paragraph-id': {
2175
- clientId: 'paragraph-id',
2176
- name: 'core/paragraph',
2177
- isValid: true,
2178
- innerBlocks: [],
2179
- },
2180
- 'controlled||reusable-id': {
2181
- innerBlocks: [
2182
- {
2183
- clientId: 'paragraph-id',
2184
- name: 'core/paragraph',
2185
- isValid: true,
2186
- innerBlocks: [],
2187
- },
2188
- ],
2189
- },
2190
- },
2319
+ ],
2320
+ },
2321
+ ],
2322
+ },
2323
+ 'paragraph-id': {
2324
+ clientId: 'paragraph-id',
2325
+ name: 'core/paragraph',
2326
+ isValid: true,
2327
+ innerBlocks: [],
2328
+ },
2329
+ 'controlled||reusable-id': {
2330
+ innerBlocks: [
2331
+ {
2332
+ clientId: 'paragraph-id',
2333
+ name: 'core/paragraph',
2334
+ isValid: true,
2335
+ innerBlocks: [],
2336
+ },
2337
+ ],
2338
+ },
2339
+ } )
2340
+ ),
2191
2341
  };
2192
2342
  // We will dispatch an action that replaces the inner
2193
2343
  // blocks with the same inner blocks, which contain
@@ -2209,11 +2359,15 @@ describe( 'state', () => {
2209
2359
  updateSelection: false,
2210
2360
  };
2211
2361
  const state = blocks( initialState, action );
2212
- expect( state.order ).toEqual(
2213
- expect.objectContaining( initialState.order )
2362
+ expect( Object.fromEntries( state.order ) ).toEqual(
2363
+ expect.objectContaining(
2364
+ Object.fromEntries( initialState.order )
2365
+ )
2214
2366
  );
2215
- expect( state.tree ).toEqual(
2216
- expect.objectContaining( initialState.tree )
2367
+ expect( Object.fromEntries( state.tree ) ).toEqual(
2368
+ expect.objectContaining(
2369
+ Object.fromEntries( initialState.tree )
2370
+ )
2217
2371
  );
2218
2372
  } );
2219
2373
  } );
@@ -2253,6 +2407,24 @@ describe( 'state', () => {
2253
2407
  } );
2254
2408
  } );
2255
2409
 
2410
+ describe( 'isBlockInterfaceHidden()', () => {
2411
+ it( 'should set the hide block interface flag to true', () => {
2412
+ const state = isBlockInterfaceHidden( false, {
2413
+ type: 'HIDE_BLOCK_INTERFACE',
2414
+ } );
2415
+
2416
+ expect( state ).toBe( true );
2417
+ } );
2418
+
2419
+ it( 'should set the hide block interface flag to false', () => {
2420
+ const state = isBlockInterfaceHidden( false, {
2421
+ type: 'SHOW_BLOCK_INTERFACE',
2422
+ } );
2423
+
2424
+ expect( state ).toBe( false );
2425
+ } );
2426
+ } );
2427
+
2256
2428
  describe( 'isTyping()', () => {
2257
2429
  it( 'should set the typing flag to true', () => {
2258
2430
  const state = isTyping( false, {