UNPKG

@wordpress/core-data

Version:
8 lines (7 loc) 5.88 kB
{ "version": 3, "sources": ["../../src/queried-data/selectors.js"], "sourcesContent": ["/**\n * External dependencies\n */\nimport EquivalentKeyMap from 'equivalent-key-map';\n\n/**\n * WordPress dependencies\n */\nimport { createSelector } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport getQueryParts from './get-query-parts';\nimport { setNestedValue } from '../utils';\n\n/**\n * Cache of state keys to EquivalentKeyMap where the inner map tracks queries\n * to their resulting items set. WeakMap allows garbage collection on expired\n * state references.\n *\n * @type {WeakMap<Object,EquivalentKeyMap>}\n */\nconst queriedItemsCacheByState = new WeakMap();\n\n/**\n * Returns items for a given query, or null if the items are not known.\n *\n * @param {Object} state State object.\n * @param {?Object} query Optional query.\n *\n * @return {?Array} Query items.\n */\nfunction getQueriedItemsUncached( state, query ) {\n\tconst { stableKey, page, perPage, include, fields, context } =\n\t\tgetQueryParts( query );\n\tlet itemIds;\n\n\tif ( state.queries?.[ context ]?.[ stableKey ] ) {\n\t\titemIds = state.queries[ context ][ stableKey ].itemIds;\n\t}\n\n\tif ( ! itemIds ) {\n\t\treturn null;\n\t}\n\n\tconst startOffset = perPage === -1 ? 0 : ( page - 1 ) * perPage;\n\tconst endOffset =\n\t\tperPage === -1\n\t\t\t? itemIds.length\n\t\t\t: Math.min( startOffset + perPage, itemIds.length );\n\n\tconst items = [];\n\tfor ( let i = startOffset; i < endOffset; i++ ) {\n\t\tconst itemId = itemIds[ i ];\n\t\tif ( Array.isArray( include ) && ! include.includes( itemId ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( itemId === undefined ) {\n\t\t\tcontinue;\n\t\t}\n\t\t// Having a target item ID doesn't guarantee that this object has been queried.\n\t\tif ( ! state.items[ context ]?.hasOwnProperty( itemId ) ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst item = state.items[ context ][ itemId ];\n\n\t\tlet filteredItem;\n\t\tif ( Array.isArray( fields ) ) {\n\t\t\tfilteredItem = {};\n\n\t\t\tfor ( let f = 0; f < fields.length; f++ ) {\n\t\t\t\tconst field = fields[ f ].split( '.' );\n\t\t\t\tlet value = item;\n\t\t\t\tfield.forEach( ( fieldName ) => {\n\t\t\t\t\tvalue = value?.[ fieldName ];\n\t\t\t\t} );\n\n\t\t\t\tsetNestedValue( filteredItem, field, value );\n\t\t\t}\n\t\t} else {\n\t\t\t// If expecting a complete item, validate that completeness, or\n\t\t\t// otherwise abort.\n\t\t\tif ( ! state.itemIsComplete[ context ]?.[ itemId ] ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tfilteredItem = item;\n\t\t}\n\n\t\titems.push( filteredItem );\n\t}\n\n\treturn items;\n}\n\n/**\n * Returns items for a given query, or null if the items are not known. Caches\n * result both per state (by reference) and per query (by deep equality).\n * The caching approach is intended to be durable to query objects which are\n * deeply but not referentially equal, since otherwise:\n *\n * `getQueriedItems( state, {} ) !== getQueriedItems( state, {} )`\n *\n * @param {Object} state State object.\n * @param {?Object} query Optional query.\n *\n * @return {?Array} Query items.\n */\nexport const getQueriedItems = createSelector( ( state, query = {} ) => {\n\tlet queriedItemsCache = queriedItemsCacheByState.get( state );\n\tif ( queriedItemsCache ) {\n\t\tconst queriedItems = queriedItemsCache.get( query );\n\t\tif ( queriedItems !== undefined ) {\n\t\t\treturn queriedItems;\n\t\t}\n\t} else {\n\t\tqueriedItemsCache = new EquivalentKeyMap();\n\t\tqueriedItemsCacheByState.set( state, queriedItemsCache );\n\t}\n\n\tconst items = getQueriedItemsUncached( state, query );\n\tqueriedItemsCache.set( query, items );\n\treturn items;\n} );\n\nexport function getQueriedTotalItems( state, query = {} ) {\n\tconst { stableKey, context } = getQueryParts( query );\n\n\treturn state.queries?.[ context ]?.[ stableKey ]?.meta?.totalItems ?? null;\n}\n\nexport function getQueriedTotalPages( state, query = {} ) {\n\tconst { stableKey, context } = getQueryParts( query );\n\n\treturn state.queries?.[ context ]?.[ stableKey ]?.meta?.totalPages ?? null;\n}\n"], "mappings": ";AAGA,OAAO,sBAAsB;AAK7B,SAAS,sBAAsB;AAK/B,OAAO,mBAAmB;AAC1B,SAAS,sBAAsB;AAS/B,IAAM,2BAA2B,oBAAI,QAAQ;AAU7C,SAAS,wBAAyB,OAAO,OAAQ;AAChD,QAAM,EAAE,WAAW,MAAM,SAAS,SAAS,QAAQ,QAAQ,IAC1D,cAAe,KAAM;AACtB,MAAI;AAEJ,MAAK,MAAM,UAAW,OAAQ,IAAK,SAAU,GAAI;AAChD,cAAU,MAAM,QAAS,OAAQ,EAAG,SAAU,EAAE;AAAA,EACjD;AAEA,MAAK,CAAE,SAAU;AAChB,WAAO;AAAA,EACR;AAEA,QAAM,cAAc,YAAY,KAAK,KAAM,OAAO,KAAM;AACxD,QAAM,YACL,YAAY,KACT,QAAQ,SACR,KAAK,IAAK,cAAc,SAAS,QAAQ,MAAO;AAEpD,QAAM,QAAQ,CAAC;AACf,WAAU,IAAI,aAAa,IAAI,WAAW,KAAM;AAC/C,UAAM,SAAS,QAAS,CAAE;AAC1B,QAAK,MAAM,QAAS,OAAQ,KAAK,CAAE,QAAQ,SAAU,MAAO,GAAI;AAC/D;AAAA,IACD;AACA,QAAK,WAAW,QAAY;AAC3B;AAAA,IACD;AAEA,QAAK,CAAE,MAAM,MAAO,OAAQ,GAAG,eAAgB,MAAO,GAAI;AACzD,aAAO;AAAA,IACR;AAEA,UAAM,OAAO,MAAM,MAAO,OAAQ,EAAG,MAAO;AAE5C,QAAI;AACJ,QAAK,MAAM,QAAS,MAAO,GAAI;AAC9B,qBAAe,CAAC;AAEhB,eAAU,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAM;AACzC,cAAM,QAAQ,OAAQ,CAAE,EAAE,MAAO,GAAI;AACrC,YAAI,QAAQ;AACZ,cAAM,QAAS,CAAE,cAAe;AAC/B,kBAAQ,QAAS,SAAU;AAAA,QAC5B,CAAE;AAEF,uBAAgB,cAAc,OAAO,KAAM;AAAA,MAC5C;AAAA,IACD,OAAO;AAGN,UAAK,CAAE,MAAM,eAAgB,OAAQ,IAAK,MAAO,GAAI;AACpD,eAAO;AAAA,MACR;AAEA,qBAAe;AAAA,IAChB;AAEA,UAAM,KAAM,YAAa;AAAA,EAC1B;AAEA,SAAO;AACR;AAeO,IAAM,kBAAkB,eAAgB,CAAE,OAAO,QAAQ,CAAC,MAAO;AACvE,MAAI,oBAAoB,yBAAyB,IAAK,KAAM;AAC5D,MAAK,mBAAoB;AACxB,UAAM,eAAe,kBAAkB,IAAK,KAAM;AAClD,QAAK,iBAAiB,QAAY;AACjC,aAAO;AAAA,IACR;AAAA,EACD,OAAO;AACN,wBAAoB,IAAI,iBAAiB;AACzC,6BAAyB,IAAK,OAAO,iBAAkB;AAAA,EACxD;AAEA,QAAM,QAAQ,wBAAyB,OAAO,KAAM;AACpD,oBAAkB,IAAK,OAAO,KAAM;AACpC,SAAO;AACR,CAAE;AAEK,SAAS,qBAAsB,OAAO,QAAQ,CAAC,GAAI;AACzD,QAAM,EAAE,WAAW,QAAQ,IAAI,cAAe,KAAM;AAEpD,SAAO,MAAM,UAAW,OAAQ,IAAK,SAAU,GAAG,MAAM,cAAc;AACvE;AAEO,SAAS,qBAAsB,OAAO,QAAQ,CAAC,GAAI;AACzD,QAAM,EAAE,WAAW,QAAQ,IAAI,cAAe,KAAM;AAEpD,SAAO,MAAM,UAAW,OAAQ,IAAK,SAAU,GAAG,MAAM,cAAc;AACvE;", "names": [] }