@data-client/normalizr
Version:
Normalizes and denormalizes JSON according to schema for Redux and Flux applications
34 lines (31 loc) • 4.85 kB
JavaScript
import { queryKey as arrayQuery } from './schemas/Array.js';
import { queryKey as objectQuery } from './schemas/Object.js';
/**
* Build the result parameter to denormalize from schema alone.
* Tries to compute the entity ids from params.
*/
export default function buildQueryKey(schema, args, getEntity, getIndex) {
// schema classes
if (canQuery(schema)) {
return schema.queryKey(args, buildQueryKey, getEntity, getIndex);
}
// plain case
if (typeof schema === 'object' && schema) {
const method = Array.isArray(schema) ? arrayQuery : objectQuery;
return method(schema, args, buildQueryKey, getEntity, getIndex);
}
// fallback for things like null or undefined
return schema;
}
export function canQuery(schema) {
return !!schema && typeof schema.queryKey === 'function';
}
// this only works if entity does a lookup first to see if its entity is 'found'
export function validateQueryKey(queryKey) {
if (queryKey === undefined) return false;
if (queryKey && typeof queryKey === 'object' && !Array.isArray(queryKey)) {
return Object.values(queryKey).every(validateQueryKey);
}
return true;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJxdWVyeUtleSIsImFycmF5UXVlcnkiLCJvYmplY3RRdWVyeSIsImJ1aWxkUXVlcnlLZXkiLCJzY2hlbWEiLCJhcmdzIiwiZ2V0RW50aXR5IiwiZ2V0SW5kZXgiLCJjYW5RdWVyeSIsIm1ldGhvZCIsIkFycmF5IiwiaXNBcnJheSIsInZhbGlkYXRlUXVlcnlLZXkiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJldmVyeSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZFF1ZXJ5S2V5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hLCBTY2hlbWFTaW1wbGUsIEdldEluZGV4LCBHZXRFbnRpdHkgfSBmcm9tICcuL2ludGVyZmFjZS5qcyc7XG5pbXBvcnQgeyBxdWVyeUtleSBhcyBhcnJheVF1ZXJ5IH0gZnJvbSAnLi9zY2hlbWFzL0FycmF5LmpzJztcbmltcG9ydCB7IHF1ZXJ5S2V5IGFzIG9iamVjdFF1ZXJ5IH0gZnJvbSAnLi9zY2hlbWFzL09iamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IE5vcm1hbGl6ZU51bGxhYmxlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogQnVpbGQgdGhlIHJlc3VsdCBwYXJhbWV0ZXIgdG8gZGVub3JtYWxpemUgZnJvbSBzY2hlbWEgYWxvbmUuXG4gKiBUcmllcyB0byBjb21wdXRlIHRoZSBlbnRpdHkgaWRzIGZyb20gcGFyYW1zLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZFF1ZXJ5S2V5PFMgZXh0ZW5kcyBTY2hlbWE+KFxuICBzY2hlbWE6IFMsXG4gIGFyZ3M6IHJlYWRvbmx5IGFueVtdLFxuICBnZXRFbnRpdHk6IEdldEVudGl0eSxcbiAgZ2V0SW5kZXg6IEdldEluZGV4LFxuKTogTm9ybWFsaXplTnVsbGFibGU8Uz4ge1xuICAvLyBzY2hlbWEgY2xhc3Nlc1xuICBpZiAoY2FuUXVlcnkoc2NoZW1hKSkge1xuICAgIHJldHVybiBzY2hlbWEucXVlcnlLZXkoYXJncyBhcyBhbnlbXSwgYnVpbGRRdWVyeUtleSwgZ2V0RW50aXR5LCBnZXRJbmRleCk7XG4gIH1cblxuICAvLyBwbGFpbiBjYXNlXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSAnb2JqZWN0JyAmJiBzY2hlbWEpIHtcbiAgICBjb25zdCBtZXRob2QgPSBBcnJheS5pc0FycmF5KHNjaGVtYSkgPyBhcnJheVF1ZXJ5IDogb2JqZWN0UXVlcnk7XG4gICAgcmV0dXJuIG1ldGhvZChzY2hlbWEsIGFyZ3MsIGJ1aWxkUXVlcnlLZXksIGdldEVudGl0eSwgZ2V0SW5kZXgpO1xuICB9XG5cbiAgLy8gZmFsbGJhY2sgZm9yIHRoaW5ncyBsaWtlIG51bGwgb3IgdW5kZWZpbmVkXG4gIHJldHVybiBzY2hlbWEgYXMgYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FuUXVlcnkoXG4gIHNjaGVtYTogU2NoZW1hLFxuKTogc2NoZW1hIGlzIFBpY2s8U2NoZW1hU2ltcGxlLCAncXVlcnlLZXknPiB7XG4gIHJldHVybiAhIXNjaGVtYSAmJiB0eXBlb2YgKHNjaGVtYSBhcyBhbnkpLnF1ZXJ5S2V5ID09PSAnZnVuY3Rpb24nO1xufVxuXG4vLyB0aGlzIG9ubHkgd29ya3MgaWYgZW50aXR5IGRvZXMgYSBsb29rdXAgZmlyc3QgdG8gc2VlIGlmIGl0cyBlbnRpdHkgaXMgJ2ZvdW5kJ1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUXVlcnlLZXkocXVlcnlLZXk6IHVua25vd24pIHtcbiAgaWYgKHF1ZXJ5S2V5ID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKHF1ZXJ5S2V5ICYmIHR5cGVvZiBxdWVyeUtleSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocXVlcnlLZXkpKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocXVlcnlLZXkpLmV2ZXJ5KHZhbGlkYXRlUXVlcnlLZXkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxRQUFRLElBQUlDLFVBQVUsUUFBUSxvQkFBb0I7QUFDM0QsU0FBU0QsUUFBUSxJQUFJRSxXQUFXLFFBQVEscUJBQXFCO0FBRzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTQyxhQUFhQSxDQUNuQ0MsTUFBUyxFQUNUQyxJQUFvQixFQUNwQkMsU0FBb0IsRUFDcEJDLFFBQWtCLEVBQ0k7RUFDdEI7RUFDQSxJQUFJQyxRQUFRLENBQUNKLE1BQU0sQ0FBQyxFQUFFO0lBQ3BCLE9BQU9BLE1BQU0sQ0FBQ0osUUFBUSxDQUFDSyxJQUFJLEVBQVdGLGFBQWEsRUFBRUcsU0FBUyxFQUFFQyxRQUFRLENBQUM7RUFDM0U7O0VBRUE7RUFDQSxJQUFJLE9BQU9ILE1BQU0sS0FBSyxRQUFRLElBQUlBLE1BQU0sRUFBRTtJQUN4QyxNQUFNSyxNQUFNLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDUCxNQUFNLENBQUMsR0FBR0gsVUFBVSxHQUFHQyxXQUFXO0lBQy9ELE9BQU9PLE1BQU0sQ0FBQ0wsTUFBTSxFQUFFQyxJQUFJLEVBQUVGLGFBQWEsRUFBRUcsU0FBUyxFQUFFQyxRQUFRLENBQUM7RUFDakU7O0VBRUE7RUFDQSxPQUFPSCxNQUFNO0FBQ2Y7QUFFQSxPQUFPLFNBQVNJLFFBQVFBLENBQ3RCSixNQUFjLEVBQzRCO0VBQzFDLE9BQU8sQ0FBQyxDQUFDQSxNQUFNLElBQUksT0FBUUEsTUFBTSxDQUFTSixRQUFRLEtBQUssVUFBVTtBQUNuRTs7QUFFQTtBQUNBLE9BQU8sU0FBU1ksZ0JBQWdCQSxDQUFDWixRQUFpQixFQUFFO0VBQ2xELElBQUlBLFFBQVEsS0FBS2EsU0FBUyxFQUFFLE9BQU8sS0FBSztFQUN4QyxJQUFJYixRQUFRLElBQUksT0FBT0EsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDVSxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsUUFBUSxDQUFDLEVBQUU7SUFDeEUsT0FBT2MsTUFBTSxDQUFDQyxNQUFNLENBQUNmLFFBQVEsQ0FBQyxDQUFDZ0IsS0FBSyxDQUFDSixnQkFBZ0IsQ0FBQztFQUN4RDtFQUNBLE9BQU8sSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119