@woocommerce/data
Version:
WooCommerce Admin data store and utilities
80 lines (79 loc) • 3.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.request = exports.getResourceIdentifier = exports.isResourcePrefix = exports.getResourcePrefix = exports.getTotalCountResourceName = exports.getResourceName = void 0;
/**
* External dependencies
*/
const url_1 = require("@wordpress/url");
const data_controls_1 = require("@wordpress/data-controls");
const controls_1 = require("./controls");
function replacer(_, value) {
if (value) {
if (Array.isArray(value)) {
return [...value].sort();
}
if (typeof value === 'object') {
return Object.entries(value)
.sort()
.reduce((current, [propKey, propVal]) => ({
...current,
[propKey]: propVal,
}), {});
}
}
return value;
}
function getResourceName(prefix, ...identifier) {
const identifierString = JSON.stringify(identifier, replacer).replace(/\\"/g, '"');
return `${prefix}:${identifierString}`;
}
exports.getResourceName = getResourceName;
/**
* Generate a resource name for order totals count.
*
* It omits query parameters from the identifier that don't affect
* totals values like pagination and response field filtering.
*
* @param {string} prefix Resource name prefix.
* @param {Object} query Query for order totals count.
* @return {string} Resource name for order totals.
*/
function getTotalCountResourceName(prefix, query) {
const { _fields, page, per_page, order, orderby, ...totalsQuery } = query;
return getResourceName(prefix, totalsQuery);
}
exports.getTotalCountResourceName = getTotalCountResourceName;
function getResourcePrefix(resourceName) {
const hasPrefixIndex = resourceName.indexOf(':');
return hasPrefixIndex < 0
? resourceName
: resourceName.substring(0, hasPrefixIndex);
}
exports.getResourcePrefix = getResourcePrefix;
function isResourcePrefix(resourceName, prefix) {
const resourcePrefix = getResourcePrefix(resourceName);
return resourcePrefix === prefix;
}
exports.isResourcePrefix = isResourcePrefix;
function getResourceIdentifier(resourceName) {
const identifierString = resourceName.substring(resourceName.indexOf(':') + 1);
return JSON.parse(identifierString);
}
exports.getResourceIdentifier = getResourceIdentifier;
function* request(namespace, query) {
const url = (0, url_1.addQueryArgs)(namespace, query);
const isUnboundedRequest = query.per_page === -1;
const fetch = isUnboundedRequest ? data_controls_1.apiFetch : controls_1.fetchWithHeaders;
const response = yield fetch({
path: url,
method: 'GET',
});
if (isUnboundedRequest && !('data' in response)) {
return { items: response, totalCount: response.length };
}
if (!isUnboundedRequest && 'data' in response) {
const totalCount = parseInt(response.headers.get('x-wp-total') || '', 10);
return { items: response.data, totalCount };
}
}
exports.request = request;