@wordpress/core-data 7.38.0 → 7.39.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 +2 -0
- package/build/actions.cjs +17 -6
- package/build/actions.cjs.map +2 -2
- package/build/awareness/base-awareness.cjs +62 -0
- package/build/awareness/base-awareness.cjs.map +7 -0
- package/build/awareness/config.cjs +34 -0
- package/build/awareness/config.cjs.map +7 -0
- package/build/awareness/post-editor-awareness.cjs +130 -0
- package/build/awareness/post-editor-awareness.cjs.map +7 -0
- package/build/awareness/types.cjs +19 -0
- package/build/awareness/types.cjs.map +7 -0
- package/build/awareness/utils.cjs +116 -0
- package/build/awareness/utils.cjs.map +7 -0
- package/build/entities.cjs +27 -2
- package/build/entities.cjs.map +2 -2
- package/build/resolvers.cjs +43 -2
- package/build/resolvers.cjs.map +2 -2
- package/build/types.cjs.map +1 -1
- package/build/utils/block-selection-history.cjs +101 -0
- package/build/utils/block-selection-history.cjs.map +7 -0
- package/build/utils/crdt-selection.cjs +139 -0
- package/build/utils/crdt-selection.cjs.map +7 -0
- package/build/utils/crdt-user-selections.cjs +171 -0
- package/build/utils/crdt-user-selections.cjs.map +7 -0
- package/build/utils/crdt-utils.cjs +29 -0
- package/build/utils/crdt-utils.cjs.map +3 -3
- package/build/utils/crdt.cjs +16 -4
- package/build/utils/crdt.cjs.map +2 -2
- package/build-module/actions.mjs +17 -6
- package/build-module/actions.mjs.map +2 -2
- package/build-module/awareness/base-awareness.mjs +35 -0
- package/build-module/awareness/base-awareness.mjs.map +7 -0
- package/build-module/awareness/config.mjs +8 -0
- package/build-module/awareness/config.mjs.map +7 -0
- package/build-module/awareness/post-editor-awareness.mjs +111 -0
- package/build-module/awareness/post-editor-awareness.mjs.map +7 -0
- package/build-module/awareness/types.mjs +1 -0
- package/build-module/awareness/types.mjs.map +7 -0
- package/build-module/awareness/utils.mjs +90 -0
- package/build-module/awareness/utils.mjs.map +7 -0
- package/build-module/entities.mjs +28 -2
- package/build-module/entities.mjs.map +2 -2
- package/build-module/resolvers.mjs +43 -2
- package/build-module/resolvers.mjs.map +2 -2
- package/build-module/utils/block-selection-history.mjs +75 -0
- package/build-module/utils/block-selection-history.mjs.map +7 -0
- package/build-module/utils/crdt-selection.mjs +115 -0
- package/build-module/utils/crdt-selection.mjs.map +7 -0
- package/build-module/utils/crdt-user-selections.mjs +144 -0
- package/build-module/utils/crdt-user-selections.mjs.map +7 -0
- package/build-module/utils/crdt-utils.mjs +28 -0
- package/build-module/utils/crdt-utils.mjs.map +2 -2
- package/build-module/utils/crdt.mjs +18 -3
- package/build-module/utils/crdt.mjs.map +2 -2
- package/build-types/actions.d.ts.map +1 -1
- package/build-types/awareness/base-awareness.d.ts +19 -0
- package/build-types/awareness/base-awareness.d.ts.map +1 -0
- package/build-types/awareness/config.d.ts +9 -0
- package/build-types/awareness/config.d.ts.map +1 -0
- package/build-types/awareness/post-editor-awareness.d.ts +38 -0
- package/build-types/awareness/post-editor-awareness.d.ts.map +1 -0
- package/build-types/awareness/types.d.ts +32 -0
- package/build-types/awareness/types.d.ts.map +1 -0
- package/build-types/awareness/utils.d.ts +22 -0
- package/build-types/awareness/utils.d.ts.map +1 -0
- package/build-types/entities.d.ts.map +1 -1
- package/build-types/entity-types/test/attachment.test.d.ts +10 -0
- package/build-types/entity-types/test/attachment.test.d.ts.map +1 -0
- package/build-types/index.d.ts.map +1 -1
- package/build-types/resolvers.d.ts.map +1 -1
- package/build-types/types.d.ts +12 -2
- package/build-types/types.d.ts.map +1 -1
- package/build-types/utils/block-selection-history.d.ts +47 -0
- package/build-types/utils/block-selection-history.d.ts.map +1 -0
- package/build-types/utils/crdt-selection.d.ts +16 -0
- package/build-types/utils/crdt-selection.d.ts.map +1 -0
- package/build-types/utils/crdt-user-selections.d.ts +66 -0
- package/build-types/utils/crdt-user-selections.d.ts.map +1 -0
- package/build-types/utils/crdt-utils.d.ts +12 -0
- package/build-types/utils/crdt-utils.d.ts.map +1 -1
- package/build-types/utils/crdt.d.ts +8 -14
- package/build-types/utils/crdt.d.ts.map +1 -1
- package/build-types/utils/test/block-selection-history.test.d.ts +2 -0
- package/build-types/utils/test/block-selection-history.test.d.ts.map +1 -0
- package/build-types/utils/test/crdt-blocks.d.ts +2 -0
- package/build-types/utils/test/crdt-blocks.d.ts.map +1 -0
- package/build-types/utils/test/crdt.d.ts +2 -0
- package/build-types/utils/test/crdt.d.ts.map +1 -0
- package/package.json +21 -18
- package/src/actions.js +40 -7
- package/src/awareness/base-awareness.ts +50 -0
- package/src/awareness/config.ts +9 -0
- package/src/awareness/post-editor-awareness.ts +167 -0
- package/src/awareness/types.ts +38 -0
- package/src/awareness/utils.ts +159 -0
- package/src/entities.js +32 -2
- package/src/entity-types/test/attachment.test.ts +4 -4
- package/src/resolvers.js +53 -1
- package/src/test/actions.js +402 -0
- package/src/test/entity-provider.js +2 -0
- package/src/test/resolvers.js +4 -0
- package/src/types.ts +12 -3
- package/src/utils/block-selection-history.ts +176 -0
- package/src/utils/crdt-selection.ts +205 -0
- package/src/utils/crdt-user-selections.ts +336 -0
- package/src/utils/crdt-utils.ts +54 -0
- package/src/utils/crdt.ts +36 -3
- package/src/utils/test/block-selection-history.test.ts +764 -0
- package/src/utils/test/crdt-blocks.ts +11 -4
package/build/resolvers.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/resolvers.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { additionalEntityConfigLoaders, DEFAULT_ENTITY_KEY } from './entities';\nimport { getSyncManager } from './sync';\nimport {\n\tforwardResolver,\n\tgetNormalizedCommaSeparable,\n\tgetUserPermissionCacheKey,\n\tgetUserPermissionsFromAllowHeader,\n\tALLOWED_RESOURCE_ACTIONS,\n\tRECEIVE_INTERMEDIATE_RESULTS,\n\tisNumericID,\n} from './utils';\nimport { fetchBlockPatterns } from './fetch';\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 =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst path = addQueryArgs(\n\t\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\t\tquery\n\t\t);\n\t\tconst users = await apiFetch( { path } );\n\t\tdispatch.receiveUserQuery( path, users );\n\t};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\t\tdispatch.receiveCurrentUser( currentUser );\n\t};\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. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getEntityRecord =\n\t( kind, name, key = '', query ) =>\n\tasync ( { select, dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, key ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t\t// and without causing `getEntityRecord` resolution to occur.\n\t\t\t\tconst hasRecord = select.hasEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tkey,\n\t\t\t\t\tquery\n\t\t\t\t);\n\t\t\t\tif ( hasRecord ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { baseURL } = entityConfig;\n\n\t\t\t// For \"string\" IDs, use the old templates endpoint.\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\t( ( key && typeof key === 'string' && ! /^\\d+$/.test( key ) ) ||\n\t\t\t\t\t! window?.__experimentalTemplateActivate )\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( baseURL + ( key ? '/' + key : '' ), {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\tconst record = await response.json();\n\t\t\tconst permissions = getUserPermissionsFromAllowHeader(\n\t\t\t\tresponse.headers?.get( 'allow' )\n\t\t\t);\n\n\t\t\tconst canUserResolutionsArgs = [];\n\t\t\tconst receiveUserPermissionArgs = {};\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\treceiveUserPermissionArgs[\n\t\t\t\t\tgetUserPermissionCacheKey( action, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tid: key,\n\t\t\t\t\t} )\n\t\t\t\t] = permissions[ action ];\n\n\t\t\t\tcanUserResolutionsArgs.push( [\n\t\t\t\t\taction,\n\t\t\t\t\t{ kind, name, id: key },\n\t\t\t\t] );\n\t\t\t}\n\n\t\t\t// Entity supports syncing.\n\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\tif (\n\t\t\t\t\tentityConfig.syncConfig &&\n\t\t\t\t\tisNumericID( key ) &&\n\t\t\t\t\t! query\n\t\t\t\t) {\n\t\t\t\t\tconst objectType = `${ kind }/${ name }`;\n\t\t\t\t\tconst objectId = key;\n\n\t\t\t\t\t// Use the new transient \"read/write\" config to compute transients for\n\t\t\t\t\t// the sync manager. Otherwise these transients are not available\n\t\t\t\t\t// if / until the record is edited. Use a copy of the record so that\n\t\t\t\t\t// it does not change the behavior outside this experimental flag.\n\t\t\t\t\tconst recordWithTransients = { ...record };\n\t\t\t\t\tObject.entries( entityConfig.transientEdits ?? {} )\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t( [ propName, transientConfig ] ) =>\n\t\t\t\t\t\t\t\tundefined ===\n\t\t\t\t\t\t\t\t\trecordWithTransients[ propName ] &&\n\t\t\t\t\t\t\t\ttransientConfig &&\n\t\t\t\t\t\t\t\t'object' === typeof transientConfig &&\n\t\t\t\t\t\t\t\t'read' in transientConfig &&\n\t\t\t\t\t\t\t\t'function' === typeof transientConfig.read\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.forEach( ( [ propName, transientConfig ] ) => {\n\t\t\t\t\t\t\trecordWithTransients[ propName ] =\n\t\t\t\t\t\t\t\ttransientConfig.read( recordWithTransients );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t// Load the entity record for syncing.\n\t\t\t\t\tawait getSyncManager()?.load(\n\t\t\t\t\t\tentityConfig.syncConfig,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\trecordWithTransients,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Handle edits sourced from the sync manager.\n\t\t\t\t\t\t\teditRecord: ( edits ) => {\n\t\t\t\t\t\t\t\tif ( ! Object.keys( edits ).length ) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdispatch( {\n\t\t\t\t\t\t\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\trecordId: key,\n\t\t\t\t\t\t\t\t\tedits,\n\t\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\t\tundo: undefined,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Get the current entity record (with edits)\n\t\t\t\t\t\t\tgetEditedRecord: async () =>\n\t\t\t\t\t\t\t\tawait resolveSelect.getEditedEntityRecord(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t// Refetch the current entity record from the database.\n\t\t\t\t\t\t\trefetchRecord: async () => {\n\t\t\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tawait apiFetch( { path, parse: true } ),\n\t\t\t\t\t\t\t\t\tquery\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Save the current entity record's unsaved edits.\n\t\t\t\t\t\t\tsaveRecord: () => {\n\t\t\t\t\t\t\t\tdispatch.saveEditedEntityRecord(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\t\t\t\tdispatch.receiveUserPermissions( receiveUserPermissionArgs );\n\t\t\t\tdispatch.finishResolutions( 'canUser', canUserResolutionsArgs );\n\t\t\t} );\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n// Whenever a template is saved, the active templates might be updated, so\n// invalidate the site settings when a template is updated or deleted.\ngetEntityRecord.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\tkind === 'root' &&\n\t\tname === 'site' &&\n\t\t( ( action.type === 'RECEIVE_ITEMS' &&\n\t\t\t// Making sure persistedEdits is set seems to be the only way of\n\t\t\t// knowing whether it's an update or fetch. Only an update would\n\t\t\t// have persistedEdits.\n\t\t\taction.persistedEdits &&\n\t\t\taction.persistedEdits.status !== 'auto-draft' ) ||\n\t\t\taction.type === 'REMOVE_ITEMS' ) &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\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. If requesting specific fields, fields\n * must always include the ID.\n */\nexport const getEntityRecords =\n\t( kind, name, query = {} ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\t// Keep a copy of the original query for later use in getResolutionsArgs.\n\t\t// The query object may be modified below (for example, when _fields is\n\t\t// specified), but we want to use the original query when marking\n\t\t// resolutions as finished.\n\t\tconst rawQuery = { ...query };\n\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\n\t\tfunction getResolutionsArgs( records, recordsQuery ) {\n\t\t\tconst queryArgs = Object.fromEntries(\n\t\t\t\tObject.entries( recordsQuery ).filter( ( [ k, v ] ) => {\n\t\t\t\t\treturn [ 'context', '_fields' ].includes( k ) && !! v;\n\t\t\t\t} )\n\t\t\t);\n\t\t\treturn records\n\t\t\t\t.filter( ( record ) => record?.[ key ] )\n\t\t\t\t.map( ( record ) => [\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecord[ key ],\n\t\t\t\t\tObject.keys( queryArgs ).length > 0 ? queryArgs : undefined,\n\t\t\t\t] );\n\t\t}\n\n\t\ttry {\n\t\t\tif ( query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet { baseURL } = entityConfig;\n\t\t\t// `combinedTemplates` means that we fetch templates from the \"old\"\n\t\t\t// /templates endpoint, which combines active user templates with\n\t\t\t// the registered templates and rewrites IDs in the form of\n\t\t\t// `theme-slug/template-slug`. When turned off, we only fetch\n\t\t\t// database templates (posts). To fetch registered templates without\n\t\t\t// edits applied, use the `registeredTemplate` entity.\n\t\t\tconst { combinedTemplates = true } = query;\n\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\tcombinedTemplates\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( baseURL, {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\n\t\t\tlet records = [],\n\t\t\t\tmeta;\n\t\t\tif ( entityConfig.supportsPagination && query.per_page !== -1 ) {\n\t\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t),\n\t\t\t\t\ttotalPages: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t} else if (\n\t\t\t\tquery.per_page === -1 &&\n\t\t\t\tquery[ RECEIVE_INTERMEDIATE_RESULTS ] === true\n\t\t\t) {\n\t\t\t\tlet page = 1;\n\t\t\t\tlet totalPages;\n\n\t\t\t\tdo {\n\t\t\t\t\tconst response = await apiFetch( {\n\t\t\t\t\t\tpath: addQueryArgs( path, { page, per_page: 100 } ),\n\t\t\t\t\t\tparse: false,\n\t\t\t\t\t} );\n\t\t\t\t\tconst pageRecords = Object.values( await response.json() );\n\n\t\t\t\t\ttotalPages = parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( ! meta ) {\n\t\t\t\t\t\tmeta = {\n\t\t\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttotalPages: 1,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\trecords.push( ...pageRecords );\n\t\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\trecords,\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tmeta\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\t\t\tgetResolutionsArgs( pageRecords, rawQuery )\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t\tpage++;\n\t\t\t\t} while ( page <= totalPages );\n\t\t\t} else {\n\t\t\t\trecords = Object.values( await apiFetch( { path } ) );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: records.length,\n\t\t\t\t\ttotalPages: 1,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\tconst targetHints = records\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t( record ) =>\n\t\t\t\t\t\t\t!! record?.[ key ] &&\n\t\t\t\t\t\t\t!! record?._links?.self?.[ 0 ]?.targetHints?.allow\n\t\t\t\t\t)\n\t\t\t\t\t.map( ( record ) => ( {\n\t\t\t\t\t\tid: record[ key ],\n\t\t\t\t\t\tpermissions: getUserPermissionsFromAllowHeader(\n\t\t\t\t\t\t\trecord._links.self[ 0 ].targetHints.allow\n\t\t\t\t\t\t),\n\t\t\t\t\t} ) );\n\n\t\t\t\tconst canUserResolutionsArgs = [];\n\t\t\t\tconst receiveUserPermissionArgs = {};\n\t\t\t\tfor ( const targetHint of targetHints ) {\n\t\t\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\t\t\tcanUserResolutionsArgs.push( [\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\t{ kind, name, id: targetHint.id },\n\t\t\t\t\t\t] );\n\n\t\t\t\t\t\treceiveUserPermissionArgs[\n\t\t\t\t\t\t\tgetUserPermissionCacheKey( action, {\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tid: targetHint.id,\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t] = targetHint.permissions[ action ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( targetHints.length > 0 ) {\n\t\t\t\t\tdispatch.receiveUserPermissions(\n\t\t\t\t\t\treceiveUserPermissionArgs\n\t\t\t\t\t);\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'canUser',\n\t\t\t\t\t\tcanUserResolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\tgetResolutionsArgs( records, rawQuery )\n\t\t\t\t);\n\n\t\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t\t} );\n\t\t} catch ( e ) {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\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 total number of entity records.\n */\nexport const getEntityRecordsTotalItems = forwardResolver( 'getEntityRecords' );\n\n/**\n * Requests the number of available pages for the given query.\n */\nexport const getEntityRecordsTotalPages = forwardResolver( 'getEntityRecords' );\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\n\t\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n\t};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview =\n\t( url ) =>\n\tasync ( { dispatch } ) => {\n\t\ttry {\n\t\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t\t} );\n\t\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t\t} catch ( error ) {\n\t\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\t\tdispatch.receiveEmbedPreview( url, false );\n\t\t}\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',\n * 'delete'.\n * @param {string|Object} resource Entity resource to check. Accepts entity object `{ kind: 'postType', name: 'attachment', id: 1 }`\n * or REST base as a string - `media`.\n * @param {?string} id ID of the rest resource to check.\n */\nexport const canUser =\n\t( requestedAction, resource, id ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tif ( ! ALLOWED_RESOURCE_ACTIONS.includes( requestedAction ) ) {\n\t\t\tthrow new Error( `'${ requestedAction }' is not a valid action.` );\n\t\t}\n\n\t\tconst { hasStartedResolution } = registry.select( STORE_NAME );\n\n\t\t// Prevent resolving the same resource twice.\n\t\tfor ( const relatedAction of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\tif ( relatedAction === requestedAction ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isAlreadyResolving = hasStartedResolution( 'canUser', [\n\t\t\t\trelatedAction,\n\t\t\t\tresource,\n\t\t\t\tid,\n\t\t\t] );\n\t\t\tif ( isAlreadyResolving ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet resourcePath = null;\n\t\tif ( typeof resource === 'object' ) {\n\t\t\tif ( ! resource.kind || ! resource.name ) {\n\t\t\t\tthrow new Error( 'The entity resource object is not valid.' );\n\t\t\t}\n\n\t\t\tconst configs = await resolveSelect.getEntitiesConfig(\n\t\t\t\tresource.kind\n\t\t\t);\n\t\t\tconst entityConfig = configs.find(\n\t\t\t\t( config ) =>\n\t\t\t\t\tconfig.name === resource.name &&\n\t\t\t\t\tconfig.kind === resource.kind\n\t\t\t);\n\t\t\tif ( ! entityConfig ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresourcePath =\n\t\t\t\tentityConfig.baseURL + ( resource.id ? '/' + resource.id : '' );\n\t\t} else {\n\t\t\tresourcePath = `/wp/v2/${ resource }` + ( id ? '/' + id : '' );\n\t\t}\n\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await apiFetch( {\n\t\t\t\tpath: resourcePath,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t\tparse: false,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\t\treturn;\n\t\t}\n\n\t\t// Optional chaining operator is used here because the API requests don't\n\t\t// return the expected result in the React native version. Instead, API requests\n\t\t// only return the result, without including response properties like the headers.\n\t\tconst permissions = getUserPermissionsFromAllowHeader(\n\t\t\tresponse.headers?.get( 'allow' )\n\t\t);\n\t\tregistry.batch( () => {\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\tconst key = getUserPermissionCacheKey( action, resource, id );\n\n\t\t\t\tdispatch.receiveUserPermission( key, permissions[ action ] );\n\n\t\t\t\t// Mark related action resolutions as finished.\n\t\t\t\tif ( action !== requestedAction ) {\n\t\t\t\t\tdispatch.finishResolution( 'canUser', [\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tresource,\n\t\t\t\t\t\tid,\n\t\t\t\t\t] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\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 {number|string} recordId Record's id.\n */\nexport const canUserEditEntityRecord =\n\t( kind, name, recordId ) =>\n\tasync ( { dispatch } ) => {\n\t\tawait dispatch( canUser( 'update', { kind, name, id: recordId } ) );\n\t};\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 =\n\t( postType, postId ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst {\n\t\t\trest_base: restBase,\n\t\t\trest_namespace: restNamespace = 'wp/v2',\n\t\t\tsupports,\n\t\t} = await resolveSelect.getPostType( postType );\n\t\tif ( ! supports?.autosave ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst autosaves = await apiFetch( {\n\t\t\tpath: `/${ restNamespace }/${ restBase }/${ postId }/autosaves?context=edit`,\n\t\t} );\n\n\t\tif ( autosaves && autosaves.length ) {\n\t\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t\t}\n\t};\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 =\n\t( postType, postId ) =>\n\tasync ( { resolveSelect } ) => {\n\t\tawait resolveSelect.getAutosaves( postType, postId );\n\t};\n\nexport const __experimentalGetCurrentGlobalStylesId =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\t\tconst globalStylesURL =\n\t\t\tactiveThemes?.[ 0 ]?._links?.[ 'wp:user-global-styles' ]?.[ 0 ]\n\t\t\t\t?.href;\n\t\tif ( ! globalStylesURL ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Regex matches the ID at the end of a URL or immediately before\n\t\t// the query string.\n\t\tconst matches = globalStylesURL.match( /\\/(\\d+)(?:\\?|$)/ );\n\t\tconst id = matches ? Number( matches[ 1 ] ) : null;\n\n\t\tif ( id ) {\n\t\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId( id );\n\t\t}\n\t};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\t// Please adjust the preloaded requests if this changes!\n\t\tconst themeGlobalStyles = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }?context=view`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tthemeGlobalStyles\n\t\t);\n\t};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\t// Please adjust the preloaded requests if this changes!\n\t\tconst variations = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations?context=view`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tvariations\n\t\t);\n\t};\n\n/**\n * Fetches and returns the revisions of the current global styles theme.\n */\nexport const getCurrentThemeGlobalStylesRevisions =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst globalStylesId =\n\t\t\tawait resolveSelect.__experimentalGetCurrentGlobalStylesId();\n\t\tconst record = globalStylesId\n\t\t\t? await resolveSelect.getEntityRecord(\n\t\t\t\t\t'root',\n\t\t\t\t\t'globalStyles',\n\t\t\t\t\tglobalStylesId\n\t\t\t )\n\t\t\t: undefined;\n\t\tconst revisionsURL = record?._links?.[ 'version-history' ]?.[ 0 ]?.href;\n\n\t\tif ( revisionsURL ) {\n\t\t\tconst resetRevisions = await apiFetch( {\n\t\t\t\turl: revisionsURL,\n\t\t\t} );\n\t\t\tconst revisions = resetRevisions?.map( ( revision ) =>\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tObject.entries( revision ).map( ( [ key, value ] ) => [\n\t\t\t\t\t\tcamelCase( key ),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t] )\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch.receiveThemeGlobalStyleRevisions(\n\t\t\t\tglobalStylesId,\n\t\t\t\trevisions\n\t\t\t);\n\t\t}\n\t};\n\ngetCurrentThemeGlobalStylesRevisions.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\t\taction.kind === 'root' &&\n\t\t! action.error &&\n\t\taction.name === 'globalStyles'\n\t);\n};\n\nexport const getBlockPatterns =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst patterns = await fetchBlockPatterns();\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERNS', patterns } );\n\t};\n\nexport const getBlockPatternCategories =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst categories = await apiFetch( {\n\t\t\tpath: '/wp/v2/block-patterns/categories',\n\t\t} );\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', categories } );\n\t};\n\nexport const getUserPatternCategories =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst patternCategories = await resolveSelect.getEntityRecords(\n\t\t\t'taxonomy',\n\t\t\t'wp_pattern_category',\n\t\t\t{\n\t\t\t\tper_page: -1,\n\t\t\t\t_fields: 'id,name,description,slug',\n\t\t\t\tcontext: 'view',\n\t\t\t}\n\t\t);\n\n\t\tconst mappedPatternCategories =\n\t\t\tpatternCategories?.map( ( userCategory ) => ( {\n\t\t\t\t...userCategory,\n\t\t\t\tlabel: decodeEntities( userCategory.name ),\n\t\t\t\tname: userCategory.slug,\n\t\t\t} ) ) || [];\n\n\t\tdispatch( {\n\t\t\ttype: 'RECEIVE_USER_PATTERN_CATEGORIES',\n\t\t\tpatternCategories: mappedPatternCategories,\n\t\t} );\n\t};\n\nexport const getNavigationFallbackId =\n\t() =>\n\tasync ( { dispatch, select, registry } ) => {\n\t\tconst fallback = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp-block-editor/v1/navigation-fallback', {\n\t\t\t\t_embed: true,\n\t\t\t} ),\n\t\t} );\n\n\t\tconst record = fallback?._embedded?.self;\n\n\t\tregistry.batch( () => {\n\t\t\tdispatch.receiveNavigationFallbackId( fallback?.id );\n\n\t\t\tif ( ! record ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the fallback is already in the store, don't invalidate navigation queries.\n\t\t\t// Otherwise, invalidate the cache for the scenario where there were no Navigation\n\t\t\t// posts in the state and the fallback created one.\n\t\t\tconst existingFallbackEntityRecord = select.getEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id\n\t\t\t);\n\t\t\tconst invalidateNavigationQueries = ! existingFallbackEntityRecord;\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\trecord,\n\t\t\t\tundefined,\n\t\t\t\tinvalidateNavigationQueries\n\t\t\t);\n\n\t\t\t// Resolve to avoid further network requests.\n\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id,\n\t\t\t] );\n\t\t} );\n\t};\n\nexport const getDefaultTemplateId =\n\t( query ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst template = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/templates/lookup', query ),\n\t\t} );\n\t\t// Wait for the the entities config to be loaded, otherwise receiving\n\t\t// the template as an entity will not work.\n\t\tawait resolveSelect.getEntitiesConfig( 'postType' );\n\t\t// When active_templates experiment is enabled, use numeric wp_id if it\n\t\t// exists, otherwise fall back to string ID format (theme//slug) as the\n\t\t// frontend expects string IDs for templates.\n\t\tconst id = window?.__experimentalTemplateActivate\n\t\t\t? template?.wp_id || template?.id\n\t\t\t: template?.id;\n\t\t// Endpoint may return an empty object if no template is found.\n\t\tif ( id ) {\n\t\t\ttemplate.id = id;\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveDefaultTemplateId( query, id );\n\t\t\t\tdispatch.receiveEntityRecords( 'postType', template.type, [\n\t\t\t\t\ttemplate,\n\t\t\t\t] );\n\t\t\t\t// Avoid further network requests.\n\t\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t\t'postType',\n\t\t\t\t\ttemplate.type,\n\t\t\t\t\tid,\n\t\t\t\t] );\n\t\t\t} );\n\t\t}\n\t};\n\ngetDefaultTemplateId.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'RECEIVE_ITEMS' &&\n\t\taction.kind === 'root' &&\n\t\taction.name === 'site'\n\t);\n};\n\n/**\n * Requests an entity's revisions from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevisions =\n\t( kind, name, recordKey, query = {} ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\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: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet records, response;\n\t\tconst meta = {};\n\t\tconst isPaginated =\n\t\t\tentityConfig.supportsPagination && query.per_page !== -1;\n\t\ttry {\n\t\t\tresponse = await apiFetch( { path, parse: ! isPaginated } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( response ) {\n\t\t\tif ( isPaginated ) {\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta.totalItems = parseInt(\n\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecords = Object.values( response );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveRevisions(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordKey,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t\t// resolve the `getRevision` selector in addition to `getRevisions`.\n\t\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t\t\t.map( ( record ) => [\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\trecordKey,\n\t\t\t\t\t\t\trecord[ key ],\n\t\t\t\t\t\t] );\n\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'getRevision',\n\t\t\t\t\t\tresolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\n// Invalidate cache when a new revision is created.\ngetRevisions.shouldInvalidate = ( action, kind, name, recordKey ) =>\n\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\tname === action.name &&\n\tkind === action.kind &&\n\t! action.error &&\n\trecordKey === action.recordId;\n\n/**\n * Requests a specific Entity revision from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {number|string} revisionKey The revision's key.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevision =\n\t( kind, name, recordKey, revisionKey, query ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\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: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey, revisionKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet record;\n\t\ttry {\n\t\t\trecord = await apiFetch( { path } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveRevisions( kind, name, recordKey, record, query );\n\t\t}\n\t};\n\n/**\n * Requests a specific post type options from the REST API.\n *\n * @param {string} postType Post type slug.\n */\nexport const getRegisteredPostMeta =\n\t( postType ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlet options;\n\t\ttry {\n\t\t\tconst {\n\t\t\t\trest_namespace: restNamespace = 'wp/v2',\n\t\t\t\trest_base: restBase,\n\t\t\t} = ( await resolveSelect.getPostType( postType ) ) || {};\n\t\t\toptions = await apiFetch( {\n\t\t\t\tpath: `${ restNamespace }/${ restBase }/?context=edit`,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if the request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( options ) {\n\t\t\tdispatch.receiveRegisteredPostMeta(\n\t\t\t\tpostType,\n\t\t\t\toptions?.schema?.properties?.meta?.properties\n\t\t\t);\n\t\t}\n\t};\n\n/**\n * Requests entity configs for the given kind from the REST API.\n *\n * @param {string} kind Entity kind.\n */\nexport const getEntitiesConfig =\n\t( kind ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst loader = additionalEntityConfigLoaders.find(\n\t\t\t( l ) => l.kind === kind\n\t\t);\n\n\t\tif ( ! loader ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst configs = await loader.loadEntities();\n\t\t\tif ( ! configs.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch.addEntities( configs );\n\t\t} catch {\n\t\t\t// Do nothing if the request comes back with an API error.\n\t\t}\n\t};\n\n/**\n * Requests editor settings from the REST API.\n */\nexport const getEditorSettings =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst settings = await apiFetch( {\n\t\t\tpath: '/wp-block-editor/v1/settings',\n\t\t} );\n\t\tdispatch.receiveEditorSettings( settings );\n\t};\n\n/**\n * Requests editor assets from the REST API.\n */\nexport const getEditorAssets =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst assets = await apiFetch( {\n\t\t\tpath: '/wp-block-editor/v1/assets',\n\t\t} );\n\t\tdispatch.receiveEditorAssets( assets );\n\t};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport { camelCase } from 'change-case';\n\n/**\n * WordPress dependencies\n */\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport { STORE_NAME } from './name';\nimport { additionalEntityConfigLoaders, DEFAULT_ENTITY_KEY } from './entities';\nimport { getSyncManager } from './sync';\nimport {\n\tforwardResolver,\n\tgetNormalizedCommaSeparable,\n\tgetUserPermissionCacheKey,\n\tgetUserPermissionsFromAllowHeader,\n\tALLOWED_RESOURCE_ACTIONS,\n\tRECEIVE_INTERMEDIATE_RESULTS,\n\tisNumericID,\n} from './utils';\nimport { fetchBlockPatterns } from './fetch';\nimport { restoreSelection, getSelectionHistory } from './utils/crdt-selection';\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 =\n\t( query ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst path = addQueryArgs(\n\t\t\t'/wp/v2/users/?who=authors&per_page=100',\n\t\t\tquery\n\t\t);\n\t\tconst users = await apiFetch( { path } );\n\t\tdispatch.receiveUserQuery( path, users );\n\t};\n\n/**\n * Requests the current user from the REST API.\n */\nexport const getCurrentUser =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst currentUser = await apiFetch( { path: '/wp/v2/users/me' } );\n\t\tdispatch.receiveCurrentUser( currentUser );\n\t};\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. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getEntityRecord =\n\t( kind, name, key = '', query ) =>\n\tasync ( { select, dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name, key ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\ttry {\n\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tentityConfig.key || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif ( query !== undefined && query._fields ) {\n\t\t\t\t// The resolution cache won't consider query as reusable based on the\n\t\t\t\t// fields, so it's tested here, prior to initiating the REST request,\n\t\t\t\t// and without causing `getEntityRecord` resolution to occur.\n\t\t\t\tconst hasRecord = select.hasEntityRecord(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\tkey,\n\t\t\t\t\tquery\n\t\t\t\t);\n\t\t\t\tif ( hasRecord ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet { baseURL } = entityConfig;\n\n\t\t\t// For \"string\" IDs, use the old templates endpoint.\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\t( ( key && typeof key === 'string' && ! /^\\d+$/.test( key ) ) ||\n\t\t\t\t\t! window?.__experimentalTemplateActivate )\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( baseURL + ( key ? '/' + key : '' ), {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\tconst record = await response.json();\n\t\t\tconst permissions = getUserPermissionsFromAllowHeader(\n\t\t\t\tresponse.headers?.get( 'allow' )\n\t\t\t);\n\n\t\t\tconst canUserResolutionsArgs = [];\n\t\t\tconst receiveUserPermissionArgs = {};\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\treceiveUserPermissionArgs[\n\t\t\t\t\tgetUserPermissionCacheKey( action, {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tid: key,\n\t\t\t\t\t} )\n\t\t\t\t] = permissions[ action ];\n\n\t\t\t\tcanUserResolutionsArgs.push( [\n\t\t\t\t\taction,\n\t\t\t\t\t{ kind, name, id: key },\n\t\t\t\t] );\n\t\t\t}\n\n\t\t\t// Entity supports syncing.\n\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\tif (\n\t\t\t\t\tentityConfig.syncConfig &&\n\t\t\t\t\tisNumericID( key ) &&\n\t\t\t\t\t! query\n\t\t\t\t) {\n\t\t\t\t\tconst objectType = `${ kind }/${ name }`;\n\t\t\t\t\tconst objectId = key;\n\n\t\t\t\t\t// Use the new transient \"read/write\" config to compute transients for\n\t\t\t\t\t// the sync manager. Otherwise these transients are not available\n\t\t\t\t\t// if / until the record is edited. Use a copy of the record so that\n\t\t\t\t\t// it does not change the behavior outside this experimental flag.\n\t\t\t\t\tconst recordWithTransients = { ...record };\n\t\t\t\t\tObject.entries( entityConfig.transientEdits ?? {} )\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t( [ propName, transientConfig ] ) =>\n\t\t\t\t\t\t\t\tundefined ===\n\t\t\t\t\t\t\t\t\trecordWithTransients[ propName ] &&\n\t\t\t\t\t\t\t\ttransientConfig &&\n\t\t\t\t\t\t\t\t'object' === typeof transientConfig &&\n\t\t\t\t\t\t\t\t'read' in transientConfig &&\n\t\t\t\t\t\t\t\t'function' === typeof transientConfig.read\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.forEach( ( [ propName, transientConfig ] ) => {\n\t\t\t\t\t\t\trecordWithTransients[ propName ] =\n\t\t\t\t\t\t\t\ttransientConfig.read( recordWithTransients );\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t// Load the entity record for syncing.\n\t\t\t\t\tawait getSyncManager()?.load(\n\t\t\t\t\t\tentityConfig.syncConfig,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\tobjectId,\n\t\t\t\t\t\trecordWithTransients,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// Handle edits sourced from the sync manager.\n\t\t\t\t\t\t\teditRecord: ( edits, options = {} ) => {\n\t\t\t\t\t\t\t\tif ( ! Object.keys( edits ).length ) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdispatch( {\n\t\t\t\t\t\t\t\t\ttype: 'EDIT_ENTITY_RECORD',\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\trecordId: key,\n\t\t\t\t\t\t\t\t\tedits,\n\t\t\t\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t\t\t\tundo: undefined,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Get the current entity record (with edits)\n\t\t\t\t\t\t\tgetEditedRecord: async () =>\n\t\t\t\t\t\t\t\tawait resolveSelect.getEditedEntityRecord(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t// Refetch the current entity record from the database.\n\t\t\t\t\t\t\trefetchRecord: async () => {\n\t\t\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tawait apiFetch( { path, parse: true } ),\n\t\t\t\t\t\t\t\t\tquery\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t// Save the current entity record's unsaved edits.\n\t\t\t\t\t\t\tsaveRecord: () => {\n\t\t\t\t\t\t\t\tdispatch.saveEditedEntityRecord(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\taddUndoMeta: ( ydoc, meta ) => {\n\t\t\t\t\t\t\t\tconst selectionHistory =\n\t\t\t\t\t\t\t\t\tgetSelectionHistory( ydoc );\n\n\t\t\t\t\t\t\t\tif ( selectionHistory ) {\n\t\t\t\t\t\t\t\t\tmeta.set(\n\t\t\t\t\t\t\t\t\t\t'selectionHistory',\n\t\t\t\t\t\t\t\t\t\tselectionHistory\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trestoreUndoMeta: ( ydoc, meta ) => {\n\t\t\t\t\t\t\t\tconst selectionHistory =\n\t\t\t\t\t\t\t\t\tmeta.get( 'selectionHistory' );\n\n\t\t\t\t\t\t\t\tif ( selectionHistory ) {\n\t\t\t\t\t\t\t\t\t// Because Yjs initiates an undo, we need to\n\t\t\t\t\t\t\t\t\t// wait until the content is restored before\n\t\t\t\t\t\t\t\t\t// we can update the selection.\n\t\t\t\t\t\t\t\t\t// Use setTimeout() to wait until content is\n\t\t\t\t\t\t\t\t\t// finished updating, and then set the correct\n\t\t\t\t\t\t\t\t\t// selection.\n\t\t\t\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\t\t\t\trestoreSelection(\n\t\t\t\t\t\t\t\t\t\t\tselectionHistory,\n\t\t\t\t\t\t\t\t\t\t\tydoc\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}, 0 );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords( kind, name, record, query );\n\t\t\t\tdispatch.receiveUserPermissions( receiveUserPermissionArgs );\n\t\t\t\tdispatch.finishResolutions( 'canUser', canUserResolutionsArgs );\n\t\t\t} );\n\t\t} finally {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\n\n// Whenever a template is saved, the active templates might be updated, so\n// invalidate the site settings when a template is updated or deleted.\ngetEntityRecord.shouldInvalidate = ( action, kind, name ) => {\n\treturn (\n\t\tkind === 'root' &&\n\t\tname === 'site' &&\n\t\t( ( action.type === 'RECEIVE_ITEMS' &&\n\t\t\t// Making sure persistedEdits is set seems to be the only way of\n\t\t\t// knowing whether it's an update or fetch. Only an update would\n\t\t\t// have persistedEdits.\n\t\t\taction.persistedEdits &&\n\t\t\taction.persistedEdits.status !== 'auto-draft' ) ||\n\t\t\taction.type === 'REMOVE_ITEMS' ) &&\n\t\taction.kind === 'postType' &&\n\t\taction.name === 'wp_template'\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. If requesting specific fields, fields\n * must always include the ID.\n */\nexport const getEntityRecords =\n\t( kind, name, query = {} ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lock = await dispatch.__unstableAcquireStoreLock(\n\t\t\tSTORE_NAME,\n\t\t\t[ 'entities', 'records', kind, name ],\n\t\t\t{ exclusive: false }\n\t\t);\n\n\t\t// Keep a copy of the original query for later use in getResolutionsArgs.\n\t\t// The query object may be modified below (for example, when _fields is\n\t\t// specified), but we want to use the original query when marking\n\t\t// resolutions as finished.\n\t\tconst rawQuery = { ...query };\n\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\n\t\tfunction getResolutionsArgs( records, recordsQuery ) {\n\t\t\tconst queryArgs = Object.fromEntries(\n\t\t\t\tObject.entries( recordsQuery ).filter( ( [ k, v ] ) => {\n\t\t\t\t\treturn [ 'context', '_fields' ].includes( k ) && !! v;\n\t\t\t\t} )\n\t\t\t);\n\t\t\treturn records\n\t\t\t\t.filter( ( record ) => record?.[ key ] )\n\t\t\t\t.map( ( record ) => [\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecord[ key ],\n\t\t\t\t\tObject.keys( queryArgs ).length > 0 ? queryArgs : undefined,\n\t\t\t\t] );\n\t\t}\n\n\t\ttry {\n\t\t\tif ( query._fields ) {\n\t\t\t\t// If requesting specific fields, items and query association to said\n\t\t\t\t// records are stored by ID reference. Thus, fields must always include\n\t\t\t\t// the ID.\n\t\t\t\tquery = {\n\t\t\t\t\t...query,\n\t\t\t\t\t_fields: [\n\t\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t] ),\n\t\t\t\t\t].join(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet { baseURL } = entityConfig;\n\t\t\t// `combinedTemplates` means that we fetch templates from the \"old\"\n\t\t\t// /templates endpoint, which combines active user templates with\n\t\t\t// the registered templates and rewrites IDs in the form of\n\t\t\t// `theme-slug/template-slug`. When turned off, we only fetch\n\t\t\t// database templates (posts). To fetch registered templates without\n\t\t\t// edits applied, use the `registeredTemplate` entity.\n\t\t\tconst { combinedTemplates = true } = query;\n\n\t\t\tif (\n\t\t\t\tkind === 'postType' &&\n\t\t\t\tname === 'wp_template' &&\n\t\t\t\tcombinedTemplates\n\t\t\t) {\n\t\t\t\tbaseURL =\n\t\t\t\t\tbaseURL.slice( 0, baseURL.lastIndexOf( '/' ) ) +\n\t\t\t\t\t'/templates';\n\t\t\t}\n\n\t\t\tconst path = addQueryArgs( baseURL, {\n\t\t\t\t...entityConfig.baseURLParams,\n\t\t\t\t...query,\n\t\t\t} );\n\n\t\t\tlet records = [],\n\t\t\t\tmeta;\n\t\t\tif ( entityConfig.supportsPagination && query.per_page !== -1 ) {\n\t\t\t\tconst response = await apiFetch( { path, parse: false } );\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t),\n\t\t\t\t\ttotalPages: parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t} else if (\n\t\t\t\tquery.per_page === -1 &&\n\t\t\t\tquery[ RECEIVE_INTERMEDIATE_RESULTS ] === true\n\t\t\t) {\n\t\t\t\tlet page = 1;\n\t\t\t\tlet totalPages;\n\n\t\t\t\tdo {\n\t\t\t\t\tconst response = await apiFetch( {\n\t\t\t\t\t\tpath: addQueryArgs( path, { page, per_page: 100 } ),\n\t\t\t\t\t\tparse: false,\n\t\t\t\t\t} );\n\t\t\t\t\tconst pageRecords = Object.values( await response.json() );\n\n\t\t\t\t\ttotalPages = parseInt(\n\t\t\t\t\t\tresponse.headers.get( 'X-WP-TotalPages' )\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( ! meta ) {\n\t\t\t\t\t\tmeta = {\n\t\t\t\t\t\t\ttotalItems: parseInt(\n\t\t\t\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\ttotalPages: 1,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\trecords.push( ...pageRecords );\n\t\t\t\t\tregistry.batch( () => {\n\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\trecords,\n\t\t\t\t\t\t\tquery,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tmeta\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\t\t\tgetResolutionsArgs( pageRecords, rawQuery )\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t\tpage++;\n\t\t\t\t} while ( page <= totalPages );\n\t\t\t} else {\n\t\t\t\trecords = Object.values( await apiFetch( { path } ) );\n\t\t\t\tmeta = {\n\t\t\t\t\ttotalItems: records.length,\n\t\t\t\t\ttotalPages: 1,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif ( globalThis.IS_GUTENBERG_PLUGIN ) {\n\t\t\t\tif ( entityConfig.syncConfig && -1 === query.per_page ) {\n\t\t\t\t\tconst objectType = `${ kind }/${ name }`;\n\t\t\t\t\tgetSyncManager()?.loadCollection(\n\t\t\t\t\t\tentityConfig.syncConfig,\n\t\t\t\t\t\tobjectType,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trefetchRecords: async () => {\n\t\t\t\t\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\tawait apiFetch( { path, parse: true } ),\n\t\t\t\t\t\t\t\t\tquery\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tundefined,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\tconst targetHints = records\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t( record ) =>\n\t\t\t\t\t\t\t!! record?.[ key ] &&\n\t\t\t\t\t\t\t!! record?._links?.self?.[ 0 ]?.targetHints?.allow\n\t\t\t\t\t)\n\t\t\t\t\t.map( ( record ) => ( {\n\t\t\t\t\t\tid: record[ key ],\n\t\t\t\t\t\tpermissions: getUserPermissionsFromAllowHeader(\n\t\t\t\t\t\t\trecord._links.self[ 0 ].targetHints.allow\n\t\t\t\t\t\t),\n\t\t\t\t\t} ) );\n\n\t\t\t\tconst canUserResolutionsArgs = [];\n\t\t\t\tconst receiveUserPermissionArgs = {};\n\t\t\t\tfor ( const targetHint of targetHints ) {\n\t\t\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\t\t\tcanUserResolutionsArgs.push( [\n\t\t\t\t\t\t\taction,\n\t\t\t\t\t\t\t{ kind, name, id: targetHint.id },\n\t\t\t\t\t\t] );\n\n\t\t\t\t\t\treceiveUserPermissionArgs[\n\t\t\t\t\t\t\tgetUserPermissionCacheKey( action, {\n\t\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\tid: targetHint.id,\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t] = targetHint.permissions[ action ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( targetHints.length > 0 ) {\n\t\t\t\t\tdispatch.receiveUserPermissions(\n\t\t\t\t\t\treceiveUserPermissionArgs\n\t\t\t\t\t);\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'canUser',\n\t\t\t\t\t\tcanUserResolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t'getEntityRecord',\n\t\t\t\t\tgetResolutionsArgs( records, rawQuery )\n\t\t\t\t);\n\n\t\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t\t} );\n\t\t} catch ( e ) {\n\t\t\tdispatch.__unstableReleaseStoreLock( lock );\n\t\t}\n\t};\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 total number of entity records.\n */\nexport const getEntityRecordsTotalItems = forwardResolver( 'getEntityRecords' );\n\n/**\n * Requests the number of available pages for the given query.\n */\nexport const getEntityRecordsTotalPages = forwardResolver( 'getEntityRecords' );\n\n/**\n * Requests the current theme.\n */\nexport const getCurrentTheme =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\n\t\tdispatch.receiveCurrentTheme( activeThemes[ 0 ] );\n\t};\n\n/**\n * Requests theme supports data from the index.\n */\nexport const getThemeSupports = forwardResolver( 'getCurrentTheme' );\n\n/**\n * Requests a preview from the Embed API.\n *\n * @param {string} url URL to get the preview for.\n */\nexport const getEmbedPreview =\n\t( url ) =>\n\tasync ( { dispatch } ) => {\n\t\ttry {\n\t\t\tconst embedProxyResponse = await apiFetch( {\n\t\t\t\tpath: addQueryArgs( '/oembed/1.0/proxy', { url } ),\n\t\t\t} );\n\t\t\tdispatch.receiveEmbedPreview( url, embedProxyResponse );\n\t\t} catch ( error ) {\n\t\t\t// Embed API 404s if the URL cannot be embedded, so we have to catch the error from the apiRequest here.\n\t\t\tdispatch.receiveEmbedPreview( url, false );\n\t\t}\n\t};\n\n/**\n * Checks whether the current user can perform the given action on the given\n * REST resource.\n *\n * @param {string} requestedAction Action to check. One of: 'create', 'read', 'update',\n * 'delete'.\n * @param {string|Object} resource Entity resource to check. Accepts entity object `{ kind: 'postType', name: 'attachment', id: 1 }`\n * or REST base as a string - `media`.\n * @param {?string} id ID of the rest resource to check.\n */\nexport const canUser =\n\t( requestedAction, resource, id ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tif ( ! ALLOWED_RESOURCE_ACTIONS.includes( requestedAction ) ) {\n\t\t\tthrow new Error( `'${ requestedAction }' is not a valid action.` );\n\t\t}\n\n\t\tconst { hasStartedResolution } = registry.select( STORE_NAME );\n\n\t\t// Prevent resolving the same resource twice.\n\t\tfor ( const relatedAction of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\tif ( relatedAction === requestedAction ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isAlreadyResolving = hasStartedResolution( 'canUser', [\n\t\t\t\trelatedAction,\n\t\t\t\tresource,\n\t\t\t\tid,\n\t\t\t] );\n\t\t\tif ( isAlreadyResolving ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet resourcePath = null;\n\t\tif ( typeof resource === 'object' ) {\n\t\t\tif ( ! resource.kind || ! resource.name ) {\n\t\t\t\tthrow new Error( 'The entity resource object is not valid.' );\n\t\t\t}\n\n\t\t\tconst configs = await resolveSelect.getEntitiesConfig(\n\t\t\t\tresource.kind\n\t\t\t);\n\t\t\tconst entityConfig = configs.find(\n\t\t\t\t( config ) =>\n\t\t\t\t\tconfig.name === resource.name &&\n\t\t\t\t\tconfig.kind === resource.kind\n\t\t\t);\n\t\t\tif ( ! entityConfig ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresourcePath =\n\t\t\t\tentityConfig.baseURL + ( resource.id ? '/' + resource.id : '' );\n\t\t} else {\n\t\t\tresourcePath = `/wp/v2/${ resource }` + ( id ? '/' + id : '' );\n\t\t}\n\n\t\tlet response;\n\t\ttry {\n\t\t\tresponse = await apiFetch( {\n\t\t\t\tpath: resourcePath,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t\tparse: false,\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our OPTIONS request comes back with an API error (4xx or\n\t\t\t// 5xx). The previously determined isAllowed value will remain in the store.\n\t\t\treturn;\n\t\t}\n\n\t\t// Optional chaining operator is used here because the API requests don't\n\t\t// return the expected result in the React native version. Instead, API requests\n\t\t// only return the result, without including response properties like the headers.\n\t\tconst permissions = getUserPermissionsFromAllowHeader(\n\t\t\tresponse.headers?.get( 'allow' )\n\t\t);\n\t\tregistry.batch( () => {\n\t\t\tfor ( const action of ALLOWED_RESOURCE_ACTIONS ) {\n\t\t\t\tconst key = getUserPermissionCacheKey( action, resource, id );\n\n\t\t\t\tdispatch.receiveUserPermission( key, permissions[ action ] );\n\n\t\t\t\t// Mark related action resolutions as finished.\n\t\t\t\tif ( action !== requestedAction ) {\n\t\t\t\t\tdispatch.finishResolution( 'canUser', [\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tresource,\n\t\t\t\t\t\tid,\n\t\t\t\t\t] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\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 {number|string} recordId Record's id.\n */\nexport const canUserEditEntityRecord =\n\t( kind, name, recordId ) =>\n\tasync ( { dispatch } ) => {\n\t\tawait dispatch( canUser( 'update', { kind, name, id: recordId } ) );\n\t};\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 =\n\t( postType, postId ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst {\n\t\t\trest_base: restBase,\n\t\t\trest_namespace: restNamespace = 'wp/v2',\n\t\t\tsupports,\n\t\t} = await resolveSelect.getPostType( postType );\n\t\tif ( ! supports?.autosave ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst autosaves = await apiFetch( {\n\t\t\tpath: `/${ restNamespace }/${ restBase }/${ postId }/autosaves?context=edit`,\n\t\t} );\n\n\t\tif ( autosaves && autosaves.length ) {\n\t\t\tdispatch.receiveAutosaves( postId, autosaves );\n\t\t}\n\t};\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 =\n\t( postType, postId ) =>\n\tasync ( { resolveSelect } ) => {\n\t\tawait resolveSelect.getAutosaves( postType, postId );\n\t};\n\nexport const __experimentalGetCurrentGlobalStylesId =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst activeThemes = await resolveSelect.getEntityRecords(\n\t\t\t'root',\n\t\t\t'theme',\n\t\t\t{ status: 'active' }\n\t\t);\n\t\tconst globalStylesURL =\n\t\t\tactiveThemes?.[ 0 ]?._links?.[ 'wp:user-global-styles' ]?.[ 0 ]\n\t\t\t\t?.href;\n\t\tif ( ! globalStylesURL ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Regex matches the ID at the end of a URL or immediately before\n\t\t// the query string.\n\t\tconst matches = globalStylesURL.match( /\\/(\\d+)(?:\\?|$)/ );\n\t\tconst id = matches ? Number( matches[ 1 ] ) : null;\n\n\t\tif ( id ) {\n\t\t\tdispatch.__experimentalReceiveCurrentGlobalStylesId( id );\n\t\t}\n\t};\n\nexport const __experimentalGetCurrentThemeBaseGlobalStyles =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\t// Please adjust the preloaded requests if this changes!\n\t\tconst themeGlobalStyles = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }?context=view`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeBaseGlobalStyles(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tthemeGlobalStyles\n\t\t);\n\t};\n\nexport const __experimentalGetCurrentThemeGlobalStylesVariations =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst currentTheme = await resolveSelect.getCurrentTheme();\n\t\t// Please adjust the preloaded requests if this changes!\n\t\tconst variations = await apiFetch( {\n\t\t\tpath: `/wp/v2/global-styles/themes/${ currentTheme.stylesheet }/variations?context=view`,\n\t\t} );\n\t\tdispatch.__experimentalReceiveThemeGlobalStyleVariations(\n\t\t\tcurrentTheme.stylesheet,\n\t\t\tvariations\n\t\t);\n\t};\n\n/**\n * Fetches and returns the revisions of the current global styles theme.\n */\nexport const getCurrentThemeGlobalStylesRevisions =\n\t() =>\n\tasync ( { resolveSelect, dispatch } ) => {\n\t\tconst globalStylesId =\n\t\t\tawait resolveSelect.__experimentalGetCurrentGlobalStylesId();\n\t\tconst record = globalStylesId\n\t\t\t? await resolveSelect.getEntityRecord(\n\t\t\t\t\t'root',\n\t\t\t\t\t'globalStyles',\n\t\t\t\t\tglobalStylesId\n\t\t\t )\n\t\t\t: undefined;\n\t\tconst revisionsURL = record?._links?.[ 'version-history' ]?.[ 0 ]?.href;\n\n\t\tif ( revisionsURL ) {\n\t\t\tconst resetRevisions = await apiFetch( {\n\t\t\t\turl: revisionsURL,\n\t\t\t} );\n\t\t\tconst revisions = resetRevisions?.map( ( revision ) =>\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tObject.entries( revision ).map( ( [ key, value ] ) => [\n\t\t\t\t\t\tcamelCase( key ),\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t] )\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch.receiveThemeGlobalStyleRevisions(\n\t\t\t\tglobalStylesId,\n\t\t\t\trevisions\n\t\t\t);\n\t\t}\n\t};\n\ngetCurrentThemeGlobalStylesRevisions.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\t\taction.kind === 'root' &&\n\t\t! action.error &&\n\t\taction.name === 'globalStyles'\n\t);\n};\n\nexport const getBlockPatterns =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst patterns = await fetchBlockPatterns();\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERNS', patterns } );\n\t};\n\nexport const getBlockPatternCategories =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst categories = await apiFetch( {\n\t\t\tpath: '/wp/v2/block-patterns/categories',\n\t\t} );\n\t\tdispatch( { type: 'RECEIVE_BLOCK_PATTERN_CATEGORIES', categories } );\n\t};\n\nexport const getUserPatternCategories =\n\t() =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst patternCategories = await resolveSelect.getEntityRecords(\n\t\t\t'taxonomy',\n\t\t\t'wp_pattern_category',\n\t\t\t{\n\t\t\t\tper_page: -1,\n\t\t\t\t_fields: 'id,name,description,slug',\n\t\t\t\tcontext: 'view',\n\t\t\t}\n\t\t);\n\n\t\tconst mappedPatternCategories =\n\t\t\tpatternCategories?.map( ( userCategory ) => ( {\n\t\t\t\t...userCategory,\n\t\t\t\tlabel: decodeEntities( userCategory.name ),\n\t\t\t\tname: userCategory.slug,\n\t\t\t} ) ) || [];\n\n\t\tdispatch( {\n\t\t\ttype: 'RECEIVE_USER_PATTERN_CATEGORIES',\n\t\t\tpatternCategories: mappedPatternCategories,\n\t\t} );\n\t};\n\nexport const getNavigationFallbackId =\n\t() =>\n\tasync ( { dispatch, select, registry } ) => {\n\t\tconst fallback = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp-block-editor/v1/navigation-fallback', {\n\t\t\t\t_embed: true,\n\t\t\t} ),\n\t\t} );\n\n\t\tconst record = fallback?._embedded?.self;\n\n\t\tregistry.batch( () => {\n\t\t\tdispatch.receiveNavigationFallbackId( fallback?.id );\n\n\t\t\tif ( ! record ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If the fallback is already in the store, don't invalidate navigation queries.\n\t\t\t// Otherwise, invalidate the cache for the scenario where there were no Navigation\n\t\t\t// posts in the state and the fallback created one.\n\t\t\tconst existingFallbackEntityRecord = select.getEntityRecord(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id\n\t\t\t);\n\t\t\tconst invalidateNavigationQueries = ! existingFallbackEntityRecord;\n\t\t\tdispatch.receiveEntityRecords(\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\trecord,\n\t\t\t\tundefined,\n\t\t\t\tinvalidateNavigationQueries\n\t\t\t);\n\n\t\t\t// Resolve to avoid further network requests.\n\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t'postType',\n\t\t\t\t'wp_navigation',\n\t\t\t\tfallback.id,\n\t\t\t] );\n\t\t} );\n\t};\n\nexport const getDefaultTemplateId =\n\t( query ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst template = await apiFetch( {\n\t\t\tpath: addQueryArgs( '/wp/v2/templates/lookup', query ),\n\t\t} );\n\t\t// Wait for the the entities config to be loaded, otherwise receiving\n\t\t// the template as an entity will not work.\n\t\tawait resolveSelect.getEntitiesConfig( 'postType' );\n\t\t// When active_templates experiment is enabled, use numeric wp_id if it\n\t\t// exists, otherwise fall back to string ID format (theme//slug) as the\n\t\t// frontend expects string IDs for templates.\n\t\tconst id = window?.__experimentalTemplateActivate\n\t\t\t? template?.wp_id || template?.id\n\t\t\t: template?.id;\n\t\t// Endpoint may return an empty object if no template is found.\n\t\tif ( id ) {\n\t\t\ttemplate.id = id;\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveDefaultTemplateId( query, id );\n\t\t\t\tdispatch.receiveEntityRecords( 'postType', template.type, [\n\t\t\t\t\ttemplate,\n\t\t\t\t] );\n\t\t\t\t// Avoid further network requests.\n\t\t\t\tdispatch.finishResolution( 'getEntityRecord', [\n\t\t\t\t\t'postType',\n\t\t\t\t\ttemplate.type,\n\t\t\t\t\tid,\n\t\t\t\t] );\n\t\t\t} );\n\t\t}\n\t};\n\ngetDefaultTemplateId.shouldInvalidate = ( action ) => {\n\treturn (\n\t\taction.type === 'RECEIVE_ITEMS' &&\n\t\taction.kind === 'root' &&\n\t\taction.name === 'site'\n\t);\n};\n\n/**\n * Requests an entity's revisions from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevisions =\n\t( kind, name, recordKey, query = {} ) =>\n\tasync ( { dispatch, registry, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\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: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet records, response;\n\t\tconst meta = {};\n\t\tconst isPaginated =\n\t\t\tentityConfig.supportsPagination && query.per_page !== -1;\n\t\ttry {\n\t\t\tresponse = await apiFetch( { path, parse: ! isPaginated } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( response ) {\n\t\t\tif ( isPaginated ) {\n\t\t\t\trecords = Object.values( await response.json() );\n\t\t\t\tmeta.totalItems = parseInt(\n\t\t\t\t\tresponse.headers.get( 'X-WP-Total' )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\trecords = Object.values( response );\n\t\t\t}\n\n\t\t\t// If we request fields but the result doesn't contain the fields,\n\t\t\t// explicitly set these fields as \"undefined\"\n\t\t\t// that way we consider the query \"fulfilled\".\n\t\t\tif ( query._fields ) {\n\t\t\t\trecords = records.map( ( record ) => {\n\t\t\t\t\tquery._fields.split( ',' ).forEach( ( field ) => {\n\t\t\t\t\t\tif ( ! record.hasOwnProperty( field ) ) {\n\t\t\t\t\t\t\trecord[ field ] = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn record;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tregistry.batch( () => {\n\t\t\t\tdispatch.receiveRevisions(\n\t\t\t\t\tkind,\n\t\t\t\t\tname,\n\t\t\t\t\trecordKey,\n\t\t\t\t\trecords,\n\t\t\t\t\tquery,\n\t\t\t\t\tfalse,\n\t\t\t\t\tmeta\n\t\t\t\t);\n\n\t\t\t\t// When requesting all fields, the list of results can be used to\n\t\t\t\t// resolve the `getRevision` selector in addition to `getRevisions`.\n\t\t\t\tif ( ! query?._fields && ! query.context ) {\n\t\t\t\t\tconst key = entityConfig.key || DEFAULT_ENTITY_KEY;\n\t\t\t\t\tconst resolutionsArgs = records\n\t\t\t\t\t\t.filter( ( record ) => record[ key ] )\n\t\t\t\t\t\t.map( ( record ) => [\n\t\t\t\t\t\t\tkind,\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\trecordKey,\n\t\t\t\t\t\t\trecord[ key ],\n\t\t\t\t\t\t] );\n\n\t\t\t\t\tdispatch.finishResolutions(\n\t\t\t\t\t\t'getRevision',\n\t\t\t\t\t\tresolutionsArgs\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t};\n\n// Invalidate cache when a new revision is created.\ngetRevisions.shouldInvalidate = ( action, kind, name, recordKey ) =>\n\taction.type === 'SAVE_ENTITY_RECORD_FINISH' &&\n\tname === action.name &&\n\tkind === action.kind &&\n\t! action.error &&\n\trecordKey === action.recordId;\n\n/**\n * Requests a specific Entity revision from the REST API.\n *\n * @param {string} kind Entity kind.\n * @param {string} name Entity name.\n * @param {number|string} recordKey The key of the entity record whose revisions you want to fetch.\n * @param {number|string} revisionKey The revision's key.\n * @param {Object|undefined} query Optional object of query parameters to\n * include with request. If requesting specific\n * fields, fields must always include the ID.\n */\nexport const getRevision =\n\t( kind, name, recordKey, revisionKey, query ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tconst configs = await resolveSelect.getEntitiesConfig( kind );\n\t\tconst entityConfig = configs.find(\n\t\t\t( config ) => config.name === name && config.kind === kind\n\t\t);\n\n\t\tif ( ! entityConfig ) {\n\t\t\treturn;\n\t\t}\n\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: [\n\t\t\t\t\t...new Set( [\n\t\t\t\t\t\t...( getNormalizedCommaSeparable( query._fields ) ||\n\t\t\t\t\t\t\t[] ),\n\t\t\t\t\t\tentityConfig.revisionKey || DEFAULT_ENTITY_KEY,\n\t\t\t\t\t] ),\n\t\t\t\t].join(),\n\t\t\t};\n\t\t}\n\t\tconst path = addQueryArgs(\n\t\t\tentityConfig.getRevisionsUrl( recordKey, revisionKey ),\n\t\t\tquery\n\t\t);\n\n\t\tlet record;\n\t\ttry {\n\t\t\trecord = await apiFetch( { path } );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if our request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( record ) {\n\t\t\tdispatch.receiveRevisions( kind, name, recordKey, record, query );\n\t\t}\n\t};\n\n/**\n * Requests a specific post type options from the REST API.\n *\n * @param {string} postType Post type slug.\n */\nexport const getRegisteredPostMeta =\n\t( postType ) =>\n\tasync ( { dispatch, resolveSelect } ) => {\n\t\tlet options;\n\t\ttry {\n\t\t\tconst {\n\t\t\t\trest_namespace: restNamespace = 'wp/v2',\n\t\t\t\trest_base: restBase,\n\t\t\t} = ( await resolveSelect.getPostType( postType ) ) || {};\n\t\t\toptions = await apiFetch( {\n\t\t\t\tpath: `${ restNamespace }/${ restBase }/?context=edit`,\n\t\t\t\tmethod: 'OPTIONS',\n\t\t\t} );\n\t\t} catch ( error ) {\n\t\t\t// Do nothing if the request comes back with an API error.\n\t\t\treturn;\n\t\t}\n\n\t\tif ( options ) {\n\t\t\tdispatch.receiveRegisteredPostMeta(\n\t\t\t\tpostType,\n\t\t\t\toptions?.schema?.properties?.meta?.properties\n\t\t\t);\n\t\t}\n\t};\n\n/**\n * Requests entity configs for the given kind from the REST API.\n *\n * @param {string} kind Entity kind.\n */\nexport const getEntitiesConfig =\n\t( kind ) =>\n\tasync ( { dispatch } ) => {\n\t\tconst loader = additionalEntityConfigLoaders.find(\n\t\t\t( l ) => l.kind === kind\n\t\t);\n\n\t\tif ( ! loader ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst configs = await loader.loadEntities();\n\t\t\tif ( ! configs.length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch.addEntities( configs );\n\t\t} catch {\n\t\t\t// Do nothing if the request comes back with an API error.\n\t\t}\n\t};\n\n/**\n * Requests editor settings from the REST API.\n */\nexport const getEditorSettings =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst settings = await apiFetch( {\n\t\t\tpath: '/wp-block-editor/v1/settings',\n\t\t} );\n\t\tdispatch.receiveEditorSettings( settings );\n\t};\n\n/**\n * Requests editor assets from the REST API.\n */\nexport const getEditorAssets =\n\t() =>\n\tasync ( { dispatch } ) => {\n\t\tconst assets = await apiFetch( {\n\t\t\tpath: '/wp-block-editor/v1/assets',\n\t\t} );\n\t\tdispatch.receiveEditorAssets( assets );\n\t};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,yBAA0B;AAK1B,iBAA6B;AAC7B,2BAA+B;AAC/B,uBAAqB;AAKrB,kBAA2B;AAC3B,sBAAkE;AAClE,kBAA+B;AAC/B,mBAQO;AACP,mBAAmC;AACnC,4BAAsD;AAQ/C,IAAM,aACZ,CAAE,UACF,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,WAAO;AAAA,IACZ;AAAA,IACA;AAAA,EACD;AACA,QAAM,QAAQ,UAAM,iBAAAA,SAAU,EAAE,KAAK,CAAE;AACvC,WAAS,iBAAkB,MAAM,KAAM;AACxC;AAKM,IAAM,iBACZ,MACA,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,cAAc,UAAM,iBAAAA,SAAU,EAAE,MAAM,kBAAkB,CAAE;AAChE,WAAS,mBAAoB,WAAY;AAC1C;AAYM,IAAM,kBACZ,CAAE,MAAM,MAAM,MAAM,IAAI,UACxB,OAAQ,EAAE,QAAQ,UAAU,UAAU,cAAc,MAAO;AAC1D,QAAM,UAAU,MAAM,cAAc,kBAAmB,IAAK;AAC5D,QAAM,eAAe,QAAQ;AAAA,IAC5B,CAAE,WAAY,OAAO,SAAS,QAAQ,OAAO,SAAS;AAAA,EACvD;AACA,MAAK,CAAE,cAAe;AACrB;AAAA,EACD;AAEA,QAAM,OAAO,MAAM,SAAS;AAAA,IAC3B;AAAA,IACA,CAAE,YAAY,WAAW,MAAM,MAAM,GAAI;AAAA,IACzC,EAAE,WAAW,MAAM;AAAA,EACpB;AAEA,MAAI;AACH,QAAK,UAAU,UAAa,MAAM,SAAU;AAI3C,cAAQ;AAAA,QACP,GAAG;AAAA,QACH,SAAS;AAAA,UACR,GAAG,oBAAI,IAAK;AAAA,YACX,OAAK,0CAA6B,MAAM,OAAQ,KAC/C,CAAC;AAAA,YACF,aAAa,OAAO;AAAA,UACrB,CAAE;AAAA,QACH,EAAE,KAAK;AAAA,MACR;AAAA,IACD;AAEA,QAAK,UAAU,UAAa,MAAM,SAAU;AAI3C,YAAM,YAAY,OAAO;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AACA,UAAK,WAAY;AAChB;AAAA,MACD;AAAA,IACD;AAEA,QAAI,EAAE,QAAQ,IAAI;AAGlB,QACC,SAAS,cACT,SAAS,kBACL,OAAO,OAAO,QAAQ,YAAY,CAAE,QAAQ,KAAM,GAAI,KACzD,CAAE,QAAQ,iCACV;AACD,gBACC,QAAQ,MAAO,GAAG,QAAQ,YAAa,GAAI,CAAE,IAC7C;AAAA,IACF;AAEA,UAAM,WAAO,yBAAc,WAAY,MAAM,MAAM,MAAM,KAAM;AAAA,MAC9D,GAAG,aAAa;AAAA,MAChB,GAAG;AAAA,IACJ,CAAE;AACF,UAAM,WAAW,UAAM,iBAAAA,SAAU,EAAE,MAAM,OAAO,MAAM,CAAE;AACxD,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,UAAM,kBAAc;AAAA,MACnB,SAAS,SAAS,IAAK,OAAQ;AAAA,IAChC;AAEA,UAAM,yBAAyB,CAAC;AAChC,UAAM,4BAA4B,CAAC;AACnC,eAAY,UAAU,uCAA2B;AAChD,oCACC,wCAA2B,QAAQ;AAAA,QAClC;AAAA,QACA;AAAA,QACA,IAAI;AAAA,MACL,CAAE,CACH,IAAI,YAAa,MAAO;AAExB,6BAAuB,KAAM;AAAA,QAC5B;AAAA,QACA,EAAE,MAAM,MAAM,IAAI,IAAI;AAAA,MACvB,CAAE;AAAA,IACH;AAGA,QAAK,WAAW,qBAAsB;AACrC,UACC,aAAa,kBACb,0BAAa,GAAI,KACjB,CAAE,OACD;AACD,cAAM,aAAa,GAAI,IAAK,IAAK,IAAK;AACtC,cAAM,WAAW;AAMjB,cAAM,uBAAuB,EAAE,GAAG,OAAO;AACzC,eAAO,QAAS,aAAa,kBAAkB,CAAC,CAAE,EAChD;AAAA,UACA,CAAE,CAAE,UAAU,eAAgB,MAC7B,WACC,qBAAsB,QAAS,KAChC,mBACA,aAAa,OAAO,mBACpB,UAAU,mBACV,eAAe,OAAO,gBAAgB;AAAA,QACxC,EACC,QAAS,CAAE,CAAE,UAAU,eAAgB,MAAO;AAC9C,+BAAsB,QAAS,IAC9B,gBAAgB,KAAM,oBAAqB;AAAA,QAC7C,CAAE;AAGH,kBAAM,4BAAe,GAAG;AAAA,UACvB,aAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,YAEC,YAAY,CAAE,OAAO,UAAU,CAAC,MAAO;AACtC,kBAAK,CAAE,OAAO,KAAM,KAAM,EAAE,QAAS;AACpC;AAAA,cACD;AAEA,uBAAU;AAAA,gBACT,MAAM;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV;AAAA,gBACA,MAAM;AAAA,kBACL,MAAM;AAAA,gBACP;AAAA,gBACA;AAAA,cACD,CAAE;AAAA,YACH;AAAA;AAAA,YAEA,iBAAiB,YAChB,MAAM,cAAc;AAAA,cACnB;AAAA,cACA;AAAA,cACA;AAAA,YACD;AAAA;AAAA,YAED,eAAe,YAAY;AAC1B,uBAAS;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA,UAAM,iBAAAA,SAAU,EAAE,MAAM,OAAO,KAAK,CAAE;AAAA,gBACtC;AAAA,cACD;AAAA,YACD;AAAA;AAAA,YAEA,YAAY,MAAM;AACjB,uBAAS;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,cACD;AAAA,YACD;AAAA,YACA,aAAa,CAAE,MAAM,SAAU;AAC9B,oBAAM,uBACL,2CAAqB,IAAK;AAE3B,kBAAK,kBAAmB;AACvB,qBAAK;AAAA,kBACJ;AAAA,kBACA;AAAA,gBACD;AAAA,cACD;AAAA,YACD;AAAA,YACA,iBAAiB,CAAE,MAAM,SAAU;AAClC,oBAAM,mBACL,KAAK,IAAK,kBAAmB;AAE9B,kBAAK,kBAAmB;AAOvB,2BAAY,MAAM;AACjB;AAAA,oBACC;AAAA,oBACA;AAAA,kBACD;AAAA,gBACD,GAAG,CAAE;AAAA,cACN;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,aAAS,MAAO,MAAM;AACrB,eAAS,qBAAsB,MAAM,MAAM,QAAQ,KAAM;AACzD,eAAS,uBAAwB,yBAA0B;AAC3D,eAAS,kBAAmB,WAAW,sBAAuB;AAAA,IAC/D,CAAE;AAAA,EACH,UAAE;AACD,aAAS,2BAA4B,IAAK;AAAA,EAC3C;AACD;AAID,gBAAgB,mBAAmB,CAAE,QAAQ,MAAM,SAAU;AAC5D,SACC,SAAS,UACT,SAAS,WACL,OAAO,SAAS;AAAA;AAAA;AAAA,EAInB,OAAO,kBACP,OAAO,eAAe,WAAW,gBACjC,OAAO,SAAS,mBACjB,OAAO,SAAS,cAChB,OAAO,SAAS;AAElB;AAKO,IAAM,yBAAqB,8BAAiB,iBAAkB;AAK9D,IAAM,4BAAwB,8BAAiB,iBAAkB;AAUjE,IAAM,mBACZ,CAAE,MAAM,MAAM,QAAQ,CAAC,MACvB,OAAQ,EAAE,UAAU,UAAU,cAAc,MAAO;AAClD,QAAM,UAAU,MAAM,cAAc,kBAAmB,IAAK;AAC5D,QAAM,eAAe,QAAQ;AAAA,IAC5B,CAAE,WAAY,OAAO,SAAS,QAAQ,OAAO,SAAS;AAAA,EACvD;AACA,MAAK,CAAE,cAAe;AACrB;AAAA,EACD;AAEA,QAAM,OAAO,MAAM,SAAS;AAAA,IAC3B;AAAA,IACA,CAAE,YAAY,WAAW,MAAM,IAAK;AAAA,IACpC,EAAE,WAAW,MAAM;AAAA,EACpB;AAMA,QAAM,WAAW,EAAE,GAAG,MAAM;AAC5B,QAAM,MAAM,aAAa,OAAO;AAEhC,WAAS,mBAAoB,SAAS,cAAe;AACpD,UAAM,YAAY,OAAO;AAAA,MACxB,OAAO,QAAS,YAAa,EAAE,OAAQ,CAAE,CAAE,GAAG,CAAE,MAAO;AACtD,eAAO,CAAE,WAAW,SAAU,EAAE,SAAU,CAAE,KAAK,CAAC,CAAE;AAAA,MACrD,CAAE;AAAA,IACH;AACA,WAAO,QACL,OAAQ,CAAE,WAAY,SAAU,GAAI,CAAE,EACtC,IAAK,CAAE,WAAY;AAAA,MACnB;AAAA,MACA;AAAA,MACA,OAAQ,GAAI;AAAA,MACZ,OAAO,KAAM,SAAU,EAAE,SAAS,IAAI,YAAY;AAAA,IACnD,CAAE;AAAA,EACJ;AAEA,MAAI;AACH,QAAK,MAAM,SAAU;AAIpB,cAAQ;AAAA,QACP,GAAG;AAAA,QACH,SAAS;AAAA,UACR,GAAG,oBAAI,IAAK;AAAA,YACX,OAAK,0CAA6B,MAAM,OAAQ,KAC/C,CAAC;AAAA,YACF;AAAA,UACD,CAAE;AAAA,QACH,EAAE,KAAK;AAAA,MACR;AAAA,IACD;AAEA,QAAI,EAAE,QAAQ,IAAI;AAOlB,UAAM,EAAE,oBAAoB,KAAK,IAAI;AAErC,QACC,SAAS,cACT,SAAS,iBACT,mBACC;AACD,gBACC,QAAQ,MAAO,GAAG,QAAQ,YAAa,GAAI,CAAE,IAC7C;AAAA,IACF;AAEA,UAAM,WAAO,yBAAc,SAAS;AAAA,MACnC,GAAG,aAAa;AAAA,MAChB,GAAG;AAAA,IACJ,CAAE;AAEF,QAAI,UAAU,CAAC,GACd;AACD,QAAK,aAAa,sBAAsB,MAAM,aAAa,IAAK;AAC/D,YAAM,WAAW,UAAM,iBAAAA,SAAU,EAAE,MAAM,OAAO,MAAM,CAAE;AACxD,gBAAU,OAAO,OAAQ,MAAM,SAAS,KAAK,CAAE;AAC/C,aAAO;AAAA,QACN,YAAY;AAAA,UACX,SAAS,QAAQ,IAAK,YAAa;AAAA,QACpC;AAAA,QACA,YAAY;AAAA,UACX,SAAS,QAAQ,IAAK,iBAAkB;AAAA,QACzC;AAAA,MACD;AAAA,IACD,WACC,MAAM,aAAa,MACnB,MAAO,yCAA6B,MAAM,MACzC;AACD,UAAI,OAAO;AACX,UAAI;AAEJ,SAAG;AACF,cAAM,WAAW,UAAM,iBAAAA,SAAU;AAAA,UAChC,UAAM,yBAAc,MAAM,EAAE,MAAM,UAAU,IAAI,CAAE;AAAA,UAClD,OAAO;AAAA,QACR,CAAE;AACF,cAAM,cAAc,OAAO,OAAQ,MAAM,SAAS,KAAK,CAAE;AAEzD,qBAAa;AAAA,UACZ,SAAS,QAAQ,IAAK,iBAAkB;AAAA,QACzC;AAEA,YAAK,CAAE,MAAO;AACb,iBAAO;AAAA,YACN,YAAY;AAAA,cACX,SAAS,QAAQ,IAAK,YAAa;AAAA,YACpC;AAAA,YACA,YAAY;AAAA,UACb;AAAA,QACD;AAEA,gBAAQ,KAAM,GAAG,WAAY;AAC7B,iBAAS,MAAO,MAAM;AACrB,mBAAS;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD;AACA,mBAAS;AAAA,YACR;AAAA,YACA,mBAAoB,aAAa,QAAS;AAAA,UAC3C;AAAA,QACD,CAAE;AACF;AAAA,MACD,SAAU,QAAQ;AAAA,IACnB,OAAO;AACN,gBAAU,OAAO,OAAQ,UAAM,iBAAAA,SAAU,EAAE,KAAK,CAAE,CAAE;AACpD,aAAO;AAAA,QACN,YAAY,QAAQ;AAAA,QACpB,YAAY;AAAA,MACb;AAAA,IACD;AAEA,QAAK,WAAW,qBAAsB;AACrC,UAAK,aAAa,cAAc,OAAO,MAAM,UAAW;AACvD,cAAM,aAAa,GAAI,IAAK,IAAK,IAAK;AACtC,wCAAe,GAAG;AAAA,UACjB,aAAa;AAAA,UACb;AAAA,UACA;AAAA,YACC,gBAAgB,YAAY;AAC3B,uBAAS;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA,UAAM,iBAAAA,SAAU,EAAE,MAAM,OAAO,KAAK,CAAE;AAAA,gBACtC;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAKA,QAAK,MAAM,SAAU;AACpB,gBAAU,QAAQ,IAAK,CAAE,WAAY;AACpC,cAAM,QAAQ,MAAO,GAAI,EAAE,QAAS,CAAE,UAAW;AAChD,cAAK,CAAE,OAAO,eAAgB,KAAM,GAAI;AACvC,mBAAQ,KAAM,IAAI;AAAA,UACnB;AAAA,QACD,CAAE;AAEF,eAAO;AAAA,MACR,CAAE;AAAA,IACH;AAEA,aAAS,MAAO,MAAM;AACrB,eAAS;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAEA,YAAM,cAAc,QAClB;AAAA,QACA,CAAE,WACD,CAAC,CAAE,SAAU,GAAI,KACjB,CAAC,CAAE,QAAQ,QAAQ,OAAQ,CAAE,GAAG,aAAa;AAAA,MAC/C,EACC,IAAK,CAAE,YAAc;AAAA,QACrB,IAAI,OAAQ,GAAI;AAAA,QAChB,iBAAa;AAAA,UACZ,OAAO,OAAO,KAAM,CAAE,EAAE,YAAY;AAAA,QACrC;AAAA,MACD,EAAI;AAEL,YAAM,yBAAyB,CAAC;AAChC,YAAM,4BAA4B,CAAC;AACnC,iBAAY,cAAc,aAAc;AACvC,mBAAY,UAAU,uCAA2B;AAChD,iCAAuB,KAAM;AAAA,YAC5B;AAAA,YACA,EAAE,MAAM,MAAM,IAAI,WAAW,GAAG;AAAA,UACjC,CAAE;AAEF,wCACC,wCAA2B,QAAQ;AAAA,YAClC;AAAA,YACA;AAAA,YACA,IAAI,WAAW;AAAA,UAChB,CAAE,CACH,IAAI,WAAW,YAAa,MAAO;AAAA,QACpC;AAAA,MACD;AAEA,UAAK,YAAY,SAAS,GAAI;AAC7B,iBAAS;AAAA,UACR;AAAA,QACD;AACA,iBAAS;AAAA,UACR;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAEA,eAAS;AAAA,QACR;AAAA,QACA,mBAAoB,SAAS,QAAS;AAAA,MACvC;AAEA,eAAS,2BAA4B,IAAK;AAAA,IAC3C,CAAE;AAAA,EACH,SAAU,GAAI;AACb,aAAS,2BAA4B,IAAK;AAAA,EAC3C;AACD;AAED,iBAAiB,mBAAmB,CAAE,QAAQ,MAAM,SAAU;AAC7D,UACG,OAAO,SAAS,mBAAmB,OAAO,SAAS,mBACrD,OAAO,mBACP,SAAS,OAAO,QAChB,SAAS,OAAO;AAElB;AAKO,IAAM,iCAA6B,8BAAiB,kBAAmB;AAKvE,IAAM,iCAA6B,8BAAiB,kBAAmB;AAKvE,IAAM,kBACZ,MACA,OAAQ,EAAE,UAAU,cAAc,MAAO;AACxC,QAAM,eAAe,MAAM,cAAc;AAAA,IACxC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,SAAS;AAAA,EACpB;AAEA,WAAS,oBAAqB,aAAc,CAAE,CAAE;AACjD;AAKM,IAAM,uBAAmB,8BAAiB,iBAAkB;AAO5D,IAAM,kBACZ,CAAE,QACF,OAAQ,EAAE,SAAS,MAAO;AACzB,MAAI;AACH,UAAM,qBAAqB,UAAM,iBAAAA,SAAU;AAAA,MAC1C,UAAM,yBAAc,qBAAqB,EAAE,IAAI,CAAE;AAAA,IAClD,CAAE;AACF,aAAS,oBAAqB,KAAK,kBAAmB;AAAA,EACvD,SAAU,OAAQ;AAEjB,aAAS,oBAAqB,KAAK,KAAM;AAAA,EAC1C;AACD;AAYM,IAAM,UACZ,CAAE,iBAAiB,UAAU,OAC7B,OAAQ,EAAE,UAAU,UAAU,cAAc,MAAO;AAClD,MAAK,CAAE,sCAAyB,SAAU,eAAgB,GAAI;AAC7D,UAAM,IAAI,MAAO,IAAK,eAAgB,0BAA2B;AAAA,EAClE;AAEA,QAAM,EAAE,qBAAqB,IAAI,SAAS,OAAQ,sBAAW;AAG7D,aAAY,iBAAiB,uCAA2B;AACvD,QAAK,kBAAkB,iBAAkB;AACxC;AAAA,IACD;AACA,UAAM,qBAAqB,qBAAsB,WAAW;AAAA,MAC3D;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAE;AACF,QAAK,oBAAqB;AACzB;AAAA,IACD;AAAA,EACD;AAEA,MAAI,eAAe;AACnB,MAAK,OAAO,aAAa,UAAW;AACnC,QAAK,CAAE,SAAS,QAAQ,CAAE,SAAS,MAAO;AACzC,YAAM,IAAI,MAAO,0CAA2C;AAAA,IAC7D;AAEA,UAAM,UAAU,MAAM,cAAc;AAAA,MACnC,SAAS;AAAA,IACV;AACA,UAAM,eAAe,QAAQ;AAAA,MAC5B,CAAE,WACD,OAAO,SAAS,SAAS,QACzB,OAAO,SAAS,SAAS;AAAA,IAC3B;AACA,QAAK,CAAE,cAAe;AACrB;AAAA,IACD;AAEA,mBACC,aAAa,WAAY,SAAS,KAAK,MAAM,SAAS,KAAK;AAAA,EAC7D,OAAO;AACN,mBAAe,UAAW,QAAS,MAAO,KAAK,MAAM,KAAK;AAAA,EAC3D;AAEA,MAAI;AACJ,MAAI;AACH,eAAW,UAAM,iBAAAA,SAAU;AAAA,MAC1B,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR,CAAE;AAAA,EACH,SAAU,OAAQ;AAGjB;AAAA,EACD;AAKA,QAAM,kBAAc;AAAA,IACnB,SAAS,SAAS,IAAK,OAAQ;AAAA,EAChC;AACA,WAAS,MAAO,MAAM;AACrB,eAAY,UAAU,uCAA2B;AAChD,YAAM,UAAM,wCAA2B,QAAQ,UAAU,EAAG;AAE5D,eAAS,sBAAuB,KAAK,YAAa,MAAO,CAAE;AAG3D,UAAK,WAAW,iBAAkB;AACjC,iBAAS,iBAAkB,WAAW;AAAA,UACrC;AAAA,UACA;AAAA,UACA;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,EACD,CAAE;AACH;AAUM,IAAM,0BACZ,CAAE,MAAM,MAAM,aACd,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,SAAU,QAAS,UAAU,EAAE,MAAM,MAAM,IAAI,SAAS,CAAE,CAAE;AACnE;AAQM,IAAM,eACZ,CAAE,UAAU,WACZ,OAAQ,EAAE,UAAU,cAAc,MAAO;AACxC,QAAM;AAAA,IACL,WAAW;AAAA,IACX,gBAAgB,gBAAgB;AAAA,IAChC;AAAA,EACD,IAAI,MAAM,cAAc,YAAa,QAAS;AAC9C,MAAK,CAAE,UAAU,UAAW;AAC3B;AAAA,EACD;AAEA,QAAM,YAAY,UAAM,iBAAAA,SAAU;AAAA,IACjC,MAAM,IAAK,aAAc,IAAK,QAAS,IAAK,MAAO;AAAA,EACpD,CAAE;AAEF,MAAK,aAAa,UAAU,QAAS;AACpC,aAAS,iBAAkB,QAAQ,SAAU;AAAA,EAC9C;AACD;AAWM,IAAM,cACZ,CAAE,UAAU,WACZ,OAAQ,EAAE,cAAc,MAAO;AAC9B,QAAM,cAAc,aAAc,UAAU,MAAO;AACpD;AAEM,IAAM,yCACZ,MACA,OAAQ,EAAE,UAAU,cAAc,MAAO;AACxC,QAAM,eAAe,MAAM,cAAc;AAAA,IACxC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,SAAS;AAAA,EACpB;AACA,QAAM,kBACL,eAAgB,CAAE,GAAG,SAAU,uBAAwB,IAAK,CAAE,GAC3D;AACJ,MAAK,CAAE,iBAAkB;AACxB;AAAA,EACD;AAIA,QAAM,UAAU,gBAAgB,MAAO,iBAAkB;AACzD,QAAM,KAAK,UAAU,OAAQ,QAAS,CAAE,CAAE,IAAI;AAE9C,MAAK,IAAK;AACT,aAAS,2CAA4C,EAAG;AAAA,EACzD;AACD;AAEM,IAAM,gDACZ,MACA,OAAQ,EAAE,eAAe,SAAS,MAAO;AACxC,QAAM,eAAe,MAAM,cAAc,gBAAgB;AAEzD,QAAM,oBAAoB,UAAM,iBAAAA,SAAU;AAAA,IACzC,MAAM,+BAAgC,aAAa,UAAW;AAAA,EAC/D,CAAE;AACF,WAAS;AAAA,IACR,aAAa;AAAA,IACb;AAAA,EACD;AACD;AAEM,IAAM,sDACZ,MACA,OAAQ,EAAE,eAAe,SAAS,MAAO;AACxC,QAAM,eAAe,MAAM,cAAc,gBAAgB;AAEzD,QAAM,aAAa,UAAM,iBAAAA,SAAU;AAAA,IAClC,MAAM,+BAAgC,aAAa,UAAW;AAAA,EAC/D,CAAE;AACF,WAAS;AAAA,IACR,aAAa;AAAA,IACb;AAAA,EACD;AACD;AAKM,IAAM,uCACZ,MACA,OAAQ,EAAE,eAAe,SAAS,MAAO;AACxC,QAAM,iBACL,MAAM,cAAc,uCAAuC;AAC5D,QAAM,SAAS,iBACZ,MAAM,cAAc;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACA,IACA;AACH,QAAM,eAAe,QAAQ,SAAU,iBAAkB,IAAK,CAAE,GAAG;AAEnE,MAAK,cAAe;AACnB,UAAM,iBAAiB,UAAM,iBAAAA,SAAU;AAAA,MACtC,KAAK;AAAA,IACN,CAAE;AACF,UAAM,YAAY,gBAAgB;AAAA,MAAK,CAAE,aACxC,OAAO;AAAA,QACN,OAAO,QAAS,QAAS,EAAE,IAAK,CAAE,CAAE,KAAK,KAAM,MAAO;AAAA,cACrD,8BAAW,GAAI;AAAA,UACf;AAAA,QACD,CAAE;AAAA,MACH;AAAA,IACD;AACA,aAAS;AAAA,MACR;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAED,qCAAqC,mBAAmB,CAAE,WAAY;AACrE,SACC,OAAO,SAAS,+BAChB,OAAO,SAAS,UAChB,CAAE,OAAO,SACT,OAAO,SAAS;AAElB;AAEO,IAAM,mBACZ,MACA,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,WAAW,UAAM,iCAAmB;AAC1C,WAAU,EAAE,MAAM,0BAA0B,SAAS,CAAE;AACxD;AAEM,IAAM,4BACZ,MACA,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,aAAa,UAAM,iBAAAA,SAAU;AAAA,IAClC,MAAM;AAAA,EACP,CAAE;AACF,WAAU,EAAE,MAAM,oCAAoC,WAAW,CAAE;AACpE;AAEM,IAAM,2BACZ,MACA,OAAQ,EAAE,UAAU,cAAc,MAAO;AACxC,QAAM,oBAAoB,MAAM,cAAc;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,MACC,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,IACV;AAAA,EACD;AAEA,QAAM,0BACL,mBAAmB,IAAK,CAAE,kBAAoB;AAAA,IAC7C,GAAG;AAAA,IACH,WAAO,qCAAgB,aAAa,IAAK;AAAA,IACzC,MAAM,aAAa;AAAA,EACpB,EAAI,KAAK,CAAC;AAEX,WAAU;AAAA,IACT,MAAM;AAAA,IACN,mBAAmB;AAAA,EACpB,CAAE;AACH;AAEM,IAAM,0BACZ,MACA,OAAQ,EAAE,UAAU,QAAQ,SAAS,MAAO;AAC3C,QAAM,WAAW,UAAM,iBAAAA,SAAU;AAAA,IAChC,UAAM,yBAAc,2CAA2C;AAAA,MAC9D,QAAQ;AAAA,IACT,CAAE;AAAA,EACH,CAAE;AAEF,QAAM,SAAS,UAAU,WAAW;AAEpC,WAAS,MAAO,MAAM;AACrB,aAAS,4BAA6B,UAAU,EAAG;AAEnD,QAAK,CAAE,QAAS;AACf;AAAA,IACD;AAKA,UAAM,+BAA+B,OAAO;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACV;AACA,UAAM,8BAA8B,CAAE;AACtC,aAAS;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAGA,aAAS,iBAAkB,mBAAmB;AAAA,MAC7C;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACV,CAAE;AAAA,EACH,CAAE;AACH;AAEM,IAAM,uBACZ,CAAE,UACF,OAAQ,EAAE,UAAU,UAAU,cAAc,MAAO;AAClD,QAAM,WAAW,UAAM,iBAAAA,SAAU;AAAA,IAChC,UAAM,yBAAc,2BAA2B,KAAM;AAAA,EACtD,CAAE;AAGF,QAAM,cAAc,kBAAmB,UAAW;AAIlD,QAAM,KAAK,QAAQ,iCAChB,UAAU,SAAS,UAAU,KAC7B,UAAU;AAEb,MAAK,IAAK;AACT,aAAS,KAAK;AACd,aAAS,MAAO,MAAM;AACrB,eAAS,yBAA0B,OAAO,EAAG;AAC7C,eAAS,qBAAsB,YAAY,SAAS,MAAM;AAAA,QACzD;AAAA,MACD,CAAE;AAEF,eAAS,iBAAkB,mBAAmB;AAAA,QAC7C;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACD,CAAE;AAAA,IACH,CAAE;AAAA,EACH;AACD;AAED,qBAAqB,mBAAmB,CAAE,WAAY;AACrD,SACC,OAAO,SAAS,mBAChB,OAAO,SAAS,UAChB,OAAO,SAAS;AAElB;AAYO,IAAM,eACZ,CAAE,MAAM,MAAM,WAAW,QAAQ,CAAC,MAClC,OAAQ,EAAE,UAAU,UAAU,cAAc,MAAO;AAClD,QAAM,UAAU,MAAM,cAAc,kBAAmB,IAAK;AAC5D,QAAM,eAAe,QAAQ;AAAA,IAC5B,CAAE,WAAY,OAAO,SAAS,QAAQ,OAAO,SAAS;AAAA,EACvD;AAEA,MAAK,CAAE,cAAe;AACrB;AAAA,EACD;AAEA,MAAK,MAAM,SAAU;AAIpB,YAAQ;AAAA,MACP,GAAG;AAAA,MACH,SAAS;AAAA,QACR,GAAG,oBAAI,IAAK;AAAA,UACX,OAAK,0CAA6B,MAAM,OAAQ,KAC/C,CAAC;AAAA,UACF,aAAa,eAAe;AAAA,QAC7B,CAAE;AAAA,MACH,EAAE,KAAK;AAAA,IACR;AAAA,EACD;AAEA,QAAM,WAAO;AAAA,IACZ,aAAa,gBAAiB,SAAU;AAAA,IACxC;AAAA,EACD;AAEA,MAAI,SAAS;AACb,QAAM,OAAO,CAAC;AACd,QAAM,cACL,aAAa,sBAAsB,MAAM,aAAa;AACvD,MAAI;AACH,eAAW,UAAM,iBAAAA,SAAU,EAAE,MAAM,OAAO,CAAE,YAAY,CAAE;AAAA,EAC3D,SAAU,OAAQ;AAEjB;AAAA,EACD;AAEA,MAAK,UAAW;AACf,QAAK,aAAc;AAClB,gBAAU,OAAO,OAAQ,MAAM,SAAS,KAAK,CAAE;AAC/C,WAAK,aAAa;AAAA,QACjB,SAAS,QAAQ,IAAK,YAAa;AAAA,MACpC;AAAA,IACD,OAAO;AACN,gBAAU,OAAO,OAAQ,QAAS;AAAA,IACnC;AAKA,QAAK,MAAM,SAAU;AACpB,gBAAU,QAAQ,IAAK,CAAE,WAAY;AACpC,cAAM,QAAQ,MAAO,GAAI,EAAE,QAAS,CAAE,UAAW;AAChD,cAAK,CAAE,OAAO,eAAgB,KAAM,GAAI;AACvC,mBAAQ,KAAM,IAAI;AAAA,UACnB;AAAA,QACD,CAAE;AAEF,eAAO;AAAA,MACR,CAAE;AAAA,IACH;AAEA,aAAS,MAAO,MAAM;AACrB,eAAS;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAIA,UAAK,CAAE,OAAO,WAAW,CAAE,MAAM,SAAU;AAC1C,cAAM,MAAM,aAAa,OAAO;AAChC,cAAM,kBAAkB,QACtB,OAAQ,CAAE,WAAY,OAAQ,GAAI,CAAE,EACpC,IAAK,CAAE,WAAY;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAQ,GAAI;AAAA,QACb,CAAE;AAEH,iBAAS;AAAA,UACR;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAE;AAAA,EACH;AACD;AAGD,aAAa,mBAAmB,CAAE,QAAQ,MAAM,MAAM,cACrD,OAAO,SAAS,+BAChB,SAAS,OAAO,QAChB,SAAS,OAAO,QAChB,CAAE,OAAO,SACT,cAAc,OAAO;AAaf,IAAM,cACZ,CAAE,MAAM,MAAM,WAAW,aAAa,UACtC,OAAQ,EAAE,UAAU,cAAc,MAAO;AACxC,QAAM,UAAU,MAAM,cAAc,kBAAmB,IAAK;AAC5D,QAAM,eAAe,QAAQ;AAAA,IAC5B,CAAE,WAAY,OAAO,SAAS,QAAQ,OAAO,SAAS;AAAA,EACvD;AAEA,MAAK,CAAE,cAAe;AACrB;AAAA,EACD;AAEA,MAAK,UAAU,UAAa,MAAM,SAAU;AAI3C,YAAQ;AAAA,MACP,GAAG;AAAA,MACH,SAAS;AAAA,QACR,GAAG,oBAAI,IAAK;AAAA,UACX,OAAK,0CAA6B,MAAM,OAAQ,KAC/C,CAAC;AAAA,UACF,aAAa,eAAe;AAAA,QAC7B,CAAE;AAAA,MACH,EAAE,KAAK;AAAA,IACR;AAAA,EACD;AACA,QAAM,WAAO;AAAA,IACZ,aAAa,gBAAiB,WAAW,WAAY;AAAA,IACrD;AAAA,EACD;AAEA,MAAI;AACJ,MAAI;AACH,aAAS,UAAM,iBAAAA,SAAU,EAAE,KAAK,CAAE;AAAA,EACnC,SAAU,OAAQ;AAEjB;AAAA,EACD;AAEA,MAAK,QAAS;AACb,aAAS,iBAAkB,MAAM,MAAM,WAAW,QAAQ,KAAM;AAAA,EACjE;AACD;AAOM,IAAM,wBACZ,CAAE,aACF,OAAQ,EAAE,UAAU,cAAc,MAAO;AACxC,MAAI;AACJ,MAAI;AACH,UAAM;AAAA,MACL,gBAAgB,gBAAgB;AAAA,MAChC,WAAW;AAAA,IACZ,IAAM,MAAM,cAAc,YAAa,QAAS,KAAO,CAAC;AACxD,cAAU,UAAM,iBAAAA,SAAU;AAAA,MACzB,MAAM,GAAI,aAAc,IAAK,QAAS;AAAA,MACtC,QAAQ;AAAA,IACT,CAAE;AAAA,EACH,SAAU,OAAQ;AAEjB;AAAA,EACD;AAEA,MAAK,SAAU;AACd,aAAS;AAAA,MACR;AAAA,MACA,SAAS,QAAQ,YAAY,MAAM;AAAA,IACpC;AAAA,EACD;AACD;AAOM,IAAM,oBACZ,CAAE,SACF,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,SAAS,8CAA8B;AAAA,IAC5C,CAAE,MAAO,EAAE,SAAS;AAAA,EACrB;AAEA,MAAK,CAAE,QAAS;AACf;AAAA,EACD;AAEA,MAAI;AACH,UAAM,UAAU,MAAM,OAAO,aAAa;AAC1C,QAAK,CAAE,QAAQ,QAAS;AACvB;AAAA,IACD;AAEA,aAAS,YAAa,OAAQ;AAAA,EAC/B,QAAQ;AAAA,EAER;AACD;AAKM,IAAM,oBACZ,MACA,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,WAAW,UAAM,iBAAAA,SAAU;AAAA,IAChC,MAAM;AAAA,EACP,CAAE;AACF,WAAS,sBAAuB,QAAS;AAC1C;AAKM,IAAM,kBACZ,MACA,OAAQ,EAAE,SAAS,MAAO;AACzB,QAAM,SAAS,UAAM,iBAAAA,SAAU;AAAA,IAC9B,MAAM;AAAA,EACP,CAAE;AACF,WAAS,oBAAqB,MAAO;AACtC;",
|
|
6
6
|
"names": ["apiFetch"]
|
|
7
7
|
}
|
package/build/types.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/types.ts"],
|
|
4
|
-
"sourcesContent": ["export interface AnyFunction {\n\t( ...args: any[] ): any;\n}\n\n
|
|
4
|
+
"sourcesContent": ["export interface AnyFunction {\n\t( ...args: any[] ): any;\n}\n\n/**\n * Avoid a circular dependency with @wordpress/editor\n *\n * Additionaly, this type marks `attributeKey` and `offset` as possibly\n * `undefined`, which can happen in two known scenarios:\n *\n * 1. If a user has an entire block highlighted (e.g., a `core/image` block).\n * 2. If there's an intermediate selection state while inserting a block, those\n * properties will be temporarily`undefined`.\n */\nexport interface WPBlockSelection {\n\tclientId: string;\n\tattributeKey?: string;\n\toffset?: number;\n}\n\nexport interface WPSelection {\n\tselectionEnd: WPBlockSelection;\n\tselectionStart: WPBlockSelection;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/core-data/src/utils/block-selection-history.ts
|
|
21
|
+
var block_selection_history_exports = {};
|
|
22
|
+
__export(block_selection_history_exports, {
|
|
23
|
+
YSelectionType: () => YSelectionType,
|
|
24
|
+
createBlockSelectionHistory: () => createBlockSelectionHistory
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(block_selection_history_exports);
|
|
27
|
+
var import_sync = require("@wordpress/sync");
|
|
28
|
+
var import_crdt_utils = require("./crdt-utils.cjs");
|
|
29
|
+
var SELECTION_HISTORY_DEFAULT_SIZE = 5;
|
|
30
|
+
var YSelectionType = /* @__PURE__ */ ((YSelectionType2) => {
|
|
31
|
+
YSelectionType2["RelativeSelection"] = "RelativeSelection";
|
|
32
|
+
YSelectionType2["BlockSelection"] = "BlockSelection";
|
|
33
|
+
return YSelectionType2;
|
|
34
|
+
})(YSelectionType || {});
|
|
35
|
+
function createBlockSelectionHistory(ydoc, historySize = SELECTION_HISTORY_DEFAULT_SIZE) {
|
|
36
|
+
let history = [];
|
|
37
|
+
const getSelectionHistory = () => {
|
|
38
|
+
return history.slice(0);
|
|
39
|
+
};
|
|
40
|
+
const updateSelection = (newSelection) => {
|
|
41
|
+
if (!newSelection?.selectionStart?.clientId || !newSelection?.selectionEnd?.clientId) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const { selectionStart, selectionEnd } = newSelection;
|
|
45
|
+
const start = convertWPBlockSelectionToSelection(
|
|
46
|
+
selectionStart,
|
|
47
|
+
ydoc
|
|
48
|
+
);
|
|
49
|
+
const end = convertWPBlockSelectionToSelection(selectionEnd, ydoc);
|
|
50
|
+
addToHistory({ start, end });
|
|
51
|
+
};
|
|
52
|
+
const addToHistory = (yFullSelection) => {
|
|
53
|
+
const startClientId = yFullSelection.start.clientId;
|
|
54
|
+
const endClientId = yFullSelection.end.clientId;
|
|
55
|
+
history = history.filter((entry) => {
|
|
56
|
+
const isSameBlockCombination = entry.start.clientId === startClientId && entry.end.clientId === endClientId;
|
|
57
|
+
return !isSameBlockCombination;
|
|
58
|
+
});
|
|
59
|
+
history.unshift(yFullSelection);
|
|
60
|
+
if (history.length > historySize + 1) {
|
|
61
|
+
history = history.slice(0, historySize + 1);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
getSelectionHistory,
|
|
66
|
+
updateSelection
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function convertWPBlockSelectionToSelection(selection, ydoc) {
|
|
70
|
+
const clientId = selection.clientId;
|
|
71
|
+
const block = (0, import_crdt_utils.findBlockByClientIdInDoc)(clientId, ydoc);
|
|
72
|
+
const attributes = block?.get("attributes");
|
|
73
|
+
const attributeKey = selection.attributeKey;
|
|
74
|
+
const changedYText = attributeKey ? attributes?.get(attributeKey) : void 0;
|
|
75
|
+
const isYText = changedYText instanceof import_sync.Y.Text;
|
|
76
|
+
const isFullyDefinedSelection = attributeKey && clientId;
|
|
77
|
+
if (!isYText || !isFullyDefinedSelection) {
|
|
78
|
+
return {
|
|
79
|
+
type: "BlockSelection" /* BlockSelection */,
|
|
80
|
+
clientId
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const offset = selection.offset ?? 0;
|
|
84
|
+
const relativePosition = import_sync.Y.createRelativePositionFromTypeIndex(
|
|
85
|
+
changedYText,
|
|
86
|
+
offset
|
|
87
|
+
);
|
|
88
|
+
return {
|
|
89
|
+
type: "RelativeSelection" /* RelativeSelection */,
|
|
90
|
+
attributeKey,
|
|
91
|
+
relativePosition,
|
|
92
|
+
clientId,
|
|
93
|
+
offset
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
97
|
+
0 && (module.exports = {
|
|
98
|
+
YSelectionType,
|
|
99
|
+
createBlockSelectionHistory
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=block-selection-history.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/block-selection-history.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\n/**\n * WordPress dependencies\n */\nimport { Y } from '@wordpress/sync';\n\n/**\n * Internal dependencies\n */\nimport { findBlockByClientIdInDoc } from './crdt-utils';\nimport type { WPBlockSelection, WPSelection } from '../types';\n\n// Default size for selection history (not including current selection)\nconst SELECTION_HISTORY_DEFAULT_SIZE = 5;\n\nexport enum YSelectionType {\n\tRelativeSelection = 'RelativeSelection',\n\tBlockSelection = 'BlockSelection',\n}\n\nexport interface YRelativeSelection {\n\ttype: YSelectionType.RelativeSelection;\n\tattributeKey: string;\n\trelativePosition: Y.RelativePosition;\n\tclientId: string;\n\toffset: number;\n}\n\nexport interface YBlockSelection {\n\ttype: YSelectionType.BlockSelection;\n\tclientId: string;\n}\n\nexport type YSelection = YRelativeSelection | YBlockSelection;\n\nexport type YFullSelection = {\n\tstart: YSelection;\n\tend: YSelection;\n};\n\nexport interface YSelectionHistory {\n\tselection: YFullSelection;\n\tbackupSelections?: YFullSelection[];\n}\n\nexport interface BlockSelectionHistory {\n\tgetSelectionHistory: () => YFullSelection[];\n\tupdateSelection: ( newSelection: WPSelection ) => void;\n}\n\n/**\n * This function is used to track recent block selections to help in restoring\n * a user's selection after an undo or redo operation.\n *\n * Maintains a history array for previous selections, which can be used for\n * backup restoration locations.\n * @param ydoc\n * @param historySize\n */\nexport function createBlockSelectionHistory(\n\tydoc: Y.Doc,\n\thistorySize: number = SELECTION_HISTORY_DEFAULT_SIZE\n): BlockSelectionHistory {\n\tlet history: YFullSelection[] = [];\n\n\t/**\n\t * Get the block history including current selection.\n\t */\n\tconst getSelectionHistory = (): YFullSelection[] => {\n\t\treturn history.slice( 0 );\n\t};\n\n\t/**\n\t * Update the selection history with a new selection.\n\t * @param newSelection\n\t */\n\tconst updateSelection = ( newSelection: WPSelection ): void => {\n\t\tif (\n\t\t\t! newSelection?.selectionStart?.clientId ||\n\t\t\t! newSelection?.selectionEnd?.clientId\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { selectionStart, selectionEnd } = newSelection;\n\t\tconst start = convertWPBlockSelectionToSelection(\n\t\t\tselectionStart,\n\t\t\tydoc\n\t\t);\n\t\tconst end = convertWPBlockSelectionToSelection( selectionEnd, ydoc );\n\n\t\taddToHistory( { start, end } );\n\t};\n\n\t/**\n\t * Add a selection to the history, maintaining only the last `historySize` unique selections.\n\t * New selections are added to the front.\n\t * Removes any existing entries with the same start and end block combination.\n\t * @param yFullSelection\n\t */\n\tconst addToHistory = ( yFullSelection: YFullSelection ): void => {\n\t\t// Remove any existing entries with the same start and end block combination\n\t\tconst startClientId = yFullSelection.start.clientId;\n\t\tconst endClientId = yFullSelection.end.clientId;\n\n\t\thistory = history.filter( ( entry ) => {\n\t\t\tconst isSameBlockCombination =\n\t\t\t\tentry.start.clientId === startClientId &&\n\t\t\t\tentry.end.clientId === endClientId;\n\n\t\t\treturn ! isSameBlockCombination;\n\t\t} );\n\n\t\t// Add the new selection to the front\n\t\thistory.unshift( yFullSelection );\n\n\t\t// Trim to max size (remove oldest entries from the back)\n\t\tif ( history.length > historySize + 1 ) {\n\t\t\thistory = history.slice( 0, historySize + 1 );\n\t\t}\n\t};\n\n\treturn {\n\t\tgetSelectionHistory,\n\t\tupdateSelection,\n\t};\n}\n\n/**\n * Convert a WPBlockSelection to a YSelection.\n * @param selection\n * @param ydoc\n * @return A YSelection object.\n */\nfunction convertWPBlockSelectionToSelection(\n\tselection: WPBlockSelection,\n\tydoc: Y.Doc\n): YSelection {\n\tconst clientId = selection.clientId;\n\tconst block = findBlockByClientIdInDoc( clientId, ydoc );\n\tconst attributes = block?.get( 'attributes' );\n\tconst attributeKey = selection.attributeKey;\n\n\tconst changedYText = attributeKey\n\t\t? attributes?.get( attributeKey )\n\t\t: undefined;\n\n\tconst isYText = changedYText instanceof Y.Text;\n\tconst isFullyDefinedSelection = attributeKey && clientId;\n\n\tif ( ! isYText || ! isFullyDefinedSelection ) {\n\t\t// We either don't have a valid YText (it's been deleted) or we've\n\t\t// been passed a selection that's just a block clientId.\n\t\t// Store as BlockSelection.\n\t\treturn {\n\t\t\ttype: YSelectionType.BlockSelection,\n\t\t\tclientId,\n\t\t};\n\t}\n\n\tconst offset = selection.offset ?? 0;\n\tconst relativePosition = Y.createRelativePositionFromTypeIndex(\n\t\tchangedYText,\n\t\toffset\n\t);\n\n\treturn {\n\t\ttype: YSelectionType.RelativeSelection,\n\t\tattributeKey,\n\t\trelativePosition,\n\t\tclientId,\n\t\toffset,\n\t};\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,kBAAkB;AAKlB,wBAAyC;AAIzC,IAAM,iCAAiC;AAEhC,IAAK,iBAAL,kBAAKA,oBAAL;AACN,EAAAA,gBAAA,uBAAoB;AACpB,EAAAA,gBAAA,oBAAiB;AAFN,SAAAA;AAAA,GAAA;AA4CL,SAAS,4BACf,MACA,cAAsB,gCACE;AACxB,MAAI,UAA4B,CAAC;AAKjC,QAAM,sBAAsB,MAAwB;AACnD,WAAO,QAAQ,MAAO,CAAE;AAAA,EACzB;AAMA,QAAM,kBAAkB,CAAE,iBAAqC;AAC9D,QACC,CAAE,cAAc,gBAAgB,YAChC,CAAE,cAAc,cAAc,UAC7B;AACD;AAAA,IACD;AAEA,UAAM,EAAE,gBAAgB,aAAa,IAAI;AACzC,UAAM,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,IACD;AACA,UAAM,MAAM,mCAAoC,cAAc,IAAK;AAEnE,iBAAc,EAAE,OAAO,IAAI,CAAE;AAAA,EAC9B;AAQA,QAAM,eAAe,CAAE,mBAA0C;AAEhE,UAAM,gBAAgB,eAAe,MAAM;AAC3C,UAAM,cAAc,eAAe,IAAI;AAEvC,cAAU,QAAQ,OAAQ,CAAE,UAAW;AACtC,YAAM,yBACL,MAAM,MAAM,aAAa,iBACzB,MAAM,IAAI,aAAa;AAExB,aAAO,CAAE;AAAA,IACV,CAAE;AAGF,YAAQ,QAAS,cAAe;AAGhC,QAAK,QAAQ,SAAS,cAAc,GAAI;AACvC,gBAAU,QAAQ,MAAO,GAAG,cAAc,CAAE;AAAA,IAC7C;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EACD;AACD;AAQA,SAAS,mCACR,WACA,MACa;AACb,QAAM,WAAW,UAAU;AAC3B,QAAM,YAAQ,4CAA0B,UAAU,IAAK;AACvD,QAAM,aAAa,OAAO,IAAK,YAAa;AAC5C,QAAM,eAAe,UAAU;AAE/B,QAAM,eAAe,eAClB,YAAY,IAAK,YAAa,IAC9B;AAEH,QAAM,UAAU,wBAAwB,cAAE;AAC1C,QAAM,0BAA0B,gBAAgB;AAEhD,MAAK,CAAE,WAAW,CAAE,yBAA0B;AAI7C,WAAO;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACD;AAAA,EACD;AAEA,QAAM,SAAS,UAAU,UAAU;AACnC,QAAM,mBAAmB,cAAE;AAAA,IAC1B;AAAA,IACA;AAAA,EACD;AAEA,SAAO;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;",
|
|
6
|
+
"names": ["YSelectionType"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/core-data/src/utils/crdt-selection.ts
|
|
21
|
+
var crdt_selection_exports = {};
|
|
22
|
+
__export(crdt_selection_exports, {
|
|
23
|
+
getSelectionHistory: () => getSelectionHistory,
|
|
24
|
+
restoreSelection: () => restoreSelection,
|
|
25
|
+
updateSelectionHistory: () => updateSelectionHistory
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(crdt_selection_exports);
|
|
28
|
+
var import_data = require("@wordpress/data");
|
|
29
|
+
var import_block_editor = require("@wordpress/block-editor");
|
|
30
|
+
var import_blocks = require("@wordpress/blocks");
|
|
31
|
+
var import_sync = require("@wordpress/sync");
|
|
32
|
+
var import_block_selection_history = require("./block-selection-history.cjs");
|
|
33
|
+
var import_crdt_utils = require("./crdt-utils.cjs");
|
|
34
|
+
var selectionHistoryMap = /* @__PURE__ */ new WeakMap();
|
|
35
|
+
function getBlockSelectionHistory(ydoc) {
|
|
36
|
+
let history = selectionHistoryMap.get(ydoc);
|
|
37
|
+
if (!history) {
|
|
38
|
+
history = (0, import_block_selection_history.createBlockSelectionHistory)(ydoc);
|
|
39
|
+
selectionHistoryMap.set(ydoc, history);
|
|
40
|
+
}
|
|
41
|
+
return history;
|
|
42
|
+
}
|
|
43
|
+
function getSelectionHistory(ydoc) {
|
|
44
|
+
return getBlockSelectionHistory(ydoc).getSelectionHistory();
|
|
45
|
+
}
|
|
46
|
+
function updateSelectionHistory(ydoc, wpSelection) {
|
|
47
|
+
return getBlockSelectionHistory(ydoc).updateSelection(wpSelection);
|
|
48
|
+
}
|
|
49
|
+
function convertYSelectionToBlockSelection(ySelection, ydoc) {
|
|
50
|
+
if (ySelection.type === import_block_selection_history.YSelectionType.RelativeSelection) {
|
|
51
|
+
const { relativePosition, attributeKey, clientId } = ySelection;
|
|
52
|
+
const absolutePosition = import_sync.Y.createAbsolutePositionFromRelativePosition(
|
|
53
|
+
relativePosition,
|
|
54
|
+
ydoc
|
|
55
|
+
);
|
|
56
|
+
if (absolutePosition) {
|
|
57
|
+
return {
|
|
58
|
+
clientId,
|
|
59
|
+
attributeKey,
|
|
60
|
+
offset: absolutePosition.index
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
} else if (ySelection.type === import_block_selection_history.YSelectionType.BlockSelection) {
|
|
64
|
+
return {
|
|
65
|
+
clientId: ySelection.clientId,
|
|
66
|
+
attributeKey: void 0,
|
|
67
|
+
offset: void 0
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function findSelectionFromHistory(ydoc, selectionHistory) {
|
|
73
|
+
for (const positionToTry of selectionHistory) {
|
|
74
|
+
const { start, end } = positionToTry;
|
|
75
|
+
const startBlock = (0, import_crdt_utils.findBlockByClientIdInDoc)(start.clientId, ydoc);
|
|
76
|
+
const endBlock = (0, import_crdt_utils.findBlockByClientIdInDoc)(end.clientId, ydoc);
|
|
77
|
+
if (!startBlock || !endBlock) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const startBlockSelection = convertYSelectionToBlockSelection(
|
|
81
|
+
start,
|
|
82
|
+
ydoc
|
|
83
|
+
);
|
|
84
|
+
const endBlockSelection = convertYSelectionToBlockSelection(
|
|
85
|
+
end,
|
|
86
|
+
ydoc
|
|
87
|
+
);
|
|
88
|
+
if (startBlockSelection === null || endBlockSelection === null) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
selectionStart: startBlockSelection,
|
|
93
|
+
selectionEnd: endBlockSelection
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
function restoreSelection(selectionHistory, ydoc) {
|
|
99
|
+
const selectionToRestore = findSelectionFromHistory(
|
|
100
|
+
ydoc,
|
|
101
|
+
selectionHistory
|
|
102
|
+
);
|
|
103
|
+
if (selectionToRestore === null) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const { getBlock } = (0, import_data.select)(import_block_editor.store);
|
|
107
|
+
const { resetSelection } = (0, import_data.dispatch)(import_block_editor.store);
|
|
108
|
+
const { selectionStart, selectionEnd } = selectionToRestore;
|
|
109
|
+
const isSelectionInSameBlock = selectionStart.clientId === selectionEnd.clientId;
|
|
110
|
+
if (isSelectionInSameBlock) {
|
|
111
|
+
const block = getBlock(selectionStart.clientId);
|
|
112
|
+
const isBlockEmpty = block && (0, import_blocks.isUnmodifiedBlock)(block);
|
|
113
|
+
const isBeginningOfEmptyBlock = 0 === selectionStart.offset && 0 === selectionEnd.offset && isBlockEmpty;
|
|
114
|
+
if (isBeginningOfEmptyBlock) {
|
|
115
|
+
const selectionStartWithoutOffset = {
|
|
116
|
+
clientId: selectionStart.clientId
|
|
117
|
+
};
|
|
118
|
+
const selectionEndWithoutOffset = {
|
|
119
|
+
clientId: selectionEnd.clientId
|
|
120
|
+
};
|
|
121
|
+
resetSelection(
|
|
122
|
+
selectionStartWithoutOffset,
|
|
123
|
+
selectionEndWithoutOffset,
|
|
124
|
+
0
|
|
125
|
+
);
|
|
126
|
+
} else {
|
|
127
|
+
resetSelection(selectionStart, selectionEnd, 0);
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
resetSelection(selectionEnd, selectionEnd, 0);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
134
|
+
0 && (module.exports = {
|
|
135
|
+
getSelectionHistory,
|
|
136
|
+
restoreSelection,
|
|
137
|
+
updateSelectionHistory
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=crdt-selection.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/crdt-selection.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { dispatch, select } from '@wordpress/data';\n// @ts-expect-error No exported types.\nimport { store as blockEditorStore } from '@wordpress/block-editor';\n// @ts-expect-error No exported types.\nimport { isUnmodifiedBlock } from '@wordpress/blocks';\nimport { type CRDTDoc, Y } from '@wordpress/sync';\n\n/**\n * Internal dependencies\n */\nimport {\n\tcreateBlockSelectionHistory,\n\tYSelectionType,\n\ttype BlockSelectionHistory,\n\ttype YFullSelection,\n\ttype YSelection,\n} from './block-selection-history';\nimport { findBlockByClientIdInDoc } from './crdt-utils';\nimport type { WPBlockSelection, WPSelection } from '../types';\n\n// WeakMap to store BlockSelectionHistory instances per Y.Doc\nconst selectionHistoryMap = new WeakMap< CRDTDoc, BlockSelectionHistory >();\n\n/**\n * Get or create a BlockSelectionHistory instance for a given Y.Doc.\n *\n * @param ydoc The Y.Doc to get the selection history for\n * @return The BlockSelectionHistory instance\n */\nfunction getBlockSelectionHistory( ydoc: CRDTDoc ): BlockSelectionHistory {\n\tlet history = selectionHistoryMap.get( ydoc );\n\n\tif ( ! history ) {\n\t\thistory = createBlockSelectionHistory( ydoc );\n\t\tselectionHistoryMap.set( ydoc, history );\n\t}\n\n\treturn history;\n}\n\nexport function getSelectionHistory( ydoc: CRDTDoc ): YFullSelection[] {\n\treturn getBlockSelectionHistory( ydoc ).getSelectionHistory();\n}\n\nexport function updateSelectionHistory(\n\tydoc: CRDTDoc,\n\twpSelection: WPSelection\n): void {\n\treturn getBlockSelectionHistory( ydoc ).updateSelection( wpSelection );\n}\n\n/**\n * Convert a YSelection to a WPBlockSelection.\n * @param ySelection The YSelection (relative) to convert\n * @param ydoc The Y.Doc to convert the selection to a block selection for\n * @return The converted WPBlockSelection, or null if the conversion fails\n */\nfunction convertYSelectionToBlockSelection(\n\tySelection: YSelection,\n\tydoc: Y.Doc\n): WPBlockSelection | null {\n\tif ( ySelection.type === YSelectionType.RelativeSelection ) {\n\t\tconst { relativePosition, attributeKey, clientId } = ySelection;\n\n\t\tconst absolutePosition = Y.createAbsolutePositionFromRelativePosition(\n\t\t\trelativePosition,\n\t\t\tydoc\n\t\t);\n\n\t\tif ( absolutePosition ) {\n\t\t\treturn {\n\t\t\t\tclientId,\n\t\t\t\tattributeKey,\n\t\t\t\toffset: absolutePosition.index,\n\t\t\t};\n\t\t}\n\t} else if ( ySelection.type === YSelectionType.BlockSelection ) {\n\t\treturn {\n\t\t\tclientId: ySelection.clientId,\n\t\t\tattributeKey: undefined,\n\t\t\toffset: undefined,\n\t\t};\n\t}\n\n\treturn null;\n}\n\n/**\n * Given a Y.Doc and a selection history, find the most recent selection\n * that exists in the document. Skip any selections that are not in the document.\n * @param ydoc The Y.Doc to find the selection in\n * @param selectionHistory The selection history to check\n * @return The most recent selection that exists in the document, or null if no selection exists.\n */\nfunction findSelectionFromHistory(\n\tydoc: Y.Doc,\n\tselectionHistory: YFullSelection[]\n): WPSelection | null {\n\t// Try each position until we find one that exists in the document\n\tfor ( const positionToTry of selectionHistory ) {\n\t\tconst { start, end } = positionToTry;\n\t\tconst startBlock = findBlockByClientIdInDoc( start.clientId, ydoc );\n\t\tconst endBlock = findBlockByClientIdInDoc( end.clientId, ydoc );\n\n\t\tif ( ! startBlock || ! endBlock ) {\n\t\t\t// This block no longer exists, skip it.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst startBlockSelection = convertYSelectionToBlockSelection(\n\t\t\tstart,\n\t\t\tydoc\n\t\t);\n\t\tconst endBlockSelection = convertYSelectionToBlockSelection(\n\t\t\tend,\n\t\t\tydoc\n\t\t);\n\n\t\tif ( startBlockSelection === null || endBlockSelection === null ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn {\n\t\t\tselectionStart: startBlockSelection,\n\t\t\tselectionEnd: endBlockSelection,\n\t\t};\n\t}\n\n\treturn null;\n}\n\n/**\n * Restore the selection to the most recent selection in history that is\n * available in the document.\n * @param selectionHistory The selection history to restore\n * @param ydoc The Y.Doc where blocks are stored\n */\nexport function restoreSelection(\n\tselectionHistory: YFullSelection[],\n\tydoc: Y.Doc\n): void {\n\t// Find the most recent selection in history that is available in\n\t// the document.\n\tconst selectionToRestore = findSelectionFromHistory(\n\t\tydoc,\n\t\tselectionHistory\n\t);\n\n\tif ( selectionToRestore === null ) {\n\t\t// Case 1: No blocks in history are available for restoration.\n\t\t// Do nothing.\n\t\treturn;\n\t}\n\n\tconst { getBlock } = select( blockEditorStore );\n\tconst { resetSelection } = dispatch( blockEditorStore );\n\tconst { selectionStart, selectionEnd } = selectionToRestore;\n\tconst isSelectionInSameBlock =\n\t\tselectionStart.clientId === selectionEnd.clientId;\n\n\tif ( isSelectionInSameBlock ) {\n\t\t// Case 2: After content is restored, the selection is available\n\t\t// within the same block\n\n\t\tconst block = getBlock( selectionStart.clientId );\n\t\tconst isBlockEmpty = block && isUnmodifiedBlock( block );\n\t\tconst isBeginningOfEmptyBlock =\n\t\t\t0 === selectionStart.offset &&\n\t\t\t0 === selectionEnd.offset &&\n\t\t\tisBlockEmpty;\n\n\t\tif ( isBeginningOfEmptyBlock ) {\n\t\t\t// Case 2a: When the content in a block has been removed after an\n\t\t\t// undo, WordPress will set the selection to the block's client ID\n\t\t\t// with an undefined startOffset and endOffset.\n\t\t\t//\n\t\t\t// To match the default behavior and tests, exclude the selection\n\t\t\t// offset when resetting to position 0.\n\t\t\tconst selectionStartWithoutOffset = {\n\t\t\t\tclientId: selectionStart.clientId,\n\t\t\t};\n\t\t\tconst selectionEndWithoutOffset = {\n\t\t\t\tclientId: selectionEnd.clientId,\n\t\t\t};\n\n\t\t\tresetSelection(\n\t\t\t\tselectionStartWithoutOffset,\n\t\t\t\tselectionEndWithoutOffset,\n\t\t\t\t0\n\t\t\t);\n\t\t} else {\n\t\t\t// Case 2b: Otherwise, reset including the saved selection offset.\n\t\t\tresetSelection( selectionStart, selectionEnd, 0 );\n\t\t}\n\t} else {\n\t\t// Case 3: A multi-block selection was made. resetSelection() can only\n\t\t// restore selections within the same block.\n\t\t// When a multi-block selection is made, selectionEnd represents\n\t\t// where the user's cursor ended.\n\t\tresetSelection( selectionEnd, selectionEnd, 0 );\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiC;AAEjC,0BAA0C;AAE1C,oBAAkC;AAClC,kBAAgC;AAKhC,qCAMO;AACP,wBAAyC;AAIzC,IAAM,sBAAsB,oBAAI,QAA0C;AAQ1E,SAAS,yBAA0B,MAAuC;AACzE,MAAI,UAAU,oBAAoB,IAAK,IAAK;AAE5C,MAAK,CAAE,SAAU;AAChB,kBAAU,4DAA6B,IAAK;AAC5C,wBAAoB,IAAK,MAAM,OAAQ;AAAA,EACxC;AAEA,SAAO;AACR;AAEO,SAAS,oBAAqB,MAAkC;AACtE,SAAO,yBAA0B,IAAK,EAAE,oBAAoB;AAC7D;AAEO,SAAS,uBACf,MACA,aACO;AACP,SAAO,yBAA0B,IAAK,EAAE,gBAAiB,WAAY;AACtE;AAQA,SAAS,kCACR,YACA,MAC0B;AAC1B,MAAK,WAAW,SAAS,8CAAe,mBAAoB;AAC3D,UAAM,EAAE,kBAAkB,cAAc,SAAS,IAAI;AAErD,UAAM,mBAAmB,cAAE;AAAA,MAC1B;AAAA,MACA;AAAA,IACD;AAEA,QAAK,kBAAmB;AACvB,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA,QAAQ,iBAAiB;AAAA,MAC1B;AAAA,IACD;AAAA,EACD,WAAY,WAAW,SAAS,8CAAe,gBAAiB;AAC/D,WAAO;AAAA,MACN,UAAU,WAAW;AAAA,MACrB,cAAc;AAAA,MACd,QAAQ;AAAA,IACT;AAAA,EACD;AAEA,SAAO;AACR;AASA,SAAS,yBACR,MACA,kBACqB;AAErB,aAAY,iBAAiB,kBAAmB;AAC/C,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,UAAM,iBAAa,4CAA0B,MAAM,UAAU,IAAK;AAClE,UAAM,eAAW,4CAA0B,IAAI,UAAU,IAAK;AAE9D,QAAK,CAAE,cAAc,CAAE,UAAW;AAEjC;AAAA,IACD;AAEA,UAAM,sBAAsB;AAAA,MAC3B;AAAA,MACA;AAAA,IACD;AACA,UAAM,oBAAoB;AAAA,MACzB;AAAA,MACA;AAAA,IACD;AAEA,QAAK,wBAAwB,QAAQ,sBAAsB,MAAO;AACjE;AAAA,IACD;AAEA,WAAO;AAAA,MACN,gBAAgB;AAAA,MAChB,cAAc;AAAA,IACf;AAAA,EACD;AAEA,SAAO;AACR;AAQO,SAAS,iBACf,kBACA,MACO;AAGP,QAAM,qBAAqB;AAAA,IAC1B;AAAA,IACA;AAAA,EACD;AAEA,MAAK,uBAAuB,MAAO;AAGlC;AAAA,EACD;AAEA,QAAM,EAAE,SAAS,QAAI,oBAAQ,oBAAAA,KAAiB;AAC9C,QAAM,EAAE,eAAe,QAAI,sBAAU,oBAAAA,KAAiB;AACtD,QAAM,EAAE,gBAAgB,aAAa,IAAI;AACzC,QAAM,yBACL,eAAe,aAAa,aAAa;AAE1C,MAAK,wBAAyB;AAI7B,UAAM,QAAQ,SAAU,eAAe,QAAS;AAChD,UAAM,eAAe,aAAS,iCAAmB,KAAM;AACvD,UAAM,0BACL,MAAM,eAAe,UACrB,MAAM,aAAa,UACnB;AAED,QAAK,yBAA0B;AAO9B,YAAM,8BAA8B;AAAA,QACnC,UAAU,eAAe;AAAA,MAC1B;AACA,YAAM,4BAA4B;AAAA,QACjC,UAAU,aAAa;AAAA,MACxB;AAEA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MACD;AAAA,IACD,OAAO;AAEN,qBAAgB,gBAAgB,cAAc,CAAE;AAAA,IACjD;AAAA,EACD,OAAO;AAKN,mBAAgB,cAAc,cAAc,CAAE;AAAA,EAC/C;AACD;",
|
|
6
|
+
"names": ["blockEditorStore"]
|
|
7
|
+
}
|