diff --git a/wp-includes/assets/script-loader-packages.php b/wp-includes/assets/script-loader-packages.php index 73b6887e49..590f64fcd0 100644 --- a/wp-includes/assets/script-loader-packages.php +++ b/wp-includes/assets/script-loader-packages.php @@ -1 +1 @@ - array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'a38319d7ba46c6e60f7f9d4c371222c5'), 'annotations.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'e103c345829d2b4da838b701a4dff236'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '63050163caffa6aac54e9ebf21fe0472'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => '21d1d6c005241b908b592f52ad684a28'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => '87cf2365cd719a6954f1e2bb8bcc692a'), 'block-directory.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '59c231b4ee1df0391993ac715e599b0f'), 'block-editor.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '2796019b58e57b1cf2f9a7fb31cf0d20'), 'block-library.js' => array('dependencies' => array('lodash', 'moment', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '085bab38a4ab58b904a8750f0d84c02f'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => '8ee151736a1e51db2bafbb61ddd60634'), 'blocks.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-shortcode'), 'version' => '70f0d7113c28590b968147e200d13a68'), 'components.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => 'a80ec44c72cf3f64f9d5465ab6667fd3'), 'compose.js' => array('dependencies' => array('lodash', 'react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => 'da94d523b115836ddbf0b3b774ddd94a'), 'core-data.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => '95df951bbac4c9f2fd2e6da80561595d'), 'customize-widgets.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-widgets'), 'version' => 'd8452f9e7fda5358f91d7fa9b955e706'), 'data.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => '38ad563aa39c8f314fe6f6e430d81a69'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => '6a75067d86cf9ab901a4646595575446'), 'date.js' => array('dependencies' => array('moment', 'wp-polyfill'), 'version' => 'e0e02b3a1c7037e6cb893486d4680631'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '96593d5d272d008fbcb6912fa0b86778'), 'dom.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '3c10edc1abf3fbbc79f17fd7d1d332eb'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'd996b53411d1533a84951212ab6ac4ff'), 'edit-post.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning'), 'version' => '0066e2a76eff88129280c12c9a52b6b4'), 'edit-site.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport'), 'version' => '37143261078ddd6868f39556a8b47617'), 'edit-widgets.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '78edb9fa8d75f19509d18d62a678667e'), 'editor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '3f6371e7599e6cefa5d43fae1b61f643'), 'element.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => '3dfdc75a0abf30f057df44e9a39abe5b'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '00a5735837e9efe13da1d979f16a7105'), 'format-library.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '98e32e5276b4b59e7b283addf7cdbd8c'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c6d64f2cb8f5c6bb49caca37f8828ce3'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c6385fb7cd9fdada1cf8892a545f8a26'), 'i18n.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'ebee46757c6a411e38fd079a7ac71d94'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => '649feec00389556f8015a6b97efc1cb1'), 'keyboard-shortcuts.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '418fddac042f08102c4110f70e13cd47'), 'keycodes.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => '84a0e6bbcf0b9e1ea0184c3f2bf28022'), 'list-reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '2b04eb3e5628488fe2cb534f02806022'), 'media-utils.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'ee812d25ec8504c5b419a1aa3cae974d'), 'notices.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-polyfill'), 'version' => 'e44820c667bf205cacdfc48cbeb3c2e6'), 'nux.js' => array('dependencies' => array('lodash', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '48ab41273bfd9022769c430fcd3c23cf'), 'plugins.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => '8318bcd6086deb19e800c183bd20bafb'), 'preferences.js' => array('dependencies' => array('wp-a11y', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'a9b6f95c63bb642d0be7c3d1d208b302'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'cadf5cfaabdb15c8c8fc440547afe919'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'efad6460ae6b28406d39866cb10731e0'), 'redux-routine.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '5156478c032ea85a2bbdceeb7a43b0c1'), 'reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '7387bed6e19d1b3aec4b6fda683a0768'), 'rich-text.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-compose', 'wp-data', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => 'e7d57502b62ec4756783a0cd79238841'), 'server-side-render.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'f3f949340f2edb72d97152f3cda119a1'), 'shortcode.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'd6964e945049b6190adc8770cda168c4'), 'token-list.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '4ebce6423dfff99d40033fd33ce52cc9'), 'url.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '16385e4d69da65c7283790971de6b297'), 'viewport.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '6b3719cd3e4fd40e0ce2de0e0c86dbe4'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b9190af8fc6a3a48c580473c6f337b88'), 'widgets.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '80e98954519d1dad7a91a2248dbc2cc9'), 'wordcount.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'fb8056c75aa0a0569f7ea3ceae97fbc6')); \ No newline at end of file + array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'a38319d7ba46c6e60f7f9d4c371222c5'), 'annotations.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'e103c345829d2b4da838b701a4dff236'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '63050163caffa6aac54e9ebf21fe0472'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => '21d1d6c005241b908b592f52ad684a28'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => '87cf2365cd719a6954f1e2bb8bcc692a'), 'block-directory.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '59c231b4ee1df0391993ac715e599b0f'), 'block-editor.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '2796019b58e57b1cf2f9a7fb31cf0d20'), 'block-library.js' => array('dependencies' => array('lodash', 'moment', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '085bab38a4ab58b904a8750f0d84c02f'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => '8ee151736a1e51db2bafbb61ddd60634'), 'blocks.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-shortcode'), 'version' => '70f0d7113c28590b968147e200d13a68'), 'components.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => 'a80ec44c72cf3f64f9d5465ab6667fd3'), 'compose.js' => array('dependencies' => array('lodash', 'react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => 'da94d523b115836ddbf0b3b774ddd94a'), 'core-data.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => '95df951bbac4c9f2fd2e6da80561595d'), 'customize-widgets.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-widgets'), 'version' => 'd8452f9e7fda5358f91d7fa9b955e706'), 'data.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => '38ad563aa39c8f314fe6f6e430d81a69'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => '6a75067d86cf9ab901a4646595575446'), 'date.js' => array('dependencies' => array('moment', 'wp-polyfill'), 'version' => 'e0e02b3a1c7037e6cb893486d4680631'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '96593d5d272d008fbcb6912fa0b86778'), 'dom.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '3c10edc1abf3fbbc79f17fd7d1d332eb'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'd996b53411d1533a84951212ab6ac4ff'), 'edit-post.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning'), 'version' => '0066e2a76eff88129280c12c9a52b6b4'), 'edit-site.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport'), 'version' => '37143261078ddd6868f39556a8b47617'), 'edit-widgets.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '78edb9fa8d75f19509d18d62a678667e'), 'editor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '3f6371e7599e6cefa5d43fae1b61f643'), 'element.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => '3dfdc75a0abf30f057df44e9a39abe5b'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '00a5735837e9efe13da1d979f16a7105'), 'format-library.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '98e32e5276b4b59e7b283addf7cdbd8c'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c6d64f2cb8f5c6bb49caca37f8828ce3'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c6385fb7cd9fdada1cf8892a545f8a26'), 'i18n.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'ebee46757c6a411e38fd079a7ac71d94'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => '649feec00389556f8015a6b97efc1cb1'), 'keyboard-shortcuts.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '418fddac042f08102c4110f70e13cd47'), 'keycodes.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => '84a0e6bbcf0b9e1ea0184c3f2bf28022'), 'list-reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '2b04eb3e5628488fe2cb534f02806022'), 'media-utils.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'ee812d25ec8504c5b419a1aa3cae974d'), 'notices.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-polyfill'), 'version' => 'e44820c667bf205cacdfc48cbeb3c2e6'), 'nux.js' => array('dependencies' => array('lodash', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '48ab41273bfd9022769c430fcd3c23cf'), 'plugins.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => '8318bcd6086deb19e800c183bd20bafb'), 'preferences.js' => array('dependencies' => array('wp-a11y', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '32a7265776ecf82938cfb10b973196cc'), 'preferences-persistence.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => '69df0e44434e3669934073951c587c78'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'cadf5cfaabdb15c8c8fc440547afe919'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'efad6460ae6b28406d39866cb10731e0'), 'redux-routine.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '5156478c032ea85a2bbdceeb7a43b0c1'), 'reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '7387bed6e19d1b3aec4b6fda683a0768'), 'rich-text.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-compose', 'wp-data', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => 'e7d57502b62ec4756783a0cd79238841'), 'server-side-render.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'f3f949340f2edb72d97152f3cda119a1'), 'shortcode.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'd6964e945049b6190adc8770cda168c4'), 'token-list.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '4ebce6423dfff99d40033fd33ce52cc9'), 'url.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '16385e4d69da65c7283790971de6b297'), 'viewport.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '6b3719cd3e4fd40e0ce2de0e0c86dbe4'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b9190af8fc6a3a48c580473c6f337b88'), 'widgets.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '80e98954519d1dad7a91a2248dbc2cc9'), 'wordcount.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'fb8056c75aa0a0569f7ea3ceae97fbc6')); \ No newline at end of file diff --git a/wp-includes/default-filters.php b/wp-includes/default-filters.php index bf76a5d5e1..54868163cd 100644 --- a/wp-includes/default-filters.php +++ b/wp-includes/default-filters.php @@ -683,4 +683,7 @@ add_action( 'wp_footer', 'the_block_template_skip_link' ); add_action( 'setup_theme', 'wp_enable_block_templates' ); add_action( 'wp_loaded', '_add_template_loader_filters' ); +// User preferences. +add_action( 'init', 'wp_register_persisted_preferences_meta' ); + unset( $filter, $action ); diff --git a/wp-includes/js/dist/preferences-persistence.js b/wp-includes/js/dist/preferences-persistence.js new file mode 100644 index 0000000000..68311dbbe5 --- /dev/null +++ b/wp-includes/js/dist/preferences-persistence.js @@ -0,0 +1,881 @@ +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "__unstableCreatePersistenceLayer": function() { return /* binding */ __unstableCreatePersistenceLayer; }, + "create": function() { return /* reexport */ create; } +}); + +;// CONCATENATED MODULE: external ["wp","apiFetch"] +var external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"]; +var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject); +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/create/debounce-async.js +/** + * Performs a leading edge debounce of async functions. + * + * If three functions are throttled at the same time: + * - The first happens immediately. + * - The second is never called. + * - The third happens `delayMS` milliseconds after the first has resolved. + * + * This is distinct from `lodash.debounce` in that it waits for promise + * resolution. + * + * @param {Function} func A function that returns a promise. + * @param {number} delayMS A delay in milliseconds. + * + * @return {Function} A function that debounce whatever function is passed + * to it. + */ +function debounceAsync(func, delayMS) { + let timeoutId; + let activePromise; + return async function debounced() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + // This is a leading edge debounce. If there's no promise or timeout + // in progress, call the debounced function immediately. + if (!activePromise && !timeoutId) { + return new Promise((resolve, reject) => { + // Keep a reference to the promise. + activePromise = func(...args).then(function () { + resolve(...arguments); + }).catch(error => { + reject(error); + }).finally(() => { + // As soon this promise is complete, clear the way for the + // next one to happen immediately. + activePromise = null; + }); + }); + } + + if (activePromise) { + // Let any active promises finish before queuing the next request. + await activePromise; + } // Clear any active timeouts, abandoning any requests that have + // been queued but not been made. + + + if (timeoutId) { + clearTimeout(timeoutId); + timeoutId = null; + } // Trigger any trailing edge calls to the function. + + + return new Promise((resolve, reject) => { + // Schedule the next request but with a delay. + timeoutId = setTimeout(() => { + activePromise = func(...args).then(function () { + resolve(...arguments); + }).catch(error => { + reject(error); + }).finally(() => { + // As soon this promise is complete, clear the way for the + // next one to happen immediately. + activePromise = null; + timeoutId = null; + }); + }, delayMS); + }); + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/create/index.js +/** + * WordPress dependencies + */ + +/** + * Internal dependencies + */ + + +const EMPTY_OBJECT = {}; +const localStorage = window.localStorage; +/** + * Creates a persistence layer that stores data in WordPress user meta via the + * REST API. + * + * @param {Object} options + * @param {?Object} options.preloadedData Any persisted preferences data that should be preloaded. + * When set, the persistence layer will avoid fetching data + * from the REST API. + * @param {?string} options.localStorageRestoreKey The key to use for restoring the localStorage backup, used + * when the persistence layer calls `localStorage.getItem` or + * `localStorage.setItem`. + * @param {?number} options.requestDebounceMS Debounce requests to the API so that they only occur at + * minimum every `requestDebounceMS` milliseconds, and don't + * swamp the server. Defaults to 2500ms. + * + * @return {Object} A persistence layer for WordPress user meta. + */ + +function create() { + let { + preloadedData, + localStorageRestoreKey = 'WP_PREFERENCES_RESTORE_DATA', + requestDebounceMS = 2500 + } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + let cache = preloadedData; + const debouncedApiFetch = debounceAsync((external_wp_apiFetch_default()), requestDebounceMS); + + async function get() { + var _user$meta; + + if (cache) { + return cache; + } + + const user = await external_wp_apiFetch_default()({ + path: '/wp/v2/users/me?context=edit' + }); + const serverData = user === null || user === void 0 ? void 0 : (_user$meta = user.meta) === null || _user$meta === void 0 ? void 0 : _user$meta.persisted_preferences; + const localData = JSON.parse(localStorage.getItem(localStorageRestoreKey)); // Date parse returns NaN for invalid input. Coerce anything invalid + // into a conveniently comparable zero. + + const serverTimestamp = Date.parse(serverData === null || serverData === void 0 ? void 0 : serverData._modified) || 0; + const localTimestamp = Date.parse(localData === null || localData === void 0 ? void 0 : localData._modified) || 0; // Prefer server data if it exists and is more recent. + // Otherwise fallback to localStorage data. + + if (serverData && serverTimestamp >= localTimestamp) { + cache = serverData; + } else if (localData) { + cache = localData; + } else { + cache = EMPTY_OBJECT; + } + + return cache; + } + + function set(newData) { + const dataWithTimestamp = { ...newData, + _modified: new Date().toISOString() + }; + cache = dataWithTimestamp; // Store data in local storage as a fallback. If for some reason the + // api request does not complete or becomes unavailable, this data + // can be used to restore preferences. + + localStorage.setItem(localStorageRestoreKey, JSON.stringify(dataWithTimestamp)); // The user meta endpoint seems susceptible to errors when consecutive + // requests are made in quick succession. Ensure there's a gap between + // any consecutive requests. + // + // Catch and do nothing with errors from the REST API. + + debouncedApiFetch({ + path: '/wp/v2/users/me', + method: 'PUT', + // `keepalive` will still send the request in the background, + // even when a browser unload event might interrupt it. + // This should hopefully make things more resilient. + // This does have a size limit of 64kb, but the data is usually + // much less. + keepalive: true, + data: { + meta: { + persisted_preferences: dataWithTimestamp + } + } + }).catch(() => {}); + } + + return { + get, + set + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-feature-preferences.js +/** + * Move the 'features' object in local storage from the sourceStoreName to the + * preferences store data structure. + * + * Previously, editors used a data structure like this for feature preferences: + * ```js + * { + * 'core/edit-post': { + * preferences: { + * features; { + * topToolbar: true, + * // ... other boolean 'feature' preferences + * }, + * }, + * }, + * } + * ``` + * + * And for a while these feature preferences lived in the interface package: + * ```js + * { + * 'core/interface': { + * preferences: { + * features: { + * 'core/edit-post': { + * topToolbar: true + * } + * } + * } + * } + * } + * ``` + * + * In the preferences store, 'features' aren't considered special, they're + * merged to the root level of the scope along with other preferences: + * ```js + * { + * 'core/preferences': { + * preferences: { + * 'core/edit-post': { + * topToolbar: true, + * // ... any other preferences. + * } + * } + * } + * } + * ``` + * + * This function handles moving from either the source store or the interface + * store to the preferences data structure. + * + * @param {Object} state The state before migration. + * @param {string} sourceStoreName The name of the store that has persisted + * preferences to migrate to the preferences + * package. + * @return {Object} The migrated state + */ +function moveFeaturePreferences(state, sourceStoreName) { + var _state$interfaceStore, _state$interfaceStore2, _state$interfaceStore3, _state$sourceStoreNam, _state$sourceStoreNam2, _state$preferencesSto; + + const preferencesStoreName = 'core/preferences'; + const interfaceStoreName = 'core/interface'; // Features most recently (and briefly) lived in the interface package. + // If data exists there, prioritize using that for the migration. If not + // also check the original package as the user may have updated from an + // older block editor version. + + const interfaceFeatures = state === null || state === void 0 ? void 0 : (_state$interfaceStore = state[interfaceStoreName]) === null || _state$interfaceStore === void 0 ? void 0 : (_state$interfaceStore2 = _state$interfaceStore.preferences) === null || _state$interfaceStore2 === void 0 ? void 0 : (_state$interfaceStore3 = _state$interfaceStore2.features) === null || _state$interfaceStore3 === void 0 ? void 0 : _state$interfaceStore3[sourceStoreName]; + const sourceFeatures = state === null || state === void 0 ? void 0 : (_state$sourceStoreNam = state[sourceStoreName]) === null || _state$sourceStoreNam === void 0 ? void 0 : (_state$sourceStoreNam2 = _state$sourceStoreNam.preferences) === null || _state$sourceStoreNam2 === void 0 ? void 0 : _state$sourceStoreNam2.features; + const featuresToMigrate = interfaceFeatures ? interfaceFeatures : sourceFeatures; + + if (!featuresToMigrate) { + return state; + } + + const existingPreferences = state === null || state === void 0 ? void 0 : (_state$preferencesSto = state[preferencesStoreName]) === null || _state$preferencesSto === void 0 ? void 0 : _state$preferencesSto.preferences; // Avoid migrating features again if they've previously been migrated. + + if (existingPreferences !== null && existingPreferences !== void 0 && existingPreferences[sourceStoreName]) { + return state; + } + + let updatedInterfaceState; + + if (interfaceFeatures) { + var _state$interfaceStore4, _state$interfaceStore5; + + const otherInterfaceState = state === null || state === void 0 ? void 0 : state[interfaceStoreName]; + const otherInterfaceScopes = state === null || state === void 0 ? void 0 : (_state$interfaceStore4 = state[interfaceStoreName]) === null || _state$interfaceStore4 === void 0 ? void 0 : (_state$interfaceStore5 = _state$interfaceStore4.preferences) === null || _state$interfaceStore5 === void 0 ? void 0 : _state$interfaceStore5.features; + updatedInterfaceState = { + [interfaceStoreName]: { ...otherInterfaceState, + preferences: { + features: { ...otherInterfaceScopes, + [sourceStoreName]: undefined + } + } + } + }; + } + + let updatedSourceState; + + if (sourceFeatures) { + var _state$sourceStoreNam3; + + const otherSourceState = state === null || state === void 0 ? void 0 : state[sourceStoreName]; + const sourcePreferences = state === null || state === void 0 ? void 0 : (_state$sourceStoreNam3 = state[sourceStoreName]) === null || _state$sourceStoreNam3 === void 0 ? void 0 : _state$sourceStoreNam3.preferences; + updatedSourceState = { + [sourceStoreName]: { ...otherSourceState, + preferences: { ...sourcePreferences, + features: undefined + } + } + }; + } // Set the feature values in the interface store, the features + // object is keyed by 'scope', which matches the store name for + // the source. + + + return { ...state, + [preferencesStoreName]: { + preferences: { ...existingPreferences, + [sourceStoreName]: featuresToMigrate + } + }, + ...updatedInterfaceState, + ...updatedSourceState + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js +/** + * The interface package previously had a public API that could be used by + * plugins to set persisted boolean 'feature' preferences. + * + * While usage was likely non-existent or very small, this function ensures + * those are migrated to the preferences data structure. The interface + * package's APIs have now been deprecated and use the preferences store. + * + * This will convert data that looks like this: + * ```js + * { + * 'core/interface': { + * preferences: { + * features: { + * 'my-plugin': { + * myPluginFeature: true + * } + * } + * } + * } + * } + * ``` + * + * To this: + * ```js + * * { + * 'core/preferences': { + * preferences: { + * 'my-plugin': { + * myPluginFeature: true + * } + * } + * } + * } + * ``` + * + * @param {Object} state The local storage state + * + * @return {Object} The state with third party preferences moved to the + * preferences data structure. + */ +function moveThirdPartyFeaturePreferencesToPreferences(state) { + var _state$interfaceStore, _state$interfaceStore2; + + const interfaceStoreName = 'core/interface'; + const preferencesStoreName = 'core/preferences'; + const interfaceScopes = state === null || state === void 0 ? void 0 : (_state$interfaceStore = state[interfaceStoreName]) === null || _state$interfaceStore === void 0 ? void 0 : (_state$interfaceStore2 = _state$interfaceStore.preferences) === null || _state$interfaceStore2 === void 0 ? void 0 : _state$interfaceStore2.features; + const interfaceScopeKeys = interfaceScopes ? Object.keys(interfaceScopes) : []; + + if (!(interfaceScopeKeys !== null && interfaceScopeKeys !== void 0 && interfaceScopeKeys.length)) { + return state; + } + + return interfaceScopeKeys.reduce(function (convertedState, scope) { + var _convertedState$prefe, _convertedState$prefe2, _convertedState$prefe3, _convertedState$inter, _convertedState$inter2; + + if (scope.startsWith('core')) { + return convertedState; + } + + const featuresToMigrate = interfaceScopes === null || interfaceScopes === void 0 ? void 0 : interfaceScopes[scope]; + + if (!featuresToMigrate) { + return convertedState; + } + + const existingMigratedData = convertedState === null || convertedState === void 0 ? void 0 : (_convertedState$prefe = convertedState[preferencesStoreName]) === null || _convertedState$prefe === void 0 ? void 0 : (_convertedState$prefe2 = _convertedState$prefe.preferences) === null || _convertedState$prefe2 === void 0 ? void 0 : _convertedState$prefe2[scope]; + + if (existingMigratedData) { + return convertedState; + } + + const otherPreferencesScopes = convertedState === null || convertedState === void 0 ? void 0 : (_convertedState$prefe3 = convertedState[preferencesStoreName]) === null || _convertedState$prefe3 === void 0 ? void 0 : _convertedState$prefe3.preferences; + const otherInterfaceState = convertedState === null || convertedState === void 0 ? void 0 : convertedState[interfaceStoreName]; + const otherInterfaceScopes = convertedState === null || convertedState === void 0 ? void 0 : (_convertedState$inter = convertedState[interfaceStoreName]) === null || _convertedState$inter === void 0 ? void 0 : (_convertedState$inter2 = _convertedState$inter.preferences) === null || _convertedState$inter2 === void 0 ? void 0 : _convertedState$inter2.features; + return { ...convertedState, + [preferencesStoreName]: { + preferences: { ...otherPreferencesScopes, + [scope]: featuresToMigrate + } + }, + [interfaceStoreName]: { ...otherInterfaceState, + preferences: { + features: { ...otherInterfaceScopes, + [scope]: undefined + } + } + } + }; + }, state); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-individual-preference.js +const identity = arg => arg; +/** + * Migrates an individual item inside the `preferences` object for a package's store. + * + * Previously, some packages had individual 'preferences' of any data type, and many used + * complex nested data structures. For example: + * ```js + * { + * 'core/edit-post': { + * preferences: { + * panels: { + * publish: { + * opened: true, + * enabled: true, + * } + * }, + * // ...other preferences. + * }, + * }, + * } + * + * This function supports moving an individual preference like 'panels' above into the + * preferences package data structure. + * + * It supports moving a preference to a particular scope in the preferences store and + * optionally converting the data using a `convert` function. + * + * ``` + * + * @param {Object} state The original state. + * @param {Object} migrate An options object that contains details of the migration. + * @param {string} migrate.from The name of the store to migrate from. + * @param {string} migrate.to The scope in the preferences store to migrate to. + * @param {string} key The key in the preferences object to migrate. + * @param {?Function} convert A function that converts preferences from one format to another. + */ + + +function moveIndividualPreferenceToPreferences(state, _ref, key) { + var _state$sourceStoreNam, _state$sourceStoreNam2, _state$preferencesSto, _state$preferencesSto2, _state$preferencesSto3, _state$preferencesSto4, _state$preferencesSto5, _state$preferencesSto6, _state$sourceStoreNam3; + + let { + from: sourceStoreName, + to: scope + } = _ref; + let convert = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : identity; + const preferencesStoreName = 'core/preferences'; + const sourcePreference = state === null || state === void 0 ? void 0 : (_state$sourceStoreNam = state[sourceStoreName]) === null || _state$sourceStoreNam === void 0 ? void 0 : (_state$sourceStoreNam2 = _state$sourceStoreNam.preferences) === null || _state$sourceStoreNam2 === void 0 ? void 0 : _state$sourceStoreNam2[key]; // There's nothing to migrate, exit early. + + if (sourcePreference === undefined) { + return state; + } + + const targetPreference = state === null || state === void 0 ? void 0 : (_state$preferencesSto = state[preferencesStoreName]) === null || _state$preferencesSto === void 0 ? void 0 : (_state$preferencesSto2 = _state$preferencesSto.preferences) === null || _state$preferencesSto2 === void 0 ? void 0 : (_state$preferencesSto3 = _state$preferencesSto2[scope]) === null || _state$preferencesSto3 === void 0 ? void 0 : _state$preferencesSto3[key]; // There's existing data at the target, so don't overwrite it, exit early. + + if (targetPreference) { + return state; + } + + const otherScopes = state === null || state === void 0 ? void 0 : (_state$preferencesSto4 = state[preferencesStoreName]) === null || _state$preferencesSto4 === void 0 ? void 0 : _state$preferencesSto4.preferences; + const otherPreferences = state === null || state === void 0 ? void 0 : (_state$preferencesSto5 = state[preferencesStoreName]) === null || _state$preferencesSto5 === void 0 ? void 0 : (_state$preferencesSto6 = _state$preferencesSto5.preferences) === null || _state$preferencesSto6 === void 0 ? void 0 : _state$preferencesSto6[scope]; + const otherSourceState = state === null || state === void 0 ? void 0 : state[sourceStoreName]; + const allSourcePreferences = state === null || state === void 0 ? void 0 : (_state$sourceStoreNam3 = state[sourceStoreName]) === null || _state$sourceStoreNam3 === void 0 ? void 0 : _state$sourceStoreNam3.preferences; // Pass an object with the key and value as this allows the convert + // function to convert to a data structure that has different keys. + + const convertedPreferences = convert({ + [key]: sourcePreference + }); + return { ...state, + [preferencesStoreName]: { + preferences: { ...otherScopes, + [scope]: { ...otherPreferences, + ...convertedPreferences + } + } + }, + [sourceStoreName]: { ...otherSourceState, + preferences: { ...allSourcePreferences, + [key]: undefined + } + } + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-interface-enable-items.js +/** + * Migrates interface 'enableItems' data to the preferences store. + * + * The interface package stores this data in this format: + * ```js + * { + * enableItems: { + * singleEnableItems: { + * complementaryArea: { + * 'core/edit-post': 'edit-post/document', + * 'core/edit-site': 'edit-site/global-styles', + * } + * }, + * multipleEnableItems: { + * pinnedItems: { + * 'core/edit-post': { + * 'plugin-1': true, + * }, + * 'core/edit-site': { + * 'plugin-2': true, + * }, + * }, + * } + * } + * } + * ``` + * + * and it should be converted it to: + * ```js + * { + * 'core/edit-post': { + * complementaryArea: 'edit-post/document', + * pinnedItems: { + * 'plugin-1': true, + * }, + * }, + * 'core/edit-site': { + * complementaryArea: 'edit-site/global-styles', + * pinnedItems: { + * 'plugin-2': true, + * }, + * }, + * } + * ``` + * + * @param {Object} state The local storage state. + */ +function moveInterfaceEnableItems(state) { + var _state$interfaceStore, _state$preferencesSto, _state$preferencesSto2, _sourceEnableItems$si, _sourceEnableItems$si2, _sourceEnableItems$mu, _sourceEnableItems$mu2; + + const interfaceStoreName = 'core/interface'; + const preferencesStoreName = 'core/preferences'; + const sourceEnableItems = state === null || state === void 0 ? void 0 : (_state$interfaceStore = state[interfaceStoreName]) === null || _state$interfaceStore === void 0 ? void 0 : _state$interfaceStore.enableItems; // There's nothing to migrate, exit early. + + if (!sourceEnableItems) { + return state; + } + + const allPreferences = (_state$preferencesSto = state === null || state === void 0 ? void 0 : (_state$preferencesSto2 = state[preferencesStoreName]) === null || _state$preferencesSto2 === void 0 ? void 0 : _state$preferencesSto2.preferences) !== null && _state$preferencesSto !== void 0 ? _state$preferencesSto : {}; // First convert complementaryAreas into the right format. + // Use the existing preferences as the accumulator so that the data is + // merged. + + const sourceComplementaryAreas = (_sourceEnableItems$si = sourceEnableItems === null || sourceEnableItems === void 0 ? void 0 : (_sourceEnableItems$si2 = sourceEnableItems.singleEnableItems) === null || _sourceEnableItems$si2 === void 0 ? void 0 : _sourceEnableItems$si2.complementaryArea) !== null && _sourceEnableItems$si !== void 0 ? _sourceEnableItems$si : {}; + const preferencesWithConvertedComplementaryAreas = Object.keys(sourceComplementaryAreas).reduce((accumulator, scope) => { + var _accumulator$scope; + + const data = sourceComplementaryAreas[scope]; // Don't overwrite any existing data in the preferences store. + + if (accumulator !== null && accumulator !== void 0 && (_accumulator$scope = accumulator[scope]) !== null && _accumulator$scope !== void 0 && _accumulator$scope.complementaryArea) { + return accumulator; + } + + return { ...accumulator, + [scope]: { ...accumulator[scope], + complementaryArea: data + } + }; + }, allPreferences); // Next feed the converted complementary areas back into a reducer that + // converts the pinned items, resulting in the fully migrated data. + + const sourcePinnedItems = (_sourceEnableItems$mu = sourceEnableItems === null || sourceEnableItems === void 0 ? void 0 : (_sourceEnableItems$mu2 = sourceEnableItems.multipleEnableItems) === null || _sourceEnableItems$mu2 === void 0 ? void 0 : _sourceEnableItems$mu2.pinnedItems) !== null && _sourceEnableItems$mu !== void 0 ? _sourceEnableItems$mu : {}; + const allConvertedData = Object.keys(sourcePinnedItems).reduce((accumulator, scope) => { + var _accumulator$scope2; + + const data = sourcePinnedItems[scope]; // Don't overwrite any existing data in the preferences store. + + if (accumulator !== null && accumulator !== void 0 && (_accumulator$scope2 = accumulator[scope]) !== null && _accumulator$scope2 !== void 0 && _accumulator$scope2.pinnedItems) { + return accumulator; + } + + return { ...accumulator, + [scope]: { ...accumulator[scope], + pinnedItems: data + } + }; + }, preferencesWithConvertedComplementaryAreas); + const otherInterfaceItems = state[interfaceStoreName]; + return { ...state, + [preferencesStoreName]: { + preferences: allConvertedData + }, + [interfaceStoreName]: { ...otherInterfaceItems, + enableItems: undefined + } + }; +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/convert-edit-post-panels.js +/** + * Convert the post editor's panels state from: + * ``` + * { + * panels: { + * tags: { + * enabled: true, + * opened: true, + * }, + * permalinks: { + * enabled: false, + * opened: false, + * }, + * }, + * } + * ``` + * + * to a new, more concise data structure: + * { + * inactivePanels: [ + * 'permalinks', + * ], + * openPanels: [ + * 'tags', + * ], + * } + * + * @param {Object} preferences A preferences object. + * + * @return {Object} The converted data. + */ +function convertEditPostPanels(preferences) { + var _preferences$panels; + + const panels = (_preferences$panels = preferences === null || preferences === void 0 ? void 0 : preferences.panels) !== null && _preferences$panels !== void 0 ? _preferences$panels : {}; + return Object.keys(panels).reduce((convertedData, panelName) => { + const panel = panels[panelName]; + + if ((panel === null || panel === void 0 ? void 0 : panel.enabled) === false) { + convertedData.inactivePanels.push(panelName); + } + + if ((panel === null || panel === void 0 ? void 0 : panel.opened) === true) { + convertedData.openPanels.push(panelName); + } + + return convertedData; + }, { + inactivePanels: [], + openPanels: [] + }); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/index.js +/** + * Internal dependencies + */ + + + + + +/** + * Gets the legacy local storage data for a given user. + * + * @param {string | number} userId The user id. + * + * @return {Object | null} The local storage data. + */ + +function getLegacyData(userId) { + const key = `WP_DATA_USER_${userId}`; + const unparsedData = window.localStorage.getItem(key); + return JSON.parse(unparsedData); +} +/** + * Converts data from the old `@wordpress/data` package format. + * + * @param {Object | null | undefined} data The legacy data in its original format. + * + * @return {Object | undefined} The converted data or `undefined` if there was + * nothing to convert. + */ + + +function convertLegacyData(data) { + var _data, _data$corePreference; + + if (!data) { + return; + } // Move boolean feature preferences from each editor into the + // preferences store data structure. + + + data = moveFeaturePreferences(data, 'core/edit-widgets'); + data = moveFeaturePreferences(data, 'core/customize-widgets'); + data = moveFeaturePreferences(data, 'core/edit-post'); + data = moveFeaturePreferences(data, 'core/edit-site'); // Move third party boolean feature preferences from the interface package + // to the preferences store data structure. + + data = moveThirdPartyFeaturePreferencesToPreferences(data); // Move and convert the interface store's `enableItems` data into the + // preferences data structure. + + data = moveInterfaceEnableItems(data); // Move individual ad-hoc preferences from various packages into the + // preferences store data structure. + + data = moveIndividualPreferenceToPreferences(data, { + from: 'core/edit-post', + to: 'core/edit-post' + }, 'hiddenBlockTypes'); + data = moveIndividualPreferenceToPreferences(data, { + from: 'core/edit-post', + to: 'core/edit-post' + }, 'editorMode'); + data = moveIndividualPreferenceToPreferences(data, { + from: 'core/edit-post', + to: 'core/edit-post' + }, 'preferredStyleVariations'); + data = moveIndividualPreferenceToPreferences(data, { + from: 'core/edit-post', + to: 'core/edit-post' + }, 'panels', convertEditPostPanels); + data = moveIndividualPreferenceToPreferences(data, { + from: 'core/editor', + to: 'core/edit-post' + }, 'isPublishSidebarEnabled'); + data = moveIndividualPreferenceToPreferences(data, { + from: 'core/edit-site', + to: 'core/edit-site' + }, 'editorMode'); // The new system is only concerned with persisting + // 'core/preferences' preferences reducer, so only return that. + + return (_data = data) === null || _data === void 0 ? void 0 : (_data$corePreference = _data['core/preferences']) === null || _data$corePreference === void 0 ? void 0 : _data$corePreference.preferences; +} +/** + * Gets the legacy local storage data for the given user and returns the + * data converted to the new format. + * + * @param {string | number} userId The user id. + * + * @return {Object | undefined} The converted data or undefined if no local + * storage data could be found. + */ + +function convertLegacyLocalStorageData(userId) { + const data = getLegacyData(userId); + return convertLegacyData(data); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/preferences-package-data/convert-complementary-areas.js +function convertComplementaryAreas(state) { + return Object.keys(state).reduce((stateAccumulator, scope) => { + const scopeData = state[scope]; // If a complementary area is truthy, convert it to the `isComplementaryAreaVisible` boolean. + + if (scopeData !== null && scopeData !== void 0 && scopeData.complementaryArea) { + const updatedScopeData = { ...scopeData + }; + delete updatedScopeData.complementaryArea; + updatedScopeData.isComplementaryAreaVisible = true; + stateAccumulator[scope] = updatedScopeData; + return stateAccumulator; + } + + return stateAccumulator; + }, state); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/preferences-package-data/index.js +/** + * Internal dependencies + */ + +function convertPreferencesPackageData(data) { + return convertComplementaryAreas(data); +} + +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/index.js +/** + * Internal dependencies + */ + + + + +/** + * Creates the persistence layer with preloaded data. + * + * It prioritizes any data from the server, but falls back first to localStorage + * restore data, and then to any legacy data. + * + * This function is used internally by WordPress in an inline script, so + * prefixed with `__unstable`. + * + * @param {Object} serverData Preferences data preloaded from the server. + * @param {string} userId The user id. + * + * @return {Object} The persistence layer initialized with the preloaded data. + */ + +function __unstableCreatePersistenceLayer(serverData, userId) { + const localStorageRestoreKey = `WP_PREFERENCES_USER_${userId}`; + const localData = JSON.parse(window.localStorage.getItem(localStorageRestoreKey)); // Date parse returns NaN for invalid input. Coerce anything invalid + // into a conveniently comparable zero. + + const serverModified = Date.parse(serverData && serverData._modified) || 0; + const localModified = Date.parse(localData && localData._modified) || 0; + let preloadedData; + + if (serverData && serverModified >= localModified) { + preloadedData = convertPreferencesPackageData(serverData); + } else if (localData) { + preloadedData = convertPreferencesPackageData(localData); + } else { + // Check if there is data in the legacy format from the old persistence system. + preloadedData = convertLegacyLocalStorageData(userId); + } + + return create({ + preloadedData, + localStorageRestoreKey + }); +} + +(window.wp = window.wp || {}).preferencesPersistence = __webpack_exports__; +/******/ })() +; \ No newline at end of file diff --git a/wp-includes/js/dist/preferences-persistence.min.js b/wp-includes/js/dist/preferences-persistence.min.js new file mode 100644 index 0000000000..81f9074e05 --- /dev/null +++ b/wp-includes/js/dist/preferences-persistence.min.js @@ -0,0 +1,2 @@ +/*! This file is auto-generated */ +!function(){"use strict";var e={n:function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(r,{a:r}),r},d:function(n,r){for(var o in r)e.o(r,o)&&!e.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:r[o]})},o:function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},n={};e.r(n),e.d(n,{__unstableCreatePersistenceLayer:function(){return m},create:function(){return c}});var r=window.wp.apiFetch,o=e.n(r);function t(e,n){let r,o;return async function(){for(var t=arguments.length,l=new Array(t),i=0;i{r=setTimeout((()=>{o=e(...l).then((function(){t(...arguments)})).catch((e=>{i(e)})).finally((()=>{o=null,r=null}))}),n)}))):new Promise(((n,r)=>{o=e(...l).then((function(){n(...arguments)})).catch((e=>{r(e)})).finally((()=>{o=null}))}))}}const l={},i=window.localStorage;function c(){let{preloadedData:e,localStorageRestoreKey:n="WP_PREFERENCES_RESTORE_DATA",requestDebounceMS:r=2500}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},c=e;const u=t(o(),r);async function d(){var e;if(c)return c;const r=await o()({path:"/wp/v2/users/me?context=edit"}),t=null==r||null===(e=r.meta)||void 0===e?void 0:e.persisted_preferences,u=JSON.parse(i.getItem(n)),d=Date.parse(null==t?void 0:t._modified)||0,s=Date.parse(null==u?void 0:u._modified)||0;return c=t&&d>=s?t:u||l,c}function s(e){const r={...e,_modified:(new Date).toISOString()};c=r,i.setItem(n,JSON.stringify(r)),u({path:"/wp/v2/users/me",method:"PUT",keepalive:!0,data:{meta:{persisted_preferences:r}}}).catch((()=>{}))}return{get:d,set:s}}function u(e,n){var r,o,t,l,i,c;const u="core/preferences",d="core/interface",s=null==e||null===(r=e["core/interface"])||void 0===r||null===(o=r.preferences)||void 0===o||null===(t=o.features)||void 0===t?void 0:t[n],a=null==e||null===(l=e[n])||void 0===l||null===(i=l.preferences)||void 0===i?void 0:i.features,f=s||a;if(!f)return e;const v=null==e||null===(c=e["core/preferences"])||void 0===c?void 0:c.preferences;if(null!=v&&v[n])return e;let p,m;if(s){var y,w;p={[d]:{...null==e?void 0:e["core/interface"],preferences:{features:{...null==e||null===(y=e["core/interface"])||void 0===y||null===(w=y.preferences)||void 0===w?void 0:w.features,[n]:void 0}}}}}if(a){var b;m={[n]:{...null==e?void 0:e[n],preferences:{...null==e||null===(b=e[n])||void 0===b?void 0:b.preferences,features:void 0}}}}return{...e,[u]:{preferences:{...v,[n]:f}},...p,...m}}const d=e=>e;function s(e,n,r){var o,t,l,i,c,u,s,a,f;let{from:v,to:p}=n,m=arguments.length>3&&void 0!==arguments[3]?arguments[3]:d;const y="core/preferences",w=null==e||null===(o=e[v])||void 0===o||null===(t=o.preferences)||void 0===t?void 0:t[r];if(void 0===w)return e;const b=null==e||null===(l=e[y])||void 0===l||null===(i=l.preferences)||void 0===i||null===(c=i[p])||void 0===c?void 0:c[r];if(b)return e;const S=null==e||null===(u=e[y])||void 0===u?void 0:u.preferences,g=null==e||null===(s=e[y])||void 0===s||null===(a=s.preferences)||void 0===a?void 0:a[p],_=null==e?void 0:e[v],h=null==e||null===(f=e[v])||void 0===f?void 0:f.preferences,P=m({[r]:w});return{...e,[y]:{preferences:{...S,[p]:{...g,...P}}},[v]:{..._,preferences:{...h,[r]:void 0}}}}function a(e){var n;const r=null!==(n=null==e?void 0:e.panels)&&void 0!==n?n:{};return Object.keys(r).reduce(((e,n)=>{const o=r[n];return!1===(null==o?void 0:o.enabled)&&e.inactivePanels.push(n),!0===(null==o?void 0:o.opened)&&e.openPanels.push(n),e}),{inactivePanels:[],openPanels:[]})}function f(e){var n,r;if(e)return e=u(e,"core/edit-widgets"),e=u(e,"core/customize-widgets"),e=u(e,"core/edit-post"),e=s(e=function(e){var n,r,o,t,l,i,c;const u="core/interface",d="core/preferences",s=null==e||null===(n=e["core/interface"])||void 0===n?void 0:n.enableItems;if(!s)return e;const a=null!==(r=null==e||null===(o=e["core/preferences"])||void 0===o?void 0:o.preferences)&&void 0!==r?r:{},f=null!==(t=null==s||null===(l=s.singleEnableItems)||void 0===l?void 0:l.complementaryArea)&&void 0!==t?t:{},v=Object.keys(f).reduce(((e,n)=>{var r;const o=f[n];return null!=e&&null!==(r=e[n])&&void 0!==r&&r.complementaryArea?e:{...e,[n]:{...e[n],complementaryArea:o}}}),a),p=null!==(i=null==s||null===(c=s.multipleEnableItems)||void 0===c?void 0:c.pinnedItems)&&void 0!==i?i:{},m=Object.keys(p).reduce(((e,n)=>{var r;const o=p[n];return null!=e&&null!==(r=e[n])&&void 0!==r&&r.pinnedItems?e:{...e,[n]:{...e[n],pinnedItems:o}}}),v),y=e["core/interface"];return{...e,[d]:{preferences:m},[u]:{...y,enableItems:void 0}}}(e=function(e){var n,r;const o="core/interface",t="core/preferences",l=null==e||null===(n=e["core/interface"])||void 0===n||null===(r=n.preferences)||void 0===r?void 0:r.features,i=l?Object.keys(l):[];return null!=i&&i.length?i.reduce((function(e,n){var r,i,c,u,d;if(n.startsWith("core"))return e;const s=null==l?void 0:l[n];if(!s)return e;if(null==e||null===(r=e["core/preferences"])||void 0===r||null===(i=r.preferences)||void 0===i?void 0:i[n])return e;const a=null==e||null===(c=e["core/preferences"])||void 0===c?void 0:c.preferences,f=null==e?void 0:e["core/interface"],v=null==e||null===(u=e["core/interface"])||void 0===u||null===(d=u.preferences)||void 0===d?void 0:d.features;return{...e,[t]:{preferences:{...a,[n]:s}},[o]:{...f,preferences:{features:{...v,[n]:void 0}}}}}),e):e}(e=u(e,"core/edit-site"))),{from:"core/edit-post",to:"core/edit-post"},"hiddenBlockTypes"),e=s(e,{from:"core/edit-post",to:"core/edit-post"},"editorMode"),e=s(e,{from:"core/edit-post",to:"core/edit-post"},"preferredStyleVariations"),e=s(e,{from:"core/edit-post",to:"core/edit-post"},"panels",a),e=s(e,{from:"core/editor",to:"core/edit-post"},"isPublishSidebarEnabled"),null===(n=e=s(e,{from:"core/edit-site",to:"core/edit-site"},"editorMode"))||void 0===n||null===(r=n["core/preferences"])||void 0===r?void 0:r.preferences}function v(e){const n=function(e){const n=`WP_DATA_USER_${e}`,r=window.localStorage.getItem(n);return JSON.parse(r)}(e);return f(n)}function p(e){return n=e,Object.keys(n).reduce(((e,r)=>{const o=n[r];if(null!=o&&o.complementaryArea){const n={...o};return delete n.complementaryArea,n.isComplementaryAreaVisible=!0,e[r]=n,e}return e}),n);var n}function m(e,n){const r=`WP_PREFERENCES_USER_${n}`,o=JSON.parse(window.localStorage.getItem(r)),t=Date.parse(e&&e._modified)||0,l=Date.parse(o&&o._modified)||0;let i;return i=e&&t>=l?p(e):o?p(o):v(n),c({preloadedData:i,localStorageRestoreKey:r})}(window.wp=window.wp||{}).preferencesPersistence=n}(); \ No newline at end of file diff --git a/wp-includes/js/dist/preferences.js b/wp-includes/js/dist/preferences.js index b25c0bd42b..ee95423cce 100644 --- a/wp-includes/js/dist/preferences.js +++ b/wp-includes/js/dist/preferences.js @@ -49,6 +49,7 @@ __webpack_require__.r(actions_namespaceObject); __webpack_require__.d(actions_namespaceObject, { "set": function() { return set; }, "setDefaults": function() { return setDefaults; }, + "setPersistenceLayer": function() { return setPersistenceLayer; }, "toggle": function() { return toggle; } }); @@ -69,7 +70,7 @@ var external_wp_components_namespaceObject = window["wp"]["components"]; var external_wp_i18n_namespaceObject = window["wp"]["i18n"]; ;// CONCATENATED MODULE: external ["wp","primitives"] var external_wp_primitives_namespaceObject = window["wp"]["primitives"]; -;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/check.js +;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences/node_modules/@wordpress/icons/build-module/library/check.js /** @@ -121,6 +122,42 @@ function defaults() { return state; } +/** + * Higher order reducer that does the following: + * - Merges any data from the persistence layer into the state when the + * `SET_PERSISTENCE_LAYER` action is received. + * - Passes any preferences changes to the persistence layer. + * + * @param {Function} reducer The preferences reducer. + * + * @return {Function} The enhanced reducer. + */ + +function withPersistenceLayer(reducer) { + let persistenceLayer; + return (state, action) => { + // Setup the persistence layer, and return the persisted data + // as the state. + if (action.type === 'SET_PERSISTENCE_LAYER') { + const { + persistenceLayer: persistence, + persistedData + } = action; + persistenceLayer = persistence; + return persistedData; + } + + const nextState = reducer(state, action); + + if (action.type === 'SET_PREFERENCE_VALUE') { + var _persistenceLayer; + + (_persistenceLayer = persistenceLayer) === null || _persistenceLayer === void 0 ? void 0 : _persistenceLayer.set(nextState); + } + + return nextState; + }; +} /** * Reducer returning the user preferences. * @@ -130,7 +167,8 @@ function defaults() { * @return {Object} Updated state. */ -function preferences() { + +const preferences = withPersistenceLayer(function () { let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; let action = arguments.length > 1 ? arguments[1] : undefined; @@ -148,7 +186,7 @@ function preferences() { } return state; -} +}); /* harmony default export */ var reducer = ((0,external_wp_data_namespaceObject.combineReducers)({ defaults, preferences @@ -208,6 +246,41 @@ function setDefaults(scope, defaults) { defaults }; } +/** @typedef {() => Promise} WPPreferencesPersistenceLayerGet */ + +/** @typedef {(*) => void} WPPreferencesPersistenceLayerSet */ + +/** + * @typedef WPPreferencesPersistenceLayer + * + * @property {WPPreferencesPersistenceLayerGet} get An async function that gets data from the persistence layer. + * @property {WPPreferencesPersistenceLayerSet} set A function that sets data in the persistence layer. + */ + +/** + * Sets the persistence layer. + * + * When a persistence layer is set, the preferences store will: + * - call `get` immediately and update the store state to the value returned. + * - call `set` with all preferences whenever a preference changes value. + * + * `setPersistenceLayer` should ideally be dispatched at the start of an + * application's lifecycle, before any other actions have been dispatched to + * the preferences store. + * + * @param {WPPreferencesPersistenceLayer} persistenceLayer The persistence layer. + * + * @return {Object} Action object. + */ + +async function setPersistenceLayer(persistenceLayer) { + const persistedData = await persistenceLayer.get(); + return { + type: 'SET_PERSISTENCE_LAYER', + persistenceLayer, + persistedData + }; +} ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences/build-module/store/selectors.js /** @@ -244,10 +317,6 @@ const STORE_NAME = 'core/preferences'; * Internal dependencies */ -/** - * Internal dependencies - */ - @@ -263,17 +332,9 @@ const STORE_NAME = 'core/preferences'; const store = (0,external_wp_data_namespaceObject.createReduxStore)(STORE_NAME, { reducer: reducer, actions: actions_namespaceObject, - selectors: selectors_namespaceObject, - persist: ['preferences'] -}); // Once we build a more generic persistence plugin that works across types of stores -// we'd be able to replace this with a register call. - -(0,external_wp_data_namespaceObject.registerStore)(STORE_NAME, { - reducer: reducer, - actions: actions_namespaceObject, - selectors: selectors_namespaceObject, - persist: ['preferences'] + selectors: selectors_namespaceObject }); +(0,external_wp_data_namespaceObject.register)(store); ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences/build-module/components/preference-toggle-menu-item/index.js diff --git a/wp-includes/js/dist/preferences.min.js b/wp-includes/js/dist/preferences.min.js index 271bf6b773..dd3648e087 100644 --- a/wp-includes/js/dist/preferences.min.js +++ b/wp-includes/js/dist/preferences.min.js @@ -1,2 +1,2 @@ /*! This file is auto-generated */ -!function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{PreferenceToggleMenuItem:function(){return m},store:function(){return g}});var n={};e.r(n),e.d(n,{set:function(){return p},setDefaults:function(){return w},toggle:function(){return f}});var r={};e.r(r),e.d(r,{get:function(){return v}});var o=window.wp.element,c=window.wp.data,i=window.wp.components,s=window.wp.i18n,u=window.wp.primitives;var a=(0,o.createElement)(u.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},(0,o.createElement)(u.Path,{d:"M16.7 7.1l-6.3 8.5-3.3-2.5-.9 1.2 4.5 3.4L17.9 8z"})),l=window.wp.a11y;var d=(0,c.combineReducers)({defaults:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;if("SET_PREFERENCE_DEFAULTS"===t.type){const{scope:n,defaults:r}=t;return{...e,[n]:{...e[n],...r}}}return e},preferences:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;if("SET_PREFERENCE_VALUE"===t.type){const{scope:n,name:r,value:o}=t;return{...e,[n]:{...e[n],[r]:o}}}return e}});function f(e,t){return function(n){let{select:r,dispatch:o}=n;const c=r.get(e,t);o.set(e,t,!c)}}function p(e,t,n){return{type:"SET_PREFERENCE_VALUE",scope:e,name:t,value:n}}function w(e,t){return{type:"SET_PREFERENCE_DEFAULTS",scope:e,defaults:t}}function v(e,t,n){var r,o;const c=null===(r=e.preferences[t])||void 0===r?void 0:r[n];return void 0!==c?c:null===(o=e.defaults[t])||void 0===o?void 0:o[n]}const E="core/preferences",g=(0,c.createReduxStore)(E,{reducer:d,actions:n,selectors:r,persist:["preferences"]});function m(e){let{scope:t,name:n,label:r,info:u,messageActivated:d,messageDeactivated:f,shortcut:p}=e;const w=(0,c.useSelect)((e=>!!e(g).get(t,n)),[n]),{toggle:v}=(0,c.useDispatch)(g);return(0,o.createElement)(i.MenuItem,{icon:w&&a,isSelected:w,onClick:()=>{v(t,n),(()=>{if(w){const e=f||(0,s.sprintf)((0,s.__)("Preference deactivated - %s"),r);(0,l.speak)(e)}else{const e=d||(0,s.sprintf)((0,s.__)("Preference activated - %s"),r);(0,l.speak)(e)}})()},role:"menuitemcheckbox",info:u,shortcut:p},r)}(0,c.registerStore)(E,{reducer:d,actions:n,selectors:r,persist:["preferences"]}),(window.wp=window.wp||{}).preferences=t}(); \ No newline at end of file +!function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r:function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{PreferenceToggleMenuItem:function(){return m},store:function(){return S}});var n={};e.r(n),e.d(n,{set:function(){return E},setDefaults:function(){return w},setPersistenceLayer:function(){return v},toggle:function(){return p}});var r={};e.r(r),e.d(r,{get:function(){return g}});var o=window.wp.element,c=window.wp.data,i=window.wp.components,s=window.wp.i18n,u=window.wp.primitives;var a=(0,o.createElement)(u.SVG,{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},(0,o.createElement)(u.Path,{d:"M16.7 7.1l-6.3 8.5-3.3-2.5-.9 1.2 4.5 3.4L17.9 8z"})),l=window.wp.a11y;const d=function(e){let t;return(n,r)=>{if("SET_PERSISTENCE_LAYER"===r.type){const{persistenceLayer:e,persistedData:n}=r;return t=e,n}const o=e(n,r);var c;"SET_PREFERENCE_VALUE"===r.type&&(null===(c=t)||void 0===c||c.set(o));return o}}((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;if("SET_PREFERENCE_VALUE"===t.type){const{scope:n,name:r,value:o}=t;return{...e,[n]:{...e[n],[r]:o}}}return e}));var f=(0,c.combineReducers)({defaults:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;if("SET_PREFERENCE_DEFAULTS"===t.type){const{scope:n,defaults:r}=t;return{...e,[n]:{...e[n],...r}}}return e},preferences:d});function p(e,t){return function(n){let{select:r,dispatch:o}=n;const c=r.get(e,t);o.set(e,t,!c)}}function E(e,t,n){return{type:"SET_PREFERENCE_VALUE",scope:e,name:t,value:n}}function w(e,t){return{type:"SET_PREFERENCE_DEFAULTS",scope:e,defaults:t}}async function v(e){const t=await e.get();return{type:"SET_PERSISTENCE_LAYER",persistenceLayer:e,persistedData:t}}function g(e,t,n){var r,o;const c=null===(r=e.preferences[t])||void 0===r?void 0:r[n];return void 0!==c?c:null===(o=e.defaults[t])||void 0===o?void 0:o[n]}const S=(0,c.createReduxStore)("core/preferences",{reducer:f,actions:n,selectors:r});function m(e){let{scope:t,name:n,label:r,info:u,messageActivated:d,messageDeactivated:f,shortcut:p}=e;const E=(0,c.useSelect)((e=>!!e(S).get(t,n)),[n]),{toggle:w}=(0,c.useDispatch)(S);return(0,o.createElement)(i.MenuItem,{icon:E&&a,isSelected:E,onClick:()=>{w(t,n),(()=>{if(E){const e=f||(0,s.sprintf)((0,s.__)("Preference deactivated - %s"),r);(0,l.speak)(e)}else{const e=d||(0,s.sprintf)((0,s.__)("Preference activated - %s"),r);(0,l.speak)(e)}})()},role:"menuitemcheckbox",info:u,shortcut:p},r)}(0,c.register)(S),(window.wp=window.wp||{}).preferences=t}(); \ No newline at end of file diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 129375a098..4ba0d2101a 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -294,6 +294,9 @@ function wp_default_packages_scripts( $scripts ) { case 'wp-edit-post': array_push( $dependencies, 'media-models', 'media-views', 'postbox', 'wp-dom-ready' ); break; + case 'wp-preferences': + array_push( $dependencies, 'wp-preferences-persistence' ); + break; } $scripts->add( $handle, $path, $dependencies, $package_data['version'], 1 ); @@ -324,11 +327,12 @@ function wp_default_packages_scripts( $scripts ) { * @since 5.0.0 * * @global WP_Locale $wp_locale WordPress date and time locale object. + * @global wpdb $wpdb WordPress database abstraction object. * * @param WP_Scripts $scripts WP_Scripts object. */ function wp_default_packages_inline_scripts( $scripts ) { - global $wp_locale; + global $wp_locale, $wpdb; if ( isset( $scripts->registered['wp-api-fetch'] ) ) { $scripts->registered['wp-api-fetch']->deps[] = 'wp-hooks'; @@ -360,19 +364,22 @@ function wp_default_packages_inline_scripts( $scripts ) { ), 'after' ); + + $meta_key = $wpdb->get_blog_prefix() . 'persisted_preferences'; + $user_id = get_current_user_ID(); + $preload_data = get_user_meta( $user_id, $meta_key, true ); $scripts->add_inline_script( - 'wp-data', - implode( - "\n", - array( - '( function() {', - ' var userId = ' . get_current_user_ID() . ';', - ' var storageKey = "WP_DATA_USER_" + userId;', - ' wp.data', - ' .use( wp.data.plugins.persistence, { storageKey: storageKey } );', - ' wp.data.plugins.persistence.__unstableMigrate( { storageKey: storageKey } );', - '} )();', - ) + 'wp-preferences', + sprintf( + '( function() { + var serverData = %s; + var userId = "%d"; + var persistenceLayer = wp.preferencesPersistence.__unstableCreatePersistenceLayer( serverData, userId ); + var preferencesStore = wp.preferences.store; + wp.data.dispatch( preferencesStore ).setPersistenceLayer( persistenceLayer ); + } ) ();', + wp_json_encode( $preload_data ), + $user_id ) ); diff --git a/wp-includes/user.php b/wp-includes/user.php index 976083a246..8f5ab52e5a 100644 --- a/wp-includes/user.php +++ b/wp-includes/user.php @@ -4951,3 +4951,50 @@ function wp_is_application_passwords_available_for_user( $user ) { */ return apply_filters( 'wp_is_application_passwords_available_for_user', true, $user ); } + +/** + * Registers the user meta property for persisted preferences. + * + * This property is used to store user preferences across page reloads and is + * currently used by the block editor for preferences like 'fullscreenMode' and + * 'fixedToolbar'. + * + * @since 6.1.0 + * @access private + * + * @global wpdb $wpdb WordPress database abstraction object. + */ +function wp_register_persisted_preferences_meta() { + /* + * Create a meta key that incorporates the blog prefix so that each site + * on a multisite can have distinct user preferences. + */ + global $wpdb; + $meta_key = $wpdb->get_blog_prefix() . 'persisted_preferences'; + + register_meta( + 'user', + $meta_key, + array( + 'type' => 'object', + 'single' => true, + 'show_in_rest' => array( + 'name' => 'persisted_preferences', + 'type' => 'object', + 'context' => array( 'edit' ), + 'schema' => array( + 'type' => 'object', + 'properties' => array( + '_modified' => array( + 'description' => __( 'The date and time the preferences were updated.' ), + 'type' => 'string', + 'format' => 'date-time', + 'readonly' => false, + ), + ), + 'additionalProperties' => true, + ), + ), + ) + ); +} diff --git a/wp-includes/version.php b/wp-includes/version.php index e0e1d7f465..c7aa2e9d4f 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.1-alpha-54181'; +$wp_version = '6.1-alpha-54182'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.