@data-client/normalizr
Version:
Normalizes and denormalizes JSON according to schema for Redux and Flux applications
36 lines (33 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(delegate) {
return function queryKey(schema, args) {
// schema classes
if (canQuery(schema)) {
return schema.queryKey(args, queryKey, delegate);
}
// plain case
if (typeof schema === 'object' && schema) {
const method = Array.isArray(schema) ? arrayQuery : objectQuery;
return method(schema, args, queryKey, delegate);
}
// 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJxdWVyeUtleSIsImFycmF5UXVlcnkiLCJvYmplY3RRdWVyeSIsImJ1aWxkUXVlcnlLZXkiLCJkZWxlZ2F0ZSIsInNjaGVtYSIsImFyZ3MiLCJjYW5RdWVyeSIsIm1ldGhvZCIsIkFycmF5IiwiaXNBcnJheSIsInZhbGlkYXRlUXVlcnlLZXkiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJ2YWx1ZXMiLCJldmVyeSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZFF1ZXJ5S2V5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU2NoZW1hLCBTY2hlbWFTaW1wbGUsIElRdWVyeURlbGVnYXRlIH0gZnJvbSAnLi9pbnRlcmZhY2UuanMnO1xuaW1wb3J0IHsgcXVlcnlLZXkgYXMgYXJyYXlRdWVyeSB9IGZyb20gJy4vc2NoZW1hcy9BcnJheS5qcyc7XG5pbXBvcnQgeyBxdWVyeUtleSBhcyBvYmplY3RRdWVyeSB9IGZyb20gJy4vc2NoZW1hcy9PYmplY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBOb3JtYWxpemVOdWxsYWJsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSByZXN1bHQgcGFyYW1ldGVyIHRvIGRlbm9ybWFsaXplIGZyb20gc2NoZW1hIGFsb25lLlxuICogVHJpZXMgdG8gY29tcHV0ZSB0aGUgZW50aXR5IGlkcyBmcm9tIHBhcmFtcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYnVpbGRRdWVyeUtleShkZWxlZ2F0ZTogSVF1ZXJ5RGVsZWdhdGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHF1ZXJ5S2V5PFMgZXh0ZW5kcyBTY2hlbWE+KFxuICAgIHNjaGVtYTogUyxcbiAgICBhcmdzOiByZWFkb25seSBhbnlbXSxcbiAgKTogTm9ybWFsaXplTnVsbGFibGU8Uz4ge1xuICAgIC8vIHNjaGVtYSBjbGFzc2VzXG4gICAgaWYgKGNhblF1ZXJ5KHNjaGVtYSkpIHtcbiAgICAgIHJldHVybiBzY2hlbWEucXVlcnlLZXkoYXJncyBhcyBhbnlbXSwgcXVlcnlLZXksIGRlbGVnYXRlKTtcbiAgICB9XG5cbiAgICAvLyBwbGFpbiBjYXNlXG4gICAgaWYgKHR5cGVvZiBzY2hlbWEgPT09ICdvYmplY3QnICYmIHNjaGVtYSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gQXJyYXkuaXNBcnJheShzY2hlbWEpID8gYXJyYXlRdWVyeSA6IG9iamVjdFF1ZXJ5O1xuICAgICAgcmV0dXJuIG1ldGhvZChzY2hlbWEsIGFyZ3MsIHF1ZXJ5S2V5LCBkZWxlZ2F0ZSk7XG4gICAgfVxuXG4gICAgLy8gZmFsbGJhY2sgZm9yIHRoaW5ncyBsaWtlIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgcmV0dXJuIHNjaGVtYSBhcyBhbnk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYW5RdWVyeShcbiAgc2NoZW1hOiBTY2hlbWEsXG4pOiBzY2hlbWEgaXMgUGljazxTY2hlbWFTaW1wbGUsICdxdWVyeUtleSc+IHtcbiAgcmV0dXJuICEhc2NoZW1hICYmIHR5cGVvZiAoc2NoZW1hIGFzIGFueSkucXVlcnlLZXkgPT09ICdmdW5jdGlvbic7XG59XG5cbi8vIHRoaXMgb25seSB3b3JrcyBpZiBlbnRpdHkgZG9lcyBhIGxvb2t1cCBmaXJzdCB0byBzZWUgaWYgaXRzIGVudGl0eSBpcyAnZm91bmQnXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVRdWVyeUtleShxdWVyeUtleTogdW5rbm93bikge1xuICBpZiAocXVlcnlLZXkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAocXVlcnlLZXkgJiYgdHlwZW9mIHF1ZXJ5S2V5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShxdWVyeUtleSkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhxdWVyeUtleSkuZXZlcnkodmFsaWRhdGVRdWVyeUtleSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwibWFwcGluZ3MiOiJBQUNBLFNBQVNBLFFBQVEsSUFBSUMsVUFBVSxRQUFRLG9CQUFvQjtBQUMzRCxTQUFTRCxRQUFRLElBQUlFLFdBQVcsUUFBUSxxQkFBcUI7QUFHN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVNDLGFBQWFBLENBQUNDLFFBQXdCLEVBQUU7RUFDOUQsT0FBTyxTQUFTSixRQUFRQSxDQUN0QkssTUFBUyxFQUNUQyxJQUFvQixFQUNFO0lBQ3RCO0lBQ0EsSUFBSUMsUUFBUSxDQUFDRixNQUFNLENBQUMsRUFBRTtNQUNwQixPQUFPQSxNQUFNLENBQUNMLFFBQVEsQ0FBQ00sSUFBSSxFQUFXTixRQUFRLEVBQUVJLFFBQVEsQ0FBQztJQUMzRDs7SUFFQTtJQUNBLElBQUksT0FBT0MsTUFBTSxLQUFLLFFBQVEsSUFBSUEsTUFBTSxFQUFFO01BQ3hDLE1BQU1HLE1BQU0sR0FBR0MsS0FBSyxDQUFDQyxPQUFPLENBQUNMLE1BQU0sQ0FBQyxHQUFHSixVQUFVLEdBQUdDLFdBQVc7TUFDL0QsT0FBT00sTUFBTSxDQUFDSCxNQUFNLEVBQUVDLElBQUksRUFBRU4sUUFBUSxFQUFFSSxRQUFRLENBQUM7SUFDakQ7O0lBRUE7SUFDQSxPQUFPQyxNQUFNO0VBQ2YsQ0FBQztBQUNIO0FBRUEsT0FBTyxTQUFTRSxRQUFRQSxDQUN0QkYsTUFBYyxFQUM0QjtFQUMxQyxPQUFPLENBQUMsQ0FBQ0EsTUFBTSxJQUFJLE9BQVFBLE1BQU0sQ0FBU0wsUUFBUSxLQUFLLFVBQVU7QUFDbkU7O0FBRUE7QUFDQSxPQUFPLFNBQVNXLGdCQUFnQkEsQ0FBQ1gsUUFBaUIsRUFBRTtFQUNsRCxJQUFJQSxRQUFRLEtBQUtZLFNBQVMsRUFBRSxPQUFPLEtBQUs7RUFDeEMsSUFBSVosUUFBUSxJQUFJLE9BQU9BLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQ1MsS0FBSyxDQUFDQyxPQUFPLENBQUNWLFFBQVEsQ0FBQyxFQUFFO0lBQ3hFLE9BQU9hLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDZCxRQUFRLENBQUMsQ0FBQ2UsS0FBSyxDQUFDSixnQkFBZ0IsQ0FBQztFQUN4RDtFQUNBLE9BQU8sSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119