@wordpress/core-data 7.52.0 → 7.53.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 (473) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +1 -0
  3. package/build/actions.cjs +18 -9
  4. package/build/actions.cjs.map +2 -2
  5. package/build/awareness/awareness-state.cjs.map +2 -2
  6. package/build/awareness/base-awareness.cjs.map +2 -2
  7. package/build/awareness/block-lookup.cjs.map +2 -2
  8. package/build/awareness/post-editor-awareness.cjs +7 -0
  9. package/build/awareness/post-editor-awareness.cjs.map +2 -2
  10. package/build/awareness/typed-awareness.cjs.map +2 -2
  11. package/build/awareness/types.cjs.map +1 -1
  12. package/build/awareness/utils.cjs.map +2 -2
  13. package/build/batch/create-batch.cjs.map +2 -2
  14. package/build/batch/default-processor.cjs.map +2 -2
  15. package/build/components/entities-saved-states/entity-record-item.cjs.map +2 -2
  16. package/build/components/entities-saved-states/entity-type-list.cjs.map +2 -2
  17. package/build/components/entities-saved-states/hooks/use-is-dirty.cjs +4 -0
  18. package/build/components/entities-saved-states/hooks/use-is-dirty.cjs.map +2 -2
  19. package/build/components/entities-saved-states/index.cjs.map +2 -2
  20. package/build/dynamic-entities.cjs.map +2 -2
  21. package/build/entities.cjs.map +2 -2
  22. package/build/entity-context.cjs.map +2 -2
  23. package/build/entity-provider.cjs.map +2 -2
  24. package/build/entity-types/attachment.cjs.map +1 -1
  25. package/build/entity-types/base.cjs.map +1 -1
  26. package/build/entity-types/comment.cjs.map +1 -1
  27. package/build/entity-types/font-collection.cjs.map +1 -1
  28. package/build/entity-types/font-family.cjs.map +1 -1
  29. package/build/entity-types/global-styles-revision.cjs.map +1 -1
  30. package/build/entity-types/helpers.cjs.map +1 -1
  31. package/build/entity-types/icon.cjs.map +1 -1
  32. package/build/entity-types/index.cjs.map +1 -1
  33. package/build/entity-types/menu-location.cjs.map +1 -1
  34. package/build/entity-types/nav-menu-item.cjs.map +1 -1
  35. package/build/entity-types/nav-menu.cjs.map +1 -1
  36. package/build/entity-types/page.cjs.map +1 -1
  37. package/build/entity-types/plugin.cjs.map +1 -1
  38. package/build/entity-types/post-revision.cjs.map +1 -1
  39. package/build/entity-types/post-status.cjs.map +1 -1
  40. package/build/entity-types/post.cjs.map +1 -1
  41. package/build/entity-types/settings.cjs.map +1 -1
  42. package/build/entity-types/sidebar.cjs.map +1 -1
  43. package/build/entity-types/taxonomy.cjs.map +1 -1
  44. package/build/entity-types/term.cjs.map +1 -1
  45. package/build/entity-types/theme.cjs.map +1 -1
  46. package/build/entity-types/type.cjs.map +1 -1
  47. package/build/entity-types/user.cjs.map +1 -1
  48. package/build/entity-types/widget-type.cjs.map +1 -1
  49. package/build/entity-types/widget.cjs.map +1 -1
  50. package/build/entity-types/wp-template-part.cjs.map +1 -1
  51. package/build/entity-types/wp-template.cjs.map +1 -1
  52. package/build/fetch/__experimental-fetch-link-suggestions.cjs.map +2 -2
  53. package/build/fetch/__experimental-fetch-url-data.cjs.map +2 -2
  54. package/build/fetch/index.cjs.map +2 -2
  55. package/build/footnotes/get-footnotes-order.cjs.map +2 -2
  56. package/build/footnotes/get-rich-text-values-cached.cjs.map +2 -2
  57. package/build/footnotes/index.cjs +12 -1
  58. package/build/footnotes/index.cjs.map +3 -3
  59. package/build/hooks/index.cjs.map +2 -2
  60. package/build/hooks/use-entity-block-editor.cjs.map +2 -2
  61. package/build/hooks/use-entity-id.cjs.map +2 -2
  62. package/build/hooks/use-entity-prop.cjs.map +2 -2
  63. package/build/hooks/use-entity-record.cjs.map +2 -2
  64. package/build/hooks/use-entity-records.cjs +2 -2
  65. package/build/hooks/use-entity-records.cjs.map +2 -2
  66. package/build/hooks/use-post-editor-awareness-state.cjs.map +2 -2
  67. package/build/hooks/use-query-select.cjs.map +2 -2
  68. package/build/hooks/use-resource-permissions.cjs.map +2 -2
  69. package/build/hooks/utils.cjs.map +2 -2
  70. package/build/index.cjs.map +2 -2
  71. package/build/lock-unlock.cjs.map +2 -2
  72. package/build/locks/actions.cjs.map +2 -2
  73. package/build/locks/engine.cjs.map +2 -2
  74. package/build/locks/reducer.cjs.map +2 -2
  75. package/build/locks/selectors.cjs.map +2 -2
  76. package/build/private-actions.cjs +54 -7
  77. package/build/private-actions.cjs.map +2 -2
  78. package/build/private-apis.cjs +3 -0
  79. package/build/private-apis.cjs.map +2 -2
  80. package/build/private-selectors.cjs +5 -0
  81. package/build/private-selectors.cjs.map +2 -2
  82. package/build/queried-data/get-query-parts.cjs.map +2 -2
  83. package/build/queried-data/reducer.cjs.map +2 -2
  84. package/build/queried-data/selectors.cjs.map +2 -2
  85. package/build/reducer.cjs.map +2 -2
  86. package/build/resolvers.cjs +21 -26
  87. package/build/resolvers.cjs.map +2 -2
  88. package/build/selectors.cjs.map +2 -2
  89. package/build/sync.cjs +26 -0
  90. package/build/sync.cjs.map +2 -2
  91. package/build/types.cjs.map +1 -1
  92. package/build/utils/block-selection-history.cjs.map +2 -2
  93. package/build/utils/clear-unchanged-edits.cjs.map +2 -2
  94. package/build/utils/conservative-map-item.cjs.map +2 -2
  95. package/build/utils/crdt-blocks.cjs.map +2 -2
  96. package/build/utils/crdt-selection.cjs.map +2 -2
  97. package/build/utils/crdt-text.cjs.map +2 -2
  98. package/build/utils/crdt-user-selections.cjs +43 -16
  99. package/build/utils/crdt-user-selections.cjs.map +3 -3
  100. package/build/utils/crdt-utils.cjs.map +2 -2
  101. package/build/utils/crdt.cjs.map +2 -2
  102. package/build/utils/get-template-info.cjs.map +2 -2
  103. package/build/utils/get-template-part-icon.cjs.map +2 -2
  104. package/build/utils/log-entity-deprecation.cjs.map +2 -2
  105. package/build/utils/save-crdt-doc.cjs.map +2 -2
  106. package/build-module/actions.mjs +19 -9
  107. package/build-module/actions.mjs.map +2 -2
  108. package/build-module/awareness/awareness-state.mjs.map +2 -2
  109. package/build-module/awareness/base-awareness.mjs.map +2 -2
  110. package/build-module/awareness/block-lookup.mjs.map +2 -2
  111. package/build-module/awareness/post-editor-awareness.mjs +7 -0
  112. package/build-module/awareness/post-editor-awareness.mjs.map +2 -2
  113. package/build-module/awareness/typed-awareness.mjs.map +2 -2
  114. package/build-module/awareness/utils.mjs.map +2 -2
  115. package/build-module/batch/create-batch.mjs.map +2 -2
  116. package/build-module/batch/default-processor.mjs.map +2 -2
  117. package/build-module/components/entities-saved-states/entity-record-item.mjs.map +2 -2
  118. package/build-module/components/entities-saved-states/entity-type-list.mjs.map +2 -2
  119. package/build-module/components/entities-saved-states/hooks/use-is-dirty.mjs +4 -0
  120. package/build-module/components/entities-saved-states/hooks/use-is-dirty.mjs.map +2 -2
  121. package/build-module/components/entities-saved-states/index.mjs.map +2 -2
  122. package/build-module/dynamic-entities.mjs.map +2 -2
  123. package/build-module/entities.mjs.map +2 -2
  124. package/build-module/entity-context.mjs.map +2 -2
  125. package/build-module/entity-provider.mjs.map +2 -2
  126. package/build-module/fetch/__experimental-fetch-link-suggestions.mjs.map +2 -2
  127. package/build-module/fetch/__experimental-fetch-url-data.mjs.map +2 -2
  128. package/build-module/fetch/index.mjs.map +2 -2
  129. package/build-module/footnotes/get-footnotes-order.mjs.map +2 -2
  130. package/build-module/footnotes/get-rich-text-values-cached.mjs.map +2 -2
  131. package/build-module/footnotes/index.mjs +12 -1
  132. package/build-module/footnotes/index.mjs.map +2 -2
  133. package/build-module/hooks/index.mjs.map +2 -2
  134. package/build-module/hooks/use-entity-block-editor.mjs.map +2 -2
  135. package/build-module/hooks/use-entity-id.mjs.map +2 -2
  136. package/build-module/hooks/use-entity-prop.mjs.map +2 -2
  137. package/build-module/hooks/use-entity-record.mjs.map +2 -2
  138. package/build-module/hooks/use-entity-records.mjs +2 -2
  139. package/build-module/hooks/use-entity-records.mjs.map +2 -2
  140. package/build-module/hooks/use-post-editor-awareness-state.mjs.map +2 -2
  141. package/build-module/hooks/use-query-select.mjs.map +2 -2
  142. package/build-module/hooks/use-resource-permissions.mjs.map +2 -2
  143. package/build-module/hooks/utils.mjs.map +2 -2
  144. package/build-module/index.mjs.map +2 -2
  145. package/build-module/lock-unlock.mjs.map +2 -2
  146. package/build-module/locks/actions.mjs.map +2 -2
  147. package/build-module/locks/engine.mjs.map +2 -2
  148. package/build-module/locks/reducer.mjs.map +2 -2
  149. package/build-module/locks/selectors.mjs.map +2 -2
  150. package/build-module/private-actions.mjs +54 -7
  151. package/build-module/private-actions.mjs.map +2 -2
  152. package/build-module/private-apis.mjs +9 -1
  153. package/build-module/private-apis.mjs.map +2 -2
  154. package/build-module/private-selectors.mjs +4 -0
  155. package/build-module/private-selectors.mjs.map +2 -2
  156. package/build-module/queried-data/get-query-parts.mjs.map +2 -2
  157. package/build-module/queried-data/reducer.mjs.map +2 -2
  158. package/build-module/queried-data/selectors.mjs.map +2 -2
  159. package/build-module/reducer.mjs.map +2 -2
  160. package/build-module/resolvers.mjs +21 -26
  161. package/build-module/resolvers.mjs.map +2 -2
  162. package/build-module/selectors.mjs.map +2 -2
  163. package/build-module/sync.mjs +23 -0
  164. package/build-module/sync.mjs.map +2 -2
  165. package/build-module/utils/block-selection-history.mjs.map +2 -2
  166. package/build-module/utils/clear-unchanged-edits.mjs.map +2 -2
  167. package/build-module/utils/conservative-map-item.mjs.map +2 -2
  168. package/build-module/utils/crdt-blocks.mjs.map +2 -2
  169. package/build-module/utils/crdt-selection.mjs.map +2 -2
  170. package/build-module/utils/crdt-text.mjs.map +2 -2
  171. package/build-module/utils/crdt-user-selections.mjs +43 -16
  172. package/build-module/utils/crdt-user-selections.mjs.map +3 -3
  173. package/build-module/utils/crdt-utils.mjs.map +2 -2
  174. package/build-module/utils/crdt.mjs.map +2 -2
  175. package/build-module/utils/get-template-info.mjs.map +2 -2
  176. package/build-module/utils/get-template-part-icon.mjs.map +2 -2
  177. package/build-module/utils/log-entity-deprecation.mjs.map +2 -2
  178. package/build-module/utils/save-crdt-doc.mjs.map +2 -2
  179. package/build-types/actions.d.ts +4 -0
  180. package/build-types/actions.d.ts.map +1 -1
  181. package/build-types/awareness/awareness-state.d.ts.map +1 -1
  182. package/build-types/awareness/base-awareness.d.ts +0 -3
  183. package/build-types/awareness/base-awareness.d.ts.map +1 -1
  184. package/build-types/awareness/block-lookup.d.ts +0 -3
  185. package/build-types/awareness/block-lookup.d.ts.map +1 -1
  186. package/build-types/awareness/post-editor-awareness.d.ts +0 -3
  187. package/build-types/awareness/post-editor-awareness.d.ts.map +1 -1
  188. package/build-types/awareness/typed-awareness.d.ts +0 -3
  189. package/build-types/awareness/typed-awareness.d.ts.map +1 -1
  190. package/build-types/awareness/types.d.ts +0 -6
  191. package/build-types/awareness/types.d.ts.map +1 -1
  192. package/build-types/awareness/utils.d.ts +0 -3
  193. package/build-types/awareness/utils.d.ts.map +1 -1
  194. package/build-types/batch/create-batch.d.ts.map +1 -1
  195. package/build-types/batch/default-processor.d.ts.map +1 -1
  196. package/build-types/components/entities-saved-states/entity-record-item.d.ts.map +1 -1
  197. package/build-types/components/entities-saved-states/entity-type-list.d.ts.map +1 -1
  198. package/build-types/components/entities-saved-states/hooks/use-is-dirty.d.ts.map +1 -1
  199. package/build-types/components/entities-saved-states/index.d.ts.map +1 -1
  200. package/build-types/dynamic-entities.d.ts +0 -3
  201. package/build-types/dynamic-entities.d.ts.map +1 -1
  202. package/build-types/entities.d.ts.map +1 -1
  203. package/build-types/entity-context.d.ts.map +1 -1
  204. package/build-types/entity-provider.d.ts.map +1 -1
  205. package/build-types/entity-types/attachment.d.ts +0 -3
  206. package/build-types/entity-types/attachment.d.ts.map +1 -1
  207. package/build-types/entity-types/base.d.ts +0 -3
  208. package/build-types/entity-types/base.d.ts.map +1 -1
  209. package/build-types/entity-types/comment.d.ts +0 -3
  210. package/build-types/entity-types/comment.d.ts.map +1 -1
  211. package/build-types/entity-types/font-collection.d.ts +0 -3
  212. package/build-types/entity-types/font-collection.d.ts.map +1 -1
  213. package/build-types/entity-types/font-family.d.ts +0 -3
  214. package/build-types/entity-types/font-family.d.ts.map +1 -1
  215. package/build-types/entity-types/global-styles-revision.d.ts +0 -3
  216. package/build-types/entity-types/global-styles-revision.d.ts.map +1 -1
  217. package/build-types/entity-types/helpers.d.ts +0 -3
  218. package/build-types/entity-types/helpers.d.ts.map +1 -1
  219. package/build-types/entity-types/icon.d.ts +0 -3
  220. package/build-types/entity-types/icon.d.ts.map +1 -1
  221. package/build-types/entity-types/index.d.ts +0 -3
  222. package/build-types/entity-types/index.d.ts.map +1 -1
  223. package/build-types/entity-types/menu-location.d.ts +0 -3
  224. package/build-types/entity-types/menu-location.d.ts.map +1 -1
  225. package/build-types/entity-types/nav-menu-item.d.ts +0 -3
  226. package/build-types/entity-types/nav-menu-item.d.ts.map +1 -1
  227. package/build-types/entity-types/nav-menu.d.ts +0 -3
  228. package/build-types/entity-types/nav-menu.d.ts.map +1 -1
  229. package/build-types/entity-types/page.d.ts +0 -3
  230. package/build-types/entity-types/page.d.ts.map +1 -1
  231. package/build-types/entity-types/plugin.d.ts +0 -3
  232. package/build-types/entity-types/plugin.d.ts.map +1 -1
  233. package/build-types/entity-types/post-revision.d.ts +0 -3
  234. package/build-types/entity-types/post-revision.d.ts.map +1 -1
  235. package/build-types/entity-types/post-status.d.ts +0 -3
  236. package/build-types/entity-types/post-status.d.ts.map +1 -1
  237. package/build-types/entity-types/post.d.ts +0 -3
  238. package/build-types/entity-types/post.d.ts.map +1 -1
  239. package/build-types/entity-types/settings.d.ts +0 -3
  240. package/build-types/entity-types/settings.d.ts.map +1 -1
  241. package/build-types/entity-types/sidebar.d.ts +0 -3
  242. package/build-types/entity-types/sidebar.d.ts.map +1 -1
  243. package/build-types/entity-types/taxonomy.d.ts +0 -3
  244. package/build-types/entity-types/taxonomy.d.ts.map +1 -1
  245. package/build-types/entity-types/term.d.ts +0 -3
  246. package/build-types/entity-types/term.d.ts.map +1 -1
  247. package/build-types/entity-types/test/attachment.test.d.ts +0 -8
  248. package/build-types/entity-types/test/attachment.test.d.ts.map +1 -1
  249. package/build-types/entity-types/theme.d.ts +0 -3
  250. package/build-types/entity-types/theme.d.ts.map +1 -1
  251. package/build-types/entity-types/type.d.ts +0 -3
  252. package/build-types/entity-types/type.d.ts.map +1 -1
  253. package/build-types/entity-types/user.d.ts +0 -3
  254. package/build-types/entity-types/user.d.ts.map +1 -1
  255. package/build-types/entity-types/widget-type.d.ts +0 -3
  256. package/build-types/entity-types/widget-type.d.ts.map +1 -1
  257. package/build-types/entity-types/widget.d.ts +0 -3
  258. package/build-types/entity-types/widget.d.ts.map +1 -1
  259. package/build-types/entity-types/wp-template-part.d.ts +0 -3
  260. package/build-types/entity-types/wp-template-part.d.ts.map +1 -1
  261. package/build-types/entity-types/wp-template.d.ts +0 -3
  262. package/build-types/entity-types/wp-template.d.ts.map +1 -1
  263. package/build-types/fetch/__experimental-fetch-link-suggestions.d.ts.map +1 -1
  264. package/build-types/fetch/__experimental-fetch-url-data.d.ts.map +1 -1
  265. package/build-types/fetch/index.d.ts.map +1 -1
  266. package/build-types/footnotes/get-footnotes-order.d.ts.map +1 -1
  267. package/build-types/footnotes/get-rich-text-values-cached.d.ts.map +1 -1
  268. package/build-types/footnotes/index.d.ts.map +1 -1
  269. package/build-types/hooks/index.d.ts +0 -3
  270. package/build-types/hooks/index.d.ts.map +1 -1
  271. package/build-types/hooks/use-entity-block-editor.d.ts.map +1 -1
  272. package/build-types/hooks/use-entity-id.d.ts.map +1 -1
  273. package/build-types/hooks/use-entity-prop.d.ts.map +1 -1
  274. package/build-types/hooks/use-entity-record.d.ts.map +1 -1
  275. package/build-types/hooks/use-entity-records.d.ts.map +1 -1
  276. package/build-types/hooks/use-post-editor-awareness-state.d.ts.map +1 -1
  277. package/build-types/hooks/use-query-select.d.ts.map +1 -1
  278. package/build-types/hooks/use-resource-permissions.d.ts.map +1 -1
  279. package/build-types/hooks/utils.d.ts +0 -6
  280. package/build-types/hooks/utils.d.ts.map +1 -1
  281. package/build-types/index.d.ts +1 -0
  282. package/build-types/index.d.ts.map +1 -1
  283. package/build-types/lock-unlock.d.ts.map +1 -1
  284. package/build-types/locks/actions.d.ts.map +1 -1
  285. package/build-types/locks/engine.d.ts.map +1 -1
  286. package/build-types/locks/reducer.d.ts.map +1 -1
  287. package/build-types/locks/selectors.d.ts.map +1 -1
  288. package/build-types/private-actions.d.ts +1 -1
  289. package/build-types/private-actions.d.ts.map +1 -1
  290. package/build-types/private-apis.d.ts +4 -3
  291. package/build-types/private-apis.d.ts.map +1 -1
  292. package/build-types/private-selectors.d.ts +12 -3
  293. package/build-types/private-selectors.d.ts.map +1 -1
  294. package/build-types/queried-data/get-query-parts.d.ts.map +1 -1
  295. package/build-types/queried-data/reducer.d.ts.map +1 -1
  296. package/build-types/queried-data/selectors.d.ts.map +1 -1
  297. package/build-types/reducer.d.ts.map +1 -1
  298. package/build-types/resolvers.d.ts +1 -2
  299. package/build-types/resolvers.d.ts.map +1 -1
  300. package/build-types/selectors.d.ts.map +1 -1
  301. package/build-types/sync.d.ts +31 -3
  302. package/build-types/sync.d.ts.map +1 -1
  303. package/build-types/types.d.ts +9 -8
  304. package/build-types/types.d.ts.map +1 -1
  305. package/build-types/utils/block-selection-history.d.ts +0 -6
  306. package/build-types/utils/block-selection-history.d.ts.map +1 -1
  307. package/build-types/utils/clear-unchanged-edits.d.ts.map +1 -1
  308. package/build-types/utils/conservative-map-item.d.ts.map +1 -1
  309. package/build-types/utils/crdt-blocks.d.ts +0 -3
  310. package/build-types/utils/crdt-blocks.d.ts.map +1 -1
  311. package/build-types/utils/crdt-selection.d.ts +0 -3
  312. package/build-types/utils/crdt-selection.d.ts.map +1 -1
  313. package/build-types/utils/crdt-text.d.ts +0 -3
  314. package/build-types/utils/crdt-text.d.ts.map +1 -1
  315. package/build-types/utils/crdt-user-selections.d.ts.map +1 -1
  316. package/build-types/utils/crdt-utils.d.ts +0 -6
  317. package/build-types/utils/crdt-utils.d.ts.map +1 -1
  318. package/build-types/utils/crdt.d.ts.map +1 -1
  319. package/build-types/utils/get-template-info.d.ts.map +1 -1
  320. package/build-types/utils/get-template-part-icon.d.ts.map +1 -1
  321. package/build-types/utils/log-entity-deprecation.d.ts.map +1 -1
  322. package/build-types/utils/save-crdt-doc.d.ts.map +1 -1
  323. package/package.json +24 -23
  324. package/src/actions.js +45 -29
  325. package/src/awareness/awareness-state.ts +0 -3
  326. package/src/awareness/base-awareness.ts +0 -8
  327. package/src/awareness/block-lookup.ts +1 -8
  328. package/src/awareness/post-editor-awareness.ts +13 -10
  329. package/src/awareness/test/awareness-state.ts +0 -11
  330. package/src/awareness/test/base-awareness.ts +0 -7
  331. package/src/awareness/test/block-lookup.ts +0 -8
  332. package/src/awareness/test/post-editor-awareness.ts +0 -7
  333. package/src/awareness/test/typed-awareness.ts +0 -11
  334. package/src/awareness/test/utils.ts +0 -3
  335. package/src/awareness/typed-awareness.ts +0 -7
  336. package/src/awareness/types.ts +0 -7
  337. package/src/awareness/utils.ts +0 -3
  338. package/src/batch/create-batch.js +0 -3
  339. package/src/batch/default-processor.js +0 -4
  340. package/src/batch/test/create-batch.js +0 -3
  341. package/src/batch/test/default-processor.js +0 -7
  342. package/src/components/entities-saved-states/entity-record-item.js +0 -7
  343. package/src/components/entities-saved-states/entity-type-list.js +0 -7
  344. package/src/components/entities-saved-states/hooks/use-is-dirty.js +4 -7
  345. package/src/components/entities-saved-states/index.js +0 -11
  346. package/src/components/entities-saved-states/test/use-is-dirty.js +70 -11
  347. package/src/dynamic-entities.ts +0 -3
  348. package/src/entities.js +0 -11
  349. package/src/entity-context.js +0 -3
  350. package/src/entity-provider.js +0 -7
  351. package/src/entity-types/attachment.ts +0 -4
  352. package/src/entity-types/base.ts +0 -3
  353. package/src/entity-types/comment.ts +0 -3
  354. package/src/entity-types/font-collection.ts +0 -3
  355. package/src/entity-types/font-family.ts +0 -3
  356. package/src/entity-types/global-styles-revision.ts +0 -4
  357. package/src/entity-types/helpers.ts +0 -3
  358. package/src/entity-types/icon.ts +0 -4
  359. package/src/entity-types/index.ts +0 -3
  360. package/src/entity-types/menu-location.ts +0 -4
  361. package/src/entity-types/nav-menu-item.ts +0 -4
  362. package/src/entity-types/nav-menu.ts +0 -4
  363. package/src/entity-types/page.ts +0 -4
  364. package/src/entity-types/plugin.ts +0 -4
  365. package/src/entity-types/post-revision.ts +0 -4
  366. package/src/entity-types/post-status.ts +0 -3
  367. package/src/entity-types/post.ts +0 -4
  368. package/src/entity-types/settings.ts +0 -4
  369. package/src/entity-types/sidebar.ts +0 -4
  370. package/src/entity-types/taxonomy.ts +0 -4
  371. package/src/entity-types/term.ts +0 -4
  372. package/src/entity-types/test/attachment.test.ts +0 -4
  373. package/src/entity-types/theme.ts +0 -4
  374. package/src/entity-types/type.ts +0 -4
  375. package/src/entity-types/user.ts +0 -4
  376. package/src/entity-types/widget-type.ts +0 -4
  377. package/src/entity-types/widget.ts +0 -4
  378. package/src/entity-types/wp-template-part.ts +0 -4
  379. package/src/entity-types/wp-template.ts +0 -4
  380. package/src/fetch/__experimental-fetch-link-suggestions.ts +0 -3
  381. package/src/fetch/__experimental-fetch-url-data.js +0 -3
  382. package/src/fetch/index.js +0 -7
  383. package/src/fetch/test/__experimental-fetch-link-suggestions.js +0 -3
  384. package/src/fetch/test/__experimental-fetch-url-data.js +1 -7
  385. package/src/footnotes/get-footnotes-order.js +0 -3
  386. package/src/footnotes/get-rich-text-values-cached.js +0 -7
  387. package/src/footnotes/index.js +21 -8
  388. package/src/footnotes/test/index.js +57 -0
  389. package/src/hooks/index.ts +0 -3
  390. package/src/hooks/test/use-entity-record.js +0 -12
  391. package/src/hooks/test/use-entity-records.js +0 -12
  392. package/src/hooks/test/use-post-editor-awareness-state.ts +0 -7
  393. package/src/hooks/test/use-query-select.js +0 -11
  394. package/src/hooks/test/use-resource-permissions.js +0 -12
  395. package/src/hooks/use-entity-block-editor.js +0 -7
  396. package/src/hooks/use-entity-id.js +0 -7
  397. package/src/hooks/use-entity-prop.js +0 -7
  398. package/src/hooks/use-entity-record.ts +0 -7
  399. package/src/hooks/use-entity-records.ts +2 -9
  400. package/src/hooks/use-post-editor-awareness-state.ts +0 -7
  401. package/src/hooks/use-query-select.ts +0 -7
  402. package/src/hooks/use-resource-permissions.ts +0 -7
  403. package/src/hooks/utils.ts +0 -7
  404. package/src/index.js +0 -7
  405. package/src/lock-unlock.ts +0 -3
  406. package/src/locks/actions.js +0 -3
  407. package/src/locks/engine.js +0 -3
  408. package/src/locks/reducer.js +0 -3
  409. package/src/locks/selectors.js +0 -3
  410. package/src/locks/test/engine.js +0 -3
  411. package/src/locks/test/reducer.js +0 -7
  412. package/src/locks/test/selectors.js +0 -7
  413. package/src/locks/test/utils.js +0 -7
  414. package/src/private-actions.js +63 -15
  415. package/src/private-apis.ts +9 -4
  416. package/src/private-selectors.ts +22 -7
  417. package/src/queried-data/get-query-parts.js +0 -7
  418. package/src/queried-data/reducer.js +0 -7
  419. package/src/queried-data/selectors.js +0 -7
  420. package/src/queried-data/test/actions.js +0 -3
  421. package/src/queried-data/test/get-query-parts.js +0 -3
  422. package/src/queried-data/test/reducer.js +0 -7
  423. package/src/queried-data/test/selectors.js +0 -3
  424. package/src/reducer.js +0 -11
  425. package/src/resolvers.js +23 -40
  426. package/src/selectors.ts +0 -7
  427. package/src/sync.ts +64 -7
  428. package/src/test/actions.js +256 -8
  429. package/src/test/deprecated-entity-logging.js +0 -7
  430. package/src/test/entities.js +0 -8
  431. package/src/test/entity-provider.js +0 -11
  432. package/src/test/private-actions.js +297 -7
  433. package/src/test/private-selectors.js +0 -3
  434. package/src/test/reducer.js +0 -7
  435. package/src/test/resolvers.js +0 -12
  436. package/src/test/rtc-rich-text-offset-space.test.js +0 -12
  437. package/src/test/selectors.js +0 -7
  438. package/src/test/store.js +8 -15
  439. package/src/types.ts +14 -12
  440. package/src/utils/block-selection-history.ts +0 -10
  441. package/src/utils/clear-unchanged-edits.ts +0 -3
  442. package/src/utils/conservative-map-item.js +0 -3
  443. package/src/utils/crdt-blocks.ts +0 -11
  444. package/src/utils/crdt-selection.ts +0 -7
  445. package/src/utils/crdt-text.ts +0 -3
  446. package/src/utils/crdt-user-selections.ts +85 -23
  447. package/src/utils/crdt-utils.ts +0 -7
  448. package/src/utils/crdt.ts +0 -11
  449. package/src/utils/get-template-info.js +0 -6
  450. package/src/utils/get-template-part-icon.js +0 -3
  451. package/src/utils/log-entity-deprecation.ts +0 -7
  452. package/src/utils/save-crdt-doc.js +0 -7
  453. package/src/utils/test/block-selection-history.test.ts +0 -7
  454. package/src/utils/test/clear-unchanged-edits.js +0 -3
  455. package/src/utils/test/conservative-map-item.js +0 -3
  456. package/src/utils/test/crdt-blocks.ts +0 -17
  457. package/src/utils/test/crdt-user-selections.ts +107 -30
  458. package/src/utils/test/crdt-utils.ts +0 -7
  459. package/src/utils/test/crdt.ts +0 -16
  460. package/src/utils/test/get-nested-value.js +0 -3
  461. package/src/utils/test/get-normalized-comma-separable.js +0 -3
  462. package/src/utils/test/get-template-info.js +0 -6
  463. package/src/utils/test/if-matching-action.js +0 -7
  464. package/src/utils/test/is-numeric-id.js +0 -3
  465. package/src/utils/test/log-entity-deprecation.js +0 -7
  466. package/src/utils/test/replace-action.js +0 -3
  467. package/src/utils/test/rtc-rich-text-cursor-scope.test.js +0 -14
  468. package/src/utils/test/rtc-rich-text-offset-space.test.js +0 -14
  469. package/src/utils/test/save-crdt-doc.js +0 -7
  470. package/src/utils/test/set-nested-value.js +0 -3
  471. package/src/utils/test/with-weak-map-cache.js +0 -3
  472. package/build-types/utils/on-sub-key.d.ts +0 -4
  473. package/build-types/utils/on-sub-key.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/fetch/__experimental-fetch-link-suggestions.ts"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { __ } from '@wordpress/i18n';\n\nexport type SearchOptions = {\n\t/**\n\t * Displays initial search suggestions, when true.\n\t */\n\tisInitialSuggestions?: boolean;\n\t/**\n\t * Search options for initial suggestions.\n\t */\n\tinitialSuggestionsSearchOptions?: Omit<\n\t\tSearchOptions,\n\t\t'isInitialSuggestions' | 'initialSuggestionsSearchOptions'\n\t>;\n\t/**\n\t * Filters by search type.\n\t */\n\ttype?: 'attachment' | 'post' | 'term' | 'post-format';\n\t/**\n\t * Slug of the post-type or taxonomy.\n\t */\n\tsubtype?: string;\n\t/**\n\t * Which page of results to return.\n\t */\n\tpage?: number;\n\t/**\n\t * Search results per page.\n\t */\n\tperPage?: number;\n};\n\nexport type EditorSettings = {\n\t/**\n\t * Disables post formats, when true.\n\t */\n\tdisablePostFormats?: boolean;\n};\n\ntype SearchAPIResult = {\n\tid: number;\n\ttitle: string;\n\turl: string;\n\ttype: string;\n\tsubtype: string;\n};\n\ntype MediaAPIResult = {\n\tid: number;\n\ttitle: { rendered: string };\n\tsource_url: string;\n\ttype: string;\n};\n\nexport type SearchResult = {\n\t/**\n\t * Post or term id.\n\t */\n\tid: number;\n\t/**\n\t * Link url.\n\t */\n\turl: string;\n\t/**\n\t * Title of the link.\n\t */\n\ttitle: string;\n\t/**\n\t * The taxonomy or post type slug or type URL.\n\t */\n\ttype: string;\n\t/**\n\t * Link kind of post-type or taxonomy\n\t */\n\tkind?: string;\n};\n\n/**\n * Fetches link suggestions from the WordPress API.\n *\n * WordPress does not support searching multiple tables at once, e.g. posts and terms, so we\n * perform multiple queries at the same time and then merge the results together.\n *\n * @param search\n * @param searchOptions\n * @param editorSettings\n *\n * @example\n * ```js\n * import { __experimentalFetchLinkSuggestions as fetchLinkSuggestions } from '@wordpress/core-data';\n *\n * //...\n *\n * export function initialize( id, settings ) {\n *\n * settings.__experimentalFetchLinkSuggestions = (\n * search,\n * searchOptions\n * ) => fetchLinkSuggestions( search, searchOptions, settings );\n * ```\n */\nexport default async function fetchLinkSuggestions(\n\tsearch: string,\n\tsearchOptions: SearchOptions = {},\n\teditorSettings: EditorSettings = {}\n): Promise< SearchResult[] > {\n\tconst searchOptionsToUse =\n\t\tsearchOptions.isInitialSuggestions &&\n\t\tsearchOptions.initialSuggestionsSearchOptions\n\t\t\t? {\n\t\t\t\t\t...searchOptions,\n\t\t\t\t\t...searchOptions.initialSuggestionsSearchOptions,\n\t\t\t }\n\t\t\t: searchOptions;\n\n\tconst {\n\t\ttype,\n\t\tsubtype,\n\t\tpage,\n\t\tperPage = searchOptions.isInitialSuggestions ? 3 : 20,\n\t} = searchOptionsToUse;\n\n\tconst { disablePostFormats = false } = editorSettings;\n\n\tconst queries: Promise< SearchResult[] >[] = [];\n\n\tif ( ! type || type === 'post' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'post',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'post-type',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! type || type === 'term' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'term',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'taxonomy',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! disablePostFormats && ( ! type || type === 'post-format' ) ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'post-format',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'taxonomy',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! type || type === 'attachment' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< MediaAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/media', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.source_url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title.rendered || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.type,\n\t\t\t\t\t\t\tkind: 'media',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tconst responses = await Promise.all( queries );\n\n\tlet results = responses.flat();\n\tresults = results.filter( ( result ) => !! result.id );\n\tresults = sortResults( results, search );\n\tresults = results.slice( 0, perPage );\n\treturn results;\n}\n\n/**\n * Sort search results by relevance to the given query.\n *\n * Sorting is necessary as we're querying multiple endpoints and merging the results. For example\n * a taxonomy title might be more relevant than a post title, but by default taxonomy results will\n * be ordered after all the (potentially irrelevant) post results.\n *\n * We sort by scoring each result, where the score is the number of tokens in the title that are\n * also in the search query, divided by the total number of tokens in the title. This gives us a\n * score between 0 and 1, where 1 is a perfect match.\n *\n * @param results\n * @param search\n */\nexport function sortResults( results: SearchResult[], search: string ) {\n\tconst searchTokens = tokenize( search );\n\n\tconst scores = {};\n\tfor ( const result of results ) {\n\t\tif ( result.title ) {\n\t\t\tconst titleTokens = tokenize( result.title );\n\t\t\tconst exactMatchingTokens = titleTokens.filter( ( titleToken ) =>\n\t\t\t\tsearchTokens.some(\n\t\t\t\t\t( searchToken ) => titleToken === searchToken\n\t\t\t\t)\n\t\t\t);\n\t\t\tconst subMatchingTokens = titleTokens.filter( ( titleToken ) =>\n\t\t\t\tsearchTokens.some(\n\t\t\t\t\t( searchToken ) =>\n\t\t\t\t\t\ttitleToken !== searchToken &&\n\t\t\t\t\t\ttitleToken.includes( searchToken )\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// The score is a combination of exact matches and sub-matches.\n\t\t\t// More weight is given to exact matches, as they are more relevant (e.g. \"cat\" vs \"caterpillar\").\n\t\t\t// Diving by the total number of tokens in the title normalizes the score and skews\n\t\t\t// the results towards shorter titles.\n\t\t\tconst exactMatchScore =\n\t\t\t\t( exactMatchingTokens.length / titleTokens.length ) * 10;\n\n\t\t\tconst subMatchScore = subMatchingTokens.length / titleTokens.length;\n\n\t\t\tscores[ result.id ] = exactMatchScore + subMatchScore;\n\t\t} else {\n\t\t\tscores[ result.id ] = 0;\n\t\t}\n\t}\n\n\treturn results.sort( ( a, b ) => scores[ b.id ] - scores[ a.id ] );\n}\n\n/**\n * Turns text into an array of tokens, with whitespace and punctuation removed.\n *\n * For example, `\"I'm having a ball.\"` becomes `[ \"im\", \"having\", \"a\", \"ball\" ]`.\n *\n * @param text\n */\nexport function tokenize( text: string ): string[] {\n\t// \\p{L} matches any kind of letter from any language.\n\t// \\p{N} matches any kind of numeric character.\n\treturn text.toLowerCase().match( /[\\p{L}\\p{N}]+/gu ) || [];\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport { __ } from '@wordpress/i18n';\n\nexport type SearchOptions = {\n\t/**\n\t * Displays initial search suggestions, when true.\n\t */\n\tisInitialSuggestions?: boolean;\n\t/**\n\t * Search options for initial suggestions.\n\t */\n\tinitialSuggestionsSearchOptions?: Omit<\n\t\tSearchOptions,\n\t\t'isInitialSuggestions' | 'initialSuggestionsSearchOptions'\n\t>;\n\t/**\n\t * Filters by search type.\n\t */\n\ttype?: 'attachment' | 'post' | 'term' | 'post-format';\n\t/**\n\t * Slug of the post-type or taxonomy.\n\t */\n\tsubtype?: string;\n\t/**\n\t * Which page of results to return.\n\t */\n\tpage?: number;\n\t/**\n\t * Search results per page.\n\t */\n\tperPage?: number;\n};\n\nexport type EditorSettings = {\n\t/**\n\t * Disables post formats, when true.\n\t */\n\tdisablePostFormats?: boolean;\n};\n\ntype SearchAPIResult = {\n\tid: number;\n\ttitle: string;\n\turl: string;\n\ttype: string;\n\tsubtype: string;\n};\n\ntype MediaAPIResult = {\n\tid: number;\n\ttitle: { rendered: string };\n\tsource_url: string;\n\ttype: string;\n};\n\nexport type SearchResult = {\n\t/**\n\t * Post or term id.\n\t */\n\tid: number;\n\t/**\n\t * Link url.\n\t */\n\turl: string;\n\t/**\n\t * Title of the link.\n\t */\n\ttitle: string;\n\t/**\n\t * The taxonomy or post type slug or type URL.\n\t */\n\ttype: string;\n\t/**\n\t * Link kind of post-type or taxonomy\n\t */\n\tkind?: string;\n};\n\n/**\n * Fetches link suggestions from the WordPress API.\n *\n * WordPress does not support searching multiple tables at once, e.g. posts and terms, so we\n * perform multiple queries at the same time and then merge the results together.\n *\n * @param search\n * @param searchOptions\n * @param editorSettings\n *\n * @example\n * ```js\n * import { __experimentalFetchLinkSuggestions as fetchLinkSuggestions } from '@wordpress/core-data';\n *\n * //...\n *\n * export function initialize( id, settings ) {\n *\n * settings.__experimentalFetchLinkSuggestions = (\n * search,\n * searchOptions\n * ) => fetchLinkSuggestions( search, searchOptions, settings );\n * ```\n */\nexport default async function fetchLinkSuggestions(\n\tsearch: string,\n\tsearchOptions: SearchOptions = {},\n\teditorSettings: EditorSettings = {}\n): Promise< SearchResult[] > {\n\tconst searchOptionsToUse =\n\t\tsearchOptions.isInitialSuggestions &&\n\t\tsearchOptions.initialSuggestionsSearchOptions\n\t\t\t? {\n\t\t\t\t\t...searchOptions,\n\t\t\t\t\t...searchOptions.initialSuggestionsSearchOptions,\n\t\t\t }\n\t\t\t: searchOptions;\n\n\tconst {\n\t\ttype,\n\t\tsubtype,\n\t\tpage,\n\t\tperPage = searchOptions.isInitialSuggestions ? 3 : 20,\n\t} = searchOptionsToUse;\n\n\tconst { disablePostFormats = false } = editorSettings;\n\n\tconst queries: Promise< SearchResult[] >[] = [];\n\n\tif ( ! type || type === 'post' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'post',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'post-type',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! type || type === 'term' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'term',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'taxonomy',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! disablePostFormats && ( ! type || type === 'post-format' ) ) {\n\t\tqueries.push(\n\t\t\tapiFetch< SearchAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/search', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t\ttype: 'post-format',\n\t\t\t\t\tsubtype,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.subtype || result.type,\n\t\t\t\t\t\t\tkind: 'taxonomy',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tif ( ! type || type === 'attachment' ) {\n\t\tqueries.push(\n\t\t\tapiFetch< MediaAPIResult[] >( {\n\t\t\t\tpath: addQueryArgs( '/wp/v2/media', {\n\t\t\t\t\tsearch,\n\t\t\t\t\tpage,\n\t\t\t\t\tper_page: perPage,\n\t\t\t\t} ),\n\t\t\t} )\n\t\t\t\t.then( ( results ) => {\n\t\t\t\t\treturn results.map( ( result ) => {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: result.id,\n\t\t\t\t\t\t\turl: result.source_url,\n\t\t\t\t\t\t\ttitle:\n\t\t\t\t\t\t\t\tdecodeEntities( result.title.rendered || '' ) ||\n\t\t\t\t\t\t\t\t__( '(no title)' ),\n\t\t\t\t\t\t\ttype: result.type,\n\t\t\t\t\t\t\tkind: 'media',\n\t\t\t\t\t\t};\n\t\t\t\t\t} );\n\t\t\t\t} )\n\t\t\t\t.catch( () => [] ) // Fail by returning no results.\n\t\t);\n\t}\n\n\tconst responses = await Promise.all( queries );\n\n\tlet results = responses.flat();\n\tresults = results.filter( ( result ) => !! result.id );\n\tresults = sortResults( results, search );\n\tresults = results.slice( 0, perPage );\n\treturn results;\n}\n\n/**\n * Sort search results by relevance to the given query.\n *\n * Sorting is necessary as we're querying multiple endpoints and merging the results. For example\n * a taxonomy title might be more relevant than a post title, but by default taxonomy results will\n * be ordered after all the (potentially irrelevant) post results.\n *\n * We sort by scoring each result, where the score is the number of tokens in the title that are\n * also in the search query, divided by the total number of tokens in the title. This gives us a\n * score between 0 and 1, where 1 is a perfect match.\n *\n * @param results\n * @param search\n */\nexport function sortResults( results: SearchResult[], search: string ) {\n\tconst searchTokens = tokenize( search );\n\n\tconst scores = {};\n\tfor ( const result of results ) {\n\t\tif ( result.title ) {\n\t\t\tconst titleTokens = tokenize( result.title );\n\t\t\tconst exactMatchingTokens = titleTokens.filter( ( titleToken ) =>\n\t\t\t\tsearchTokens.some(\n\t\t\t\t\t( searchToken ) => titleToken === searchToken\n\t\t\t\t)\n\t\t\t);\n\t\t\tconst subMatchingTokens = titleTokens.filter( ( titleToken ) =>\n\t\t\t\tsearchTokens.some(\n\t\t\t\t\t( searchToken ) =>\n\t\t\t\t\t\ttitleToken !== searchToken &&\n\t\t\t\t\t\ttitleToken.includes( searchToken )\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// The score is a combination of exact matches and sub-matches.\n\t\t\t// More weight is given to exact matches, as they are more relevant (e.g. \"cat\" vs \"caterpillar\").\n\t\t\t// Diving by the total number of tokens in the title normalizes the score and skews\n\t\t\t// the results towards shorter titles.\n\t\t\tconst exactMatchScore =\n\t\t\t\t( exactMatchingTokens.length / titleTokens.length ) * 10;\n\n\t\t\tconst subMatchScore = subMatchingTokens.length / titleTokens.length;\n\n\t\t\tscores[ result.id ] = exactMatchScore + subMatchScore;\n\t\t} else {\n\t\t\tscores[ result.id ] = 0;\n\t\t}\n\t}\n\n\treturn results.sort( ( a, b ) => scores[ b.id ] - scores[ a.id ] );\n}\n\n/**\n * Turns text into an array of tokens, with whitespace and punctuation removed.\n *\n * For example, `\"I'm having a ball.\"` becomes `[ \"im\", \"having\", \"a\", \"ball\" ]`.\n *\n * @param text\n */\nexport function tokenize( text: string ): string[] {\n\t// \\p{L} matches any kind of letter from any language.\n\t// \\p{N} matches any kind of numeric character.\n\treturn text.toLowerCase().match( /[\\p{L}\\p{N}]+/gu ) || [];\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["apiFetch", "results"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/fetch/__experimental-fetch-url-data.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport {\n\taddQueryArgs,\n\tprependHTTP,\n\tisURL,\n\tgetProtocol,\n\tisValidProtocol,\n} from '@wordpress/url';\n\n/**\n * A simple in-memory cache for requests.\n * This avoids repeat HTTP requests which may be beneficial\n * for those wishing to preserve low-bandwidth.\n */\nconst CACHE = new Map();\n\n/**\n * @typedef WPRemoteUrlData\n *\n * @property {string} title contents of the remote URL's `<title>` tag.\n */\n\n/**\n * Fetches data about a remote URL.\n * eg: <title> tag, favicon...etc.\n *\n * @async\n * @param {string} url the URL to request details from.\n * @param {?Object} options any options to pass to the underlying fetch.\n * @example\n * ```js\n * import { __experimentalFetchUrlData as fetchUrlData } from '@wordpress/core-data';\n *\n * //...\n *\n * export function initialize( id, settings ) {\n *\n * settings.__experimentalFetchUrlData = (\n * url\n * ) => fetchUrlData( url );\n * ```\n * @return {Promise< WPRemoteUrlData[] >} Remote URL data.\n */\nconst fetchUrlData = async ( url, options = {} ) => {\n\tconst endpoint = '/wp-block-editor/v1/url-details';\n\n\tconst args = {\n\t\turl: prependHTTP( url ),\n\t};\n\n\tif ( ! isURL( url ) ) {\n\t\treturn Promise.reject( `${ url } is not a valid URL.` );\n\t}\n\n\t// Test for \"http\" based URL as it is possible for valid\n\t// yet unusable URLs such as `tel:123456` to be passed.\n\tconst protocol = getProtocol( url );\n\n\tif (\n\t\t! protocol ||\n\t\t! isValidProtocol( protocol ) ||\n\t\t! protocol.startsWith( 'http' ) ||\n\t\t! /^https?:\\/\\/[^\\/\\s]/i.test( url )\n\t) {\n\t\treturn Promise.reject(\n\t\t\t`${ url } does not have a valid protocol. URLs must be \"http\" based`\n\t\t);\n\t}\n\n\tif ( CACHE.has( url ) ) {\n\t\treturn CACHE.get( url );\n\t}\n\n\treturn apiFetch( {\n\t\tpath: addQueryArgs( endpoint, args ),\n\t\t...options,\n\t} ).then( ( res ) => {\n\t\tCACHE.set( url, res );\n\t\treturn res;\n\t} );\n};\n\nexport default fetchUrlData;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,uBAAqB;AACrB,iBAMO;AAOP,IAAM,QAAQ,oBAAI,IAAI;AA6BtB,IAAM,eAAe,OAAQ,KAAK,UAAU,CAAC,MAAO;AACnD,QAAM,WAAW;AAEjB,QAAM,OAAO;AAAA,IACZ,SAAK,wBAAa,GAAI;AAAA,EACvB;AAEA,MAAK,KAAE,kBAAO,GAAI,GAAI;AACrB,WAAO,QAAQ,OAAQ,GAAI,GAAI,sBAAuB;AAAA,EACvD;AAIA,QAAM,eAAW,wBAAa,GAAI;AAElC,MACC,CAAE,YACF,KAAE,4BAAiB,QAAS,KAC5B,CAAE,SAAS,WAAY,MAAO,KAC9B,CAAE,uBAAuB,KAAM,GAAI,GAClC;AACD,WAAO,QAAQ;AAAA,MACd,GAAI,GAAI;AAAA,IACT;AAAA,EACD;AAEA,MAAK,MAAM,IAAK,GAAI,GAAI;AACvB,WAAO,MAAM,IAAK,GAAI;AAAA,EACvB;AAEA,aAAO,iBAAAA,SAAU;AAAA,IAChB,UAAM,yBAAc,UAAU,IAAK;AAAA,IACnC,GAAG;AAAA,EACJ,CAAE,EAAE,KAAM,CAAE,QAAS;AACpB,UAAM,IAAK,KAAK,GAAI;AACpB,WAAO;AAAA,EACR,CAAE;AACH;AAEA,IAAO,sCAAQ;",
