UNPKG

nukak

Version:

flexible and efficient ORM, with declarative JSON syntax and smart type-safety

93 lines 13.3 kB
import { QueryRaw, } from '../type/index.js'; import { getKeys } from './object.util.js'; export function filterFieldKeys(meta, payload, callbackKey) { const persistableKeys = getKeys(payload).filter((key) => { const fieldOpts = meta.fields[key]; return fieldOpts && !fieldOpts.virtual && (callbackKey !== 'onUpdate' || (fieldOpts.updatable ?? true)); }); return persistableKeys; } export function getFieldCallbackValue(val) { return typeof val === 'function' ? val() : val; } export function fillOnFields(meta, payload, callbackKey) { const payloads = Array.isArray(payload) ? payload : [payload]; const keys = getKeys(meta.fields).filter((key) => meta.fields[key][callbackKey]); return payloads.map((it) => { for (const key of keys) { if (it[key] === undefined) { it[key] = getFieldCallbackValue(meta.fields[key][callbackKey]); } } return it; }); } export function filterPersistableRelationKeys(meta, payload, action) { const keys = getKeys(payload); return keys.filter((key) => { const relOpts = meta.relations[key]; return relOpts && isCascadable(action, relOpts.cascade); }); } export function isCascadable(action, configuration) { if (typeof configuration === 'boolean') { return configuration; } return configuration === action; } export function filterRelationKeys(meta, select) { const keys = filterPositiveKeys(select); return keys.filter((key) => key in meta.relations); } export function isSelectingRelations(meta, select) { const keys = filterPositiveKeys(select); return keys.some((key) => key in meta.relations); } function filterPositiveKeys(select) { if (Array.isArray(select)) { return select; } return getKeys(select).filter((key) => select[key]); } export function buildSortMap(sort) { if (Array.isArray(sort)) { return sort.reduce((acc, it) => { if (Array.isArray(it)) { acc[it[0]] = it[1]; } else { acc[it.field] = it.sort; } return acc; }, {}); } return sort; } export function augmentWhere(meta, target = {}, source = {}) { const targetComparison = buldQueryWhereAsMap(meta, target); const sourceComparison = buldQueryWhereAsMap(meta, source); return { ...targetComparison, ...sourceComparison, }; } export function buldQueryWhereAsMap(meta, filter = {}) { if (filter instanceof QueryRaw) { return { $and: [filter] }; } if (isIdValue(filter)) { return { [meta.id]: filter, }; } return filter; } function isIdValue(filter) { const type = typeof filter; return (type === 'string' || type === 'number' || type === 'bigint' || typeof filter.toHexString === 'function' || Array.isArray(filter)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGVjdC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvZGlhbGVjdC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFTTCxRQUFRLEdBT1QsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJM0MsTUFBTSxVQUFVLGVBQWUsQ0FBSSxJQUFtQixFQUFFLE9BQVUsRUFBRSxXQUF3QjtJQUMxRixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFrQixDQUFDLENBQUM7UUFDbEQsT0FBTyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRyxDQUFDLENBQWtCLENBQUM7SUFDcEIsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxHQUFvQjtJQUN4RCxPQUFPLE9BQU8sR0FBRyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBSSxJQUFtQixFQUFFLE9BQWdCLEVBQUUsV0FBd0I7SUFDN0YsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENB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O0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgQ2FzY2FkZVR5cGUsXG4gIHR5cGUgRW50aXR5TWV0YSxcbiAgdHlwZSBGaWVsZEtleSxcbiAgdHlwZSBGaWVsZE9wdGlvbnMsXG4gIHR5cGUgSWRWYWx1ZSxcbiAgdHlwZSBLZXksXG4gIHR5cGUgTW9uZ29JZCxcbiAgdHlwZSBPbkZpZWxkQ2FsbGJhY2ssXG4gIFF1ZXJ5UmF3LFxuICB0eXBlIFF1ZXJ5U2VsZWN0LFxuICB0eXBlIFF1ZXJ5U29ydCxcbiAgdHlwZSBRdWVyeVNvcnRNYXAsXG4gIHR5cGUgUXVlcnlXaGVyZSxcbiAgdHlwZSBRdWVyeVdoZXJlTWFwLFxuICB0eXBlIFJlbGF0aW9uS2V5LFxufSBmcm9tICcuLi90eXBlL2luZGV4LmpzJztcbmltcG9ydCB7IGdldEtleXMgfSBmcm9tICcuL29iamVjdC51dGlsLmpzJztcblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2tLZXkgPSBrZXlvZiBQaWNrPEZpZWxkT3B0aW9ucywgJ29uSW5zZXJ0JyB8ICdvblVwZGF0ZScgfCAnb25EZWxldGUnPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckZpZWxkS2V5czxFPihtZXRhOiBFbnRpdHlNZXRhPEU+LCBwYXlsb2FkOiBFLCBjYWxsYmFja0tleTogQ2FsbGJhY2tLZXkpOiBGaWVsZEtleTxFPltdIHtcbiAgY29uc3QgcGVyc2lzdGFibGVLZXlzID0gZ2V0S2V5cyhwYXlsb2FkKS5maWx0ZXIoKGtleSkgPT4ge1xuICAgIGNvbnN0IGZpZWxkT3B0cyA9IG1ldGEuZmllbGRzW2tleSBhcyBGaWVsZEtleTxFPl07XG4gICAgcmV0dXJuIGZpZWxkT3B0cyAmJiAhZmllbGRPcHRzLnZpcnR1YWwgJiYgKGNhbGxiYWNrS2V5ICE9PSAnb25VcGRhdGUnIHx8IChmaWVsZE9wdHMudXBkYXRhYmxlID8/IHRydWUpKTtcbiAgfSkgYXMgRmllbGRLZXk8RT5bXTtcbiAgcmV0dXJuIHBlcnNpc3RhYmxlS2V5cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkQ2FsbGJhY2tWYWx1ZSh2YWw6IE9uRmllbGRDYWxsYmFjaykge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHZhbCgpIDogdmFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsbE9uRmllbGRzPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4sIHBheWxvYWQ6IEUgfCBFW10sIGNhbGxiYWNrS2V5OiBDYWxsYmFja0tleSk6IEVbXSB7XG4gIGNvbnN0IHBheWxvYWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF07XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlzKG1ldGEuZmllbGRzKS5maWx0ZXIoKGtleSkgPT4gbWV0YS5maWVsZHNba2V5XVtjYWxsYmFja0tleV0pO1xuICByZXR1cm4gcGF5bG9hZHMubWFwKChpdCkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChpdFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXRba2V5XSA9IGdldEZpZWxkQ2FsbGJhY2tWYWx1ZShtZXRhLmZpZWxkc1trZXldW2NhbGxiYWNrS2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdDtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJQZXJzaXN0YWJsZVJlbGF0aW9uS2V5czxFPihcbiAgbWV0YTogRW50aXR5TWV0YTxFPixcbiAgcGF5bG9hZDogRSxcbiAgYWN0aW9uOiBDYXNjYWRlVHlwZSxcbik6IFJlbGF0aW9uS2V5PEU+W10ge1xuICBjb25zdCBrZXlzID0gZ2V0S2V5cyhwYXlsb2FkKTtcbiAgcmV0dXJuIGtleXMuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCByZWxPcHRzID0gbWV0YS5yZWxhdGlvbnNba2V5IGFzIFJlbGF0aW9uS2V5PEU+XTtcbiAgICByZXR1cm4gcmVsT3B0cyAmJiBpc0Nhc2NhZGFibGUoYWN0aW9uLCByZWxPcHRzLmNhc2NhZGUpO1xuICB9KSBhcyBSZWxhdGlvbktleTxFPltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDYXNjYWRhYmxlKGFjdGlvbjogQ2FzY2FkZVR5cGUsIGNvbmZpZ3VyYXRpb24/OiBib29sZWFuIHwgQ2FzY2FkZVR5cGUpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmF0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgfVxuICByZXR1cm4gY29uZmlndXJhdGlvbiA9PT0gYWN0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmVsYXRpb25LZXlzPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4sIHNlbGVjdDogUXVlcnlTZWxlY3Q8RT4pOiBSZWxhdGlvbktleTxFPltdIHtcbiAgY29uc3Qga2V5cyA9IGZpbHRlclBvc2l0aXZlS2V5cyhzZWxlY3QpO1xuICByZXR1cm4ga2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5IGluIG1ldGEucmVsYXRpb25zKSBhcyBSZWxhdGlvbktleTxFPltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZWxlY3RpbmdSZWxhdGlvbnM8RT4obWV0YTogRW50aXR5TWV0YTxFPiwgc2VsZWN0OiBRdWVyeVNlbGVjdDxFPik6IGJvb2xlYW4ge1xuICBjb25zdCBrZXlzID0gZmlsdGVyUG9zaXRpdmVLZXlzKHNlbGVjdCk7XG4gIHJldHVybiBrZXlzLnNvbWUoKGtleSkgPT4ga2V5IGluIG1ldGEucmVsYXRpb25zKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyUG9zaXRpdmVLZXlzPEU+KHNlbGVjdDogUXVlcnlTZWxlY3Q8RT4pOiBLZXk8RT5bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdCkpIHtcbiAgICByZXR1cm4gc2VsZWN0IGFzIEtleTxFPltdO1xuICB9XG4gIHJldHVybiBnZXRLZXlzKHNlbGVjdCkuZmlsdGVyKChrZXkpID0+IHNlbGVjdFtrZXldKSBhcyBLZXk8RT5bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29ydE1hcDxFPihzb3J0OiBRdWVyeVNvcnQ8RT4pOiBRdWVyeVNvcnRNYXA8RT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzb3J0KSkge1xuICAgIHJldHVybiBzb3J0LnJlZHVjZShcbiAgICAgIChhY2MsIGl0KSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICAgIGFjY1tpdFswXV0gPSBpdFsxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY2NbaXQuZmllbGRdID0gaXQuc29ydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFF1ZXJ5U29ydE1hcDxFPixcbiAgICApO1xuICB9XG4gIHJldHVybiBzb3J0IGFzIFF1ZXJ5U29ydE1hcDxFPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1Z21lbnRXaGVyZTxFPihcbiAgbWV0YTogRW50aXR5TWV0YTxFPixcbiAgdGFyZ2V0OiBRdWVyeVdoZXJlPEU+ID0ge30sXG4gIHNvdXJjZTogUXVlcnlXaGVyZTxFPiA9IHt9LFxuKTogUXVlcnlXaGVyZTxFPiB7XG4gIGNvbnN0IHRhcmdldENvbXBhcmlzb24gPSBidWxkUXVlcnlXaGVyZUFzTWFwKG1ldGEsIHRhcmdldCk7XG4gIGNvbnN0IHNvdXJjZUNvbXBhcmlzb24gPSBidWxkUXVlcnlXaGVyZUFzTWFwKG1ldGEsIHNvdXJjZSk7XG4gIHJldHVybiB7XG4gICAgLi4udGFyZ2V0Q29tcGFyaXNvbixcbiAgICAuLi5zb3VyY2VDb21wYXJpc29uLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVsZFF1ZXJ5V2hlcmVBc01hcDxFPihtZXRhOiBFbnRpdHlNZXRhPEU+LCBmaWx0ZXI6IFF1ZXJ5V2hlcmU8RT4gPSB7fSk6IFF1ZXJ5V2hlcmVNYXA8RT4ge1xuICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICByZXR1cm4geyAkYW5kOiBbZmlsdGVyXSB9IGFzIFF1ZXJ5V2hlcmVNYXA8RT47XG4gIH1cbiAgaWYgKGlzSWRWYWx1ZShmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFttZXRhLmlkXTogZmlsdGVyLFxuICAgIH0gYXMgUXVlcnlXaGVyZU1hcDxFPjtcbiAgfVxuICByZXR1cm4gZmlsdGVyIGFzIFF1ZXJ5V2hlcmVNYXA8RT47XG59XG5cbmZ1bmN0aW9uIGlzSWRWYWx1ZTxFPihmaWx0ZXI6IFF1ZXJ5V2hlcmU8RT4pOiBmaWx0ZXIgaXMgSWRWYWx1ZTxFPiB8IElkVmFsdWU8RT5bXSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgZmlsdGVyO1xuICByZXR1cm4gKFxuICAgIHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICB0eXBlID09PSAnYmlnaW50JyB8fFxuICAgIHR5cGVvZiAoZmlsdGVyIGFzIE1vbmdvSWQpLnRvSGV4U3RyaW5nID09PSAnZnVuY3Rpb24nIHx8XG4gICAgQXJyYXkuaXNBcnJheShmaWx0ZXIpXG4gICk7XG59XG4iXX0=