wp/wp-includes/js/dist/preferences-persistence.js
changeset 21 48c4eec2b7e6
child 22 8c2e4d02f4ef
equal deleted inserted replaced
20:7b1b88e27a20 21:48c4eec2b7e6
       
     1 /******/ (() => { // webpackBootstrap
       
     2 /******/ 	"use strict";
       
     3 /******/ 	// The require scope
       
     4 /******/ 	var __webpack_require__ = {};
       
     5 /******/ 	
       
     6 /************************************************************************/
       
     7 /******/ 	/* webpack/runtime/compat get default export */
       
     8 /******/ 	(() => {
       
     9 /******/ 		// getDefaultExport function for compatibility with non-harmony modules
       
    10 /******/ 		__webpack_require__.n = (module) => {
       
    11 /******/ 			var getter = module && module.__esModule ?
       
    12 /******/ 				() => (module['default']) :
       
    13 /******/ 				() => (module);
       
    14 /******/ 			__webpack_require__.d(getter, { a: getter });
       
    15 /******/ 			return getter;
       
    16 /******/ 		};
       
    17 /******/ 	})();
       
    18 /******/ 	
       
    19 /******/ 	/* webpack/runtime/define property getters */
       
    20 /******/ 	(() => {
       
    21 /******/ 		// define getter functions for harmony exports
       
    22 /******/ 		__webpack_require__.d = (exports, definition) => {
       
    23 /******/ 			for(var key in definition) {
       
    24 /******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
       
    25 /******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
       
    26 /******/ 				}
       
    27 /******/ 			}
       
    28 /******/ 		};
       
    29 /******/ 	})();
       
    30 /******/ 	
       
    31 /******/ 	/* webpack/runtime/hasOwnProperty shorthand */
       
    32 /******/ 	(() => {
       
    33 /******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
       
    34 /******/ 	})();
       
    35 /******/ 	
       
    36 /******/ 	/* webpack/runtime/make namespace object */
       
    37 /******/ 	(() => {
       
    38 /******/ 		// define __esModule on exports
       
    39 /******/ 		__webpack_require__.r = (exports) => {
       
    40 /******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
       
    41 /******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
       
    42 /******/ 			}
       
    43 /******/ 			Object.defineProperty(exports, '__esModule', { value: true });
       
    44 /******/ 		};
       
    45 /******/ 	})();
       
    46 /******/ 	
       
    47 /************************************************************************/
       
    48 var __webpack_exports__ = {};
       
    49 // ESM COMPAT FLAG
       
    50 __webpack_require__.r(__webpack_exports__);
       
    51 
       
    52 // EXPORTS
       
    53 __webpack_require__.d(__webpack_exports__, {
       
    54   __unstableCreatePersistenceLayer: () => (/* binding */ __unstableCreatePersistenceLayer),
       
    55   create: () => (/* reexport */ create)
       
    56 });
       
    57 
       
    58 ;// CONCATENATED MODULE: external ["wp","apiFetch"]
       
    59 const external_wp_apiFetch_namespaceObject = window["wp"]["apiFetch"];
       
    60 var external_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_wp_apiFetch_namespaceObject);
       
    61 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/create/debounce-async.js
       
    62 /**
       
    63  * Performs a leading edge debounce of async functions.
       
    64  *
       
    65  * If three functions are throttled at the same time:
       
    66  * - The first happens immediately.
       
    67  * - The second is never called.
       
    68  * - The third happens `delayMS` milliseconds after the first has resolved.
       
    69  *
       
    70  * This is distinct from `{ debounce } from @wordpress/compose` in that it
       
    71  * waits for promise resolution.
       
    72  *
       
    73  * @param {Function} func    A function that returns a promise.
       
    74  * @param {number}   delayMS A delay in milliseconds.
       
    75  *
       
    76  * @return {Function} A function that debounce whatever function is passed
       
    77  *                    to it.
       
    78  */
       
    79 function debounceAsync(func, delayMS) {
       
    80   let timeoutId;
       
    81   let activePromise;
       
    82   return async function debounced(...args) {
       
    83     // This is a leading edge debounce. If there's no promise or timeout
       
    84     // in progress, call the debounced function immediately.
       
    85     if (!activePromise && !timeoutId) {
       
    86       return new Promise((resolve, reject) => {
       
    87         // Keep a reference to the promise.
       
    88         activePromise = func(...args).then((...thenArgs) => {
       
    89           resolve(...thenArgs);
       
    90         }).catch(error => {
       
    91           reject(error);
       
    92         }).finally(() => {
       
    93           // As soon this promise is complete, clear the way for the
       
    94           // next one to happen immediately.
       
    95           activePromise = null;
       
    96         });
       
    97       });
       
    98     }
       
    99     if (activePromise) {
       
   100       // Let any active promises finish before queuing the next request.
       
   101       await activePromise;
       
   102     }
       
   103 
       
   104     // Clear any active timeouts, abandoning any requests that have
       
   105     // been queued but not been made.
       
   106     if (timeoutId) {
       
   107       clearTimeout(timeoutId);
       
   108       timeoutId = null;
       
   109     }
       
   110 
       
   111     // Trigger any trailing edge calls to the function.
       
   112     return new Promise((resolve, reject) => {
       
   113       // Schedule the next request but with a delay.
       
   114       timeoutId = setTimeout(() => {
       
   115         activePromise = func(...args).then((...thenArgs) => {
       
   116           resolve(...thenArgs);
       
   117         }).catch(error => {
       
   118           reject(error);
       
   119         }).finally(() => {
       
   120           // As soon this promise is complete, clear the way for the
       
   121           // next one to happen immediately.
       
   122           activePromise = null;
       
   123           timeoutId = null;
       
   124         });
       
   125       }, delayMS);
       
   126     });
       
   127   };
       
   128 }
       
   129 
       
   130 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/create/index.js
       
   131 /**
       
   132  * WordPress dependencies
       
   133  */
       
   134 
       
   135 
       
   136 /**
       
   137  * Internal dependencies
       
   138  */
       
   139 
       
   140 const EMPTY_OBJECT = {};
       
   141 const localStorage = window.localStorage;
       
   142 
       
   143 /**
       
   144  * Creates a persistence layer that stores data in WordPress user meta via the
       
   145  * REST API.
       
   146  *
       
   147  * @param {Object}  options
       
   148  * @param {?Object} options.preloadedData          Any persisted preferences data that should be preloaded.
       
   149  *                                                 When set, the persistence layer will avoid fetching data
       
   150  *                                                 from the REST API.
       
   151  * @param {?string} options.localStorageRestoreKey The key to use for restoring the localStorage backup, used
       
   152  *                                                 when the persistence layer calls `localStorage.getItem` or
       
   153  *                                                 `localStorage.setItem`.
       
   154  * @param {?number} options.requestDebounceMS      Debounce requests to the API so that they only occur at
       
   155  *                                                 minimum every `requestDebounceMS` milliseconds, and don't
       
   156  *                                                 swamp the server. Defaults to 2500ms.
       
   157  *
       
   158  * @return {Object} A persistence layer for WordPress user meta.
       
   159  */
       
   160 function create({
       
   161   preloadedData,
       
   162   localStorageRestoreKey = 'WP_PREFERENCES_RESTORE_DATA',
       
   163   requestDebounceMS = 2500
       
   164 } = {}) {
       
   165   let cache = preloadedData;
       
   166   const debouncedApiFetch = debounceAsync((external_wp_apiFetch_default()), requestDebounceMS);
       
   167   async function get() {
       
   168     if (cache) {
       
   169       return cache;
       
   170     }
       
   171     const user = await external_wp_apiFetch_default()({
       
   172       path: '/wp/v2/users/me?context=edit'
       
   173     });
       
   174     const serverData = user?.meta?.persisted_preferences;
       
   175     const localData = JSON.parse(localStorage.getItem(localStorageRestoreKey));
       
   176 
       
   177     // Date parse returns NaN for invalid input. Coerce anything invalid
       
   178     // into a conveniently comparable zero.
       
   179     const serverTimestamp = Date.parse(serverData?._modified) || 0;
       
   180     const localTimestamp = Date.parse(localData?._modified) || 0;
       
   181 
       
   182     // Prefer server data if it exists and is more recent.
       
   183     // Otherwise fallback to localStorage data.
       
   184     if (serverData && serverTimestamp >= localTimestamp) {
       
   185       cache = serverData;
       
   186     } else if (localData) {
       
   187       cache = localData;
       
   188     } else {
       
   189       cache = EMPTY_OBJECT;
       
   190     }
       
   191     return cache;
       
   192   }
       
   193   function set(newData) {
       
   194     const dataWithTimestamp = {
       
   195       ...newData,
       
   196       _modified: new Date().toISOString()
       
   197     };
       
   198     cache = dataWithTimestamp;
       
   199 
       
   200     // Store data in local storage as a fallback. If for some reason the
       
   201     // api request does not complete or becomes unavailable, this data
       
   202     // can be used to restore preferences.
       
   203     localStorage.setItem(localStorageRestoreKey, JSON.stringify(dataWithTimestamp));
       
   204 
       
   205     // The user meta endpoint seems susceptible to errors when consecutive
       
   206     // requests are made in quick succession. Ensure there's a gap between
       
   207     // any consecutive requests.
       
   208     //
       
   209     // Catch and do nothing with errors from the REST API.
       
   210     debouncedApiFetch({
       
   211       path: '/wp/v2/users/me',
       
   212       method: 'PUT',
       
   213       // `keepalive` will still send the request in the background,
       
   214       // even when a browser unload event might interrupt it.
       
   215       // This should hopefully make things more resilient.
       
   216       // This does have a size limit of 64kb, but the data is usually
       
   217       // much less.
       
   218       keepalive: true,
       
   219       data: {
       
   220         meta: {
       
   221           persisted_preferences: dataWithTimestamp
       
   222         }
       
   223       }
       
   224     }).catch(() => {});
       
   225   }
       
   226   return {
       
   227     get,
       
   228     set
       
   229   };
       
   230 }
       
   231 
       
   232 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-feature-preferences.js
       
   233 /**
       
   234  * Move the 'features' object in local storage from the sourceStoreName to the
       
   235  * preferences store data structure.
       
   236  *
       
   237  * Previously, editors used a data structure like this for feature preferences:
       
   238  * ```js
       
   239  * {
       
   240  *     'core/edit-post': {
       
   241  *         preferences: {
       
   242  *             features; {
       
   243  *                 topToolbar: true,
       
   244  *                 // ... other boolean 'feature' preferences
       
   245  *             },
       
   246  *         },
       
   247  *     },
       
   248  * }
       
   249  * ```
       
   250  *
       
   251  * And for a while these feature preferences lived in the interface package:
       
   252  * ```js
       
   253  * {
       
   254  *     'core/interface': {
       
   255  *         preferences: {
       
   256  *             features: {
       
   257  *                 'core/edit-post': {
       
   258  *                     topToolbar: true
       
   259  *                 }
       
   260  *             }
       
   261  *         }
       
   262  *     }
       
   263  * }
       
   264  * ```
       
   265  *
       
   266  * In the preferences store, 'features' aren't considered special, they're
       
   267  * merged to the root level of the scope along with other preferences:
       
   268  * ```js
       
   269  * {
       
   270  *     'core/preferences': {
       
   271  *         preferences: {
       
   272  *             'core/edit-post': {
       
   273  *                 topToolbar: true,
       
   274  *                 // ... any other preferences.
       
   275  *             }
       
   276  *         }
       
   277  *     }
       
   278  * }
       
   279  * ```
       
   280  *
       
   281  * This function handles moving from either the source store or the interface
       
   282  * store to the preferences data structure.
       
   283  *
       
   284  * @param {Object} state           The state before migration.
       
   285  * @param {string} sourceStoreName The name of the store that has persisted
       
   286  *                                 preferences to migrate to the preferences
       
   287  *                                 package.
       
   288  * @return {Object} The migrated state
       
   289  */
       
   290 function moveFeaturePreferences(state, sourceStoreName) {
       
   291   const preferencesStoreName = 'core/preferences';
       
   292   const interfaceStoreName = 'core/interface';
       
   293 
       
   294   // Features most recently (and briefly) lived in the interface package.
       
   295   // If data exists there, prioritize using that for the migration. If not
       
   296   // also check the original package as the user may have updated from an
       
   297   // older block editor version.
       
   298   const interfaceFeatures = state?.[interfaceStoreName]?.preferences?.features?.[sourceStoreName];
       
   299   const sourceFeatures = state?.[sourceStoreName]?.preferences?.features;
       
   300   const featuresToMigrate = interfaceFeatures ? interfaceFeatures : sourceFeatures;
       
   301   if (!featuresToMigrate) {
       
   302     return state;
       
   303   }
       
   304   const existingPreferences = state?.[preferencesStoreName]?.preferences;
       
   305 
       
   306   // Avoid migrating features again if they've previously been migrated.
       
   307   if (existingPreferences?.[sourceStoreName]) {
       
   308     return state;
       
   309   }
       
   310   let updatedInterfaceState;
       
   311   if (interfaceFeatures) {
       
   312     const otherInterfaceState = state?.[interfaceStoreName];
       
   313     const otherInterfaceScopes = state?.[interfaceStoreName]?.preferences?.features;
       
   314     updatedInterfaceState = {
       
   315       [interfaceStoreName]: {
       
   316         ...otherInterfaceState,
       
   317         preferences: {
       
   318           features: {
       
   319             ...otherInterfaceScopes,
       
   320             [sourceStoreName]: undefined
       
   321           }
       
   322         }
       
   323       }
       
   324     };
       
   325   }
       
   326   let updatedSourceState;
       
   327   if (sourceFeatures) {
       
   328     const otherSourceState = state?.[sourceStoreName];
       
   329     const sourcePreferences = state?.[sourceStoreName]?.preferences;
       
   330     updatedSourceState = {
       
   331       [sourceStoreName]: {
       
   332         ...otherSourceState,
       
   333         preferences: {
       
   334           ...sourcePreferences,
       
   335           features: undefined
       
   336         }
       
   337       }
       
   338     };
       
   339   }
       
   340 
       
   341   // Set the feature values in the interface store, the features
       
   342   // object is keyed by 'scope', which matches the store name for
       
   343   // the source.
       
   344   return {
       
   345     ...state,
       
   346     [preferencesStoreName]: {
       
   347       preferences: {
       
   348         ...existingPreferences,
       
   349         [sourceStoreName]: featuresToMigrate
       
   350       }
       
   351     },
       
   352     ...updatedInterfaceState,
       
   353     ...updatedSourceState
       
   354   };
       
   355 }
       
   356 
       
   357 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js
       
   358 /**
       
   359  * The interface package previously had a public API that could be used by
       
   360  * plugins to set persisted boolean 'feature' preferences.
       
   361  *
       
   362  * While usage was likely non-existent or very small, this function ensures
       
   363  * those are migrated to the preferences data structure. The interface
       
   364  * package's APIs have now been deprecated and use the preferences store.
       
   365  *
       
   366  * This will convert data that looks like this:
       
   367  * ```js
       
   368  * {
       
   369  *     'core/interface': {
       
   370  *         preferences: {
       
   371  *             features: {
       
   372  *                 'my-plugin': {
       
   373  *                     myPluginFeature: true
       
   374  *                 }
       
   375  *             }
       
   376  *         }
       
   377  *     }
       
   378  * }
       
   379  * ```
       
   380  *
       
   381  * To this:
       
   382  * ```js
       
   383  *  * {
       
   384  *     'core/preferences': {
       
   385  *         preferences: {
       
   386  *             'my-plugin': {
       
   387  *                 myPluginFeature: true
       
   388  *             }
       
   389  *         }
       
   390  *     }
       
   391  * }
       
   392  * ```
       
   393  *
       
   394  * @param {Object} state The local storage state
       
   395  *
       
   396  * @return {Object} The state with third party preferences moved to the
       
   397  *                  preferences data structure.
       
   398  */
       
   399 function moveThirdPartyFeaturePreferencesToPreferences(state) {
       
   400   const interfaceStoreName = 'core/interface';
       
   401   const preferencesStoreName = 'core/preferences';
       
   402   const interfaceScopes = state?.[interfaceStoreName]?.preferences?.features;
       
   403   const interfaceScopeKeys = interfaceScopes ? Object.keys(interfaceScopes) : [];
       
   404   if (!interfaceScopeKeys?.length) {
       
   405     return state;
       
   406   }
       
   407   return interfaceScopeKeys.reduce(function (convertedState, scope) {
       
   408     if (scope.startsWith('core')) {
       
   409       return convertedState;
       
   410     }
       
   411     const featuresToMigrate = interfaceScopes?.[scope];
       
   412     if (!featuresToMigrate) {
       
   413       return convertedState;
       
   414     }
       
   415     const existingMigratedData = convertedState?.[preferencesStoreName]?.preferences?.[scope];
       
   416     if (existingMigratedData) {
       
   417       return convertedState;
       
   418     }
       
   419     const otherPreferencesScopes = convertedState?.[preferencesStoreName]?.preferences;
       
   420     const otherInterfaceState = convertedState?.[interfaceStoreName];
       
   421     const otherInterfaceScopes = convertedState?.[interfaceStoreName]?.preferences?.features;
       
   422     return {
       
   423       ...convertedState,
       
   424       [preferencesStoreName]: {
       
   425         preferences: {
       
   426           ...otherPreferencesScopes,
       
   427           [scope]: featuresToMigrate
       
   428         }
       
   429       },
       
   430       [interfaceStoreName]: {
       
   431         ...otherInterfaceState,
       
   432         preferences: {
       
   433           features: {
       
   434             ...otherInterfaceScopes,
       
   435             [scope]: undefined
       
   436           }
       
   437         }
       
   438       }
       
   439     };
       
   440   }, state);
       
   441 }
       
   442 
       
   443 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-individual-preference.js
       
   444 const identity = arg => arg;
       
   445 
       
   446 /**
       
   447  * Migrates an individual item inside the `preferences` object for a package's store.
       
   448  *
       
   449  * Previously, some packages had individual 'preferences' of any data type, and many used
       
   450  * complex nested data structures. For example:
       
   451  * ```js
       
   452  * {
       
   453  *     'core/edit-post': {
       
   454  *         preferences: {
       
   455  *             panels: {
       
   456  *                 publish: {
       
   457  *                     opened: true,
       
   458  *                     enabled: true,
       
   459  *                 }
       
   460  *             },
       
   461  *             // ...other preferences.
       
   462  *         },
       
   463  *     },
       
   464  * }
       
   465  *
       
   466  * This function supports moving an individual preference like 'panels' above into the
       
   467  * preferences package data structure.
       
   468  *
       
   469  * It supports moving a preference to a particular scope in the preferences store and
       
   470  * optionally converting the data using a `convert` function.
       
   471  *
       
   472  * ```
       
   473  *
       
   474  * @param {Object}    state        The original state.
       
   475  * @param {Object}    migrate      An options object that contains details of the migration.
       
   476  * @param {string}    migrate.from The name of the store to migrate from.
       
   477  * @param {string}    migrate.to   The scope in the preferences store to migrate to.
       
   478  * @param {string}    key          The key in the preferences object to migrate.
       
   479  * @param {?Function} convert      A function that converts preferences from one format to another.
       
   480  */
       
   481 function moveIndividualPreferenceToPreferences(state, {
       
   482   from: sourceStoreName,
       
   483   to: scope
       
   484 }, key, convert = identity) {
       
   485   const preferencesStoreName = 'core/preferences';
       
   486   const sourcePreference = state?.[sourceStoreName]?.preferences?.[key];
       
   487 
       
   488   // There's nothing to migrate, exit early.
       
   489   if (sourcePreference === undefined) {
       
   490     return state;
       
   491   }
       
   492   const targetPreference = state?.[preferencesStoreName]?.preferences?.[scope]?.[key];
       
   493 
       
   494   // There's existing data at the target, so don't overwrite it, exit early.
       
   495   if (targetPreference) {
       
   496     return state;
       
   497   }
       
   498   const otherScopes = state?.[preferencesStoreName]?.preferences;
       
   499   const otherPreferences = state?.[preferencesStoreName]?.preferences?.[scope];
       
   500   const otherSourceState = state?.[sourceStoreName];
       
   501   const allSourcePreferences = state?.[sourceStoreName]?.preferences;
       
   502 
       
   503   // Pass an object with the key and value as this allows the convert
       
   504   // function to convert to a data structure that has different keys.
       
   505   const convertedPreferences = convert({
       
   506     [key]: sourcePreference
       
   507   });
       
   508   return {
       
   509     ...state,
       
   510     [preferencesStoreName]: {
       
   511       preferences: {
       
   512         ...otherScopes,
       
   513         [scope]: {
       
   514           ...otherPreferences,
       
   515           ...convertedPreferences
       
   516         }
       
   517       }
       
   518     },
       
   519     [sourceStoreName]: {
       
   520       ...otherSourceState,
       
   521       preferences: {
       
   522         ...allSourcePreferences,
       
   523         [key]: undefined
       
   524       }
       
   525     }
       
   526   };
       
   527 }
       
   528 
       
   529 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/move-interface-enable-items.js
       
   530 /**
       
   531  * Migrates interface 'enableItems' data to the preferences store.
       
   532  *
       
   533  * The interface package stores this data in this format:
       
   534  * ```js
       
   535  * {
       
   536  *     enableItems: {
       
   537  *         singleEnableItems: {
       
   538  * 	           complementaryArea: {
       
   539  *                 'core/edit-post': 'edit-post/document',
       
   540  *                 'core/edit-site': 'edit-site/global-styles',
       
   541  *             }
       
   542  *         },
       
   543  *         multipleEnableItems: {
       
   544  *             pinnedItems: {
       
   545  *                 'core/edit-post': {
       
   546  *                     'plugin-1': true,
       
   547  *                 },
       
   548  *                 'core/edit-site': {
       
   549  *                     'plugin-2': true,
       
   550  *                 },
       
   551  *             },
       
   552  *         }
       
   553  *     }
       
   554  * }
       
   555  * ```
       
   556  *
       
   557  * and it should be converted it to:
       
   558  * ```js
       
   559  * {
       
   560  *     'core/edit-post': {
       
   561  *         complementaryArea: 'edit-post/document',
       
   562  *         pinnedItems: {
       
   563  *             'plugin-1': true,
       
   564  *         },
       
   565  *     },
       
   566  *     'core/edit-site': {
       
   567  *         complementaryArea: 'edit-site/global-styles',
       
   568  *         pinnedItems: {
       
   569  *             'plugin-2': true,
       
   570  *         },
       
   571  *     },
       
   572  * }
       
   573  * ```
       
   574  *
       
   575  * @param {Object} state The local storage state.
       
   576  */
       
   577 function moveInterfaceEnableItems(state) {
       
   578   var _state$preferencesSto, _sourceEnableItems$si, _sourceEnableItems$mu;
       
   579   const interfaceStoreName = 'core/interface';
       
   580   const preferencesStoreName = 'core/preferences';
       
   581   const sourceEnableItems = state?.[interfaceStoreName]?.enableItems;
       
   582 
       
   583   // There's nothing to migrate, exit early.
       
   584   if (!sourceEnableItems) {
       
   585     return state;
       
   586   }
       
   587   const allPreferences = (_state$preferencesSto = state?.[preferencesStoreName]?.preferences) !== null && _state$preferencesSto !== void 0 ? _state$preferencesSto : {};
       
   588 
       
   589   // First convert complementaryAreas into the right format.
       
   590   // Use the existing preferences as the accumulator so that the data is
       
   591   // merged.
       
   592   const sourceComplementaryAreas = (_sourceEnableItems$si = sourceEnableItems?.singleEnableItems?.complementaryArea) !== null && _sourceEnableItems$si !== void 0 ? _sourceEnableItems$si : {};
       
   593   const preferencesWithConvertedComplementaryAreas = Object.keys(sourceComplementaryAreas).reduce((accumulator, scope) => {
       
   594     const data = sourceComplementaryAreas[scope];
       
   595 
       
   596     // Don't overwrite any existing data in the preferences store.
       
   597     if (accumulator?.[scope]?.complementaryArea) {
       
   598       return accumulator;
       
   599     }
       
   600     return {
       
   601       ...accumulator,
       
   602       [scope]: {
       
   603         ...accumulator[scope],
       
   604         complementaryArea: data
       
   605       }
       
   606     };
       
   607   }, allPreferences);
       
   608 
       
   609   // Next feed the converted complementary areas back into a reducer that
       
   610   // converts the pinned items, resulting in the fully migrated data.
       
   611   const sourcePinnedItems = (_sourceEnableItems$mu = sourceEnableItems?.multipleEnableItems?.pinnedItems) !== null && _sourceEnableItems$mu !== void 0 ? _sourceEnableItems$mu : {};
       
   612   const allConvertedData = Object.keys(sourcePinnedItems).reduce((accumulator, scope) => {
       
   613     const data = sourcePinnedItems[scope];
       
   614     // Don't overwrite any existing data in the preferences store.
       
   615     if (accumulator?.[scope]?.pinnedItems) {
       
   616       return accumulator;
       
   617     }
       
   618     return {
       
   619       ...accumulator,
       
   620       [scope]: {
       
   621         ...accumulator[scope],
       
   622         pinnedItems: data
       
   623       }
       
   624     };
       
   625   }, preferencesWithConvertedComplementaryAreas);
       
   626   const otherInterfaceItems = state[interfaceStoreName];
       
   627   return {
       
   628     ...state,
       
   629     [preferencesStoreName]: {
       
   630       preferences: allConvertedData
       
   631     },
       
   632     [interfaceStoreName]: {
       
   633       ...otherInterfaceItems,
       
   634       enableItems: undefined
       
   635     }
       
   636   };
       
   637 }
       
   638 
       
   639 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/convert-edit-post-panels.js
       
   640 /**
       
   641  * Convert the post editor's panels state from:
       
   642  * ```
       
   643  * {
       
   644  *     panels: {
       
   645  *         tags: {
       
   646  *             enabled: true,
       
   647  *             opened: true,
       
   648  *         },
       
   649  *         permalinks: {
       
   650  *             enabled: false,
       
   651  *             opened: false,
       
   652  *         },
       
   653  *     },
       
   654  * }
       
   655  * ```
       
   656  *
       
   657  * to a new, more concise data structure:
       
   658  * {
       
   659  *     inactivePanels: [
       
   660  *         'permalinks',
       
   661  *     ],
       
   662  *     openPanels: [
       
   663  *         'tags',
       
   664  *     ],
       
   665  * }
       
   666  *
       
   667  * @param {Object} preferences A preferences object.
       
   668  *
       
   669  * @return {Object} The converted data.
       
   670  */
       
   671 function convertEditPostPanels(preferences) {
       
   672   var _preferences$panels;
       
   673   const panels = (_preferences$panels = preferences?.panels) !== null && _preferences$panels !== void 0 ? _preferences$panels : {};
       
   674   return Object.keys(panels).reduce((convertedData, panelName) => {
       
   675     const panel = panels[panelName];
       
   676     if (panel?.enabled === false) {
       
   677       convertedData.inactivePanels.push(panelName);
       
   678     }
       
   679     if (panel?.opened === true) {
       
   680       convertedData.openPanels.push(panelName);
       
   681     }
       
   682     return convertedData;
       
   683   }, {
       
   684     inactivePanels: [],
       
   685     openPanels: []
       
   686   });
       
   687 }
       
   688 
       
   689 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/legacy-local-storage-data/index.js
       
   690 /**
       
   691  * Internal dependencies
       
   692  */
       
   693 
       
   694 
       
   695 
       
   696 
       
   697 
       
   698 
       
   699 /**
       
   700  * Gets the legacy local storage data for a given user.
       
   701  *
       
   702  * @param {string | number} userId The user id.
       
   703  *
       
   704  * @return {Object | null} The local storage data.
       
   705  */
       
   706 function getLegacyData(userId) {
       
   707   const key = `WP_DATA_USER_${userId}`;
       
   708   const unparsedData = window.localStorage.getItem(key);
       
   709   return JSON.parse(unparsedData);
       
   710 }
       
   711 
       
   712 /**
       
   713  * Converts data from the old `@wordpress/data` package format.
       
   714  *
       
   715  * @param {Object | null | undefined} data The legacy data in its original format.
       
   716  *
       
   717  * @return {Object | undefined} The converted data or `undefined` if there was
       
   718  *                              nothing to convert.
       
   719  */
       
   720 function convertLegacyData(data) {
       
   721   if (!data) {
       
   722     return;
       
   723   }
       
   724 
       
   725   // Move boolean feature preferences from each editor into the
       
   726   // preferences store data structure.
       
   727   data = moveFeaturePreferences(data, 'core/edit-widgets');
       
   728   data = moveFeaturePreferences(data, 'core/customize-widgets');
       
   729   data = moveFeaturePreferences(data, 'core/edit-post');
       
   730   data = moveFeaturePreferences(data, 'core/edit-site');
       
   731 
       
   732   // Move third party boolean feature preferences from the interface package
       
   733   // to the preferences store data structure.
       
   734   data = moveThirdPartyFeaturePreferencesToPreferences(data);
       
   735 
       
   736   // Move and convert the interface store's `enableItems` data into the
       
   737   // preferences data structure.
       
   738   data = moveInterfaceEnableItems(data);
       
   739 
       
   740   // Move individual ad-hoc preferences from various packages into the
       
   741   // preferences store data structure.
       
   742   data = moveIndividualPreferenceToPreferences(data, {
       
   743     from: 'core/edit-post',
       
   744     to: 'core/edit-post'
       
   745   }, 'hiddenBlockTypes');
       
   746   data = moveIndividualPreferenceToPreferences(data, {
       
   747     from: 'core/edit-post',
       
   748     to: 'core/edit-post'
       
   749   }, 'editorMode');
       
   750   data = moveIndividualPreferenceToPreferences(data, {
       
   751     from: 'core/edit-post',
       
   752     to: 'core/edit-post'
       
   753   }, 'panels', convertEditPostPanels);
       
   754   data = moveIndividualPreferenceToPreferences(data, {
       
   755     from: 'core/editor',
       
   756     to: 'core'
       
   757   }, 'isPublishSidebarEnabled');
       
   758   data = moveIndividualPreferenceToPreferences(data, {
       
   759     from: 'core/edit-post',
       
   760     to: 'core'
       
   761   }, 'isPublishSidebarEnabled');
       
   762   data = moveIndividualPreferenceToPreferences(data, {
       
   763     from: 'core/edit-site',
       
   764     to: 'core/edit-site'
       
   765   }, 'editorMode');
       
   766 
       
   767   // The new system is only concerned with persisting
       
   768   // 'core/preferences' preferences reducer, so only return that.
       
   769   return data?.['core/preferences']?.preferences;
       
   770 }
       
   771 
       
   772 /**
       
   773  * Gets the legacy local storage data for the given user and returns the
       
   774  * data converted to the new format.
       
   775  *
       
   776  * @param {string | number} userId The user id.
       
   777  *
       
   778  * @return {Object | undefined} The converted data or undefined if no local
       
   779  *                              storage data could be found.
       
   780  */
       
   781 function convertLegacyLocalStorageData(userId) {
       
   782   const data = getLegacyData(userId);
       
   783   return convertLegacyData(data);
       
   784 }
       
   785 
       
   786 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/preferences-package-data/convert-complementary-areas.js
       
   787 function convertComplementaryAreas(state) {
       
   788   return Object.keys(state).reduce((stateAccumulator, scope) => {
       
   789     const scopeData = state[scope];
       
   790 
       
   791     // If a complementary area is truthy, convert it to the `isComplementaryAreaVisible` boolean.
       
   792     if (scopeData?.complementaryArea) {
       
   793       const updatedScopeData = {
       
   794         ...scopeData
       
   795       };
       
   796       delete updatedScopeData.complementaryArea;
       
   797       updatedScopeData.isComplementaryAreaVisible = true;
       
   798       stateAccumulator[scope] = updatedScopeData;
       
   799       return stateAccumulator;
       
   800     }
       
   801     return stateAccumulator;
       
   802   }, state);
       
   803 }
       
   804 
       
   805 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/preferences-package-data/convert-editor-settings.js
       
   806 /**
       
   807  * Internal dependencies
       
   808  */
       
   809 
       
   810 function convertEditorSettings(data) {
       
   811   var _newData$coreEditPo, _newData$coreEditSi;
       
   812   let newData = data;
       
   813   const settingsToMoveToCore = ['allowRightClickOverrides', 'distractionFree', 'editorMode', 'fixedToolbar', 'focusMode', 'hiddenBlockTypes', 'inactivePanels', 'keepCaretInsideBlock', 'mostUsedBlocks', 'openPanels', 'showBlockBreadcrumbs', 'showIconLabels', 'showListViewByDefault', 'isPublishSidebarEnabled', 'isComplementaryAreaVisible', 'pinnedItems'];
       
   814   settingsToMoveToCore.forEach(setting => {
       
   815     if (data?.['core/edit-post']?.[setting] !== undefined) {
       
   816       newData = {
       
   817         ...newData,
       
   818         core: {
       
   819           ...newData?.core,
       
   820           [setting]: data['core/edit-post'][setting]
       
   821         }
       
   822       };
       
   823       delete newData['core/edit-post'][setting];
       
   824     }
       
   825     if (data?.['core/edit-site']?.[setting] !== undefined) {
       
   826       delete newData['core/edit-site'][setting];
       
   827     }
       
   828   });
       
   829   if (Object.keys((_newData$coreEditPo = newData?.['core/edit-post']) !== null && _newData$coreEditPo !== void 0 ? _newData$coreEditPo : {})?.length === 0) {
       
   830     delete newData['core/edit-post'];
       
   831   }
       
   832   if (Object.keys((_newData$coreEditSi = newData?.['core/edit-site']) !== null && _newData$coreEditSi !== void 0 ? _newData$coreEditSi : {})?.length === 0) {
       
   833     delete newData['core/edit-site'];
       
   834   }
       
   835   return newData;
       
   836 }
       
   837 
       
   838 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/migrations/preferences-package-data/index.js
       
   839 /**
       
   840  * Internal dependencies
       
   841  */
       
   842 
       
   843 
       
   844 function convertPreferencesPackageData(data) {
       
   845   let newData = convertComplementaryAreas(data);
       
   846   newData = convertEditorSettings(newData);
       
   847   return newData;
       
   848 }
       
   849 
       
   850 ;// CONCATENATED MODULE: ./node_modules/@wordpress/preferences-persistence/build-module/index.js
       
   851 /**
       
   852  * Internal dependencies
       
   853  */
       
   854 
       
   855 
       
   856 
       
   857 
       
   858 
       
   859 /**
       
   860  * Creates the persistence layer with preloaded data.
       
   861  *
       
   862  * It prioritizes any data from the server, but falls back first to localStorage
       
   863  * restore data, and then to any legacy data.
       
   864  *
       
   865  * This function is used internally by WordPress in an inline script, so
       
   866  * prefixed with `__unstable`.
       
   867  *
       
   868  * @param {Object} serverData Preferences data preloaded from the server.
       
   869  * @param {string} userId     The user id.
       
   870  *
       
   871  * @return {Object} The persistence layer initialized with the preloaded data.
       
   872  */
       
   873 function __unstableCreatePersistenceLayer(serverData, userId) {
       
   874   const localStorageRestoreKey = `WP_PREFERENCES_USER_${userId}`;
       
   875   const localData = JSON.parse(window.localStorage.getItem(localStorageRestoreKey));
       
   876 
       
   877   // Date parse returns NaN for invalid input. Coerce anything invalid
       
   878   // into a conveniently comparable zero.
       
   879   const serverModified = Date.parse(serverData && serverData._modified) || 0;
       
   880   const localModified = Date.parse(localData && localData._modified) || 0;
       
   881   let preloadedData;
       
   882   if (serverData && serverModified >= localModified) {
       
   883     preloadedData = convertPreferencesPackageData(serverData);
       
   884   } else if (localData) {
       
   885     preloadedData = convertPreferencesPackageData(localData);
       
   886   } else {
       
   887     // Check if there is data in the legacy format from the old persistence system.
       
   888     preloadedData = convertLegacyLocalStorageData(userId);
       
   889   }
       
   890   return create({
       
   891     preloadedData,
       
   892     localStorageRestoreKey
       
   893   });
       
   894 }
       
   895 
       
   896 (window.wp = window.wp || {}).preferencesPersistence = __webpack_exports__;
       
   897 /******/ })()
       
   898 ;