4
+ "sourcesContent": ["import apiFetch from '@wordpress/api-fetch';\nimport {\n\taddQueryArgs,\n\tprependHTTP,\n\tisURL,\n\tgetProtocol,\n\tisValidProtocol,\n} from '@wordpress/url';\n\n/**\n * A simple in-memory cache for requests.\n * This avoids repeat HTTP requests which may be beneficial\n * for those wishing to preserve low-bandwidth.\n */\nconst CACHE = new Map();\n\n/**\n * @typedef WPRemoteUrlData\n *\n * @property {string} title contents of the remote URL's `<title>` tag.\n */\n\n/**\n * Fetches data about a remote URL.\n * eg: <title> tag, favicon...etc.\n *\n * @async\n * @param {string} url the URL to request details from.\n * @param {?Object} options any options to pass to the underlying fetch.\n * @example\n * ```js\n * import { __experimentalFetchUrlData as fetchUrlData } from '@wordpress/core-data';\n *\n * //...\n *\n * export function initialize( id, settings ) {\n *\n * settings.__experimentalFetchUrlData = (\n * url\n * ) => fetchUrlData( url );\n * ```\n * @return {Promise< WPRemoteUrlData[] >} Remote URL data.\n */\nconst fetchUrlData = async ( url, options = {} ) => {\n\tconst endpoint = '/wp-block-editor/v1/url-details';\n\n\tconst args = {\n\t\turl: prependHTTP( url ),\n\t};\n\n\tif ( ! isURL( url ) ) {\n\t\treturn Promise.reject( `${ url } is not a valid URL.` );\n\t}\n\n\t// Test for \"http\" based URL as it is possible for valid\n\t// yet unusable URLs such as `tel:123456` to be passed.\n\tconst protocol = getProtocol( url );\n\n\tif (\n\t\t! protocol ||\n\t\t! isValidProtocol( protocol ) ||\n\t\t! protocol.startsWith( 'http' ) ||\n\t\t! /^https?:\\/\\/[^\\/\\s]/i.test( url )\n\t) {\n\t\treturn Promise.reject(\n\t\t\t`${ url } does not have a valid protocol. URLs must be \"http\" based`\n\t\t);\n\t}\n\n\tif ( CACHE.has( url ) ) {\n\t\treturn CACHE.get( url );\n\t}\n\n\treturn apiFetch( {\n\t\tpath: addQueryArgs( endpoint, args ),\n\t\t...options,\n\t} ).then( ( res ) => {\n\t\tCACHE.set( url, res );\n\t\treturn res;\n\t} );\n};\n\nexport default fetchUrlData;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAqB;AACrB,iBAMO;AAOP,IAAM,QAAQ,oBAAI,IAAI;AA6BtB,IAAM,eAAe,OAAQ,KAAK,UAAU,CAAC,MAAO;AACnD,QAAM,WAAW;AAEjB,QAAM,OAAO;AAAA,IACZ,SAAK,wBAAa,GAAI;AAAA,EACvB;AAEA,MAAK,KAAE,kBAAO,GAAI,GAAI;AACrB,WAAO,QAAQ,OAAQ,GAAI,GAAI,sBAAuB;AAAA,EACvD;AAIA,QAAM,eAAW,wBAAa,GAAI;AAElC,MACC,CAAE,YACF,KAAE,4BAAiB,QAAS,KAC5B,CAAE,SAAS,WAAY,MAAO,KAC9B,CAAE,uBAAuB,KAAM,GAAI,GAClC;AACD,WAAO,QAAQ;AAAA,MACd,GAAI,GAAI;AAAA,IACT;AAAA,EACD;AAEA,MAAK,MAAM,IAAK,GAAI,GAAI;AACvB,WAAO,MAAM,IAAK,GAAI;AAAA,EACvB;AAEA,aAAO,iBAAAA,SAAU;AAAA,IAChB,UAAM,yBAAc,UAAU,IAAK;AAAA,IACnC,GAAG;AAAA,EACJ,CAAE,EAAE,KAAM,CAAE,QAAS;AACpB,UAAM,IAAK,KAAK,GAAI;AACpB,WAAO;AAAA,EACR,CAAE;AACH;AAEA,IAAO,sCAAQ;",
6
6
  "names": ["apiFetch"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/fetch/index.js"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport apiFetch from '@wordpress/api-fetch';\n\nexport { default as __experimentalFetchLinkSuggestions } from './__experimental-fetch-link-suggestions';\nexport { default as __experimentalFetchUrlData } from './__experimental-fetch-url-data';\n\nexport async function fetchBlockPatterns() {\n\tconst restPatterns = await apiFetch( {\n\t\tpath: '/wp/v2/block-patterns/patterns',\n\t} );\n\tif ( ! restPatterns ) {\n\t\treturn [];\n\t}\n\treturn restPatterns.map( ( pattern ) =>\n\t\tObject.fromEntries(\n\t\t\tObject.entries( pattern ).map( ( [ key, value ] ) => [\n\t\t\t\tcamelCase( key ),\n\t\t\t\tvalue,\n\t\t\t] )\n\t\t)\n\t);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yBAA0B;AAK1B,uBAAqB;AAErB,iDAA8D;AAC9D,yCAAsD;AAEtD,eAAsB,qBAAqB;AAC1C,QAAM,eAAe,UAAM,iBAAAA,SAAU;AAAA,IACpC,MAAM;AAAA,EACP,CAAE;AACF,MAAK,CAAE,cAAe;AACrB,WAAO,CAAC;AAAA,EACT;AACA,SAAO,aAAa;AAAA,IAAK,CAAE,YAC1B,OAAO;AAAA,MACN,OAAO,QAAS,OAAQ,EAAE,IAAK,CAAE,CAAE,KAAK,KAAM,MAAO;AAAA,YACpD,8BAAW,GAAI;AAAA,QACf;AAAA,MACD,CAAE;AAAA,IACH;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["import { camelCase } from 'change-case';\nimport apiFetch from '@wordpress/api-fetch';\n\nexport { default as __experimentalFetchLinkSuggestions } from './__experimental-fetch-link-suggestions';\nexport { default as __experimentalFetchUrlData } from './__experimental-fetch-url-data';\n\nexport async function fetchBlockPatterns() {\n\tconst restPatterns = await apiFetch( {\n\t\tpath: '/wp/v2/block-patterns/patterns',\n\t} );\n\tif ( ! restPatterns ) {\n\t\treturn [];\n\t}\n\treturn restPatterns.map( ( pattern ) =>\n\t\tObject.fromEntries(\n\t\t\tObject.entries( pattern ).map( ( [ key, value ] ) => [\n\t\t\t\tcamelCase( key ),\n\t\t\t\tvalue,\n\t\t\t] )\n\t\t)\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA0B;AAC1B,uBAAqB;AAErB,iDAA8D;AAC9D,yCAAsD;AAEtD,eAAsB,qBAAqB;AAC1C,QAAM,eAAe,UAAM,iBAAAA,SAAU;AAAA,IACpC,MAAM;AAAA,EACP,CAAE;AACF,MAAK,CAAE,cAAe;AACrB,WAAO,CAAC;AAAA,EACT;AACA,SAAO,aAAa;AAAA,IAAK,CAAE,YAC1B,OAAO;AAAA,MACN,OAAO,QAAS,OAAQ,EAAE,IAAK,CAAE,CAAE,KAAK,KAAM,MAAO;AAAA,YACpD,8BAAW,GAAI;AAAA,QACf;AAAA,MACD,CAAE;AAAA,IACH;AAAA,EACD;AACD;",
6
6
  "names": ["apiFetch"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/footnotes/get-footnotes-order.js"],
4
- "sourcesContent": ["/**\n * Internal dependencies\n */\nimport getRichTextValuesCached from './get-rich-text-values-cached';\n\nconst cache = new WeakMap();\n\nfunction getBlockFootnotesOrder( block ) {\n\tif ( ! cache.has( block ) ) {\n\t\tconst order = [];\n\t\tfor ( const value of getRichTextValuesCached( block ) ) {\n\t\t\tif ( ! value ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// replacements is a sparse array, use forEach to skip empty slots.\n\t\t\tvalue.replacements.forEach( ( { type, attributes } ) => {\n\t\t\t\tif ( type === 'core/footnote' ) {\n\t\t\t\t\torder.push( attributes[ 'data-fn' ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\tcache.set( block, order );\n\t}\n\n\treturn cache.get( block );\n}\n\nexport default function getFootnotesOrder( blocks ) {\n\t// We can only separate getting order from blocks at the root level. For\n\t// deeper inner blocks, this will not work since it's possible to have both\n\t// inner blocks and block attributes, so order needs to be computed from the\n\t// Edit functions as a whole.\n\treturn blocks.flatMap( getBlockFootnotesOrder );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yCAAoC;AAEpC,IAAM,QAAQ,oBAAI,QAAQ;AAE1B,SAAS,uBAAwB,OAAQ;AACxC,MAAK,CAAE,MAAM,IAAK,KAAM,GAAI;AAC3B,UAAM,QAAQ,CAAC;AACf,eAAY,aAAS,mCAAAA,SAAyB,KAAM,GAAI;AACvD,UAAK,CAAE,OAAQ;AACd;AAAA,MACD;AAGA,YAAM,aAAa,QAAS,CAAE,EAAE,MAAM,WAAW,MAAO;AACvD,YAAK,SAAS,iBAAkB;AAC/B,gBAAM,KAAM,WAAY,SAAU,CAAE;AAAA,QACrC;AAAA,MACD,CAAE;AAAA,IACH;AACA,UAAM,IAAK,OAAO,KAAM;AAAA,EACzB;AAEA,SAAO,MAAM,IAAK,KAAM;AACzB;AAEe,SAAR,kBAAoC,QAAS;AAKnD,SAAO,OAAO,QAAS,sBAAuB;AAC/C;",
4
+ "sourcesContent": ["import getRichTextValuesCached from './get-rich-text-values-cached';\n\nconst cache = new WeakMap();\n\nfunction getBlockFootnotesOrder( block ) {\n\tif ( ! cache.has( block ) ) {\n\t\tconst order = [];\n\t\tfor ( const value of getRichTextValuesCached( block ) ) {\n\t\t\tif ( ! value ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// replacements is a sparse array, use forEach to skip empty slots.\n\t\t\tvalue.replacements.forEach( ( { type, attributes } ) => {\n\t\t\t\tif ( type === 'core/footnote' ) {\n\t\t\t\t\torder.push( attributes[ 'data-fn' ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\tcache.set( block, order );\n\t}\n\n\treturn cache.get( block );\n}\n\nexport default function getFootnotesOrder( blocks ) {\n\t// We can only separate getting order from blocks at the root level. For\n\t// deeper inner blocks, this will not work since it's possible to have both\n\t// inner blocks and block attributes, so order needs to be computed from the\n\t// Edit functions as a whole.\n\treturn blocks.flatMap( getBlockFootnotesOrder );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAoC;AAEpC,IAAM,QAAQ,oBAAI,QAAQ;AAE1B,SAAS,uBAAwB,OAAQ;AACxC,MAAK,CAAE,MAAM,IAAK,KAAM,GAAI;AAC3B,UAAM,QAAQ,CAAC;AACf,eAAY,aAAS,mCAAAA,SAAyB,KAAM,GAAI;AACvD,UAAK,CAAE,OAAQ;AACd;AAAA,MACD;AAGA,YAAM,aAAa,QAAS,CAAE,EAAE,MAAM,WAAW,MAAO;AACvD,YAAK,SAAS,iBAAkB;AAC/B,gBAAM,KAAM,WAAY,SAAU,CAAE;AAAA,QACrC;AAAA,MACD,CAAE;AAAA,IACH;AACA,UAAM,IAAK,OAAO,KAAM;AAAA,EACzB;AAEA,SAAO,MAAM,IAAK,KAAM;AACzB;AAEe,SAAR,kBAAoC,QAAS;AAKnD,SAAO,OAAO,QAAS,sBAAuB;AAC/C;",
6
6
  "names": ["getRichTextValuesCached"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/footnotes/get-rich-text-values-cached.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\n\n// TODO: The following line should have been:\n//\n// const unlockedApis = unlock( blockEditorPrivateApis );\n//\n// But there are hidden circular dependencies in RNMobile code, specifically in\n// certain native components in the `components` package that depend on\n// `block-editor`. What follows is a workaround that defers the `unlock` call\n// to prevent native code from failing.\n//\n// Fix once https://github.com/WordPress/gutenberg/issues/52692 is closed.\nlet unlockedApis;\n\nconst cache = new WeakMap();\n\nexport default function getRichTextValuesCached( block ) {\n\tif ( ! unlockedApis ) {\n\t\tunlockedApis = unlock( blockEditorPrivateApis );\n\t}\n\n\tif ( ! cache.has( block ) ) {\n\t\tconst values = unlockedApis.getRichTextValues( [ block ] );\n\t\tcache.set( block, values );\n\t}\n\treturn cache.get( block );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,0BAAsD;AAKtD,yBAAuB;AAYvB,IAAI;AAEJ,IAAM,QAAQ,oBAAI,QAAQ;AAEX,SAAR,wBAA0C,OAAQ;AACxD,MAAK,CAAE,cAAe;AACrB,uBAAe,2BAAQ,oBAAAA,WAAuB;AAAA,EAC/C;AAEA,MAAK,CAAE,MAAM,IAAK,KAAM,GAAI;AAC3B,UAAM,SAAS,aAAa,kBAAmB,CAAE,KAAM,CAAE;AACzD,UAAM,IAAK,OAAO,MAAO;AAAA,EAC1B;AACA,SAAO,MAAM,IAAK,KAAM;AACzB;",
4
+ "sourcesContent": ["import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';\nimport { unlock } from '../lock-unlock';\n\n// TODO: The following line should have been:\n//\n// const unlockedApis = unlock( blockEditorPrivateApis );\n//\n// But there are hidden circular dependencies in RNMobile code, specifically in\n// certain native components in the `components` package that depend on\n// `block-editor`. What follows is a workaround that defers the `unlock` call\n// to prevent native code from failing.\n//\n// Fix once https://github.com/WordPress/gutenberg/issues/52692 is closed.\nlet unlockedApis;\n\nconst cache = new WeakMap();\n\nexport default function getRichTextValuesCached( block ) {\n\tif ( ! unlockedApis ) {\n\t\tunlockedApis = unlock( blockEditorPrivateApis );\n\t}\n\n\tif ( ! cache.has( block ) ) {\n\t\tconst values = unlockedApis.getRichTextValues( [ block ] );\n\t\tcache.set( block, values );\n\t}\n\treturn cache.get( block );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAsD;AACtD,yBAAuB;AAYvB,IAAI;AAEJ,IAAM,QAAQ,oBAAI,QAAQ;AAEX,SAAR,wBAA0C,OAAQ;AACxD,MAAK,CAAE,cAAe;AACrB,uBAAe,2BAAQ,oBAAAA,WAAuB;AAAA,EAC/C;AAEA,MAAK,CAAE,MAAM,IAAK,KAAM,GAAI;AAC3B,UAAM,SAAS,aAAa,kBAAmB,CAAE,KAAM,CAAE;AACzD,UAAM,IAAK,OAAO,MAAO;AAAA,EAC1B;AACA,SAAO,MAAM,IAAK,KAAM;AACzB;",
6
6
  "names": ["blockEditorPrivateApis"]
7
7
  }
@@ -34,6 +34,7 @@ __export(footnotes_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(footnotes_exports);
36
36
  var import_rich_text = require("@wordpress/rich-text");
37
+ var import_warning = __toESM(require("@wordpress/warning"));
37
38
  var import_get_footnotes_order = __toESM(require("./get-footnotes-order.cjs"));
38
39
  var oldFootnotes = {};
39
40
  function updateFootnotesFromMeta(blocks, meta) {
@@ -45,7 +46,17 @@ function updateFootnotesFromMeta(blocks, meta) {
45
46
  return output;
46
47
  }
47
48
  const newOrder = (0, import_get_footnotes_order.default)(blocks);
48
- const footnotes = meta.footnotes ? JSON.parse(meta.footnotes) : [];
49
+ let parsed;
50
+ try {
51
+ parsed = JSON.parse(meta.footnotes || "[]");
52
+ } catch {
53
+ }
54
+ let footnotes = [];
55
+ if (Array.isArray(parsed)) {
56
+ footnotes = parsed;
57
+ } else {
58
+ (0, import_warning.default)("Footnotes post meta is not a JSON array; ignoring it.");
59
+ }
49
60
  const currentOrder = footnotes.map((fn) => fn.id);
50
61
  if (currentOrder.join("") === newOrder.join("")) {
51
62
  return output;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/footnotes/index.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { RichTextData, create, toHTMLString } from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport getFootnotesOrder from './get-footnotes-order';\n\nlet oldFootnotes = {};\n\nexport function updateFootnotesFromMeta( blocks, meta ) {\n\tconst output = { blocks };\n\tif ( ! meta ) {\n\t\treturn output;\n\t}\n\n\t// If meta.footnotes is empty, it means the meta is not registered.\n\tif ( meta.footnotes === undefined ) {\n\t\treturn output;\n\t}\n\n\tconst newOrder = getFootnotesOrder( blocks );\n\n\tconst footnotes = meta.footnotes ? JSON.parse( meta.footnotes ) : [];\n\tconst currentOrder = footnotes.map( ( fn ) => fn.id );\n\n\tif ( currentOrder.join( '' ) === newOrder.join( '' ) ) {\n\t\treturn output;\n\t}\n\n\tconst newFootnotes = newOrder.map(\n\t\t( fnId ) =>\n\t\t\tfootnotes.find( ( fn ) => fn.id === fnId ) ||\n\t\t\toldFootnotes[ fnId ] || {\n\t\t\t\tid: fnId,\n\t\t\t\tcontent: '',\n\t\t\t}\n\t);\n\n\tfunction updateAttributes( attributes ) {\n\t\t// Only attempt to update attributes, if attributes is an object.\n\t\tif (\n\t\t\t! attributes ||\n\t\t\tArray.isArray( attributes ) ||\n\t\t\ttypeof attributes !== 'object'\n\t\t) {\n\t\t\treturn attributes;\n\t\t}\n\n\t\tattributes = { ...attributes };\n\n\t\tfor ( const key in attributes ) {\n\t\t\tconst value = attributes[ key ];\n\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\tattributes[ key ] = value.map( updateAttributes );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// To do, remove support for string values?\n\t\t\tif (\n\t\t\t\ttypeof value !== 'string' &&\n\t\t\t\t! ( value instanceof RichTextData )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst richTextValue =\n\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t? RichTextData.fromHTMLString( value )\n\t\t\t\t\t: new RichTextData( value );\n\n\t\t\tlet hasFootnotes = false;\n\n\t\t\trichTextValue.replacements.forEach( ( replacement ) => {\n\t\t\t\tif ( replacement.type === 'core/footnote' ) {\n\t\t\t\t\tconst id = replacement.attributes[ 'data-fn' ];\n\t\t\t\t\tconst index = newOrder.indexOf( id );\n\t\t\t\t\t// The innerHTML contains the count wrapped in a link.\n\t\t\t\t\tconst countValue = create( {\n\t\t\t\t\t\thtml: replacement.innerHTML,\n\t\t\t\t\t} );\n\t\t\t\t\tcountValue.text = String( index + 1 );\n\t\t\t\t\tcountValue.formats = Array.from(\n\t\t\t\t\t\t{ length: countValue.text.length },\n\t\t\t\t\t\t() => countValue.formats[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t\tcountValue.replacements = Array.from(\n\t\t\t\t\t\t{ length: countValue.text.length },\n\t\t\t\t\t\t() => countValue.replacements[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t\treplacement.innerHTML = toHTMLString( {\n\t\t\t\t\t\tvalue: countValue,\n\t\t\t\t\t} );\n\t\t\t\t\thasFootnotes = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( hasFootnotes ) {\n\t\t\t\tattributes[ key ] =\n\t\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t\t? richTextValue.toHTMLString()\n\t\t\t\t\t\t: richTextValue;\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n\tfunction updateBlocksAttributes( __blocks ) {\n\t\treturn __blocks.map( ( block ) => {\n\t\t\treturn {\n\t\t\t\t...block,\n\t\t\t\tattributes: updateAttributes( block.attributes ),\n\t\t\t\tinnerBlocks: updateBlocksAttributes( block.innerBlocks ),\n\t\t\t};\n\t\t} );\n\t}\n\n\t// We need to go through all block attributes deeply and update the\n\t// footnote anchor numbering (textContent) to match the new order.\n\tconst newBlocks = updateBlocksAttributes( blocks );\n\n\toldFootnotes = {\n\t\t...oldFootnotes,\n\t\t...footnotes.reduce( ( acc, fn ) => {\n\t\t\tif ( ! newOrder.includes( fn.id ) ) {\n\t\t\t\tacc[ fn.id ] = fn;\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} ),\n\t};\n\n\treturn {\n\t\tmeta: {\n\t\t\t...meta,\n\t\t\tfootnotes: JSON.stringify( newFootnotes ),\n\t\t},\n\t\tblocks: newBlocks,\n\t};\n}\n"],
5
- "mappings": "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",
6
- "names": ["getFootnotesOrder"]
4
+ "sourcesContent": ["import { RichTextData, create, toHTMLString } from '@wordpress/rich-text';\nimport warning from '@wordpress/warning';\nimport getFootnotesOrder from './get-footnotes-order';\n\nlet oldFootnotes = {};\n\nexport function updateFootnotesFromMeta( blocks, meta ) {\n\tconst output = { blocks };\n\tif ( ! meta ) {\n\t\treturn output;\n\t}\n\n\t// If meta.footnotes is empty, it means the meta is not registered.\n\tif ( meta.footnotes === undefined ) {\n\t\treturn output;\n\t}\n\n\tconst newOrder = getFootnotesOrder( blocks );\n\n\t// This meta is a string that something else may have written: a plugin, an\n\t// import, or a direct database edit can leave it malformed or holding\n\t// something other than an array. Parsing it unguarded throws inside a store\n\t// subscriber, where no error boundary catches it and the edit is dropped\n\t// before it reaches editEntityRecord, so the post silently stops saving.\n\tlet parsed;\n\ttry {\n\t\tparsed = JSON.parse( meta.footnotes || '[]' );\n\t} catch {\n\t\t// Left undefined, which the check below reports along with a value of\n\t\t// the wrong shape.\n\t}\n\n\tlet footnotes = [];\n\tif ( Array.isArray( parsed ) ) {\n\t\tfootnotes = parsed;\n\t} else {\n\t\twarning( 'Footnotes post meta is not a JSON array; ignoring it.' );\n\t}\n\n\tconst currentOrder = footnotes.map( ( fn ) => fn.id );\n\n\tif ( currentOrder.join( '' ) === newOrder.join( '' ) ) {\n\t\treturn output;\n\t}\n\n\tconst newFootnotes = newOrder.map(\n\t\t( fnId ) =>\n\t\t\tfootnotes.find( ( fn ) => fn.id === fnId ) ||\n\t\t\toldFootnotes[ fnId ] || {\n\t\t\t\tid: fnId,\n\t\t\t\tcontent: '',\n\t\t\t}\n\t);\n\n\tfunction updateAttributes( attributes ) {\n\t\t// Only attempt to update attributes, if attributes is an object.\n\t\tif (\n\t\t\t! attributes ||\n\t\t\tArray.isArray( attributes ) ||\n\t\t\ttypeof attributes !== 'object'\n\t\t) {\n\t\t\treturn attributes;\n\t\t}\n\n\t\tattributes = { ...attributes };\n\n\t\tfor ( const key in attributes ) {\n\t\t\tconst value = attributes[ key ];\n\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\tattributes[ key ] = value.map( updateAttributes );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// To do, remove support for string values?\n\t\t\tif (\n\t\t\t\ttypeof value !== 'string' &&\n\t\t\t\t! ( value instanceof RichTextData )\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst richTextValue =\n\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t? RichTextData.fromHTMLString( value )\n\t\t\t\t\t: new RichTextData( value );\n\n\t\t\tlet hasFootnotes = false;\n\n\t\t\trichTextValue.replacements.forEach( ( replacement ) => {\n\t\t\t\tif ( replacement.type === 'core/footnote' ) {\n\t\t\t\t\tconst id = replacement.attributes[ 'data-fn' ];\n\t\t\t\t\tconst index = newOrder.indexOf( id );\n\t\t\t\t\t// The innerHTML contains the count wrapped in a link.\n\t\t\t\t\tconst countValue = create( {\n\t\t\t\t\t\thtml: replacement.innerHTML,\n\t\t\t\t\t} );\n\t\t\t\t\tcountValue.text = String( index + 1 );\n\t\t\t\t\tcountValue.formats = Array.from(\n\t\t\t\t\t\t{ length: countValue.text.length },\n\t\t\t\t\t\t() => countValue.formats[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t\tcountValue.replacements = Array.from(\n\t\t\t\t\t\t{ length: countValue.text.length },\n\t\t\t\t\t\t() => countValue.replacements[ 0 ]\n\t\t\t\t\t);\n\t\t\t\t\treplacement.innerHTML = toHTMLString( {\n\t\t\t\t\t\tvalue: countValue,\n\t\t\t\t\t} );\n\t\t\t\t\thasFootnotes = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( hasFootnotes ) {\n\t\t\t\tattributes[ key ] =\n\t\t\t\t\ttypeof value === 'string'\n\t\t\t\t\t\t? richTextValue.toHTMLString()\n\t\t\t\t\t\t: richTextValue;\n\t\t\t}\n\t\t}\n\n\t\treturn attributes;\n\t}\n\n\tfunction updateBlocksAttributes( __blocks ) {\n\t\treturn __blocks.map( ( block ) => {\n\t\t\treturn {\n\t\t\t\t...block,\n\t\t\t\tattributes: updateAttributes( block.attributes ),\n\t\t\t\tinnerBlocks: updateBlocksAttributes( block.innerBlocks ),\n\t\t\t};\n\t\t} );\n\t}\n\n\t// We need to go through all block attributes deeply and update the\n\t// footnote anchor numbering (textContent) to match the new order.\n\tconst newBlocks = updateBlocksAttributes( blocks );\n\n\toldFootnotes = {\n\t\t...oldFootnotes,\n\t\t...footnotes.reduce( ( acc, fn ) => {\n\t\t\tif ( ! newOrder.includes( fn.id ) ) {\n\t\t\t\tacc[ fn.id ] = fn;\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} ),\n\t};\n\n\treturn {\n\t\tmeta: {\n\t\t\t...meta,\n\t\t\tfootnotes: JSON.stringify( newFootnotes ),\n\t\t},\n\t\tblocks: newBlocks,\n\t};\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["getFootnotesOrder", "warning"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/index.ts"],
4
- "sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { WithPermissions } from './use-entity-records';\n\n/**\n * Utility type that adds permissions to any record type.\n */\nexport type { WithPermissions };\nexport {\n\tdefault as useEntityRecord,\n\tuseDeprecatedEntityRecord as __experimentalUseEntityRecord,\n} from './use-entity-record';\nexport {\n\tdefault as useEntityRecords,\n\tuseDeprecatedEntityRecords as __experimentalUseEntityRecords,\n} from './use-entity-records';\nexport {\n\tdefault as useResourcePermissions,\n\tuseDeprecatedResourcePermissions as __experimentalUseResourcePermissions,\n} from './use-resource-permissions';\nexport { default as useEntityBlockEditor } from './use-entity-block-editor';\nexport { default as useEntityId } from './use-entity-id';\nexport { default as useEntityProp } from './use-entity-prop';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,+BAGO;AACP,gCAGO;AACP,sCAGO;AACP,qCAAgD;AAChD,2BAAuC;AACvC,6BAAyC;",
4
+ "sourcesContent": ["import type { WithPermissions } from './use-entity-records';\n\n/**\n * Utility type that adds permissions to any record type.\n */\nexport type { WithPermissions };\nexport {\n\tdefault as useEntityRecord,\n\tuseDeprecatedEntityRecord as __experimentalUseEntityRecord,\n} from './use-entity-record';\nexport {\n\tdefault as useEntityRecords,\n\tuseDeprecatedEntityRecords as __experimentalUseEntityRecords,\n} from './use-entity-records';\nexport {\n\tdefault as useResourcePermissions,\n\tuseDeprecatedResourcePermissions as __experimentalUseResourcePermissions,\n} from './use-resource-permissions';\nexport { default as useEntityBlockEditor } from './use-entity-block-editor';\nexport { default as useEntityId } from './use-entity-id';\nexport { default as useEntityProp } from './use-entity-prop';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,+BAGO;AACP,gCAGO;AACP,sCAGO;AACP,qCAAgD;AAChD,2BAAuC;AACvC,6BAAyC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-entity-block-editor.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback, useMemo } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { parse, __unstableSerializeAndClean } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from '../name';\nimport useEntityId from './use-entity-id';\nimport { updateFootnotesFromMeta } from '../footnotes';\nimport { parsedBlocksCache, getCacheKey } from '../parsed-blocks-cache';\n\nconst EMPTY_ARRAY = [];\n\n/**\n * Hook that returns block content getters and setters for\n * the nearest provided entity of the specified type.\n *\n * The return value has the shape `[ blocks, onInput, onChange ]`.\n * `onInput` is for block changes that don't create undo levels\n * or dirty the post, non-persistent changes, and `onChange` is for\n * persistent changes. They map directly to the props of a\n * `BlockEditorProvider` and are intended to be used with it,\n * or similar components or hooks.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n * @param {Object} options\n * @param {string} [options.id] An entity ID to use instead of the context-provided one.\n *\n * @return {[unknown[], Function, Function]} The block array and setters.\n */\nexport default function useEntityBlockEditor( kind, name, { id: _id } = {} ) {\n\tconst providerId = useEntityId( kind, name );\n\tconst id = _id ?? providerId;\n\tconst { content, editedBlocks, meta } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! id ) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst { getEditedEntityRecord } = select( STORE_NAME );\n\t\t\tconst editedRecord = getEditedEntityRecord( kind, name, id );\n\t\t\treturn {\n\t\t\t\teditedBlocks: editedRecord.blocks,\n\t\t\t\tcontent: editedRecord.content,\n\t\t\t\tmeta: editedRecord.meta,\n\t\t\t};\n\t\t},\n\t\t[ kind, name, id ]\n\t);\n\tconst { __unstableCreateUndoLevel, editEntityRecord } =\n\t\tuseDispatch( STORE_NAME );\n\n\tconst blocks = useMemo( () => {\n\t\tif ( ! id ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( editedBlocks ) {\n\t\t\treturn editedBlocks;\n\t\t}\n\n\t\tif ( ! content || typeof content !== 'string' ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\t// Cache parsed blocks by entity identity. Store the content\n\t\t// alongside the blocks so we can validate it hasn't changed.\n\t\tconst cacheKey = getCacheKey( kind, name, id );\n\t\tconst cached = parsedBlocksCache.get( cacheKey );\n\t\tlet _blocks;\n\n\t\tif ( cached && cached.content === content ) {\n\t\t\t_blocks = cached.blocks;\n\t\t} else {\n\t\t\t_blocks = parse( content );\n\t\t\tparsedBlocksCache.set( cacheKey, { content, blocks: _blocks } );\n\t\t}\n\n\t\treturn _blocks;\n\t}, [ kind, name, id, editedBlocks, content ] );\n\n\tconst onChange = useCallback(\n\t\t( newBlocks, options ) => {\n\t\t\tconst noChange = blocks === newBlocks;\n\t\t\tif ( noChange ) {\n\t\t\t\treturn __unstableCreateUndoLevel( kind, name, id );\n\t\t\t}\n\t\t\tconst { selection, ...rest } = options;\n\n\t\t\t// We create a new function here on every persistent edit\n\t\t\t// to make sure the edit makes the post dirty and creates\n\t\t\t// a new undo level.\n\t\t\tconst edits = {\n\t\t\t\tselection,\n\t\t\t\tcontent: ( { blocks: blocksForSerialization = [] } ) =>\n\t\t\t\t\t__unstableSerializeAndClean( blocksForSerialization ),\n\t\t\t\t...updateFootnotesFromMeta( newBlocks, meta ),\n\t\t\t};\n\n\t\t\teditEntityRecord( kind, name, id, edits, {\n\t\t\t\tisCached: false,\n\t\t\t\t...rest,\n\t\t\t} );\n\t\t},\n\t\t[\n\t\t\tkind,\n\t\t\tname,\n\t\t\tid,\n\t\t\tblocks,\n\t\t\tmeta,\n\t\t\t__unstableCreateUndoLevel,\n\t\t\teditEntityRecord,\n\t\t]\n\t);\n\n\tconst onInput = useCallback(\n\t\t( newBlocks, options ) => {\n\t\t\tconst { selection, ...rest } = options;\n\t\t\tconst edits = {\n\t\t\t\tselection,\n\t\t\t\t...updateFootnotesFromMeta( newBlocks, meta ),\n\t\t\t};\n\n\t\t\teditEntityRecord( kind, name, id, edits, {\n\t\t\t\tisCached: true,\n\t\t\t\t...rest,\n\t\t\t} );\n\t\t},\n\t\t[ kind, name, id, meta, editEntityRecord ]\n\t);\n\n\treturn [ blocks, onInput, onChange ];\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAqC;AACrC,kBAAuC;AACvC,oBAAmD;AAKnD,kBAA2B;AAC3B,2BAAwB;AACxB,uBAAwC;AACxC,iCAA+C;AAE/C,IAAM,cAAc,CAAC;AAoBN,SAAR,qBAAuC,MAAM,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,GAAI;AAC5E,QAAM,iBAAa,qBAAAA,SAAa,MAAM,IAAK;AAC3C,QAAM,KAAK,OAAO;AAClB,QAAM,EAAE,SAAS,cAAc,KAAK,QAAI;AAAA,IACvC,CAAE,WAAY;AACb,UAAK,CAAE,IAAK;AACX,eAAO,CAAC;AAAA,MACT;AACA,YAAM,EAAE,sBAAsB,IAAI,OAAQ,sBAAW;AACrD,YAAM,eAAe,sBAAuB,MAAM,MAAM,EAAG;AAC3D,aAAO;AAAA,QACN,cAAc,aAAa;AAAA,QAC3B,SAAS,aAAa;AAAA,QACtB,MAAM,aAAa;AAAA,MACpB;AAAA,IACD;AAAA,IACA,CAAE,MAAM,MAAM,EAAG;AAAA,EAClB;AACA,QAAM,EAAE,2BAA2B,iBAAiB,QACnD,yBAAa,sBAAW;AAEzB,QAAM,aAAS,wBAAS,MAAM;AAC7B,QAAK,CAAE,IAAK;AACX,aAAO;AAAA,IACR;AAEA,QAAK,cAAe;AACnB,aAAO;AAAA,IACR;AAEA,QAAK,CAAE,WAAW,OAAO,YAAY,UAAW;AAC/C,aAAO;AAAA,IACR;AAIA,UAAM,eAAW,wCAAa,MAAM,MAAM,EAAG;AAC7C,UAAM,SAAS,6CAAkB,IAAK,QAAS;AAC/C,QAAI;AAEJ,QAAK,UAAU,OAAO,YAAY,SAAU;AAC3C,gBAAU,OAAO;AAAA,IAClB,OAAO;AACN,oBAAU,qBAAO,OAAQ;AACzB,mDAAkB,IAAK,UAAU,EAAE,SAAS,QAAQ,QAAQ,CAAE;AAAA,IAC/D;AAEA,WAAO;AAAA,EACR,GAAG,CAAE,MAAM,MAAM,IAAI,cAAc,OAAQ,CAAE;AAE7C,QAAM,eAAW;AAAA,IAChB,CAAE,WAAW,YAAa;AACzB,YAAM,WAAW,WAAW;AAC5B,UAAK,UAAW;AACf,eAAO,0BAA2B,MAAM,MAAM,EAAG;AAAA,MAClD;AACA,YAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAK/B,YAAM,QAAQ;AAAA,QACb;AAAA,QACA,SAAS,CAAE,EAAE,QAAQ,yBAAyB,CAAC,EAAE,UAChD,2CAA6B,sBAAuB;AAAA,QACrD,OAAG,0CAAyB,WAAW,IAAK;AAAA,MAC7C;AAEA,uBAAkB,MAAM,MAAM,IAAI,OAAO;AAAA,QACxC,UAAU;AAAA,QACV,GAAG;AAAA,MACJ,CAAE;AAAA,IACH;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,cAAU;AAAA,IACf,CAAE,WAAW,YAAa;AACzB,YAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,YAAM,QAAQ;AAAA,QACb;AAAA,QACA,OAAG,0CAAyB,WAAW,IAAK;AAAA,MAC7C;AAEA,uBAAkB,MAAM,MAAM,IAAI,OAAO;AAAA,QACxC,UAAU;AAAA,QACV,GAAG;AAAA,MACJ,CAAE;AAAA,IACH;AAAA,IACA,CAAE,MAAM,MAAM,IAAI,MAAM,gBAAiB;AAAA,EAC1C;AAEA,SAAO,CAAE,QAAQ,SAAS,QAAS;AACpC;",
4
+ "sourcesContent": ["import { useCallback, useMemo } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { parse, __unstableSerializeAndClean } from '@wordpress/blocks';\nimport { STORE_NAME } from '../name';\nimport useEntityId from './use-entity-id';\nimport { updateFootnotesFromMeta } from '../footnotes';\nimport { parsedBlocksCache, getCacheKey } from '../parsed-blocks-cache';\n\nconst EMPTY_ARRAY = [];\n\n/**\n * Hook that returns block content getters and setters for\n * the nearest provided entity of the specified type.\n *\n * The return value has the shape `[ blocks, onInput, onChange ]`.\n * `onInput` is for block changes that don't create undo levels\n * or dirty the post, non-persistent changes, and `onChange` is for\n * persistent changes. They map directly to the props of a\n * `BlockEditorProvider` and are intended to be used with it,\n * or similar components or hooks.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n * @param {Object} options\n * @param {string} [options.id] An entity ID to use instead of the context-provided one.\n *\n * @return {[unknown[], Function, Function]} The block array and setters.\n */\nexport default function useEntityBlockEditor( kind, name, { id: _id } = {} ) {\n\tconst providerId = useEntityId( kind, name );\n\tconst id = _id ?? providerId;\n\tconst { content, editedBlocks, meta } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! id ) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t\tconst { getEditedEntityRecord } = select( STORE_NAME );\n\t\t\tconst editedRecord = getEditedEntityRecord( kind, name, id );\n\t\t\treturn {\n\t\t\t\teditedBlocks: editedRecord.blocks,\n\t\t\t\tcontent: editedRecord.content,\n\t\t\t\tmeta: editedRecord.meta,\n\t\t\t};\n\t\t},\n\t\t[ kind, name, id ]\n\t);\n\tconst { __unstableCreateUndoLevel, editEntityRecord } =\n\t\tuseDispatch( STORE_NAME );\n\n\tconst blocks = useMemo( () => {\n\t\tif ( ! id ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( editedBlocks ) {\n\t\t\treturn editedBlocks;\n\t\t}\n\n\t\tif ( ! content || typeof content !== 'string' ) {\n\t\t\treturn EMPTY_ARRAY;\n\t\t}\n\n\t\t// Cache parsed blocks by entity identity. Store the content\n\t\t// alongside the blocks so we can validate it hasn't changed.\n\t\tconst cacheKey = getCacheKey( kind, name, id );\n\t\tconst cached = parsedBlocksCache.get( cacheKey );\n\t\tlet _blocks;\n\n\t\tif ( cached && cached.content === content ) {\n\t\t\t_blocks = cached.blocks;\n\t\t} else {\n\t\t\t_blocks = parse( content );\n\t\t\tparsedBlocksCache.set( cacheKey, { content, blocks: _blocks } );\n\t\t}\n\n\t\treturn _blocks;\n\t}, [ kind, name, id, editedBlocks, content ] );\n\n\tconst onChange = useCallback(\n\t\t( newBlocks, options ) => {\n\t\t\tconst noChange = blocks === newBlocks;\n\t\t\tif ( noChange ) {\n\t\t\t\treturn __unstableCreateUndoLevel( kind, name, id );\n\t\t\t}\n\t\t\tconst { selection, ...rest } = options;\n\n\t\t\t// We create a new function here on every persistent edit\n\t\t\t// to make sure the edit makes the post dirty and creates\n\t\t\t// a new undo level.\n\t\t\tconst edits = {\n\t\t\t\tselection,\n\t\t\t\tcontent: ( { blocks: blocksForSerialization = [] } ) =>\n\t\t\t\t\t__unstableSerializeAndClean( blocksForSerialization ),\n\t\t\t\t...updateFootnotesFromMeta( newBlocks, meta ),\n\t\t\t};\n\n\t\t\teditEntityRecord( kind, name, id, edits, {\n\t\t\t\tisCached: false,\n\t\t\t\t...rest,\n\t\t\t} );\n\t\t},\n\t\t[\n\t\t\tkind,\n\t\t\tname,\n\t\t\tid,\n\t\t\tblocks,\n\t\t\tmeta,\n\t\t\t__unstableCreateUndoLevel,\n\t\t\teditEntityRecord,\n\t\t]\n\t);\n\n\tconst onInput = useCallback(\n\t\t( newBlocks, options ) => {\n\t\t\tconst { selection, ...rest } = options;\n\t\t\tconst edits = {\n\t\t\t\tselection,\n\t\t\t\t...updateFootnotesFromMeta( newBlocks, meta ),\n\t\t\t};\n\n\t\t\teditEntityRecord( kind, name, id, edits, {\n\t\t\t\tisCached: true,\n\t\t\t\t...rest,\n\t\t\t} );\n\t\t},\n\t\t[ kind, name, id, meta, editEntityRecord ]\n\t);\n\n\treturn [ blocks, onInput, onChange ];\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAqC;AACrC,kBAAuC;AACvC,oBAAmD;AACnD,kBAA2B;AAC3B,2BAAwB;AACxB,uBAAwC;AACxC,iCAA+C;AAE/C,IAAM,cAAc,CAAC;AAoBN,SAAR,qBAAuC,MAAM,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,GAAI;AAC5E,QAAM,iBAAa,qBAAAA,SAAa,MAAM,IAAK;AAC3C,QAAM,KAAK,OAAO;AAClB,QAAM,EAAE,SAAS,cAAc,KAAK,QAAI;AAAA,IACvC,CAAE,WAAY;AACb,UAAK,CAAE,IAAK;AACX,eAAO,CAAC;AAAA,MACT;AACA,YAAM,EAAE,sBAAsB,IAAI,OAAQ,sBAAW;AACrD,YAAM,eAAe,sBAAuB,MAAM,MAAM,EAAG;AAC3D,aAAO;AAAA,QACN,cAAc,aAAa;AAAA,QAC3B,SAAS,aAAa;AAAA,QACtB,MAAM,aAAa;AAAA,MACpB;AAAA,IACD;AAAA,IACA,CAAE,MAAM,MAAM,EAAG;AAAA,EAClB;AACA,QAAM,EAAE,2BAA2B,iBAAiB,QACnD,yBAAa,sBAAW;AAEzB,QAAM,aAAS,wBAAS,MAAM;AAC7B,QAAK,CAAE,IAAK;AACX,aAAO;AAAA,IACR;AAEA,QAAK,cAAe;AACnB,aAAO;AAAA,IACR;AAEA,QAAK,CAAE,WAAW,OAAO,YAAY,UAAW;AAC/C,aAAO;AAAA,IACR;AAIA,UAAM,eAAW,wCAAa,MAAM,MAAM,EAAG;AAC7C,UAAM,SAAS,6CAAkB,IAAK,QAAS;AAC/C,QAAI;AAEJ,QAAK,UAAU,OAAO,YAAY,SAAU;AAC3C,gBAAU,OAAO;AAAA,IAClB,OAAO;AACN,oBAAU,qBAAO,OAAQ;AACzB,mDAAkB,IAAK,UAAU,EAAE,SAAS,QAAQ,QAAQ,CAAE;AAAA,IAC/D;AAEA,WAAO;AAAA,EACR,GAAG,CAAE,MAAM,MAAM,IAAI,cAAc,OAAQ,CAAE;AAE7C,QAAM,eAAW;AAAA,IAChB,CAAE,WAAW,YAAa;AACzB,YAAM,WAAW,WAAW;AAC5B,UAAK,UAAW;AACf,eAAO,0BAA2B,MAAM,MAAM,EAAG;AAAA,MAClD;AACA,YAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAK/B,YAAM,QAAQ;AAAA,QACb;AAAA,QACA,SAAS,CAAE,EAAE,QAAQ,yBAAyB,CAAC,EAAE,UAChD,2CAA6B,sBAAuB;AAAA,QACrD,OAAG,0CAAyB,WAAW,IAAK;AAAA,MAC7C;AAEA,uBAAkB,MAAM,MAAM,IAAI,OAAO;AAAA,QACxC,UAAU;AAAA,QACV,GAAG;AAAA,MACJ,CAAE;AAAA,IACH;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,cAAU;AAAA,IACf,CAAE,WAAW,YAAa;AACzB,YAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,YAAM,QAAQ;AAAA,QACb;AAAA,QACA,OAAG,0CAAyB,WAAW,IAAK;AAAA,MAC7C;AAEA,uBAAkB,MAAM,MAAM,IAAI,OAAO;AAAA,QACxC,UAAU;AAAA,QACV,GAAG;AAAA,MACJ,CAAE;AAAA,IACH;AAAA,IACA,CAAE,MAAM,MAAM,IAAI,MAAM,gBAAiB;AAAA,EAC1C;AAEA,SAAO,CAAE,QAAQ,SAAS,QAAS;AACpC;",
6
6
  "names": ["useEntityId"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-entity-id.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useContext } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { EntityContext } from '../entity-context';\n\n/**\n * Hook that returns the ID for the nearest\n * provided entity of the specified type.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n */\nexport default function useEntityId( kind, name ) {\n\tconst context = useContext( EntityContext );\n\treturn context?.[ kind ]?.[ name ];\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAA2B;AAK3B,4BAA8B;AASf,SAAR,YAA8B,MAAM,MAAO;AACjD,QAAM,cAAU,2BAAY,mCAAc;AAC1C,SAAO,UAAW,IAAK,IAAK,IAAK;AAClC;",
4
+ "sourcesContent": ["import { useContext } from '@wordpress/element';\nimport { EntityContext } from '../entity-context';\n\n/**\n * Hook that returns the ID for the nearest\n * provided entity of the specified type.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n */\nexport default function useEntityId( kind, name ) {\n\tconst context = useContext( EntityContext );\n\treturn context?.[ kind ]?.[ name ];\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA2B;AAC3B,4BAA8B;AASf,SAAR,YAA8B,MAAM,MAAO;AACjD,QAAM,cAAU,2BAAY,mCAAc;AAC1C,SAAO,UAAW,IAAK,IAAK,IAAK;AAClC;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-entity-prop.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useCallback, useContext } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from '../name';\nimport { DEFAULT_ENTITY_KEY } from '../entities';\nimport { EntityContext } from '../entity-context';\nimport useEntityId from './use-entity-id';\n\n/**\n * Hook that returns the value and a setter for the\n * specified property of the nearest provided\n * entity of the specified type.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n * @param {string} prop The property name.\n * @param {number|string} [_id] An entity ID to use instead of the context-provided one.\n *\n * @return {[*, Function, *]} An array where the first item is the\n * property value, the second is the\n * setter and the third is the full value\n * \t\t\t\t\t\t\t object from REST API containing more\n * \t\t\t\t\t\t\t information like `raw`, `rendered` and\n * \t\t\t\t\t\t\t `protected` props.\n */\nexport default function useEntityProp( kind, name, prop, _id ) {\n\tconst providerId = useEntityId( kind, name );\n\tconst id = _id ?? providerId;\n\tconst context = useContext( EntityContext );\n\tconst revisionId = context?.revisionId;\n\n\tconst { value, fullValue } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( revisionId ) {\n\t\t\t\t// Use getRevisions (not getRevision) to read from the\n\t\t\t\t// already-cached collection. Using getRevision would\n\t\t\t\t// trigger a redundant single-revision API fetch that\n\t\t\t\t// can wipe the collection due to a race condition.\n\t\t\t\t// See https://github.com/WordPress/gutenberg/pull/76043.\n\t\t\t\tconst revisions = select( STORE_NAME ).getRevisions(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tid,\n\t\t\t\t\t{\n\t\t\t\t\t\tper_page: -1,\n\t\t\t\t\t\tcontext: 'edit',\n\t\t\t\t\t\t_fields:\n\t\t\t\t\t\t\t'id,date,author,meta,title.raw,excerpt.raw,content.raw',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tconst entityConfig = select( STORE_NAME ).getEntityConfig(\n\t\t\t\t\tkind,\n\t\t\t\t\tname\n\t\t\t\t);\n\t\t\t\tconst revKey = entityConfig?.revisionKey || DEFAULT_ENTITY_KEY;\n\t\t\t\tconst revision = revisions?.find(\n\t\t\t\t\t( r ) => r[ revKey ] === revisionId\n\t\t\t\t);\n\t\t\t\treturn revision\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tvalue: revision[ prop ]?.raw ?? revision[ prop ],\n\t\t\t\t\t\t\tfullValue: revision[ prop ],\n\t\t\t\t\t }\n\t\t\t\t\t: {};\n\t\t\t}\n\n\t\t\tconst { getEntityRecord, getEditedEntityRecord } =\n\t\t\t\tselect( STORE_NAME );\n\t\t\tconst record = getEntityRecord( kind, name, id ); // Trigger resolver.\n\t\t\tconst editedRecord = getEditedEntityRecord( kind, name, id );\n\t\t\treturn record && editedRecord\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: editedRecord[ prop ],\n\t\t\t\t\t\tfullValue: record[ prop ],\n\t\t\t\t }\n\t\t\t\t: {};\n\t\t},\n\t\t[ kind, name, id, prop, revisionId ]\n\t);\n\tconst { editEntityRecord } = useDispatch( STORE_NAME );\n\tconst setValue = useCallback(\n\t\t( newValue ) => {\n\t\t\tif ( revisionId ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\teditEntityRecord( kind, name, id, {\n\t\t\t\t[ prop ]: newValue,\n\t\t\t} );\n\t\t},\n\t\t[ editEntityRecord, kind, name, id, prop, revisionId ]\n\t);\n\n\treturn [ value, setValue, fullValue ];\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAwC;AACxC,kBAAuC;AAKvC,kBAA2B;AAC3B,sBAAmC;AACnC,4BAA8B;AAC9B,2BAAwB;AAmBT,SAAR,cAAgC,MAAM,MAAM,MAAM,KAAM;AAC9D,QAAM,iBAAa,qBAAAA,SAAa,MAAM,IAAK;AAC3C,QAAM,KAAK,OAAO;AAClB,QAAM,cAAU,2BAAY,mCAAc;AAC1C,QAAM,aAAa,SAAS;AAE5B,QAAM,EAAE,OAAO,UAAU,QAAI;AAAA,IAC5B,CAAE,WAAY;AACb,UAAK,YAAa;AAMjB,cAAM,YAAY,OAAQ,sBAAW,EAAE;AAAA,UACtC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACC,UAAU;AAAA,YACV,SAAS;AAAA,YACT,SACC;AAAA,UACF;AAAA,QACD;AACA,cAAM,eAAe,OAAQ,sBAAW,EAAE;AAAA,UACzC;AAAA,UACA;AAAA,QACD;AACA,cAAM,SAAS,cAAc,eAAe;AAC5C,cAAM,WAAW,WAAW;AAAA,UAC3B,CAAE,MAAO,EAAG,MAAO,MAAM;AAAA,QAC1B;AACA,eAAO,WACJ;AAAA,UACA,OAAO,SAAU,IAAK,GAAG,OAAO,SAAU,IAAK;AAAA,UAC/C,WAAW,SAAU,IAAK;AAAA,QAC1B,IACA,CAAC;AAAA,MACL;AAEA,YAAM,EAAE,iBAAiB,sBAAsB,IAC9C,OAAQ,sBAAW;AACpB,YAAM,SAAS,gBAAiB,MAAM,MAAM,EAAG;AAC/C,YAAM,eAAe,sBAAuB,MAAM,MAAM,EAAG;AAC3D,aAAO,UAAU,eACd;AAAA,QACA,OAAO,aAAc,IAAK;AAAA,QAC1B,WAAW,OAAQ,IAAK;AAAA,MACxB,IACA,CAAC;AAAA,IACL;AAAA,IACA,CAAE,MAAM,MAAM,IAAI,MAAM,UAAW;AAAA,EACpC;AACA,QAAM,EAAE,iBAAiB,QAAI,yBAAa,sBAAW;AACrD,QAAM,eAAW;AAAA,IAChB,CAAE,aAAc;AACf,UAAK,YAAa;AACjB;AAAA,MACD;AACA,uBAAkB,MAAM,MAAM,IAAI;AAAA,QACjC,CAAE,IAAK,GAAG;AAAA,MACX,CAAE;AAAA,IACH;AAAA,IACA,CAAE,kBAAkB,MAAM,MAAM,IAAI,MAAM,UAAW;AAAA,EACtD;AAEA,SAAO,CAAE,OAAO,UAAU,SAAU;AACrC;",
4
+ "sourcesContent": ["import { useCallback, useContext } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { STORE_NAME } from '../name';\nimport { DEFAULT_ENTITY_KEY } from '../entities';\nimport { EntityContext } from '../entity-context';\nimport useEntityId from './use-entity-id';\n\n/**\n * Hook that returns the value and a setter for the\n * specified property of the nearest provided\n * entity of the specified type.\n *\n * @param {string} kind The entity kind.\n * @param {string} name The entity name.\n * @param {string} prop The property name.\n * @param {number|string} [_id] An entity ID to use instead of the context-provided one.\n *\n * @return {[*, Function, *]} An array where the first item is the\n * property value, the second is the\n * setter and the third is the full value\n * \t\t\t\t\t\t\t object from REST API containing more\n * \t\t\t\t\t\t\t information like `raw`, `rendered` and\n * \t\t\t\t\t\t\t `protected` props.\n */\nexport default function useEntityProp( kind, name, prop, _id ) {\n\tconst providerId = useEntityId( kind, name );\n\tconst id = _id ?? providerId;\n\tconst context = useContext( EntityContext );\n\tconst revisionId = context?.revisionId;\n\n\tconst { value, fullValue } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( revisionId ) {\n\t\t\t\t// Use getRevisions (not getRevision) to read from the\n\t\t\t\t// already-cached collection. Using getRevision would\n\t\t\t\t// trigger a redundant single-revision API fetch that\n\t\t\t\t// can wipe the collection due to a race condition.\n\t\t\t\t// See https://github.com/WordPress/gutenberg/pull/76043.\n\t\t\t\tconst revisions = select( STORE_NAME ).getRevisions(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tid,\n\t\t\t\t\t{\n\t\t\t\t\t\tper_page: -1,\n\t\t\t\t\t\tcontext: 'edit',\n\t\t\t\t\t\t_fields:\n\t\t\t\t\t\t\t'id,date,author,meta,title.raw,excerpt.raw,content.raw',\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tconst entityConfig = select( STORE_NAME ).getEntityConfig(\n\t\t\t\t\tkind,\n\t\t\t\t\tname\n\t\t\t\t);\n\t\t\t\tconst revKey = entityConfig?.revisionKey || DEFAULT_ENTITY_KEY;\n\t\t\t\tconst revision = revisions?.find(\n\t\t\t\t\t( r ) => r[ revKey ] === revisionId\n\t\t\t\t);\n\t\t\t\treturn revision\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tvalue: revision[ prop ]?.raw ?? revision[ prop ],\n\t\t\t\t\t\t\tfullValue: revision[ prop ],\n\t\t\t\t\t }\n\t\t\t\t\t: {};\n\t\t\t}\n\n\t\t\tconst { getEntityRecord, getEditedEntityRecord } =\n\t\t\t\tselect( STORE_NAME );\n\t\t\tconst record = getEntityRecord( kind, name, id ); // Trigger resolver.\n\t\t\tconst editedRecord = getEditedEntityRecord( kind, name, id );\n\t\t\treturn record && editedRecord\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: editedRecord[ prop ],\n\t\t\t\t\t\tfullValue: record[ prop ],\n\t\t\t\t }\n\t\t\t\t: {};\n\t\t},\n\t\t[ kind, name, id, prop, revisionId ]\n\t);\n\tconst { editEntityRecord } = useDispatch( STORE_NAME );\n\tconst setValue = useCallback(\n\t\t( newValue ) => {\n\t\t\tif ( revisionId ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\teditEntityRecord( kind, name, id, {\n\t\t\t\t[ prop ]: newValue,\n\t\t\t} );\n\t\t},\n\t\t[ editEntityRecord, kind, name, id, prop, revisionId ]\n\t);\n\n\treturn [ value, setValue, fullValue ];\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwC;AACxC,kBAAuC;AACvC,kBAA2B;AAC3B,sBAAmC;AACnC,4BAA8B;AAC9B,2BAAwB;AAmBT,SAAR,cAAgC,MAAM,MAAM,MAAM,KAAM;AAC9D,QAAM,iBAAa,qBAAAA,SAAa,MAAM,IAAK;AAC3C,QAAM,KAAK,OAAO;AAClB,QAAM,cAAU,2BAAY,mCAAc;AAC1C,QAAM,aAAa,SAAS;AAE5B,QAAM,EAAE,OAAO,UAAU,QAAI;AAAA,IAC5B,CAAE,WAAY;AACb,UAAK,YAAa;AAMjB,cAAM,YAAY,OAAQ,sBAAW,EAAE;AAAA,UACtC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACC,UAAU;AAAA,YACV,SAAS;AAAA,YACT,SACC;AAAA,UACF;AAAA,QACD;AACA,cAAM,eAAe,OAAQ,sBAAW,EAAE;AAAA,UACzC;AAAA,UACA;AAAA,QACD;AACA,cAAM,SAAS,cAAc,eAAe;AAC5C,cAAM,WAAW,WAAW;AAAA,UAC3B,CAAE,MAAO,EAAG,MAAO,MAAM;AAAA,QAC1B;AACA,eAAO,WACJ;AAAA,UACA,OAAO,SAAU,IAAK,GAAG,OAAO,SAAU,IAAK;AAAA,UAC/C,WAAW,SAAU,IAAK;AAAA,QAC1B,IACA,CAAC;AAAA,MACL;AAEA,YAAM,EAAE,iBAAiB,sBAAsB,IAC9C,OAAQ,sBAAW;AACpB,YAAM,SAAS,gBAAiB,MAAM,MAAM,EAAG;AAC/C,YAAM,eAAe,sBAAuB,MAAM,MAAM,EAAG;AAC3D,aAAO,UAAU,eACd;AAAA,QACA,OAAO,aAAc,IAAK;AAAA,QAC1B,WAAW,OAAQ,IAAK;AAAA,MACxB,IACA,CAAC;AAAA,IACL;AAAA,IACA,CAAE,MAAM,MAAM,IAAI,MAAM,UAAW;AAAA,EACpC;AACA,QAAM,EAAE,iBAAiB,QAAI,yBAAa,sBAAW;AACrD,QAAM,eAAW;AAAA,IAChB,CAAE,aAAc;AACf,UAAK,YAAa;AACjB;AAAA,MACD;AACA,uBAAkB,MAAM,MAAM,IAAI;AAAA,QACjC,CAAE,IAAK,GAAG;AAAA,MACX,CAAE;AAAA,IACH;AAAA,IACA,CAAE,kBAAkB,MAAM,MAAM,IAAI,MAAM,UAAW;AAAA,EACtD;AAEA,SAAO,CAAE,OAAO,UAAU,SAAU;AACrC;",
6
6
  "names": ["useEntityId"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-entity-record.ts"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\nimport { useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { store as coreStore } from '../';\nimport type { Status } from './constants';\nimport { getResolutionStatus } from './utils';\n\nexport interface EntityRecordResolution< RecordType > {\n\t/** The requested entity record */\n\trecord: RecordType | null;\n\n\t/** The edited entity record */\n\teditedRecord: Partial< RecordType >;\n\n\t/** The edits to the edited entity record */\n\tedits: Partial< RecordType >;\n\n\t/** Apply local (in-browser) edits to the edited entity record */\n\tedit: ( diff: Partial< RecordType > ) => void;\n\n\t/** Persist the edits to the server */\n\tsave: () => Promise< void >;\n\n\t/**\n\t * Is the record still being resolved?\n\t */\n\tisResolving: boolean;\n\n\t/**\n\t * Does the record have any local edits?\n\t */\n\thasEdits: boolean;\n\n\t/**\n\t * Has the resolution started?\n\t */\n\thasStarted: boolean;\n\n\t/**\n\t * Is the record resolved by now?\n\t */\n\thasResolved: boolean;\n\n\t/** Resolution status */\n\tstatus: Status;\n}\n\nexport interface Options {\n\t/**\n\t * Whether to run the query or short-circuit and return null.\n\t *\n\t * @default true\n\t */\n\tenabled: boolean;\n}\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Resolves the specified entity record.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.\n * @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.\n * @param recordId ID of the requested entity record.\n * @param options Optional hook options.\n * @example\n * ```js\n * import { useEntityRecord } from '@wordpress/core-data';\n *\n * function PageTitleDisplay( { id } ) {\n * const { record, isResolving } = useEntityRecord( 'postType', 'page', id );\n *\n * if ( isResolving ) {\n * return 'Loading...';\n * }\n *\n * return record.title;\n * }\n *\n * // Rendered in the application:\n * // <PageTitleDisplay id={ 1 } />\n * ```\n *\n * In the above example, when `PageTitleDisplay` is rendered into an\n * application, the page and the resolution details will be retrieved from\n * the store state using `getEntityRecord()`, or resolved if missing.\n *\n * @example\n * ```js\n * import { useCallback } from 'react';\n * import { useDispatch } from '@wordpress/data';\n * import { __ } from '@wordpress/i18n';\n * import { TextControl } from '@wordpress/components';\n * import { store as noticeStore } from '@wordpress/notices';\n * import { useEntityRecord } from '@wordpress/core-data';\n *\n * function PageRenameForm( { id } ) {\n * \tconst page = useEntityRecord( 'postType', 'page', id );\n * \tconst { createSuccessNotice, createErrorNotice } =\n * \t\tuseDispatch( noticeStore );\n *\n * \tconst setTitle = useCallback( ( title ) => {\n * \t\tpage.edit( { title } );\n * \t}, [ page.edit ] );\n *\n * \tif ( page.isResolving ) {\n * \t\treturn 'Loading...';\n * \t}\n *\n * \tasync function onRename( event ) {\n * \t\tevent.preventDefault();\n * \t\ttry {\n * \t\t\tawait page.save();\n * \t\t\tcreateSuccessNotice( __( 'Page renamed.' ), {\n * \t\t\t\ttype: 'snackbar',\n * \t\t\t} );\n * \t\t} catch ( error ) {\n * \t\t\tcreateErrorNotice( error.message, { type: 'snackbar' } );\n * \t\t}\n * \t}\n *\n * \treturn (\n * \t\t<form onSubmit={ onRename }>\n * \t\t\t<TextControl\n * \t\t\t\tlabel={ __( 'Name' ) }\n * \t\t\t\tvalue={ page.editedRecord.title }\n * \t\t\t\tonChange={ setTitle }\n * \t\t\t/>\n * \t\t\t<button type=\"submit\">{ __( 'Save' ) }</button>\n * \t\t</form>\n * \t);\n * }\n *\n * // Rendered in the application:\n * // <PageRenameForm id={ 1 } />\n * ```\n *\n * In the above example, updating and saving the page title is handled\n * via the `edit()` and `save()` mutation helpers provided by\n * `useEntityRecord()`;\n *\n * @return Entity record data.\n * @template RecordType\n */\nexport default function useEntityRecord< RecordType >(\n\tkind: string,\n\tname: string,\n\trecordId: string | number,\n\toptions: Options = { enabled: true }\n): EntityRecordResolution< RecordType > {\n\tconst { editEntityRecord, saveEditedEntityRecord } =\n\t\tuseDispatch( coreStore );\n\n\tconst mutations = useMemo(\n\t\t() => ( {\n\t\t\tedit: ( record, editOptions: any = {} ) =>\n\t\t\t\teditEntityRecord( kind, name, recordId, record, editOptions ),\n\t\t\tsave: ( saveOptions: any = {} ) =>\n\t\t\t\tsaveEditedEntityRecord( kind, name, recordId, {\n\t\t\t\t\tthrowOnError: true,\n\t\t\t\t\t...saveOptions,\n\t\t\t\t} ),\n\t\t} ),\n\t\t[ editEntityRecord, kind, name, recordId, saveEditedEntityRecord ]\n\t);\n\n\tconst { record, editedRecord, hasEdits, edits, ...resolution } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\trecord: null,\n\t\t\t\t\teditedRecord: EMPTY_OBJECT,\n\t\t\t\t\thasEdits: false,\n\t\t\t\t\tedits: EMPTY_OBJECT,\n\t\t\t\t\t...getResolutionStatus(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst storeSelectors = select( coreStore );\n\t\t\tconst resolutionStatus = storeSelectors.getResolutionState(\n\t\t\t\t'getEntityRecord',\n\t\t\t\t[ kind, name, recordId ]\n\t\t\t)?.status;\n\n\t\t\treturn {\n\t\t\t\trecord: ( storeSelectors.getEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t) ?? null ) as RecordType | null,\n\t\t\t\teditedRecord: storeSelectors.getEditedEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\thasEdits: storeSelectors.hasEditsForEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\tedits: storeSelectors.getEntityRecordNonTransientEdits(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\t...getResolutionStatus( resolutionStatus ),\n\t\t\t};\n\t\t},\n\t\t[ kind, name, recordId, options.enabled ]\n\t);\n\n\treturn {\n\t\trecord,\n\t\teditedRecord,\n\t\thasEdits,\n\t\tedits,\n\t\t...resolution,\n\t\t...mutations,\n\t} as EntityRecordResolution< RecordType >;\n}\n\nexport function useDeprecatedEntityRecord(\n\tkind: string,\n\tname: string,\n\trecordId: any,\n\toptions: any\n) {\n\tdeprecated( `wp.data.__experimentalUseEntityRecord`, {\n\t\talternative: 'wp.data.useEntityRecord',\n\t\tsince: '6.1',\n\t} );\n\treturn useEntityRecord( kind, name, recordId, options );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAuC;AACvC,wBAAuB;AACvB,qBAAwB;AAKxB,eAAmC;AAEnC,mBAAoC;AAmDpC,IAAM,eAAe,CAAC;AA0FP,SAAR,gBACN,MACA,MACA,UACA,UAAmB,EAAE,SAAS,KAAK,GACI;AACvC,QAAM,EAAE,kBAAkB,uBAAuB,QAChD,yBAAa,SAAAA,KAAU;AAExB,QAAM,gBAAY;AAAA,IACjB,OAAQ;AAAA,MACP,MAAM,CAAEC,SAAQ,cAAmB,CAAC,MACnC,iBAAkB,MAAM,MAAM,UAAUA,SAAQ,WAAY;AAAA,MAC7D,MAAM,CAAE,cAAmB,CAAC,MAC3B,uBAAwB,MAAM,MAAM,UAAU;AAAA,QAC7C,cAAc;AAAA,QACd,GAAG;AAAA,MACJ,CAAE;AAAA,IACJ;AAAA,IACA,CAAE,kBAAkB,MAAM,MAAM,UAAU,sBAAuB;AAAA,EAClE;AAEA,QAAM,EAAE,QAAQ,cAAc,UAAU,OAAO,GAAG,WAAW,QAAI;AAAA,IAChE,CAAE,WAAY;AACb,UAAK,CAAE,QAAQ,SAAU;AACxB,eAAO;AAAA,UACN,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAG,kCAAoB;AAAA,QACxB;AAAA,MACD;AAEA,YAAM,iBAAiB,OAAQ,SAAAD,KAAU;AACzC,YAAM,mBAAmB,eAAe;AAAA,QACvC;AAAA,QACA,CAAE,MAAM,MAAM,QAAS;AAAA,MACxB,GAAG;AAEH,aAAO;AAAA,QACN,QAAU,eAAe;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QACD,KAAK;AAAA,QACL,cAAc,eAAe;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,QACA,UAAU,eAAe;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,QACA,OAAO,eAAe;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,QACA,OAAG,kCAAqB,gBAAiB;AAAA,MAC1C;AAAA,IACD;AAAA,IACA,CAAE,MAAM,MAAM,UAAU,QAAQ,OAAQ;AAAA,EACzC;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AACD;AAEO,SAAS,0BACf,MACA,MACA,UACA,SACC;AACD,wBAAAE,SAAY,yCAAyC;AAAA,IACpD,aAAa;AAAA,IACb,OAAO;AAAA,EACR,CAAE;AACF,SAAO,gBAAiB,MAAM,MAAM,UAAU,OAAQ;AACvD;",
4
+ "sourcesContent": ["import { useDispatch, useSelect } from '@wordpress/data';\nimport deprecated from '@wordpress/deprecated';\nimport { useMemo } from '@wordpress/element';\nimport { store as coreStore } from '../';\nimport type { Status } from './constants';\nimport { getResolutionStatus } from './utils';\n\nexport interface EntityRecordResolution< RecordType > {\n\t/** The requested entity record */\n\trecord: RecordType | null;\n\n\t/** The edited entity record */\n\teditedRecord: Partial< RecordType >;\n\n\t/** The edits to the edited entity record */\n\tedits: Partial< RecordType >;\n\n\t/** Apply local (in-browser) edits to the edited entity record */\n\tedit: ( diff: Partial< RecordType > ) => void;\n\n\t/** Persist the edits to the server */\n\tsave: () => Promise< void >;\n\n\t/**\n\t * Is the record still being resolved?\n\t */\n\tisResolving: boolean;\n\n\t/**\n\t * Does the record have any local edits?\n\t */\n\thasEdits: boolean;\n\n\t/**\n\t * Has the resolution started?\n\t */\n\thasStarted: boolean;\n\n\t/**\n\t * Is the record resolved by now?\n\t */\n\thasResolved: boolean;\n\n\t/** Resolution status */\n\tstatus: Status;\n}\n\nexport interface Options {\n\t/**\n\t * Whether to run the query or short-circuit and return null.\n\t *\n\t * @default true\n\t */\n\tenabled: boolean;\n}\n\nconst EMPTY_OBJECT = {};\n\n/**\n * Resolves the specified entity record.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.\n * @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.\n * @param recordId ID of the requested entity record.\n * @param options Optional hook options.\n * @example\n * ```js\n * import { useEntityRecord } from '@wordpress/core-data';\n *\n * function PageTitleDisplay( { id } ) {\n * const { record, isResolving } = useEntityRecord( 'postType', 'page', id );\n *\n * if ( isResolving ) {\n * return 'Loading...';\n * }\n *\n * return record.title;\n * }\n *\n * // Rendered in the application:\n * // <PageTitleDisplay id={ 1 } />\n * ```\n *\n * In the above example, when `PageTitleDisplay` is rendered into an\n * application, the page and the resolution details will be retrieved from\n * the store state using `getEntityRecord()`, or resolved if missing.\n *\n * @example\n * ```js\n * import { useCallback } from 'react';\n * import { useDispatch } from '@wordpress/data';\n * import { __ } from '@wordpress/i18n';\n * import { TextControl } from '@wordpress/components';\n * import { store as noticeStore } from '@wordpress/notices';\n * import { useEntityRecord } from '@wordpress/core-data';\n *\n * function PageRenameForm( { id } ) {\n * \tconst page = useEntityRecord( 'postType', 'page', id );\n * \tconst { createSuccessNotice, createErrorNotice } =\n * \t\tuseDispatch( noticeStore );\n *\n * \tconst setTitle = useCallback( ( title ) => {\n * \t\tpage.edit( { title } );\n * \t}, [ page.edit ] );\n *\n * \tif ( page.isResolving ) {\n * \t\treturn 'Loading...';\n * \t}\n *\n * \tasync function onRename( event ) {\n * \t\tevent.preventDefault();\n * \t\ttry {\n * \t\t\tawait page.save();\n * \t\t\tcreateSuccessNotice( __( 'Page renamed.' ), {\n * \t\t\t\ttype: 'snackbar',\n * \t\t\t} );\n * \t\t} catch ( error ) {\n * \t\t\tcreateErrorNotice( error.message, { type: 'snackbar' } );\n * \t\t}\n * \t}\n *\n * \treturn (\n * \t\t<form onSubmit={ onRename }>\n * \t\t\t<TextControl\n * \t\t\t\tlabel={ __( 'Name' ) }\n * \t\t\t\tvalue={ page.editedRecord.title }\n * \t\t\t\tonChange={ setTitle }\n * \t\t\t/>\n * \t\t\t<button type=\"submit\">{ __( 'Save' ) }</button>\n * \t\t</form>\n * \t);\n * }\n *\n * // Rendered in the application:\n * // <PageRenameForm id={ 1 } />\n * ```\n *\n * In the above example, updating and saving the page title is handled\n * via the `edit()` and `save()` mutation helpers provided by\n * `useEntityRecord()`;\n *\n * @return Entity record data.\n * @template RecordType\n */\nexport default function useEntityRecord< RecordType >(\n\tkind: string,\n\tname: string,\n\trecordId: string | number,\n\toptions: Options = { enabled: true }\n): EntityRecordResolution< RecordType > {\n\tconst { editEntityRecord, saveEditedEntityRecord } =\n\t\tuseDispatch( coreStore );\n\n\tconst mutations = useMemo(\n\t\t() => ( {\n\t\t\tedit: ( record, editOptions: any = {} ) =>\n\t\t\t\teditEntityRecord( kind, name, recordId, record, editOptions ),\n\t\t\tsave: ( saveOptions: any = {} ) =>\n\t\t\t\tsaveEditedEntityRecord( kind, name, recordId, {\n\t\t\t\t\tthrowOnError: true,\n\t\t\t\t\t...saveOptions,\n\t\t\t\t} ),\n\t\t} ),\n\t\t[ editEntityRecord, kind, name, recordId, saveEditedEntityRecord ]\n\t);\n\n\tconst { record, editedRecord, hasEdits, edits, ...resolution } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\trecord: null,\n\t\t\t\t\teditedRecord: EMPTY_OBJECT,\n\t\t\t\t\thasEdits: false,\n\t\t\t\t\tedits: EMPTY_OBJECT,\n\t\t\t\t\t...getResolutionStatus(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst storeSelectors = select( coreStore );\n\t\t\tconst resolutionStatus = storeSelectors.getResolutionState(\n\t\t\t\t'getEntityRecord',\n\t\t\t\t[ kind, name, recordId ]\n\t\t\t)?.status;\n\n\t\t\treturn {\n\t\t\t\trecord: ( storeSelectors.getEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t) ?? null ) as RecordType | null,\n\t\t\t\teditedRecord: storeSelectors.getEditedEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\thasEdits: storeSelectors.hasEditsForEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\tedits: storeSelectors.getEntityRecordNonTransientEdits(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordId\n\t\t\t\t),\n\t\t\t\t...getResolutionStatus( resolutionStatus ),\n\t\t\t};\n\t\t},\n\t\t[ kind, name, recordId, options.enabled ]\n\t);\n\n\treturn {\n\t\trecord,\n\t\teditedRecord,\n\t\thasEdits,\n\t\tedits,\n\t\t...resolution,\n\t\t...mutations,\n\t} as EntityRecordResolution< RecordType >;\n}\n\nexport function useDeprecatedEntityRecord(\n\tkind: string,\n\tname: string,\n\trecordId: any,\n\toptions: any\n) {\n\tdeprecated( `wp.data.__experimentalUseEntityRecord`, {\n\t\talternative: 'wp.data.useEntityRecord',\n\t\tsince: '6.1',\n\t} );\n\treturn useEntityRecord( kind, name, recordId, options );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAuC;AACvC,wBAAuB;AACvB,qBAAwB;AACxB,eAAmC;AAEnC,mBAAoC;AAmDpC,IAAM,eAAe,CAAC;AA0FP,SAAR,gBACN,MACA,MACA,UACA,UAAmB,EAAE,SAAS,KAAK,GACI;AACvC,QAAM,EAAE,kBAAkB,uBAAuB,QAChD,yBAAa,SAAAA,KAAU;AAExB,QAAM,gBAAY;AAAA,IACjB,OAAQ;AAAA,MACP,MAAM,CAAEC,SAAQ,cAAmB,CAAC,MACnC,iBAAkB,MAAM,MAAM,UAAUA,SAAQ,WAAY;AAAA,MAC7D,MAAM,CAAE,cAAmB,CAAC,MAC3B,uBAAwB,MAAM,MAAM,UAAU;AAAA,QAC7C,cAAc;AAAA,QACd,GAAG;AAAA,MACJ,CAAE;AAAA,IACJ;AAAA,IACA,CAAE,kBAAkB,MAAM,MAAM,UAAU,sBAAuB;AAAA,EAClE;AAEA,QAAM,EAAE,QAAQ,cAAc,UAAU,OAAO,GAAG,WAAW,QAAI;AAAA,IAChE,CAAE,WAAY;AACb,UAAK,CAAE,QAAQ,SAAU;AACxB,eAAO;AAAA,UACN,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAG,kCAAoB;AAAA,QACxB;AAAA,MACD;AAEA,YAAM,iBAAiB,OAAQ,SAAAD,KAAU;AACzC,YAAM,mBAAmB,eAAe;AAAA,QACvC;AAAA,QACA,CAAE,MAAM,MAAM,QAAS;AAAA,MACxB,GAAG;AAEH,aAAO;AAAA,QACN,QAAU,eAAe;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QACD,KAAK;AAAA,QACL,cAAc,eAAe;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,QACA,UAAU,eAAe;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,QACA,OAAO,eAAe;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,QACA,OAAG,kCAAqB,gBAAiB;AAAA,MAC1C;AAAA,IACD;AAAA,IACA,CAAE,MAAM,MAAM,UAAU,QAAQ,OAAQ;AAAA,EACzC;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AACD;AAEO,SAAS,0BACf,MACA,MACA,UACA,SACC;AACD,wBAAAE,SAAY,yCAAyC;AAAA,IACpD,aAAa;AAAA,IACb,OAAO;AAAA,EACR,CAAE;AACF,SAAO,gBAAiB,MAAM,MAAM,UAAU,OAAQ;AACvD;",
6
6
  "names": ["coreStore", "record", "deprecated"]
7
7
  }
@@ -123,7 +123,7 @@ function useEntityRecordsWithPermissions(kind, name, queryArgs = {}, options = {
123
123
  );
124
124
  const ids = (0, import_element.useMemo)(
125
125
  () => data?.map(
126
- // @ts-ignore
126
+ // @ts-expect-error `data` is `unknown[]`, so the callback signature does not line up.
127
127
  (record) => record[entityConfig?.key ?? "id"]
128
128
  ) ?? [],
129
129
  [data, entityConfig?.key]
@@ -139,7 +139,7 @@ function useEntityRecordsWithPermissions(kind, name, queryArgs = {}, options = {
139
139
  );
140
140
  const dataWithPermissions = (0, import_element.useMemo)(
141
141
  () => data?.map((record, index) => ({
142
- // @ts-ignore
142
+ // @ts-expect-error `record` is `unknown`, which cannot be spread.
143
143
  ...record,
144
144
  permissions: permissions[index]
145
145
  })) ?? [],
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-entity-records.ts"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport deprecated from '@wordpress/deprecated';\nimport { useSelect } from '@wordpress/data';\nimport { useMemo } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { store as coreStore } from '../';\nimport type { Options } from './use-entity-record';\nimport type { Status } from './constants';\nimport { getResolutionStatus } from './utils';\nimport { unlock } from '../lock-unlock';\nimport { getNormalizedCommaSeparable } from '../utils';\n\nexport interface EntityRecordsResolution< RecordType > {\n\t/** The requested entity records */\n\trecords: RecordType[] | null;\n\n\t/**\n\t * Is the record still being resolved?\n\t */\n\tisResolving: boolean;\n\n\t/**\n\t * Has the resolution started?\n\t */\n\thasStarted: boolean;\n\n\t/**\n\t * Is the record resolved by now?\n\t */\n\thasResolved: boolean;\n\n\t/** Resolution status */\n\tstatus: Status;\n\n\t/**\n\t * The total number of available items (if not paginated).\n\t */\n\ttotalItems: number | null;\n\n\t/**\n\t * The total number of pages.\n\t */\n\ttotalPages: number | null;\n}\n\nexport type WithPermissions< RecordType > = RecordType & {\n\tpermissions: { delete: boolean; update: boolean };\n};\n\ninterface EntityRecordsWithPermissionsResolution< RecordType >\n\textends Omit< EntityRecordsResolution< RecordType >, 'records' > {\n\t/** The requested entity records with permissions */\n\trecords: WithPermissions< RecordType >[] | null;\n}\n\nconst EMPTY_ARRAY = [];\n\n/**\n * Resolves the specified entity records.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.\n * @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.\n * @param queryArgs Optional HTTP query description for how to fetch the data, passed to the requested API endpoint.\n * @param options Optional hook options.\n * @example\n * ```js\n * import { useEntityRecords } from '@wordpress/core-data';\n *\n * function PageTitlesList() {\n * const { records, isResolving } = useEntityRecords( 'postType', 'page' );\n *\n * if ( isResolving ) {\n * return 'Loading...';\n * }\n *\n * return (\n * <ul>\n * {records.map(( page ) => (\n * <li>{ page.title }</li>\n * ))}\n * </ul>\n * );\n * }\n *\n * // Rendered in the application:\n * // <PageTitlesList />\n * ```\n *\n * In the above example, when `PageTitlesList` is rendered into an\n * application, the list of records and the resolution details will be retrieved from\n * the store state using `getEntityRecords()`, or resolved if missing.\n *\n * @return Entity records data.\n * @template RecordType\n */\nexport default function useEntityRecords< RecordType >(\n\tkind: string,\n\tname: string,\n\tqueryArgs: Record< string, unknown > = {},\n\toptions: Options = { enabled: true }\n): EntityRecordsResolution< RecordType > {\n\t// Serialize queryArgs to a string that can be safely used as a React dep.\n\t// We can't just pass queryArgs as one of the deps, because if it is passed\n\t// as an object literal, then it will be a different object on each call even\n\t// if the values remain the same.\n\tconst queryAsString = addQueryArgs( '', queryArgs );\n\n\tconst { records, totalItems, totalPages, ...rest } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\t// Avoiding returning a new reference on every execution.\n\t\t\t\t\trecords: EMPTY_ARRAY,\n\t\t\t\t\ttotalItems: null,\n\t\t\t\t\ttotalPages: null,\n\t\t\t\t\t...getResolutionStatus(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst storeSelectors = select( coreStore );\n\t\t\tconst resolutionStatus = storeSelectors.getResolutionState(\n\t\t\t\t'getEntityRecords',\n\t\t\t\t[ kind, name, queryArgs ]\n\t\t\t)?.status;\n\n\t\t\treturn {\n\t\t\t\trecords: storeSelectors.getEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t) as RecordType[] | null,\n\t\t\t\ttotalItems: storeSelectors.getEntityRecordsTotalItems(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t),\n\t\t\t\ttotalPages: storeSelectors.getEntityRecordsTotalPages(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t),\n\t\t\t\t...getResolutionStatus( resolutionStatus ),\n\t\t\t};\n\t\t},\n\t\t[ kind, name, queryAsString, options.enabled ]\n\t);\n\n\treturn {\n\t\trecords,\n\t\ttotalItems,\n\t\ttotalPages,\n\t\t...rest,\n\t};\n}\n\nexport function useDeprecatedEntityRecords(\n\tkind: string,\n\tname: string,\n\tqueryArgs: any,\n\toptions: any\n) {\n\tdeprecated( `wp.data.__experimentalUseEntityRecords`, {\n\t\talternative: 'wp.data.useEntityRecords',\n\t\tsince: '6.1',\n\t} );\n\treturn useEntityRecords( kind, name, queryArgs, options );\n}\n\nexport function useEntityRecordsWithPermissions< RecordType >(\n\tkind: string,\n\tname: string,\n\tqueryArgs: Record< string, unknown > = {},\n\toptions: Options = { enabled: true }\n): EntityRecordsWithPermissionsResolution< RecordType > {\n\tconst entityConfig = useSelect(\n\t\t( select ) => select( coreStore ).getEntityConfig( kind, name ),\n\t\t[ kind, name ]\n\t);\n\tconst { records: data, ...ret } = useEntityRecords(\n\t\tkind,\n\t\tname,\n\t\t{\n\t\t\t...queryArgs,\n\t\t\t// If _fields is provided, we need to include _links in the request for permission caching to work.\n\t\t\t...( queryArgs._fields\n\t\t\t\t? {\n\t\t\t\t\t\t_fields: [\n\t\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t\t...( getNormalizedCommaSeparable(\n\t\t\t\t\t\t\t\t\tqueryArgs._fields\n\t\t\t\t\t\t\t\t) || [] ),\n\t\t\t\t\t\t\t\t'_links',\n\t\t\t\t\t\t\t] ),\n\t\t\t\t\t\t].join(),\n\t\t\t\t }\n\t\t\t\t: {} ),\n\t\t},\n\t\toptions\n\t);\n\tconst ids = useMemo(\n\t\t() =>\n\t\t\tdata?.map(\n\t\t\t\t// @ts-ignore\n\t\t\t\t( record: RecordType ) => record[ entityConfig?.key ?? 'id' ]\n\t\t\t) ?? [],\n\t\t[ data, entityConfig?.key ]\n\t);\n\n\tconst permissions = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEntityRecordsPermissions } = unlock(\n\t\t\t\tselect( coreStore )\n\t\t\t);\n\t\t\treturn getEntityRecordsPermissions( kind, name, ids );\n\t\t},\n\t\t[ ids, kind, name ]\n\t);\n\n\tconst dataWithPermissions = useMemo(\n\t\t() =>\n\t\t\tdata?.map( ( record, index ) => ( {\n\t\t\t\t// @ts-ignore\n\t\t\t\t...record,\n\t\t\t\tpermissions: permissions[ index ],\n\t\t\t} ) ) ?? [],\n\t\t[ data, permissions ]\n\t);\n\n\treturn { records: dataWithPermissions, ...ret };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { addQueryArgs } from '@wordpress/url';\nimport deprecated from '@wordpress/deprecated';\nimport { useSelect } from '@wordpress/data';\nimport { useMemo } from '@wordpress/element';\nimport { store as coreStore } from '../';\nimport type { Options } from './use-entity-record';\nimport type { Status } from './constants';\nimport { getResolutionStatus } from './utils';\nimport { unlock } from '../lock-unlock';\nimport { getNormalizedCommaSeparable } from '../utils';\n\nexport interface EntityRecordsResolution< RecordType > {\n\t/** The requested entity records */\n\trecords: RecordType[] | null;\n\n\t/**\n\t * Is the record still being resolved?\n\t */\n\tisResolving: boolean;\n\n\t/**\n\t * Has the resolution started?\n\t */\n\thasStarted: boolean;\n\n\t/**\n\t * Is the record resolved by now?\n\t */\n\thasResolved: boolean;\n\n\t/** Resolution status */\n\tstatus: Status;\n\n\t/**\n\t * The total number of available items (if not paginated).\n\t */\n\ttotalItems: number | null;\n\n\t/**\n\t * The total number of pages.\n\t */\n\ttotalPages: number | null;\n}\n\nexport type WithPermissions< RecordType > = RecordType & {\n\tpermissions: { delete: boolean; update: boolean };\n};\n\ninterface EntityRecordsWithPermissionsResolution< RecordType >\n\textends Omit< EntityRecordsResolution< RecordType >, 'records' > {\n\t/** The requested entity records with permissions */\n\trecords: WithPermissions< RecordType >[] | null;\n}\n\nconst EMPTY_ARRAY = [];\n\n/**\n * Resolves the specified entity records.\n *\n * @since 6.1.0 Introduced in WordPress core.\n *\n * @param kind Kind of the entity, e.g. `root` or a `postType`. See rootEntitiesConfig in ../entities.ts for a list of available kinds.\n * @param name Name of the entity, e.g. `plugin` or a `post`. See rootEntitiesConfig in ../entities.ts for a list of available names.\n * @param queryArgs Optional HTTP query description for how to fetch the data, passed to the requested API endpoint.\n * @param options Optional hook options.\n * @example\n * ```js\n * import { useEntityRecords } from '@wordpress/core-data';\n *\n * function PageTitlesList() {\n * const { records, isResolving } = useEntityRecords( 'postType', 'page' );\n *\n * if ( isResolving ) {\n * return 'Loading...';\n * }\n *\n * return (\n * <ul>\n * {records.map(( page ) => (\n * <li>{ page.title }</li>\n * ))}\n * </ul>\n * );\n * }\n *\n * // Rendered in the application:\n * // <PageTitlesList />\n * ```\n *\n * In the above example, when `PageTitlesList` is rendered into an\n * application, the list of records and the resolution details will be retrieved from\n * the store state using `getEntityRecords()`, or resolved if missing.\n *\n * @return Entity records data.\n * @template RecordType\n */\nexport default function useEntityRecords< RecordType >(\n\tkind: string,\n\tname: string,\n\tqueryArgs: Record< string, unknown > = {},\n\toptions: Options = { enabled: true }\n): EntityRecordsResolution< RecordType > {\n\t// Serialize queryArgs to a string that can be safely used as a React dep.\n\t// We can't just pass queryArgs as one of the deps, because if it is passed\n\t// as an object literal, then it will be a different object on each call even\n\t// if the values remain the same.\n\tconst queryAsString = addQueryArgs( '', queryArgs );\n\n\tconst { records, totalItems, totalPages, ...rest } = useSelect(\n\t\t( select ) => {\n\t\t\tif ( ! options.enabled ) {\n\t\t\t\treturn {\n\t\t\t\t\t// Avoiding returning a new reference on every execution.\n\t\t\t\t\trecords: EMPTY_ARRAY,\n\t\t\t\t\ttotalItems: null,\n\t\t\t\t\ttotalPages: null,\n\t\t\t\t\t...getResolutionStatus(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst storeSelectors = select( coreStore );\n\t\t\tconst resolutionStatus = storeSelectors.getResolutionState(\n\t\t\t\t'getEntityRecords',\n\t\t\t\t[ kind, name, queryArgs ]\n\t\t\t)?.status;\n\n\t\t\treturn {\n\t\t\t\trecords: storeSelectors.getEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t) as RecordType[] | null,\n\t\t\t\ttotalItems: storeSelectors.getEntityRecordsTotalItems(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t),\n\t\t\t\ttotalPages: storeSelectors.getEntityRecordsTotalPages(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tqueryArgs\n\t\t\t\t),\n\t\t\t\t...getResolutionStatus( resolutionStatus ),\n\t\t\t};\n\t\t},\n\t\t[ kind, name, queryAsString, options.enabled ]\n\t);\n\n\treturn {\n\t\trecords,\n\t\ttotalItems,\n\t\ttotalPages,\n\t\t...rest,\n\t};\n}\n\nexport function useDeprecatedEntityRecords(\n\tkind: string,\n\tname: string,\n\tqueryArgs: any,\n\toptions: any\n) {\n\tdeprecated( `wp.data.__experimentalUseEntityRecords`, {\n\t\talternative: 'wp.data.useEntityRecords',\n\t\tsince: '6.1',\n\t} );\n\treturn useEntityRecords( kind, name, queryArgs, options );\n}\n\nexport function useEntityRecordsWithPermissions< RecordType >(\n\tkind: string,\n\tname: string,\n\tqueryArgs: Record< string, unknown > = {},\n\toptions: Options = { enabled: true }\n): EntityRecordsWithPermissionsResolution< RecordType > {\n\tconst entityConfig = useSelect(\n\t\t( select ) => select( coreStore ).getEntityConfig( kind, name ),\n\t\t[ kind, name ]\n\t);\n\tconst { records: data, ...ret } = useEntityRecords(\n\t\tkind,\n\t\tname,\n\t\t{\n\t\t\t...queryArgs,\n\t\t\t// If _fields is provided, we need to include _links in the request for permission caching to work.\n\t\t\t...( queryArgs._fields\n\t\t\t\t? {\n\t\t\t\t\t\t_fields: [\n\t\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t\t...( getNormalizedCommaSeparable(\n\t\t\t\t\t\t\t\t\tqueryArgs._fields\n\t\t\t\t\t\t\t\t) || [] ),\n\t\t\t\t\t\t\t\t'_links',\n\t\t\t\t\t\t\t] ),\n\t\t\t\t\t\t].join(),\n\t\t\t\t }\n\t\t\t\t: {} ),\n\t\t},\n\t\toptions\n\t);\n\tconst ids = useMemo(\n\t\t() =>\n\t\t\tdata?.map(\n\t\t\t\t// @ts-expect-error `data` is `unknown[]`, so the callback signature does not line up.\n\t\t\t\t( record: RecordType ) => record[ entityConfig?.key ?? 'id' ]\n\t\t\t) ?? [],\n\t\t[ data, entityConfig?.key ]\n\t);\n\n\tconst permissions = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getEntityRecordsPermissions } = unlock(\n\t\t\t\tselect( coreStore )\n\t\t\t);\n\t\t\treturn getEntityRecordsPermissions( kind, name, ids );\n\t\t},\n\t\t[ ids, kind, name ]\n\t);\n\n\tconst dataWithPermissions = useMemo(\n\t\t() =>\n\t\t\tdata?.map( ( record, index ) => ( {\n\t\t\t\t// @ts-expect-error `record` is `unknown`, which cannot be spread.\n\t\t\t\t...record,\n\t\t\t\tpermissions: permissions[ index ],\n\t\t\t} ) ) ?? [],\n\t\t[ data, permissions ]\n\t);\n\n\treturn { records: dataWithPermissions, ...ret };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_utils", "coreStore", "deprecated"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-post-editor-awareness-state.ts"],
4
- "sourcesContent": ["/**\n * External dependencies\n */\nimport { usePrevious } from '@wordpress/compose';\nimport { useEffect, useState, useCallback } from '@wordpress/element';\nimport type { Y } from '@wordpress/sync';\n\n/**\n * Internal dependencies\n */\nimport { getSyncManager } from '../sync';\nimport { usePostContentBlocks } from '../awareness/block-lookup';\nimport type { EditorStoreBlock } from '../awareness/block-lookup';\nimport type {\n\tPostEditorAwarenessState as ActiveCollaborator,\n\tPostSaveEvent,\n\tYDocDebugData,\n} from '../awareness/types';\nimport type { SelectionState, ResolvedSelection } from '../types';\nimport type { PostEditorAwareness } from '../awareness/post-editor-awareness';\n\ninterface AwarenessState {\n\tactiveCollaborators: ActiveCollaborator[];\n\tresolveSelection: (\n\t\tselection: SelectionState,\n\t\tblocks: EditorStoreBlock[]\n\t) => ResolvedSelection;\n\tgetDebugData: () => YDocDebugData;\n\tisCurrentCollaboratorDisconnected: boolean;\n}\n\nconst defaultResolvedSelection: ResolvedSelection = {\n\trichTextOffset: null,\n\tlocalClientId: null,\n\tattributeKey: null,\n};\n\nconst defaultState: AwarenessState = {\n\tactiveCollaborators: [],\n\tresolveSelection: () => defaultResolvedSelection,\n\tgetDebugData: () => ( {\n\t\tdoc: {},\n\t\tclients: {},\n\t\tcollaboratorMap: {},\n\t} ),\n\tisCurrentCollaboratorDisconnected: false,\n};\n\nfunction getAwarenessState(\n\tawareness: PostEditorAwareness,\n\tnewState?: ActiveCollaborator[]\n): AwarenessState {\n\tconst activeCollaborators = newState ?? awareness.getCurrentState();\n\n\treturn {\n\t\tactiveCollaborators,\n\t\tresolveSelection: (\n\t\t\tselection: SelectionState,\n\t\t\tblocks: EditorStoreBlock[]\n\t\t) => awareness.convertSelectionStateToAbsolute( selection, blocks ),\n\t\tgetDebugData: () => awareness.getDebugData(),\n\t\tisCurrentCollaboratorDisconnected:\n\t\t\tactiveCollaborators.find( ( collaborator ) => collaborator.isMe )\n\t\t\t\t?.isConnected === false,\n\t};\n}\n\nfunction usePostEditorAwarenessState(\n\tpostId: number | null,\n\tpostType: string | null\n): AwarenessState {\n\tconst [ state, setState ] = useState< AwarenessState >( defaultState );\n\n\tuseEffect( () => {\n\t\tif ( null === postId || null === postType ) {\n\t\t\tsetState( defaultState );\n\t\t\treturn;\n\t\t}\n\n\t\tconst objectType = `postType/${ postType }`;\n\t\tconst objectId = postId.toString();\n\t\tconst awareness = getSyncManager()?.getAwareness< PostEditorAwareness >(\n\t\t\tobjectType,\n\t\t\tobjectId\n\t\t);\n\n\t\tif ( ! awareness ) {\n\t\t\tsetState( defaultState );\n\t\t\treturn;\n\t\t}\n\n\t\tawareness.setUp();\n\n\t\t// Initialize with current awareness state.\n\t\tsetState( getAwarenessState( awareness ) );\n\n\t\tconst unsubscribe = awareness?.onStateChange(\n\t\t\t( newState: ActiveCollaborator[] ) => {\n\t\t\t\tsetState( getAwarenessState( awareness, newState ) );\n\t\t\t}\n\t\t);\n\n\t\treturn unsubscribe;\n\t}, [ postId, postType ] );\n\n\treturn state;\n}\n\n/**\n * Hook to get the active collaborators for a post editor.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return {ActiveCollaborator[]} The active collaborators.\n */\nexport function useActiveCollaborators(\n\tpostId: number | null,\n\tpostType: string | null\n): ActiveCollaborator[] {\n\treturn usePostEditorAwarenessState( postId, postType ).activeCollaborators;\n}\n\n/**\n * Hook to resolve a selection state to a text index and block client ID.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return A function that resolves a selection to its text index and block client ID.\n */\nexport function useResolvedSelection(\n\tpostId: number | null,\n\tpostType: string | null\n): ( selection: SelectionState ) => ResolvedSelection {\n\tconst blocks = usePostContentBlocks();\n\tconst awarenessState = usePostEditorAwarenessState( postId, postType );\n\treturn useCallback(\n\t\t( selection: SelectionState ) =>\n\t\t\tawarenessState.resolveSelection( selection, blocks ),\n\t\t[ blocks, awarenessState ]\n\t);\n}\n\n/**\n * Hook to get data for debugging, using the awareness state.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return {YDocDebugData} The debug data.\n */\nexport function useGetDebugData(\n\tpostId: number | null,\n\tpostType: string | null\n): YDocDebugData {\n\treturn usePostEditorAwarenessState( postId, postType ).getDebugData();\n}\n\n/**\n * Hook to check if the current collaborator is disconnected.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return {boolean} Whether the current collaborator is disconnected.\n */\nexport function useIsDisconnected(\n\tpostId: number | null,\n\tpostType: string | null\n): boolean {\n\treturn usePostEditorAwarenessState( postId, postType )\n\t\t.isCurrentCollaboratorDisconnected;\n}\n\n/**\n * Hook that subscribes to the CRDT state map and returns the most recent\n * user-facing post save event (timestamp + client ID). The state map is\n * updated by `markEntityAsSaved` in `@wordpress/sync`.\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n */\nfunction useLastPostSave(\n\tpostId: number | null,\n\tpostType: string | null\n): PostSaveEvent | null {\n\tconst [ lastSave, setLastSave ] = useState< PostSaveEvent | null >( null );\n\n\tuseEffect( () => {\n\t\tif ( null === postId || null === postType ) {\n\t\t\tsetLastSave( null );\n\t\t\treturn;\n\t\t}\n\n\t\tconst awareness = getSyncManager()?.getAwareness< PostEditorAwareness >(\n\t\t\t`postType/${ postType }`,\n\t\t\tpostId.toString()\n\t\t);\n\n\t\tif ( ! awareness ) {\n\t\t\tsetLastSave( null );\n\t\t\treturn;\n\t\t}\n\n\t\tawareness.setUp();\n\n\t\tconst stateMap = awareness.doc.getMap( 'state' );\n\t\tconst recordMap = awareness.doc.getMap( 'document' );\n\n\t\t// Only notify for saves that occur after the observer is\n\t\t// set up. This prevents false notifications when the Y.Doc\n\t\t// syncs historical state on page load or peer reconnect.\n\t\tconst setupTime = Date.now();\n\n\t\tconst observer = ( event: Y.YMapEvent< unknown > ) => {\n\t\t\tif ( event.keysChanged.has( 'savedAt' ) ) {\n\t\t\t\tconst savedAt = stateMap.get( 'savedAt' ) as number;\n\t\t\t\tconst savedByClientId = stateMap.get( 'savedBy' ) as number;\n\n\t\t\t\tif (\n\t\t\t\t\ttypeof savedAt === 'number' &&\n\t\t\t\t\ttypeof savedByClientId === 'number' &&\n\t\t\t\t\tsavedAt > setupTime\n\t\t\t\t) {\n\t\t\t\t\tconst postStatus = recordMap.get( 'status' ) as\n\t\t\t\t\t\t| string\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tsetLastSave( { savedAt, savedByClientId, postStatus } );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tstateMap.observe( observer );\n\n\t\treturn () => {\n\t\t\tstateMap.unobserve( observer );\n\t\t};\n\t}, [ postId, postType ] );\n\n\treturn lastSave;\n}\n\n/**\n * Hook that fires a callback when a new collaborator joins the post.\n * Handles initial hydration and state diffing internally—consumers\n * only receive \"join\" events for collaborators that appear after the\n * initial state has loaded.\n *\n * The callback receives the joining collaborator and, when available,\n * the current user's state (useful for comparing `enteredAt` timestamps).\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n * @param callback Invoked for each collaborator that joins.\n */\nexport function useOnCollaboratorJoin(\n\tpostId: number | null,\n\tpostType: string | null,\n\tcallback: (\n\t\tcollaborator: ActiveCollaborator,\n\t\tme?: ActiveCollaborator\n\t) => void\n): void {\n\tconst { activeCollaborators } = usePostEditorAwarenessState(\n\t\tpostId,\n\t\tpostType\n\t);\n\tconst prevCollaborators = usePrevious( activeCollaborators );\n\n\tuseEffect( () => {\n\t\t/*\n\t\t * On first render usePrevious returns undefined. On subsequent\n\t\t * renders the list may still be empty while the store hydrates.\n\t\t * In both cases, skip to avoid spurious \"joined\" callbacks for\n\t\t * users already present.\n\t\t */\n\t\tif ( ! prevCollaborators || prevCollaborators.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst prevMap = new Map< number, ActiveCollaborator >(\n\t\t\tprevCollaborators.map( ( collaborator ) => [\n\t\t\t\tcollaborator.clientId,\n\t\t\t\tcollaborator,\n\t\t\t] )\n\t\t);\n\t\tconst me = activeCollaborators.find(\n\t\t\t( collaborator ) => collaborator.isMe\n\t\t);\n\n\t\tfor ( const collaborator of activeCollaborators ) {\n\t\t\tif (\n\t\t\t\t! prevMap.has( collaborator.clientId ) &&\n\t\t\t\t! collaborator.isMe\n\t\t\t) {\n\t\t\t\tcallback( collaborator, me );\n\t\t\t}\n\t\t}\n\t}, [ activeCollaborators, prevCollaborators, callback ] );\n}\n\n/**\n * Hook that fires a callback when a collaborator leaves the post.\n * A \"leave\" is detected when a previously-connected collaborator either\n * transitions to `isConnected = false` or disappears from the list\n * entirely while still connected. Already-disconnected collaborators\n * that are later removed from the list are silently ignored.\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n * @param callback Invoked for each collaborator that leaves.\n */\nexport function useOnCollaboratorLeave(\n\tpostId: number | null,\n\tpostType: string | null,\n\tcallback: ( collaborator: ActiveCollaborator ) => void\n): void {\n\tconst { activeCollaborators } = usePostEditorAwarenessState(\n\t\tpostId,\n\t\tpostType\n\t);\n\tconst prevCollaborators = usePrevious( activeCollaborators );\n\n\tuseEffect( () => {\n\t\tif ( ! prevCollaborators || prevCollaborators.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newMap = new Map< number, ActiveCollaborator >(\n\t\t\tactiveCollaborators.map( ( collaborator ) => [\n\t\t\t\tcollaborator.clientId,\n\t\t\t\tcollaborator,\n\t\t\t] )\n\t\t);\n\n\t\tfor ( const prevCollab of prevCollaborators ) {\n\t\t\tif ( prevCollab.isMe || ! prevCollab.isConnected ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newCollab = newMap.get( prevCollab.clientId );\n\t\t\tif ( ! newCollab?.isConnected ) {\n\t\t\t\tcallback( prevCollab );\n\t\t\t}\n\t\t}\n\t}, [ activeCollaborators, prevCollaborators, callback ] );\n}\n\n/**\n * Hook that fires a callback when a remote collaborator saves the post.\n * Only fires for saves by other collaborators (not the current user).\n * Deduplicates by `savedAt` timestamp so the same save event is never\n * reported twice.\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n * @param callback Invoked with the save event, the collaborator who saved,\n * and the previous save event (if any) for transition detection.\n */\nexport function useOnPostSave(\n\tpostId: number | null,\n\tpostType: string | null,\n\tcallback: (\n\t\tevent: PostSaveEvent,\n\t\tsaver: ActiveCollaborator,\n\t\tprevEvent: PostSaveEvent | null\n\t) => void\n): void {\n\tconst { activeCollaborators } = usePostEditorAwarenessState(\n\t\tpostId,\n\t\tpostType\n\t);\n\tconst lastPostSave = useLastPostSave( postId, postType );\n\tconst prevPostSave = usePrevious( lastPostSave );\n\n\tuseEffect( () => {\n\t\tif ( ! lastPostSave ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( prevPostSave && lastPostSave.savedAt === prevPostSave.savedAt ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst saver = activeCollaborators.find(\n\t\t\t( collaborator ) =>\n\t\t\t\tcollaborator.clientId === lastPostSave.savedByClientId &&\n\t\t\t\t! collaborator.isMe\n\t\t);\n\n\t\tif ( ! saver ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcallback( lastPostSave, saver, prevPostSave ?? null );\n\t}, [ lastPostSave, prevPostSave, activeCollaborators, callback ] );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { usePrevious } from '@wordpress/compose';\nimport { useEffect, useState, useCallback } from '@wordpress/element';\nimport type { Y } from '@wordpress/sync';\nimport { getSyncManager } from '../sync';\nimport { usePostContentBlocks } from '../awareness/block-lookup';\nimport type { EditorStoreBlock } from '../awareness/block-lookup';\nimport type {\n\tPostEditorAwarenessState as ActiveCollaborator,\n\tPostSaveEvent,\n\tYDocDebugData,\n} from '../awareness/types';\nimport type { SelectionState, ResolvedSelection } from '../types';\nimport type { PostEditorAwareness } from '../awareness/post-editor-awareness';\n\ninterface AwarenessState {\n\tactiveCollaborators: ActiveCollaborator[];\n\tresolveSelection: (\n\t\tselection: SelectionState,\n\t\tblocks: EditorStoreBlock[]\n\t) => ResolvedSelection;\n\tgetDebugData: () => YDocDebugData;\n\tisCurrentCollaboratorDisconnected: boolean;\n}\n\nconst defaultResolvedSelection: ResolvedSelection = {\n\trichTextOffset: null,\n\tlocalClientId: null,\n\tattributeKey: null,\n};\n\nconst defaultState: AwarenessState = {\n\tactiveCollaborators: [],\n\tresolveSelection: () => defaultResolvedSelection,\n\tgetDebugData: () => ( {\n\t\tdoc: {},\n\t\tclients: {},\n\t\tcollaboratorMap: {},\n\t} ),\n\tisCurrentCollaboratorDisconnected: false,\n};\n\nfunction getAwarenessState(\n\tawareness: PostEditorAwareness,\n\tnewState?: ActiveCollaborator[]\n): AwarenessState {\n\tconst activeCollaborators = newState ?? awareness.getCurrentState();\n\n\treturn {\n\t\tactiveCollaborators,\n\t\tresolveSelection: (\n\t\t\tselection: SelectionState,\n\t\t\tblocks: EditorStoreBlock[]\n\t\t) => awareness.convertSelectionStateToAbsolute( selection, blocks ),\n\t\tgetDebugData: () => awareness.getDebugData(),\n\t\tisCurrentCollaboratorDisconnected:\n\t\t\tactiveCollaborators.find( ( collaborator ) => collaborator.isMe )\n\t\t\t\t?.isConnected === false,\n\t};\n}\n\nfunction usePostEditorAwarenessState(\n\tpostId: number | null,\n\tpostType: string | null\n): AwarenessState {\n\tconst [ state, setState ] = useState< AwarenessState >( defaultState );\n\n\tuseEffect( () => {\n\t\tif ( null === postId || null === postType ) {\n\t\t\tsetState( defaultState );\n\t\t\treturn;\n\t\t}\n\n\t\tconst objectType = `postType/${ postType }`;\n\t\tconst objectId = postId.toString();\n\t\tconst awareness = getSyncManager()?.getAwareness< PostEditorAwareness >(\n\t\t\tobjectType,\n\t\t\tobjectId\n\t\t);\n\n\t\tif ( ! awareness ) {\n\t\t\tsetState( defaultState );\n\t\t\treturn;\n\t\t}\n\n\t\tawareness.setUp();\n\n\t\t// Initialize with current awareness state.\n\t\tsetState( getAwarenessState( awareness ) );\n\n\t\tconst unsubscribe = awareness?.onStateChange(\n\t\t\t( newState: ActiveCollaborator[] ) => {\n\t\t\t\tsetState( getAwarenessState( awareness, newState ) );\n\t\t\t}\n\t\t);\n\n\t\treturn unsubscribe;\n\t}, [ postId, postType ] );\n\n\treturn state;\n}\n\n/**\n * Hook to get the active collaborators for a post editor.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return {ActiveCollaborator[]} The active collaborators.\n */\nexport function useActiveCollaborators(\n\tpostId: number | null,\n\tpostType: string | null\n): ActiveCollaborator[] {\n\treturn usePostEditorAwarenessState( postId, postType ).activeCollaborators;\n}\n\n/**\n * Hook to resolve a selection state to a text index and block client ID.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return A function that resolves a selection to its text index and block client ID.\n */\nexport function useResolvedSelection(\n\tpostId: number | null,\n\tpostType: string | null\n): ( selection: SelectionState ) => ResolvedSelection {\n\tconst blocks = usePostContentBlocks();\n\tconst awarenessState = usePostEditorAwarenessState( postId, postType );\n\treturn useCallback(\n\t\t( selection: SelectionState ) =>\n\t\t\tawarenessState.resolveSelection( selection, blocks ),\n\t\t[ blocks, awarenessState ]\n\t);\n}\n\n/**\n * Hook to get data for debugging, using the awareness state.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return {YDocDebugData} The debug data.\n */\nexport function useGetDebugData(\n\tpostId: number | null,\n\tpostType: string | null\n): YDocDebugData {\n\treturn usePostEditorAwarenessState( postId, postType ).getDebugData();\n}\n\n/**\n * Hook to check if the current collaborator is disconnected.\n *\n * @param postId - The ID of the post.\n * @param postType - The type of the post.\n * @return {boolean} Whether the current collaborator is disconnected.\n */\nexport function useIsDisconnected(\n\tpostId: number | null,\n\tpostType: string | null\n): boolean {\n\treturn usePostEditorAwarenessState( postId, postType )\n\t\t.isCurrentCollaboratorDisconnected;\n}\n\n/**\n * Hook that subscribes to the CRDT state map and returns the most recent\n * user-facing post save event (timestamp + client ID). The state map is\n * updated by `markEntityAsSaved` in `@wordpress/sync`.\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n */\nfunction useLastPostSave(\n\tpostId: number | null,\n\tpostType: string | null\n): PostSaveEvent | null {\n\tconst [ lastSave, setLastSave ] = useState< PostSaveEvent | null >( null );\n\n\tuseEffect( () => {\n\t\tif ( null === postId || null === postType ) {\n\t\t\tsetLastSave( null );\n\t\t\treturn;\n\t\t}\n\n\t\tconst awareness = getSyncManager()?.getAwareness< PostEditorAwareness >(\n\t\t\t`postType/${ postType }`,\n\t\t\tpostId.toString()\n\t\t);\n\n\t\tif ( ! awareness ) {\n\t\t\tsetLastSave( null );\n\t\t\treturn;\n\t\t}\n\n\t\tawareness.setUp();\n\n\t\tconst stateMap = awareness.doc.getMap( 'state' );\n\t\tconst recordMap = awareness.doc.getMap( 'document' );\n\n\t\t// Only notify for saves that occur after the observer is\n\t\t// set up. This prevents false notifications when the Y.Doc\n\t\t// syncs historical state on page load or peer reconnect.\n\t\tconst setupTime = Date.now();\n\n\t\tconst observer = ( event: Y.YMapEvent< unknown > ) => {\n\t\t\tif ( event.keysChanged.has( 'savedAt' ) ) {\n\t\t\t\tconst savedAt = stateMap.get( 'savedAt' ) as number;\n\t\t\t\tconst savedByClientId = stateMap.get( 'savedBy' ) as number;\n\n\t\t\t\tif (\n\t\t\t\t\ttypeof savedAt === 'number' &&\n\t\t\t\t\ttypeof savedByClientId === 'number' &&\n\t\t\t\t\tsavedAt > setupTime\n\t\t\t\t) {\n\t\t\t\t\tconst postStatus = recordMap.get( 'status' ) as\n\t\t\t\t\t\t| string\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tsetLastSave( { savedAt, savedByClientId, postStatus } );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tstateMap.observe( observer );\n\n\t\treturn () => {\n\t\t\tstateMap.unobserve( observer );\n\t\t};\n\t}, [ postId, postType ] );\n\n\treturn lastSave;\n}\n\n/**\n * Hook that fires a callback when a new collaborator joins the post.\n * Handles initial hydration and state diffing internally—consumers\n * only receive \"join\" events for collaborators that appear after the\n * initial state has loaded.\n *\n * The callback receives the joining collaborator and, when available,\n * the current user's state (useful for comparing `enteredAt` timestamps).\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n * @param callback Invoked for each collaborator that joins.\n */\nexport function useOnCollaboratorJoin(\n\tpostId: number | null,\n\tpostType: string | null,\n\tcallback: (\n\t\tcollaborator: ActiveCollaborator,\n\t\tme?: ActiveCollaborator\n\t) => void\n): void {\n\tconst { activeCollaborators } = usePostEditorAwarenessState(\n\t\tpostId,\n\t\tpostType\n\t);\n\tconst prevCollaborators = usePrevious( activeCollaborators );\n\n\tuseEffect( () => {\n\t\t/*\n\t\t * On first render usePrevious returns undefined. On subsequent\n\t\t * renders the list may still be empty while the store hydrates.\n\t\t * In both cases, skip to avoid spurious \"joined\" callbacks for\n\t\t * users already present.\n\t\t */\n\t\tif ( ! prevCollaborators || prevCollaborators.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst prevMap = new Map< number, ActiveCollaborator >(\n\t\t\tprevCollaborators.map( ( collaborator ) => [\n\t\t\t\tcollaborator.clientId,\n\t\t\t\tcollaborator,\n\t\t\t] )\n\t\t);\n\t\tconst me = activeCollaborators.find(\n\t\t\t( collaborator ) => collaborator.isMe\n\t\t);\n\n\t\tfor ( const collaborator of activeCollaborators ) {\n\t\t\tif (\n\t\t\t\t! prevMap.has( collaborator.clientId ) &&\n\t\t\t\t! collaborator.isMe\n\t\t\t) {\n\t\t\t\tcallback( collaborator, me );\n\t\t\t}\n\t\t}\n\t}, [ activeCollaborators, prevCollaborators, callback ] );\n}\n\n/**\n * Hook that fires a callback when a collaborator leaves the post.\n * A \"leave\" is detected when a previously-connected collaborator either\n * transitions to `isConnected = false` or disappears from the list\n * entirely while still connected. Already-disconnected collaborators\n * that are later removed from the list are silently ignored.\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n * @param callback Invoked for each collaborator that leaves.\n */\nexport function useOnCollaboratorLeave(\n\tpostId: number | null,\n\tpostType: string | null,\n\tcallback: ( collaborator: ActiveCollaborator ) => void\n): void {\n\tconst { activeCollaborators } = usePostEditorAwarenessState(\n\t\tpostId,\n\t\tpostType\n\t);\n\tconst prevCollaborators = usePrevious( activeCollaborators );\n\n\tuseEffect( () => {\n\t\tif ( ! prevCollaborators || prevCollaborators.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst newMap = new Map< number, ActiveCollaborator >(\n\t\t\tactiveCollaborators.map( ( collaborator ) => [\n\t\t\t\tcollaborator.clientId,\n\t\t\t\tcollaborator,\n\t\t\t] )\n\t\t);\n\n\t\tfor ( const prevCollab of prevCollaborators ) {\n\t\t\tif ( prevCollab.isMe || ! prevCollab.isConnected ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst newCollab = newMap.get( prevCollab.clientId );\n\t\t\tif ( ! newCollab?.isConnected ) {\n\t\t\t\tcallback( prevCollab );\n\t\t\t}\n\t\t}\n\t}, [ activeCollaborators, prevCollaborators, callback ] );\n}\n\n/**\n * Hook that fires a callback when a remote collaborator saves the post.\n * Only fires for saves by other collaborators (not the current user).\n * Deduplicates by `savedAt` timestamp so the same save event is never\n * reported twice.\n *\n * @param postId The ID of the post.\n * @param postType The type of the post.\n * @param callback Invoked with the save event, the collaborator who saved,\n * and the previous save event (if any) for transition detection.\n */\nexport function useOnPostSave(\n\tpostId: number | null,\n\tpostType: string | null,\n\tcallback: (\n\t\tevent: PostSaveEvent,\n\t\tsaver: ActiveCollaborator,\n\t\tprevEvent: PostSaveEvent | null\n\t) => void\n): void {\n\tconst { activeCollaborators } = usePostEditorAwarenessState(\n\t\tpostId,\n\t\tpostType\n\t);\n\tconst lastPostSave = useLastPostSave( postId, postType );\n\tconst prevPostSave = usePrevious( lastPostSave );\n\n\tuseEffect( () => {\n\t\tif ( ! lastPostSave ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( prevPostSave && lastPostSave.savedAt === prevPostSave.savedAt ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst saver = activeCollaborators.find(\n\t\t\t( collaborator ) =>\n\t\t\t\tcollaborator.clientId === lastPostSave.savedByClientId &&\n\t\t\t\t! collaborator.isMe\n\t\t);\n\n\t\tif ( ! saver ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcallback( lastPostSave, saver, prevPostSave ?? null );\n\t}, [ lastPostSave, prevPostSave, activeCollaborators, callback ] );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA4B;AAC5B,qBAAiD;AAEjD,kBAA+B;AAC/B,0BAAqC;AAoBrC,IAAM,2BAA8C;AAAA,EACnD,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,cAAc;AACf;AAEA,IAAM,eAA+B;AAAA,EACpC,qBAAqB,CAAC;AAAA,EACtB,kBAAkB,MAAM;AAAA,EACxB,cAAc,OAAQ;AAAA,IACrB,KAAK,CAAC;AAAA,IACN,SAAS,CAAC;AAAA,IACV,iBAAiB,CAAC;AAAA,EACnB;AAAA,EACA,mCAAmC;AACpC;AAEA,SAAS,kBACR,WACA,UACiB;AACjB,QAAM,sBAAsB,YAAY,UAAU,gBAAgB;AAElE,SAAO;AAAA,IACN;AAAA,IACA,kBAAkB,CACjB,WACA,WACI,UAAU,gCAAiC,WAAW,MAAO;AAAA,IAClE,cAAc,MAAM,UAAU,aAAa;AAAA,IAC3C,mCACC,oBAAoB,KAAM,CAAE,iBAAkB,aAAa,IAAK,GAC7D,gBAAgB;AAAA,EACrB;AACD;AAEA,SAAS,4BACR,QACA,UACiB;AACjB,QAAM,CAAE,OAAO,QAAS,QAAI,yBAA4B,YAAa;AAErE,gCAAW,MAAM;AAChB,QAAK,SAAS,UAAU,SAAS,UAAW;AAC3C,eAAU,YAAa;AACvB;AAAA,IACD;AAEA,UAAM,aAAa,YAAa,QAAS;AACzC,UAAM,WAAW,OAAO,SAAS;AACjC,UAAM,gBAAY,4BAAe,GAAG;AAAA,MACnC;AAAA,MACA;AAAA,IACD;AAEA,QAAK,CAAE,WAAY;AAClB,eAAU,YAAa;AACvB;AAAA,IACD;AAEA,cAAU,MAAM;AAGhB,aAAU,kBAAmB,SAAU,CAAE;AAEzC,UAAM,cAAc,WAAW;AAAA,MAC9B,CAAE,aAAoC;AACrC,iBAAU,kBAAmB,WAAW,QAAS,CAAE;AAAA,MACpD;AAAA,IACD;AAEA,WAAO;AAAA,EACR,GAAG,CAAE,QAAQ,QAAS,CAAE;AAExB,SAAO;AACR;AASO,SAAS,uBACf,QACA,UACuB;AACvB,SAAO,4BAA6B,QAAQ,QAAS,EAAE;AACxD;AASO,SAAS,qBACf,QACA,UACqD;AACrD,QAAM,aAAS,0CAAqB;AACpC,QAAM,iBAAiB,4BAA6B,QAAQ,QAAS;AACrE,aAAO;AAAA,IACN,CAAE,cACD,eAAe,iBAAkB,WAAW,MAAO;AAAA,IACpD,CAAE,QAAQ,cAAe;AAAA,EAC1B;AACD;AASO,SAAS,gBACf,QACA,UACgB;AAChB,SAAO,4BAA6B,QAAQ,QAAS,EAAE,aAAa;AACrE;AASO,SAAS,kBACf,QACA,UACU;AACV,SAAO,4BAA6B,QAAQ,QAAS,EACnD;AACH;AAUA,SAAS,gBACR,QACA,UACuB;AACvB,QAAM,CAAE,UAAU,WAAY,QAAI,yBAAkC,IAAK;AAEzE,gCAAW,MAAM;AAChB,QAAK,SAAS,UAAU,SAAS,UAAW;AAC3C,kBAAa,IAAK;AAClB;AAAA,IACD;AAEA,UAAM,gBAAY,4BAAe,GAAG;AAAA,MACnC,YAAa,QAAS;AAAA,MACtB,OAAO,SAAS;AAAA,IACjB;AAEA,QAAK,CAAE,WAAY;AAClB,kBAAa,IAAK;AAClB;AAAA,IACD;AAEA,cAAU,MAAM;AAEhB,UAAM,WAAW,UAAU,IAAI,OAAQ,OAAQ;AAC/C,UAAM,YAAY,UAAU,IAAI,OAAQ,UAAW;AAKnD,UAAM,YAAY,KAAK,IAAI;AAE3B,UAAM,WAAW,CAAE,UAAmC;AACrD,UAAK,MAAM,YAAY,IAAK,SAAU,GAAI;AACzC,cAAM,UAAU,SAAS,IAAK,SAAU;AACxC,cAAM,kBAAkB,SAAS,IAAK,SAAU;AAEhD,YACC,OAAO,YAAY,YACnB,OAAO,oBAAoB,YAC3B,UAAU,WACT;AACD,gBAAM,aAAa,UAAU,IAAK,QAAS;AAG3C,sBAAa,EAAE,SAAS,iBAAiB,WAAW,CAAE;AAAA,QACvD;AAAA,MACD;AAAA,IACD;AAEA,aAAS,QAAS,QAAS;AAE3B,WAAO,MAAM;AACZ,eAAS,UAAW,QAAS;AAAA,IAC9B;AAAA,EACD,GAAG,CAAE,QAAQ,QAAS,CAAE;AAExB,SAAO;AACR;AAeO,SAAS,sBACf,QACA,UACA,UAIO;AACP,QAAM,EAAE,oBAAoB,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,EACD;AACA,QAAM,wBAAoB,4BAAa,mBAAoB;AAE3D,gCAAW,MAAM;AAOhB,QAAK,CAAE,qBAAqB,kBAAkB,WAAW,GAAI;AAC5D;AAAA,IACD;AAEA,UAAM,UAAU,IAAI;AAAA,MACnB,kBAAkB,IAAK,CAAE,iBAAkB;AAAA,QAC1C,aAAa;AAAA,QACb;AAAA,MACD,CAAE;AAAA,IACH;AACA,UAAM,KAAK,oBAAoB;AAAA,MAC9B,CAAE,iBAAkB,aAAa;AAAA,IAClC;AAEA,eAAY,gBAAgB,qBAAsB;AACjD,UACC,CAAE,QAAQ,IAAK,aAAa,QAAS,KACrC,CAAE,aAAa,MACd;AACD,iBAAU,cAAc,EAAG;AAAA,MAC5B;AAAA,IACD;AAAA,EACD,GAAG,CAAE,qBAAqB,mBAAmB,QAAS,CAAE;AACzD;AAaO,SAAS,uBACf,QACA,UACA,UACO;AACP,QAAM,EAAE,oBAAoB,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,EACD;AACA,QAAM,wBAAoB,4BAAa,mBAAoB;AAE3D,gCAAW,MAAM;AAChB,QAAK,CAAE,qBAAqB,kBAAkB,WAAW,GAAI;AAC5D;AAAA,IACD;AAEA,UAAM,SAAS,IAAI;AAAA,MAClB,oBAAoB,IAAK,CAAE,iBAAkB;AAAA,QAC5C,aAAa;AAAA,QACb;AAAA,MACD,CAAE;AAAA,IACH;AAEA,eAAY,cAAc,mBAAoB;AAC7C,UAAK,WAAW,QAAQ,CAAE,WAAW,aAAc;AAClD;AAAA,MACD;AAEA,YAAM,YAAY,OAAO,IAAK,WAAW,QAAS;AAClD,UAAK,CAAE,WAAW,aAAc;AAC/B,iBAAU,UAAW;AAAA,MACtB;AAAA,IACD;AAAA,EACD,GAAG,CAAE,qBAAqB,mBAAmB,QAAS,CAAE;AACzD;AAaO,SAAS,cACf,QACA,UACA,UAKO;AACP,QAAM,EAAE,oBAAoB,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,EACD;AACA,QAAM,eAAe,gBAAiB,QAAQ,QAAS;AACvD,QAAM,mBAAe,4BAAa,YAAa;AAE/C,gCAAW,MAAM;AAChB,QAAK,CAAE,cAAe;AACrB;AAAA,IACD;AAEA,QAAK,gBAAgB,aAAa,YAAY,aAAa,SAAU;AACpE;AAAA,IACD;AAEA,UAAM,QAAQ,oBAAoB;AAAA,MACjC,CAAE,iBACD,aAAa,aAAa,aAAa,mBACvC,CAAE,aAAa;AAAA,IACjB;AAEA,QAAK,CAAE,OAAQ;AACd;AAAA,IACD;AAEA,aAAU,cAAc,OAAO,gBAAgB,IAAK;AAAA,EACrD,GAAG,CAAE,cAAc,cAAc,qBAAqB,QAAS,CAAE;AAClE;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/hooks/use-query-select.ts"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport memoize from 'memize';\nimport { getResolutionStatus } from './utils';\n\nexport const META_SELECTORS = [\n\t'getIsResolving',\n\t'hasStartedResolution',\n\t'hasFinishedResolution',\n\t'isResolving',\n\t'getCachedResolvers',\n];\n\ninterface QuerySelectResponse< Data > {\n\t/** the requested selector return value */\n\tdata: Data;\n\n\t/** is the record still being resolved? Via the `isResolving` meta-selector */\n\tisResolving: boolean;\n\n\t/** was the resolution started? Via the `hasStartedResolution` meta-selector */\n\thasStarted: boolean;\n\n\t/** has the resolution finished? Via the `hasFinishedResolution` meta-selector. */\n\thasResolved: boolean;\n}\n\n/**\n * Like useSelect, but the selectors return objects containing\n * both the original data AND the resolution info.\n *\n * @since 6.1.0 Introduced in WordPress core.\n * @private\n *\n * @param {Function} mapQuerySelect see useSelect\n * @param {Array} deps see useSelect\n *\n * @example\n * ```js\n * import { useQuerySelect } from '@wordpress/data';\n * import { store as coreDataStore } from '@wordpress/core-data';\n *\n * function PageTitleDisplay( { id } ) {\n * const { data: page, isResolving } = useQuerySelect( ( query ) => {\n * return query( coreDataStore ).getEntityRecord( 'postType', 'page', id )\n * }, [ id ] );\n *\n * if ( isResolving ) {\n * return 'Loading...';\n * }\n *\n * return page.title;\n * }\n *\n * // Rendered in the application:\n * // <PageTitleDisplay id={ 10 } />\n * ```\n *\n * In the above example, when `PageTitleDisplay` is rendered into an\n * application, the page and the resolution details will be retrieved from\n * the store state using the `mapSelect` callback on `useQuerySelect`.\n *\n * If the id prop changes then any page in the state for that id is\n * retrieved. If the id prop doesn't change and other props are passed in\n * that do change, the title will not change because the dependency is just\n * the id.\n * @see useSelect\n *\n * @return {QuerySelectResponse} Queried data.\n */\nexport default function useQuerySelect( mapQuerySelect, deps ) {\n\treturn useSelect( ( select, registry ) => {\n\t\tconst resolve = ( store ) => enrichSelectors( select( store ) );\n\t\treturn mapQuerySelect( resolve, registry );\n\t}, deps );\n}\n\ninterface EnrichedSelectors {\n\t< Selectors extends Record< string, ( ...args: any[] ) => any > >(\n\t\tselectors: Selectors\n\t): {\n\t\t[ Selector in keyof Selectors ]: (\n\t\t\t...args: Parameters< Selectors[ Selector ] >\n\t\t) => QuerySelectResponse< ReturnType< Selectors[ Selector ] > >;\n\t};\n}\n\n/**\n * Transform simple selectors into ones that return an object with the\n * original return value AND the resolution info.\n *\n * @param {Object} selectors Selectors to enrich\n * @return {EnrichedSelectors} Enriched selectors\n */\nconst enrichSelectors = memoize( ( ( selectors ) => {\n\tconst resolvers = {};\n\tfor ( const selectorName in selectors ) {\n\t\tif ( META_SELECTORS.includes( selectorName ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tObject.defineProperty( resolvers, selectorName, {\n\t\t\tget:\n\t\t\t\t() =>\n\t\t\t\t( ...args: unknown[] ) => {\n\t\t\t\t\tconst data = selectors[ selectorName ]( ...args );\n\t\t\t\t\tconst resolutionStatus = selectors.getResolutionState(\n\t\t\t\t\t\tselectorName,\n\t\t\t\t\t\targs\n\t\t\t\t\t)?.status;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\t...getResolutionStatus( resolutionStatus ),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t} );\n\t}\n\treturn resolvers;\n} ) as EnrichedSelectors );\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAA0B;AAK1B,oBAAoB;AACpB,mBAAoC;AAE7B,IAAM,iBAAiB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AA2De,SAAR,eAAiC,gBAAgB,MAAO;AAC9D,aAAO,uBAAW,CAAE,QAAQ,aAAc;AACzC,UAAM,UAAU,CAAE,UAAW,gBAAiB,OAAQ,KAAM,CAAE;AAC9D,WAAO,eAAgB,SAAS,QAAS;AAAA,EAC1C,GAAG,IAAK;AACT;AAmBA,IAAM,sBAAkB,cAAAA,UAAW,CAAE,cAAe;AACnD,QAAM,YAAY,CAAC;AACnB,aAAY,gBAAgB,WAAY;AACvC,QAAK,eAAe,SAAU,YAAa,GAAI;AAC9C;AAAA,IACD;AACA,WAAO,eAAgB,WAAW,cAAc;AAAA,MAC/C,KACC,MACA,IAAK,SAAqB;AACzB,cAAM,OAAO,UAAW,YAAa,EAAG,GAAG,IAAK;AAChD,cAAM,mBAAmB,UAAU;AAAA,UAClC;AAAA,UACA;AAAA,QACD,GAAG;AAEH,eAAO;AAAA,UACN;AAAA,UACA,OAAG,kCAAqB,gBAAiB;AAAA,QAC1C;AAAA,MACD;AAAA,IACF,CAAE;AAAA,EACH;AACA,SAAO;AACR,EAAyB;",
4
+ "sourcesContent": ["import { useSelect } from '@wordpress/data';\nimport memoize from 'memize';\nimport { getResolutionStatus } from './utils';\n\nexport const META_SELECTORS = [\n\t'getIsResolving',\n\t'hasStartedResolution',\n\t'hasFinishedResolution',\n\t'isResolving',\n\t'getCachedResolvers',\n];\n\ninterface QuerySelectResponse< Data > {\n\t/** the requested selector return value */\n\tdata: Data;\n\n\t/** is the record still being resolved? Via the `isResolving` meta-selector */\n\tisResolving: boolean;\n\n\t/** was the resolution started? Via the `hasStartedResolution` meta-selector */\n\thasStarted: boolean;\n\n\t/** has the resolution finished? Via the `hasFinishedResolution` meta-selector. */\n\thasResolved: boolean;\n}\n\n/**\n * Like useSelect, but the selectors return objects containing\n * both the original data AND the resolution info.\n *\n * @since 6.1.0 Introduced in WordPress core.\n * @private\n *\n * @param {Function} mapQuerySelect see useSelect\n * @param {Array} deps see useSelect\n *\n * @example\n * ```js\n * import { useQuerySelect } from '@wordpress/data';\n * import { store as coreDataStore } from '@wordpress/core-data';\n *\n * function PageTitleDisplay( { id } ) {\n * const { data: page, isResolving } = useQuerySelect( ( query ) => {\n * return query( coreDataStore ).getEntityRecord( 'postType', 'page', id )\n * }, [ id ] );\n *\n * if ( isResolving ) {\n * return 'Loading...';\n * }\n *\n * return page.title;\n * }\n *\n * // Rendered in the application:\n * // <PageTitleDisplay id={ 10 } />\n * ```\n *\n * In the above example, when `PageTitleDisplay` is rendered into an\n * application, the page and the resolution details will be retrieved from\n * the store state using the `mapSelect` callback on `useQuerySelect`.\n *\n * If the id prop changes then any page in the state for that id is\n * retrieved. If the id prop doesn't change and other props are passed in\n * that do change, the title will not change because the dependency is just\n * the id.\n * @see useSelect\n *\n * @return {QuerySelectResponse} Queried data.\n */\nexport default function useQuerySelect( mapQuerySelect, deps ) {\n\treturn useSelect( ( select, registry ) => {\n\t\tconst resolve = ( store ) => enrichSelectors( select( store ) );\n\t\treturn mapQuerySelect( resolve, registry );\n\t}, deps );\n}\n\ninterface EnrichedSelectors {\n\t< Selectors extends Record< string, ( ...args: any[] ) => any > >(\n\t\tselectors: Selectors\n\t): {\n\t\t[ Selector in keyof Selectors ]: (\n\t\t\t...args: Parameters< Selectors[ Selector ] >\n\t\t) => QuerySelectResponse< ReturnType< Selectors[ Selector ] > >;\n\t};\n}\n\n/**\n * Transform simple selectors into ones that return an object with the\n * original return value AND the resolution info.\n *\n * @param {Object} selectors Selectors to enrich\n * @return {EnrichedSelectors} Enriched selectors\n */\nconst enrichSelectors = memoize( ( ( selectors ) => {\n\tconst resolvers = {};\n\tfor ( const selectorName in selectors ) {\n\t\tif ( META_SELECTORS.includes( selectorName ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tObject.defineProperty( resolvers, selectorName, {\n\t\t\tget:\n\t\t\t\t() =>\n\t\t\t\t( ...args: unknown[] ) => {\n\t\t\t\t\tconst data = selectors[ selectorName ]( ...args );\n\t\t\t\t\tconst resolutionStatus = selectors.getResolutionState(\n\t\t\t\t\t\tselectorName,\n\t\t\t\t\t\targs\n\t\t\t\t\t)?.status;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\t...getResolutionStatus( resolutionStatus ),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t} );\n\t}\n\treturn resolvers;\n} ) as EnrichedSelectors );\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA0B;AAC1B,oBAAoB;AACpB,mBAAoC;AAE7B,IAAM,iBAAiB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AA2De,SAAR,eAAiC,gBAAgB,MAAO;AAC9D,aAAO,uBAAW,CAAE,QAAQ,aAAc;AACzC,UAAM,UAAU,CAAE,UAAW,gBAAiB,OAAQ,KAAM,CAAE;AAC9D,WAAO,eAAgB,SAAS,QAAS;AAAA,EAC1C,GAAG,IAAK;AACT;AAmBA,IAAM,sBAAkB,cAAAA,UAAW,CAAE,cAAe;AACnD,QAAM,YAAY,CAAC;AACnB,aAAY,gBAAgB,WAAY;AACvC,QAAK,eAAe,SAAU,YAAa,GAAI;AAC9C;AAAA,IACD;AACA,WAAO,eAAgB,WAAW,cAAc;AAAA,MAC/C,KACC,MACA,IAAK,SAAqB;AACzB,cAAM,OAAO,UAAW,YAAa,EAAG,GAAG,IAAK;AAChD,cAAM,mBAAmB,UAAU;AAAA,UAClC;AAAA,UACA;AAAA,QACD,GAAG;AAEH,eAAO;AAAA,UACN;AAAA,UACA,OAAG,kCAAqB,gBAAiB;AAAA,QAC1C;AAAA,MACD;AAAA,IACF,CAAE;AAAA,EACH;AACA,SAAO;AACR,EAAyB;",
6
6
  "names": ["memoize"]
7
7
  }