@wordpress/core-data 4.1.1 → 4.2.0-next.e230fbab09.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +2 -10
- package/build/actions.js +9 -13
- package/build/actions.js.map +1 -1
- package/build/batch/create-batch.js +17 -12
- package/build/batch/create-batch.js.map +1 -1
- package/build/entities.js +1 -1
- package/build/entities.js.map +1 -1
- package/build/entity-types/attachment.js +6 -0
- package/build/entity-types/attachment.js.map +1 -0
- package/build/entity-types/base-entity-types.js +47 -0
- package/build/entity-types/base-entity-types.js.map +1 -0
- package/build/entity-types/comment.js +6 -0
- package/build/entity-types/comment.js.map +1 -0
- package/build/entity-types/helpers.js +6 -0
- package/build/entity-types/helpers.js.map +1 -0
- package/build/entity-types/index.js +6 -0
- package/build/entity-types/index.js.map +1 -0
- package/build/entity-types/menu-location.js +6 -0
- package/build/entity-types/menu-location.js.map +1 -0
- package/build/entity-types/nav-menu-item.js +6 -0
- package/build/entity-types/nav-menu-item.js.map +1 -0
- package/build/entity-types/nav-menu.js +6 -0
- package/build/entity-types/nav-menu.js.map +1 -0
- package/build/entity-types/navigation-area.js +6 -0
- package/build/entity-types/navigation-area.js.map +1 -0
- package/build/entity-types/page.js +6 -0
- package/build/entity-types/page.js.map +1 -0
- package/build/entity-types/plugin.js +6 -0
- package/build/entity-types/plugin.js.map +1 -0
- package/build/entity-types/post.js +6 -0
- package/build/entity-types/post.js.map +1 -0
- package/build/entity-types/settings.js +6 -0
- package/build/entity-types/settings.js.map +1 -0
- package/build/entity-types/sidebar.js +6 -0
- package/build/entity-types/sidebar.js.map +1 -0
- package/build/entity-types/taxonomy.js +6 -0
- package/build/entity-types/taxonomy.js.map +1 -0
- package/build/entity-types/theme.js +6 -0
- package/build/entity-types/theme.js.map +1 -0
- package/build/entity-types/type.js +6 -0
- package/build/entity-types/type.js.map +1 -0
- package/build/entity-types/user.js +6 -0
- package/build/entity-types/user.js.map +1 -0
- package/build/entity-types/widget-type.js +6 -0
- package/build/entity-types/widget-type.js.map +1 -0
- package/build/entity-types/widget.js +6 -0
- package/build/entity-types/widget.js.map +1 -0
- package/build/entity-types/wp-template-part.js +6 -0
- package/build/entity-types/wp-template-part.js.map +1 -0
- package/build/entity-types/wp-template.js +6 -0
- package/build/entity-types/wp-template.js.map +1 -0
- package/build/fetch/__experimental-fetch-link-suggestions.js +2 -2
- package/build/fetch/__experimental-fetch-link-suggestions.js.map +1 -1
- package/build/hooks/constants.js +18 -0
- package/build/hooks/constants.js.map +1 -0
- package/build/hooks/memoize.js +18 -0
- package/build/hooks/memoize.js.map +1 -0
- package/build/hooks/use-entity-record.js +60 -0
- package/build/hooks/use-entity-record.js.map +1 -0
- package/build/hooks/use-entity-records.js +77 -0
- package/build/hooks/use-entity-records.js.map +1 -0
- package/build/hooks/use-query-select.js +130 -0
- package/build/hooks/use-query-select.js.map +1 -0
- package/build/index.js +34 -3
- package/build/index.js.map +1 -1
- package/build/reducer.js +1 -1
- package/build/reducer.js.map +1 -1
- package/build/resolvers.js +7 -17
- package/build/resolvers.js.map +1 -1
- package/build-module/actions.js +9 -13
- package/build-module/actions.js.map +1 -1
- package/build-module/batch/create-batch.js +17 -12
- package/build-module/batch/create-batch.js.map +1 -1
- package/build-module/entities.js +1 -1
- package/build-module/entities.js.map +1 -1
- package/build-module/entity-types/attachment.js +2 -0
- package/build-module/entity-types/attachment.js.map +1 -0
- package/build-module/entity-types/base-entity-types.js +39 -0
- package/build-module/entity-types/base-entity-types.js.map +1 -0
- package/build-module/entity-types/comment.js +2 -0
- package/build-module/entity-types/comment.js.map +1 -0
- package/build-module/entity-types/helpers.js +2 -0
- package/build-module/entity-types/helpers.js.map +1 -0
- package/build-module/entity-types/index.js +2 -0
- package/build-module/entity-types/index.js.map +1 -0
- package/build-module/entity-types/menu-location.js +2 -0
- package/build-module/entity-types/menu-location.js.map +1 -0
- package/build-module/entity-types/nav-menu-item.js +2 -0
- package/build-module/entity-types/nav-menu-item.js.map +1 -0
- package/build-module/entity-types/nav-menu.js +2 -0
- package/build-module/entity-types/nav-menu.js.map +1 -0
- package/build-module/entity-types/navigation-area.js +2 -0
- package/build-module/entity-types/navigation-area.js.map +1 -0
- package/build-module/entity-types/page.js +2 -0
- package/build-module/entity-types/page.js.map +1 -0
- package/build-module/entity-types/plugin.js +2 -0
- package/build-module/entity-types/plugin.js.map +1 -0
- package/build-module/entity-types/post.js +2 -0
- package/build-module/entity-types/post.js.map +1 -0
- package/build-module/entity-types/settings.js +2 -0
- package/build-module/entity-types/settings.js.map +1 -0
- package/build-module/entity-types/sidebar.js +2 -0
- package/build-module/entity-types/sidebar.js.map +1 -0
- package/build-module/entity-types/taxonomy.js +2 -0
- package/build-module/entity-types/taxonomy.js.map +1 -0
- package/build-module/entity-types/theme.js +2 -0
- package/build-module/entity-types/theme.js.map +1 -0
- package/build-module/entity-types/type.js +2 -0
- package/build-module/entity-types/type.js.map +1 -0
- package/build-module/entity-types/user.js +2 -0
- package/build-module/entity-types/user.js.map +1 -0
- package/build-module/entity-types/widget-type.js +2 -0
- package/build-module/entity-types/widget-type.js.map +1 -0
- package/build-module/entity-types/widget.js +2 -0
- package/build-module/entity-types/widget.js.map +1 -0
- package/build-module/entity-types/wp-template-part.js +2 -0
- package/build-module/entity-types/wp-template-part.js.map +1 -0
- package/build-module/entity-types/wp-template.js +2 -0
- package/build-module/entity-types/wp-template.js.map +1 -0
- package/build-module/fetch/__experimental-fetch-link-suggestions.js +2 -2
- package/build-module/fetch/__experimental-fetch-link-suggestions.js.map +1 -1
- package/build-module/hooks/constants.js +10 -0
- package/build-module/hooks/constants.js.map +1 -0
- package/build-module/hooks/memoize.js +7 -0
- package/build-module/hooks/memoize.js.map +1 -0
- package/build-module/hooks/use-entity-record.js +49 -0
- package/build-module/hooks/use-entity-record.js.map +1 -0
- package/build-module/hooks/use-entity-records.js +65 -0
- package/build-module/hooks/use-entity-records.js.map +1 -0
- package/build-module/hooks/use-query-select.js +116 -0
- package/build-module/hooks/use-query-select.js.map +1 -0
- package/build-module/index.js +4 -2
- package/build-module/index.js.map +1 -1
- package/build-module/reducer.js +1 -1
- package/build-module/reducer.js.map +1 -1
- package/build-module/resolvers.js +8 -18
- package/build-module/resolvers.js.map +1 -1
- package/package.json +15 -11
- package/src/actions.js +9 -13
- package/src/batch/create-batch.js +16 -12
- package/src/entities.js +1 -1
- package/src/entity-types/README.md +193 -0
- package/src/entity-types/attachment.ts +146 -0
- package/src/entity-types/base-entity-types.ts +36 -0
- package/src/entity-types/comment.ts +96 -0
- package/src/entity-types/helpers.ts +153 -0
- package/src/entity-types/index.ts +72 -0
- package/src/entity-types/menu-location.ts +29 -0
- package/src/entity-types/nav-menu-item.ts +106 -0
- package/src/entity-types/nav-menu.ts +53 -0
- package/src/entity-types/navigation-area.ts +29 -0
- package/src/entity-types/page.ts +144 -0
- package/src/entity-types/plugin.ts +74 -0
- package/src/entity-types/post.ts +153 -0
- package/src/entity-types/settings.ts +93 -0
- package/src/entity-types/sidebar.ts +60 -0
- package/src/entity-types/taxonomy.ts +92 -0
- package/src/entity-types/theme.ts +222 -0
- package/src/entity-types/type.ts +80 -0
- package/src/entity-types/user.ts +109 -0
- package/src/entity-types/widget-type.ts +37 -0
- package/src/entity-types/widget.ts +64 -0
- package/src/entity-types/wp-template-part.ts +94 -0
- package/src/entity-types/wp-template.ts +94 -0
- package/src/fetch/__experimental-fetch-link-suggestions.js +2 -2
- package/src/hooks/constants.ts +7 -0
- package/src/hooks/memoize.js +7 -0
- package/src/hooks/test/use-entity-record.js +74 -0
- package/src/hooks/test/use-entity-records.js +78 -0
- package/src/hooks/test/use-query-select.js +194 -0
- package/src/hooks/use-entity-record.ts +72 -0
- package/src/hooks/use-entity-records.ts +89 -0
- package/src/hooks/use-query-select.ts +131 -0
- package/src/index.js +3 -1
- package/src/locks/test/engine.js +13 -13
- package/src/locks/test/reducer.js +3 -3
- package/src/locks/test/utils.js +2 -2
- package/src/reducer.js +1 -1
- package/src/resolvers.js +6 -17
- package/src/test/resolvers.js +17 -23
- package/src/test/selectors.js +2 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* External dependencies
|
|
3
3
|
*/
|
|
4
|
-
import { find, includes, get,
|
|
4
|
+
import { find, includes, get, compact, uniq } from 'lodash';
|
|
5
5
|
/**
|
|
6
6
|
* WordPress dependencies
|
|
7
7
|
*/
|
|
@@ -278,6 +278,8 @@ export const getEmbedPreview = url => async _ref6 => {
|
|
|
278
278
|
*/
|
|
279
279
|
|
|
280
280
|
export const canUser = (action, resource, id) => async _ref7 => {
|
|
281
|
+
var _response$headers;
|
|
282
|
+
|
|
281
283
|
let {
|
|
282
284
|
dispatch
|
|
283
285
|
} = _ref7;
|
|
@@ -299,31 +301,19 @@ export const canUser = (action, resource, id) => async _ref7 => {
|
|
|
299
301
|
try {
|
|
300
302
|
response = await apiFetch({
|
|
301
303
|
path,
|
|
302
|
-
|
|
303
|
-
// a bug in the REST API which causes the Allow header to not be sent on
|
|
304
|
-
// OPTIONS requests to /posts/:id routes.
|
|
305
|
-
// https://core.trac.wordpress.org/ticket/45753
|
|
306
|
-
method: id ? 'GET' : 'OPTIONS',
|
|
304
|
+
method: 'OPTIONS',
|
|
307
305
|
parse: false
|
|
308
306
|
});
|
|
309
307
|
} catch (error) {
|
|
310
308
|
// Do nothing if our OPTIONS request comes back with an API error (4xx or
|
|
311
309
|
// 5xx). The previously determined isAllowed value will remain in the store.
|
|
312
310
|
return;
|
|
313
|
-
}
|
|
311
|
+
} // Optional chaining operator is used here because the API requests don't
|
|
312
|
+
// return the expected result in the native version. Instead, API requests
|
|
313
|
+
// only return the result, without including response properties like the headers.
|
|
314
314
|
|
|
315
|
-
let allowHeader;
|
|
316
|
-
|
|
317
|
-
if (hasIn(response, ['headers', 'get'])) {
|
|
318
|
-
// If the request is fetched using the fetch api, the header can be
|
|
319
|
-
// retrieved using the 'get' method.
|
|
320
|
-
allowHeader = response.headers.get('allow');
|
|
321
|
-
} else {
|
|
322
|
-
// If the request was preloaded server-side and is returned by the
|
|
323
|
-
// preloading middleware, the header will be a simple property.
|
|
324
|
-
allowHeader = get(response, ['headers', 'Allow'], '');
|
|
325
|
-
}
|
|
326
315
|
|
|
316
|
+
const allowHeader = (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers.get('allow');
|
|
327
317
|
const key = compact([action, resource, id]).join('/');
|
|
328
318
|
const isAllowed = includes(allowHeader, method);
|
|
329
319
|
dispatch.receiveUserPermission(key, isAllowed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@wordpress/core-data/src/resolvers.js"],"names":["find","includes","get","hasIn","compact","uniq","addQueryArgs","apiFetch","STORE_NAME","getKindEntities","DEFAULT_ENTITY_KEY","forwardResolver","getNormalizedCommaSeparable","getAuthors","query","dispatch","path","users","receiveUserQuery","getCurrentUser","currentUser","receiveCurrentUser","getEntityRecord","kind","name","key","select","entities","entity","__experimentalNoFetch","lock","__unstableAcquireStoreLock","exclusive","undefined","_fields","join","baseURL","baseURLParams","include","hasRecords","hasEntityRecords","record","receiveEntityRecords","error","__unstableReleaseStoreLock","getRawEntityRecord","getEditedEntityRecord","getEntityRecords","records","Object","values","map","split","forEach","field","hasOwnProperty","context","resolutionsArgs","filter","type","selectorName","args","shouldInvalidate","action","invalidateCache","getCurrentTheme","resolveSelect","activeThemes","status","receiveCurrentTheme","getThemeSupports","getEmbedPreview","url","embedProxyResponse","receiveEmbedPreview","canUser","resource","id","methods","create","read","update","delete","method","Error","response","parse","allowHeader","headers","isAllowed","receiveUserPermission","canUserEditEntityRecord","recordId","__unstable_rest_base","getAutosaves","postType","postId","rest_base","restBase","getPostType","autosaves","length","receiveAutosaves","getAutosave","__experimentalGetTemplateForLink","link","template","window","fetch","then","res","json","data","e","__experimentalGetCurrentGlobalStylesId","globalStylesURL","globalStylesObject","__experimentalReceiveCurrentGlobalStylesId","__experimentalGetCurrentThemeBaseGlobalStyles","currentTheme","themeGlobalStyles","stylesheet","__experimentalReceiveThemeBaseGlobalStyles","__experimentalGetCurrentThemeGlobalStylesVariations","variations","__experimentalReceiveThemeGlobalStyleVariations"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { find, includes, get, hasIn, compact, uniq } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { getKindEntities, DEFAULT_ENTITY_KEY } from './entities';\nimport { forwardResolver, getNormalizedCommaSeparable } from './utils';\n\n/**\n * Requests authors from the REST API.\n *\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request.\n */\nexport const getAuthors = ( query ) => async ( { dispatch } ) => {\n\tconst path = addQueryArgs(\n\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\tquery\n\t);\n\tconst users = await apiFetch( { path } );\n\tdispatch.receiveUserQuery( path, users );\n};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser = () => async ( { dispatch } ) => {\n\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\tdispatch.receiveCurrentUser( currentUser );\n};\n\n/**\n * Requests an entity's record from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} key Record's key\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request.\n */\nexport const getEntityRecord = ( kind, name, key = '', query ) => async ( {\n\tselect,\n\tdispatch,\n} ) => {\n\tconst entities = await dispatch( getKindEntities( kind ) );\n\tconst entity = find( entities, { kind, name } );\n\tif ( ! entity || entity?.__experimentalNoFetch ) {\n\t\treturn;\n\t}\n\n\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\tSTORE_NAME,\n\t\t[ 'entities', 'data', kind, name, key ],\n\t\t{ exclusive: false }\n\t);\n\n\ttry {\n\t\tif ( query !== undefined && query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: uniq( [\n\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) || [] ),\n\t\t\t\t\tentity.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t] ).join(),\n\t\t\t};\n\t\t}\n\n\t\t// Disable reason: While true that an early return could leave `path`\n\t\t// unused, it's important that path is derived using the query prior to\n\t\t// additional query modifications in the condition below, since those\n\t\t// modifications are relevant to how the data is tracked in state, and not\n\t\t// for how the request is made to the REST API.\n\n\t\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\t\tconst path = addQueryArgs( entity.baseURL + ( key ? '/' + key : '' ), {\n\t\t\t...entity.baseURLParams,\n\t\t\t...query,\n\t\t} );\n\n\t\tif ( query !== undefined ) {\n\t\t\tquery = { ...query, include: [ key ] };\n\n\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t// and without causing `getEntityRecords` resolution to occur.\n\t\t\tconst hasRecords = select.hasEntityRecords( kind, name, query );\n\t\t\tif ( hasRecords ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst record = await apiFetch( { path } );\n\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\t} catch ( error ) {\n\t\t// We need a way to handle and access REST API errors in state\n\t\t// Until then, catching the error ensures the resolver is marked as resolved.\n\t\t// See similar implementation in `getEntityRecords()`.\n\t} finally {\n\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t}\n};\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getRawEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getEditedEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests the entity's records from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {Object?} query Query Object.\n */\nexport const getEntityRecords = ( kind, name, query = {} ) => async ( {\n\tdispatch,\n} ) => {\n\tconst entities = await dispatch( getKindEntities( kind ) );\n\tconst entity = find( entities, { kind, name } );\n\tif ( ! entity || entity?.__experimentalNoFetch ) {\n\t\treturn;\n\t}\n\n\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\tSTORE_NAME,\n\t\t[ 'entities', 'data', kind, name ],\n\t\t{ exclusive: false }\n\t);\n\n\ttry {\n\t\tif ( query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: uniq( [\n\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) || [] ),\n\t\t\t\t\tentity.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t] ).join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs( entity.baseURL, {\n\t\t\t...entity.baseURLParams,\n\t\t\t...query,\n\t\t} );\n\n\t\tlet records = Object.values( await apiFetch( { path } ) );\n\t\t// If we request fields but the result doesn't contain the fields,\n\t\t// explicitely set these fields as \"undefined\"\n\t\t// that way we consider the query \"fullfilled\".\n\t\tif ( query._fields ) {\n\t\t\trecords = records.map( ( record ) => {\n\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\treturn record;\n\t\t\t} );\n\t\t}\n\n\t\tdispatch.receiveEntityRecords( kind, name, records, query );\n\n\t\t// When requesting all fields, the list of results can be used to\n\t\t// resolve the `getEntityRecord` selector in addition to `getEntityRecords`.\n\t\t// See https://github.com/WordPress/gutenberg/pull/26575\n\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\tconst key = entity.key || DEFAULT_ENTITY_KEY;\n\t\t\tconst resolutionsArgs = records\n\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t.map( ( record ) => [ kind, name, record[ key ] ] );\n\n\t\t\tdispatch( {\n\t\t\t\ttype: 'START_RESOLUTIONS',\n\t\t\t\tselectorName: 'getEntityRecord',\n\t\t\t\targs: resolutionsArgs,\n\t\t\t} );\n\t\t\tdispatch( {\n\t\t\t\ttype: 'FINISH_RESOLUTIONS',\n\t\t\t\tselectorName: 'getEntityRecord',\n\t\t\t\targs: resolutionsArgs,\n\t\t\t} );\n\t\t}\n\t} catch ( error ) {\n\t\t// We need a way to handle and access REST API errors in state\n\t\t// Until then, catching the error ensures the resolver is marked as resolved.\n\t\t// See similar implementation in `getEntityRecord()`.\n\t} finally {\n\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t}\n};\n\ngetEntityRecords.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\tkind === action.kind &&\n\t\tname === action.name\n\t);\n};\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme = () => async ( { dispatch, resolveSelect } ) => {\n\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t'root',\n\t\t'theme',\n\t\t{ status: 'active' }\n\t);\n\n\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview = ( url ) => async ( { dispatch } ) => {\n\ttry {\n\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t} );\n\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t} catch ( error ) {\n\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\tdispatch.receiveEmbedPreview( url, false );\n\t}\n};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} action Action to check. One of: 'create', 'read', 'update',\n * 'delete'.\n * @param {string} resource REST resource to check, e.g. 'media' or 'posts'.\n * @param {?string} id ID of the rest resource to check.\n */\nexport const canUser = ( action, resource, id ) => async ( { dispatch } ) => {\n\tconst methods = {\n\t\tcreate: 'POST',\n\t\tread: 'GET',\n\t\tupdate: 'PUT',\n\t\tdelete: 'DELETE',\n\t};\n\n\tconst method = methods[ action ];\n\tif ( ! method ) {\n\t\tthrow new Error( `'${ action }' is not a valid action.` );\n\t}\n\n\tconst path = id ? `/wp/v2/${ resource }/${ id }` : `/wp/v2/${ resource }`;\n\n\tlet response;\n\ttry {\n\t\tresponse = await apiFetch( {\n\t\t\tpath,\n\t\t\t// Ideally this would always be an OPTIONS request, but unfortunately there's\n\t\t\t// a bug in the REST API which causes the Allow header to not be sent on\n\t\t\t// OPTIONS requests to /posts/:id routes.\n\t\t\t// https://core.trac.wordpress.org/ticket/45753\n\t\t\tmethod: id ? 'GET' : 'OPTIONS',\n\t\t\tparse: false,\n\t\t} );\n\t} catch ( error ) {\n\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\treturn;\n\t}\n\n\tlet allowHeader;\n\tif ( hasIn( response, [ 'headers', 'get' ] ) ) {\n\t\t// If the request is fetched using the fetch api, the header can be\n\t\t// retrieved using the 'get' method.\n\t\tallowHeader = response.headers.get( 'allow' );\n\t} else {\n\t\t// If the request was preloaded server-side and is returned by the\n\t\t// preloading middleware, the header will be a simple property.\n\t\tallowHeader = get( response, [ 'headers', 'Allow' ], '' );\n\t}\n\n\tconst key = compact( [ action, resource, id ] ).join( '/' );\n\tconst isAllowed = includes( allowHeader, method );\n\tdispatch.receiveUserPermission( key, isAllowed );\n};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {string} recordId Record's id.\n */\nexport const canUserEditEntityRecord = ( kind, name, recordId ) => async ( {\n\tdispatch,\n} ) => {\n\tconst entities = await dispatch( getKindEntities( kind ) );\n\tconst entity = find( entities, { kind, name } );\n\tif ( ! entity ) {\n\t\treturn;\n\t}\n\n\tconst resource = entity.__unstable_rest_base;\n\tawait dispatch( canUser( 'update', resource, recordId ) );\n};\n\n/**\n * Request autosave data from the REST API.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosaves = ( postType, postId ) => async ( {\n\tdispatch,\n\tresolveSelect,\n} ) => {\n\tconst { rest_base: restBase } = await resolveSelect.getPostType( postType );\n\tconst autosaves = await apiFetch( {\n\t\tpath: `/wp/v2/${ restBase }/${ postId }/autosaves?context=edit`,\n\t} );\n\n\tif ( autosaves && autosaves.length ) {\n\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t}\n};\n\n/**\n * Request autosave data from the REST API.\n *\n * This resolver exists to ensure the underlying autosaves are fetched via\n * `getAutosaves` when a call to the `getAutosave` selector is made.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosave = ( postType, postId ) => async ( {\n\tresolveSelect,\n} ) => {\n\tawait resolveSelect.getAutosaves( postType, postId );\n};\n\n/**\n * Retrieve the frontend template used for a given link.\n *\n * @param {string} link Link.\n */\nexport const __experimentalGetTemplateForLink = ( link ) => async ( {\n\tdispatch,\n\tresolveSelect,\n} ) => {\n\t// Ideally this should be using an apiFetch call\n\t// We could potentially do so by adding a \"filter\" to the `wp_template` end point.\n\t// Also it seems the returned object is not a regular REST API post type.\n\tlet template;\n\ttry {\n\t\ttemplate = await window\n\t\t\t.fetch( addQueryArgs( link, { '_wp-find-template': true } ) )\n\t\t\t.then( ( res ) => res.json() )\n\t\t\t.then( ( { data } ) => data );\n\t} catch ( e ) {\n\t\t// For non-FSE themes, it is possible that this request returns an error.\n\t}\n\n\tif ( ! template ) {\n\t\treturn;\n\t}\n\n\tconst record = await resolveSelect.getEntityRecord(\n\t\t'postType',\n\t\t'wp_template',\n\t\ttemplate.id\n\t);\n\n\tif ( record ) {\n\t\tdispatch.receiveEntityRecords( 'postType', 'wp_template', [ record ], {\n\t\t\t'find-template': link,\n\t\t} );\n\t}\n};\n\n__experimentalGetTemplateForLink.shouldInvalidate = ( action ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\n\t);\n};\n\nexport const __experimentalGetCurrentGlobalStylesId = () => async ( {\n\tdispatch,\n\tresolveSelect,\n} ) => {\n\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t'root',\n\t\t'theme',\n\t\t{ status: 'active' }\n\t);\n\tconst globalStylesURL = get( activeThemes, [\n\t\t0,\n\t\t'_links',\n\t\t'wp:user-global-styles',\n\t\t0,\n\t\t'href',\n\t] );\n\tif ( globalStylesURL ) {\n\t\tconst globalStylesObject = await apiFetch( {\n\t\t\turl: globalStylesURL,\n\t\t} );\n\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId(\n\t\t\tglobalStylesObject.id\n\t\t);\n\t}\n};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles = () => async ( {\n\tresolveSelect,\n\tdispatch,\n} ) => {\n\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\tconst themeGlobalStyles = await apiFetch( {\n\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }`,\n\t} );\n\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\tcurrentTheme.stylesheet,\n\t\tthemeGlobalStyles\n\t);\n};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations = () => async ( {\n\tresolveSelect,\n\tdispatch,\n} ) => {\n\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\tconst variations = await apiFetch( {\n\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations`,\n\t} );\n\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\tcurrentTheme.stylesheet,\n\t\tvariations\n\t);\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["@wordpress/core-data/src/resolvers.js"],"names":["find","includes","get","compact","uniq","addQueryArgs","apiFetch","STORE_NAME","getKindEntities","DEFAULT_ENTITY_KEY","forwardResolver","getNormalizedCommaSeparable","getAuthors","query","dispatch","path","users","receiveUserQuery","getCurrentUser","currentUser","receiveCurrentUser","getEntityRecord","kind","name","key","select","entities","entity","__experimentalNoFetch","lock","__unstableAcquireStoreLock","exclusive","undefined","_fields","join","baseURL","baseURLParams","include","hasRecords","hasEntityRecords","record","receiveEntityRecords","error","__unstableReleaseStoreLock","getRawEntityRecord","getEditedEntityRecord","getEntityRecords","records","Object","values","map","split","forEach","field","hasOwnProperty","context","resolutionsArgs","filter","type","selectorName","args","shouldInvalidate","action","invalidateCache","getCurrentTheme","resolveSelect","activeThemes","status","receiveCurrentTheme","getThemeSupports","getEmbedPreview","url","embedProxyResponse","receiveEmbedPreview","canUser","resource","id","methods","create","read","update","delete","method","Error","response","parse","allowHeader","headers","isAllowed","receiveUserPermission","canUserEditEntityRecord","recordId","__unstable_rest_base","getAutosaves","postType","postId","rest_base","restBase","getPostType","autosaves","length","receiveAutosaves","getAutosave","__experimentalGetTemplateForLink","link","template","window","fetch","then","res","json","data","e","__experimentalGetCurrentGlobalStylesId","globalStylesURL","globalStylesObject","__experimentalReceiveCurrentGlobalStylesId","__experimentalGetCurrentThemeBaseGlobalStyles","currentTheme","themeGlobalStyles","stylesheet","__experimentalReceiveThemeBaseGlobalStyles","__experimentalGetCurrentThemeGlobalStylesVariations","variations","__experimentalReceiveThemeGlobalStyleVariations"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { find, includes, get, compact, uniq } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { getKindEntities, DEFAULT_ENTITY_KEY } from './entities';\nimport { forwardResolver, getNormalizedCommaSeparable } from './utils';\n\n/**\n * Requests authors from the REST API.\n *\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request.\n */\nexport const getAuthors = ( query ) => async ( { dispatch } ) => {\n\tconst path = addQueryArgs(\n\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\tquery\n\t);\n\tconst users = await apiFetch( { path } );\n\tdispatch.receiveUserQuery( path, users );\n};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser = () => async ( { dispatch } ) => {\n\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\tdispatch.receiveCurrentUser( currentUser );\n};\n\n/**\n * Requests an entity's record from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} key Record's key\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request.\n */\nexport const getEntityRecord = ( kind, name, key = '', query ) => async ( {\n\tselect,\n\tdispatch,\n} ) => {\n\tconst entities = await dispatch( getKindEntities( kind ) );\n\tconst entity = find( entities, { kind, name } );\n\tif ( ! entity || entity?.__experimentalNoFetch ) {\n\t\treturn;\n\t}\n\n\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\tSTORE_NAME,\n\t\t[ 'entities', 'data', kind, name, key ],\n\t\t{ exclusive: false }\n\t);\n\n\ttry {\n\t\tif ( query !== undefined && query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: uniq( [\n\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) || [] ),\n\t\t\t\t\tentity.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t] ).join(),\n\t\t\t};\n\t\t}\n\n\t\t// Disable reason: While true that an early return could leave `path`\n\t\t// unused, it's important that path is derived using the query prior to\n\t\t// additional query modifications in the condition below, since those\n\t\t// modifications are relevant to how the data is tracked in state, and not\n\t\t// for how the request is made to the REST API.\n\n\t\t// eslint-disable-next-line @wordpress/no-unused-vars-before-return\n\t\tconst path = addQueryArgs( entity.baseURL + ( key ? '/' + key : '' ), {\n\t\t\t...entity.baseURLParams,\n\t\t\t...query,\n\t\t} );\n\n\t\tif ( query !== undefined ) {\n\t\t\tquery = { ...query, include: [ key ] };\n\n\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t// and without causing `getEntityRecords` resolution to occur.\n\t\t\tconst hasRecords = select.hasEntityRecords( kind, name, query );\n\t\t\tif ( hasRecords ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst record = await apiFetch( { path } );\n\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\t} catch ( error ) {\n\t\t// We need a way to handle and access REST API errors in state\n\t\t// Until then, catching the error ensures the resolver is marked as resolved.\n\t\t// See similar implementation in `getEntityRecords()`.\n\t} finally {\n\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t}\n};\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getRawEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests an entity's record from the REST API.\n */\nexport const getEditedEntityRecord = forwardResolver( 'getEntityRecord' );\n\n/**\n * Requests the entity's records from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {Object?} query Query Object.\n */\nexport const getEntityRecords = ( kind, name, query = {} ) => async ( {\n\tdispatch,\n} ) => {\n\tconst entities = await dispatch( getKindEntities( kind ) );\n\tconst entity = find( entities, { kind, name } );\n\tif ( ! entity || entity?.__experimentalNoFetch ) {\n\t\treturn;\n\t}\n\n\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\tSTORE_NAME,\n\t\t[ 'entities', 'data', kind, name ],\n\t\t{ exclusive: false }\n\t);\n\n\ttry {\n\t\tif ( query._fields ) {\n\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t// the ID.\n\t\t\tquery = {\n\t\t\t\t...query,\n\t\t\t\t_fields: uniq( [\n\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) || [] ),\n\t\t\t\t\tentity.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t] ).join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs( entity.baseURL, {\n\t\t\t...entity.baseURLParams,\n\t\t\t...query,\n\t\t} );\n\n\t\tlet records = Object.values( await apiFetch( { path } ) );\n\t\t// If we request fields but the result doesn't contain the fields,\n\t\t// explicitely set these fields as \"undefined\"\n\t\t// that way we consider the query \"fullfilled\".\n\t\tif ( query._fields ) {\n\t\t\trecords = records.map( ( record ) => {\n\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\treturn record;\n\t\t\t} );\n\t\t}\n\n\t\tdispatch.receiveEntityRecords( kind, name, records, query );\n\n\t\t// When requesting all fields, the list of results can be used to\n\t\t// resolve the `getEntityRecord` selector in addition to `getEntityRecords`.\n\t\t// See https://github.com/WordPress/gutenberg/pull/26575\n\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\tconst key = entity.key || DEFAULT_ENTITY_KEY;\n\t\t\tconst resolutionsArgs = records\n\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t.map( ( record ) => [ kind, name, record[ key ] ] );\n\n\t\t\tdispatch( {\n\t\t\t\ttype: 'START_RESOLUTIONS',\n\t\t\t\tselectorName: 'getEntityRecord',\n\t\t\t\targs: resolutionsArgs,\n\t\t\t} );\n\t\t\tdispatch( {\n\t\t\t\ttype: 'FINISH_RESOLUTIONS',\n\t\t\t\tselectorName: 'getEntityRecord',\n\t\t\t\targs: resolutionsArgs,\n\t\t\t} );\n\t\t}\n\t} catch ( error ) {\n\t\t// We need a way to handle and access REST API errors in state\n\t\t// Until then, catching the error ensures the resolver is marked as resolved.\n\t\t// See similar implementation in `getEntityRecord()`.\n\t} finally {\n\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t}\n};\n\ngetEntityRecords.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\tkind === action.kind &&\n\t\tname === action.name\n\t);\n};\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme = () => async ( { dispatch, resolveSelect } ) => {\n\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t'root',\n\t\t'theme',\n\t\t{ status: 'active' }\n\t);\n\n\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview = ( url ) => async ( { dispatch } ) => {\n\ttry {\n\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t} );\n\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t} catch ( error ) {\n\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\tdispatch.receiveEmbedPreview( url, false );\n\t}\n};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} action Action to check. One of: 'create', 'read', 'update',\n * 'delete'.\n * @param {string} resource REST resource to check, e.g. 'media' or 'posts'.\n * @param {?string} id ID of the rest resource to check.\n */\nexport const canUser = ( action, resource, id ) => async ( { dispatch } ) => {\n\tconst methods = {\n\t\tcreate: 'POST',\n\t\tread: 'GET',\n\t\tupdate: 'PUT',\n\t\tdelete: 'DELETE',\n\t};\n\n\tconst method = methods[ action ];\n\tif ( ! method ) {\n\t\tthrow new Error( `'${ action }' is not a valid action.` );\n\t}\n\n\tconst path = id ? `/wp/v2/${ resource }/${ id }` : `/wp/v2/${ resource }`;\n\n\tlet response;\n\ttry {\n\t\tresponse = await apiFetch( {\n\t\t\tpath,\n\t\t\tmethod: 'OPTIONS',\n\t\t\tparse: false,\n\t\t} );\n\t} catch ( error ) {\n\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\treturn;\n\t}\n\n\t// Optional chaining operator is used here because the API requests don't\n\t// return the expected result in the native version. Instead, API requests\n\t// only return the result, without including response properties like the headers.\n\tconst allowHeader = response.headers?.get( 'allow' );\n\tconst key = compact( [ action, resource, id ] ).join( '/' );\n\tconst isAllowed = includes( allowHeader, method );\n\tdispatch.receiveUserPermission( key, isAllowed );\n};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {string} recordId Record's id.\n */\nexport const canUserEditEntityRecord = ( kind, name, recordId ) => async ( {\n\tdispatch,\n} ) => {\n\tconst entities = await dispatch( getKindEntities( kind ) );\n\tconst entity = find( entities, { kind, name } );\n\tif ( ! entity ) {\n\t\treturn;\n\t}\n\n\tconst resource = entity.__unstable_rest_base;\n\tawait dispatch( canUser( 'update', resource, recordId ) );\n};\n\n/**\n * Request autosave data from the REST API.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosaves = ( postType, postId ) => async ( {\n\tdispatch,\n\tresolveSelect,\n} ) => {\n\tconst { rest_base: restBase } = await resolveSelect.getPostType( postType );\n\tconst autosaves = await apiFetch( {\n\t\tpath: `/wp/v2/${ restBase }/${ postId }/autosaves?context=edit`,\n\t} );\n\n\tif ( autosaves && autosaves.length ) {\n\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t}\n};\n\n/**\n * Request autosave data from the REST API.\n *\n * This resolver exists to ensure the underlying autosaves are fetched via\n * `getAutosaves` when a call to the `getAutosave` selector is made.\n *\n * @param {string} postType The type of the parent post.\n * @param {number} postId The id of the parent post.\n */\nexport const getAutosave = ( postType, postId ) => async ( {\n\tresolveSelect,\n} ) => {\n\tawait resolveSelect.getAutosaves( postType, postId );\n};\n\n/**\n * Retrieve the frontend template used for a given link.\n *\n * @param {string} link Link.\n */\nexport const __experimentalGetTemplateForLink = ( link ) => async ( {\n\tdispatch,\n\tresolveSelect,\n} ) => {\n\t// Ideally this should be using an apiFetch call\n\t// We could potentially do so by adding a \"filter\" to the `wp_template` end point.\n\t// Also it seems the returned object is not a regular REST API post type.\n\tlet template;\n\ttry {\n\t\ttemplate = await window\n\t\t\t.fetch( addQueryArgs( link, { '_wp-find-template': true } ) )\n\t\t\t.then( ( res ) => res.json() )\n\t\t\t.then( ( { data } ) => data );\n\t} catch ( e ) {\n\t\t// For non-FSE themes, it is possible that this request returns an error.\n\t}\n\n\tif ( ! template ) {\n\t\treturn;\n\t}\n\n\tconst record = await resolveSelect.getEntityRecord(\n\t\t'postType',\n\t\t'wp_template',\n\t\ttemplate.id\n\t);\n\n\tif ( record ) {\n\t\tdispatch.receiveEntityRecords( 'postType', 'wp_template', [ record ], {\n\t\t\t'find-template': link,\n\t\t} );\n\t}\n};\n\n__experimentalGetTemplateForLink.shouldInvalidate = ( action ) => {\n\treturn (\n\t\t( action.type === 'RECEIVE_ITEMS' || action.type === 'REMOVE_ITEMS' ) &&\n\t\taction.invalidateCache &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\n\t);\n};\n\nexport const __experimentalGetCurrentGlobalStylesId = () => async ( {\n\tdispatch,\n\tresolveSelect,\n} ) => {\n\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t'root',\n\t\t'theme',\n\t\t{ status: 'active' }\n\t);\n\tconst globalStylesURL = get( activeThemes, [\n\t\t0,\n\t\t'_links',\n\t\t'wp:user-global-styles',\n\t\t0,\n\t\t'href',\n\t] );\n\tif ( globalStylesURL ) {\n\t\tconst globalStylesObject = await apiFetch( {\n\t\t\turl: globalStylesURL,\n\t\t} );\n\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId(\n\t\t\tglobalStylesObject.id\n\t\t);\n\t}\n};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles = () => async ( {\n\tresolveSelect,\n\tdispatch,\n} ) => {\n\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\tconst themeGlobalStyles = await apiFetch( {\n\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }`,\n\t} );\n\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\tcurrentTheme.stylesheet,\n\t\tthemeGlobalStyles\n\t);\n};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations = () => async ( {\n\tresolveSelect,\n\tdispatch,\n} ) => {\n\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\tconst variations = await apiFetch( {\n\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations`,\n\t} );\n\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\tcurrentTheme.stylesheet,\n\t\tvariations\n\t);\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wordpress/core-data",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0-next.e230fbab09.0",
|
|
4
4
|
"description": "Access to and manipulation of core WordPress entities.",
|
|
5
5
|
"author": "The WordPress Contributors",
|
|
6
6
|
"license": "GPL-2.0-or-later",
|
|
@@ -30,22 +30,26 @@
|
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@babel/runtime": "^7.16.0",
|
|
33
|
-
"@wordpress/api-fetch": "^6.0.
|
|
34
|
-
"@wordpress/blocks": "^11.
|
|
35
|
-
"@wordpress/data": "^6.
|
|
36
|
-
"@wordpress/deprecated": "^3.
|
|
37
|
-
"@wordpress/element": "^4.
|
|
38
|
-
"@wordpress/html-entities": "^3.
|
|
39
|
-
"@wordpress/i18n": "^4.
|
|
40
|
-
"@wordpress/is-shallow-equal": "^4.
|
|
41
|
-
"@wordpress/url": "^3.
|
|
33
|
+
"@wordpress/api-fetch": "^6.1.0-next.e230fbab09.0",
|
|
34
|
+
"@wordpress/blocks": "^11.3.0-next.e230fbab09.0",
|
|
35
|
+
"@wordpress/data": "^6.4.0-next.e230fbab09.0",
|
|
36
|
+
"@wordpress/deprecated": "^3.4.0-next.e230fbab09.0",
|
|
37
|
+
"@wordpress/element": "^4.3.0-next.e230fbab09.0",
|
|
38
|
+
"@wordpress/html-entities": "^3.4.0-next.e230fbab09.0",
|
|
39
|
+
"@wordpress/i18n": "^4.4.0-next.e230fbab09.0",
|
|
40
|
+
"@wordpress/is-shallow-equal": "^4.4.0-next.e230fbab09.0",
|
|
41
|
+
"@wordpress/url": "^3.5.0-next.e230fbab09.0",
|
|
42
42
|
"equivalent-key-map": "^0.2.2",
|
|
43
43
|
"lodash": "^4.17.21",
|
|
44
|
+
"memize": "^1.1.0",
|
|
44
45
|
"rememo": "^3.0.0",
|
|
45
46
|
"uuid": "^8.3.0"
|
|
46
47
|
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"react": "^17.0.0"
|
|
50
|
+
},
|
|
47
51
|
"publishConfig": {
|
|
48
52
|
"access": "public"
|
|
49
53
|
},
|
|
50
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "308df03e6a96ded732f9c4e32471b1b4f8dea54a"
|
|
51
55
|
}
|
package/src/actions.js
CHANGED
|
@@ -283,12 +283,12 @@ export const deleteEntityRecord = (
|
|
|
283
283
|
* Returns an action object that triggers an
|
|
284
284
|
* edit to an entity record.
|
|
285
285
|
*
|
|
286
|
-
* @param {string} kind
|
|
287
|
-
* @param {string} name
|
|
288
|
-
* @param {number} recordId
|
|
289
|
-
* @param {Object} edits
|
|
290
|
-
* @param {Object} options
|
|
291
|
-
* @param {boolean} options.undoIgnore Whether to ignore the edit in undo history or not.
|
|
286
|
+
* @param {string} kind Kind of the edited entity record.
|
|
287
|
+
* @param {string} name Name of the edited entity record.
|
|
288
|
+
* @param {number} recordId Record ID of the edited entity record.
|
|
289
|
+
* @param {Object} edits The edits.
|
|
290
|
+
* @param {Object} options Options for the edit.
|
|
291
|
+
* @param {boolean} [options.undoIgnore] Whether to ignore the edit in undo history or not.
|
|
292
292
|
*
|
|
293
293
|
* @return {Object} Action object.
|
|
294
294
|
*/
|
|
@@ -345,8 +345,6 @@ export const editEntityRecord = (
|
|
|
345
345
|
/**
|
|
346
346
|
* Action triggered to undo the last edit to
|
|
347
347
|
* an entity record, if any.
|
|
348
|
-
*
|
|
349
|
-
* @return {undefined}
|
|
350
348
|
*/
|
|
351
349
|
export const undo = () => ( { select, dispatch } ) => {
|
|
352
350
|
const undoEdit = select.getUndoEdit();
|
|
@@ -363,8 +361,6 @@ export const undo = () => ( { select, dispatch } ) => {
|
|
|
363
361
|
/**
|
|
364
362
|
* Action triggered to redo the last undoed
|
|
365
363
|
* edit to an entity record, if any.
|
|
366
|
-
*
|
|
367
|
-
* @return {undefined}
|
|
368
364
|
*/
|
|
369
365
|
export const redo = () => ( { select, dispatch } ) => {
|
|
370
366
|
const redoEdit = select.getRedoEdit();
|
|
@@ -466,7 +462,7 @@ export const saveEntityRecord = (
|
|
|
466
462
|
// so the client just sends and receives objects.
|
|
467
463
|
const currentUser = select.getCurrentUser();
|
|
468
464
|
const currentUserId = currentUser ? currentUser.id : undefined;
|
|
469
|
-
const autosavePost = resolveSelect.getAutosave(
|
|
465
|
+
const autosavePost = await resolveSelect.getAutosave(
|
|
470
466
|
persistedRecord.type,
|
|
471
467
|
persistedRecord.id,
|
|
472
468
|
currentUserId
|
|
@@ -607,8 +603,8 @@ export const saveEntityRecord = (
|
|
|
607
603
|
* `saveEntityRecord`, `saveEditedEntityRecord`, and
|
|
608
604
|
* `deleteEntityRecord`.
|
|
609
605
|
*
|
|
610
|
-
* @return {Promise} A promise that resolves to an array containing the return
|
|
611
|
-
*
|
|
606
|
+
* @return {(thunkArgs: Object) => Promise} A promise that resolves to an array containing the return
|
|
607
|
+
* values of each function given in `requests`.
|
|
612
608
|
*/
|
|
613
609
|
export const __experimentalBatch = ( requests ) => async ( { dispatch } ) => {
|
|
614
610
|
const batch = createBatch();
|
|
@@ -43,6 +43,7 @@ import defaultProcessor from './default-processor';
|
|
|
43
43
|
*/
|
|
44
44
|
export default function createBatch( processor = defaultProcessor ) {
|
|
45
45
|
let lastId = 0;
|
|
46
|
+
/** @type {Array<{ input: any; resolve: ( value: any ) => void; reject: ( error: any ) => void }>} */
|
|
46
47
|
let queue = [];
|
|
47
48
|
const pending = new ObservableSet();
|
|
48
49
|
|
|
@@ -100,7 +101,7 @@ export default function createBatch( processor = defaultProcessor ) {
|
|
|
100
101
|
* Runs the batch. This calls `batchProcessor` and resolves or rejects
|
|
101
102
|
* all promises returned by `add()`.
|
|
102
103
|
*
|
|
103
|
-
* @return {Promise} A promise that resolves to a boolean that is true
|
|
104
|
+
* @return {Promise<boolean>} A promise that resolves to a boolean that is true
|
|
104
105
|
* if the processor returned no errors.
|
|
105
106
|
*/
|
|
106
107
|
async run() {
|
|
@@ -109,7 +110,7 @@ export default function createBatch( processor = defaultProcessor ) {
|
|
|
109
110
|
const unsubscribe = pending.subscribe( () => {
|
|
110
111
|
if ( ! pending.size ) {
|
|
111
112
|
unsubscribe();
|
|
112
|
-
resolve();
|
|
113
|
+
resolve( undefined );
|
|
113
114
|
}
|
|
114
115
|
} );
|
|
115
116
|
} );
|
|
@@ -137,15 +138,18 @@ export default function createBatch( processor = defaultProcessor ) {
|
|
|
137
138
|
|
|
138
139
|
let isSuccess = true;
|
|
139
140
|
|
|
140
|
-
for ( const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
141
|
+
for ( const pair of zip( results, queue ) ) {
|
|
142
|
+
/** @type {{error?: unknown, output?: unknown}} */
|
|
143
|
+
const result = pair[ 0 ];
|
|
144
|
+
|
|
145
|
+
/** @type {{resolve: (value: any) => void; reject: (error: any) => void} | undefined} */
|
|
146
|
+
const queueItem = pair[ 1 ];
|
|
147
|
+
|
|
144
148
|
if ( result?.error ) {
|
|
145
|
-
reject( result.error );
|
|
149
|
+
queueItem?.reject( result.error );
|
|
146
150
|
isSuccess = false;
|
|
147
151
|
} else {
|
|
148
|
-
resolve( result?.output ?? result );
|
|
152
|
+
queueItem?.resolve( result?.output ?? result );
|
|
149
153
|
}
|
|
150
154
|
}
|
|
151
155
|
|
|
@@ -166,14 +170,14 @@ class ObservableSet {
|
|
|
166
170
|
return this.set.size;
|
|
167
171
|
}
|
|
168
172
|
|
|
169
|
-
add(
|
|
170
|
-
this.set.add(
|
|
173
|
+
add( value ) {
|
|
174
|
+
this.set.add( value );
|
|
171
175
|
this.subscribers.forEach( ( subscriber ) => subscriber() );
|
|
172
176
|
return this;
|
|
173
177
|
}
|
|
174
178
|
|
|
175
|
-
delete(
|
|
176
|
-
const isSuccess = this.set.delete(
|
|
179
|
+
delete( value ) {
|
|
180
|
+
const isSuccess = this.set.delete( value );
|
|
177
181
|
this.subscribers.forEach( ( subscriber ) => subscriber() );
|
|
178
182
|
return isSuccess;
|
|
179
183
|
}
|
package/src/entities.js
CHANGED
|
@@ -143,7 +143,7 @@ export const defaultEntities = [
|
|
|
143
143
|
kind: 'root',
|
|
144
144
|
baseURL: '/wp/v2/global-styles',
|
|
145
145
|
baseURLParams: { context: 'edit' },
|
|
146
|
-
plural: 'globalStylesVariations', //
|
|
146
|
+
plural: 'globalStylesVariations', // Should be different than name.
|
|
147
147
|
getTitle: ( record ) => record?.title?.rendered || record?.title,
|
|
148
148
|
},
|
|
149
149
|
{
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Entity Records Types
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The types in this directory are designed to support the following use-cases:
|
|
6
|
+
|
|
7
|
+
* Provide type-hinting and documentation for entity records fetched in the various REST API contexts.
|
|
8
|
+
* Type-check the values we use to *edit* entity records, the values that are sent back to the server as updates.
|
|
9
|
+
|
|
10
|
+
**Warning:** The types model the expected API responses which is **not** the same as having a full type safety for the API-related operations. The API responses are type-cast to these definitions and therefore may not match those expectations; for example, a plugin could modify the response, or the API endpoint could have a nuanced implementation in which strings are sometimes used instead of numbers.
|
|
11
|
+
|
|
12
|
+
### Context-aware type checks for entity records
|
|
13
|
+
|
|
14
|
+
WordPress REST API returns different responses based on the `context` query parameter, which typically is one of `view`, `edit`, or `embed`. See the [REST API documentation](https://developer.wordpress.org/rest-api/) to learn more.
|
|
15
|
+
|
|
16
|
+
For example, requesting `/wp/v2/posts/1?context=view` yields:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
{
|
|
20
|
+
"content": {
|
|
21
|
+
"protected": false,
|
|
22
|
+
"rendered": "\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n"
|
|
23
|
+
},
|
|
24
|
+
"title": {
|
|
25
|
+
"rendered": "Hello world!"
|
|
26
|
+
}
|
|
27
|
+
// other fields
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
While requesting `/wp/v2/posts/1?context=edit`, yields:
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
{
|
|
35
|
+
"content": {
|
|
36
|
+
"block_version": 1,
|
|
37
|
+
"protected": false,
|
|
38
|
+
"raw": "<!-- wp:paragraph -->\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n<!-- /wp:paragraph -->",
|
|
39
|
+
"rendered": "\n<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing!</p>\n"
|
|
40
|
+
},
|
|
41
|
+
"title": {
|
|
42
|
+
"raw": "Hello world!",
|
|
43
|
+
"rendered": "Hello world!"
|
|
44
|
+
}
|
|
45
|
+
// other fields
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
And, finally, requesting `/wp/v2/posts/1?context=embed` yields:
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
{
|
|
53
|
+
// Note content is missing
|
|
54
|
+
"title": {
|
|
55
|
+
"rendered": "Hello world!"
|
|
56
|
+
}
|
|
57
|
+
// other fields
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
These contexts are supported by the core-data resolvers like `getEntityRecord()` and `getEntityRecords()` to retrieve the appropriate "flavor" of the data.
|
|
62
|
+
|
|
63
|
+
The types describing different entity records must thus be aware of the relevant API context. This is implemented using the `Context` type parameter. For example, the implementation of the `Post` type resembles the following snippet:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
interface Post<C extends Context> {
|
|
67
|
+
/**
|
|
68
|
+
* A named status for the post.
|
|
69
|
+
*/
|
|
70
|
+
status: ContextualField< PostStatus, 'view' | 'edit', C >;
|
|
71
|
+
|
|
72
|
+
// ... other fields ...
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The `status` field is a `PostStatus` when the requesting context is `view` or `edit`, but if requested with an `embed` context the field won't appear on the `Post` object at all.
|
|
77
|
+
|
|
78
|
+
### Static type checks for *edited* entity records, where certain fields become strings instead of objects.
|
|
79
|
+
|
|
80
|
+
When the `post` is retrieved using `getEntityRecord`, its `content` field is an object:
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
const post = wp.data.select('core').getEntityRecord( 'postType', 'post', 1, { context: 'view' } )
|
|
84
|
+
// `post.content` is an object with two fields: protected and rendered
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The block markup stored in `content` can only be rendered on the server so the REST API exposes both the raw markup and the rendered version. For example, `content.rendered` could used as a visual preview, and `content.raw` could be used to populate the code editor.
|
|
88
|
+
|
|
89
|
+
When updating that field from the JavaScript code, however, all we can set is the raw value that the server will eventually render. The API expects us to send a much simpler `string` form which is the raw form that needs to be stored in the database.
|
|
90
|
+
|
|
91
|
+
The types reflect this through the `Updatable<EntityRecord>` wrapper:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
interface Post< C extends Context > {
|
|
95
|
+
title: {
|
|
96
|
+
raw: string;
|
|
97
|
+
rendered: string;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const post : Post< 'edit' > = ...
|
|
102
|
+
// post.title is an object with properties `raw` and `rendered`
|
|
103
|
+
|
|
104
|
+
const post : Updatable<Post< 'edit' >> = ...
|
|
105
|
+
// post.title is a string
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The `getEditedEntityRecord` selector returns the Updatable version of the entity records:
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
const post = wp.data.select('core').getEditedEntityRecord( 'postType', 'post', 1 );
|
|
112
|
+
// `post.content` is a string
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Helpers
|
|
116
|
+
|
|
117
|
+
### Context
|
|
118
|
+
|
|
119
|
+
The REST API context parameter.
|
|
120
|
+
|
|
121
|
+
### ContextualField
|
|
122
|
+
|
|
123
|
+
`ContextualField` makes the field available only in the specified given contexts, and ensure the field is absent from the object when in a different context.
|
|
124
|
+
|
|
125
|
+
Example:
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
interface Post< C extends Context > {
|
|
129
|
+
…
|
|
130
|
+
modified: ContextualField< string, 'edit' | 'view', C >;
|
|
131
|
+
password: ContextualField< string, 'edit', C >;
|
|
132
|
+
…
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const post: Post<'edit'> = …
|
|
136
|
+
// post.modified exists as a string
|
|
137
|
+
// post.password exists as a string
|
|
138
|
+
|
|
139
|
+
const post: Post<'view'> = …
|
|
140
|
+
// post.modified still exists as a string
|
|
141
|
+
// post.password is missing, undefined, because we're not in the `edit` context.
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### OmitNevers
|
|
145
|
+
|
|
146
|
+
Removes all the properties of type never, even the deeply nested ones.
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
type MyType = {
|
|
150
|
+
foo: string;
|
|
151
|
+
bar: never;
|
|
152
|
+
nested: {
|
|
153
|
+
foo: string;
|
|
154
|
+
bar: never;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const x = {} as OmitNevers<MyType>;
|
|
158
|
+
// x is of type { foo: string; nested: { foo: string; }}
|
|
159
|
+
// The `never` properties were removed entirely
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Updatable
|
|
163
|
+
|
|
164
|
+
Updatable<EntityRecord> is a type describing Edited Entity Records. They are like
|
|
165
|
+
regular Entity Records, but they have all the local edits applied on top of the REST API data.
|
|
166
|
+
|
|
167
|
+
This turns certain field from an object into a string.
|
|
168
|
+
|
|
169
|
+
Entities like Post have fields that only be rendered on the server, like title, excerpt,
|
|
170
|
+
and content. The REST API exposes both the raw markup and the rendered version of those fields.
|
|
171
|
+
For example, in the block editor, content.rendered could used as a visual preview, and
|
|
172
|
+
content.raw could be used to populate the code editor.
|
|
173
|
+
|
|
174
|
+
When updating these rendered fields, JavaScript is not be able to properly render arbitrary block
|
|
175
|
+
markup. Therefore, it stores only the raw markup without the rendered part. And since that's a string,
|
|
176
|
+
the entire field becomes a string.
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
type Post< C extends Context > {
|
|
180
|
+
title: RenderedText< C >;
|
|
181
|
+
}
|
|
182
|
+
const post = {} as Post;
|
|
183
|
+
// post.title is an object with raw and rendered properties
|
|
184
|
+
|
|
185
|
+
const updatablePost = {} as Updatable< Post >;
|
|
186
|
+
// updatablePost.title is a string
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### RenderedText
|
|
190
|
+
|
|
191
|
+
A string that the server renders which often involves modifications from the raw source string.
|
|
192
|
+
|
|
193
|
+
For example, block HTML with the comment delimiters exists in `post_content` but those comments are stripped out when rendering to a page view. Similarly, plugins might modify content or replace shortcodes.
|