UNPKG

nukak

Version:

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

93 lines 13.2 kB
import { QueryRaw, } from '../type/index.js'; import { getKeys } from '../util/index.js'; export function filterFieldKeys(meta, payload, callbackKey) { const persistableKeys = getKeys(payload).filter((key) => { const fieldOpts = meta.fields[key]; return fieldOpts && (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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGVjdC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvZGlhbGVjdC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFTTCxRQUFRLEdBT1QsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJM0MsTUFBTSxVQUFVLGVBQWUsQ0FBSSxJQUFtQixFQUFFLE9BQVUsRUFBRSxXQUF3QjtJQUMxRixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFrQixDQUFDLENBQUM7UUFDbEQsT0FBTyxTQUFTLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBa0IsQ0FBQztJQUNwQixPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQW9CO0lBQ3hELE9BQU8sT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFJLElBQW1CLEVBQUUsT0FBZ0IsRUFBRSxXQUF3QjtJQUM3RixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVB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bnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBDYXNjYWRlVHlwZSxcbiAgdHlwZSBFbnRpdHlNZXRhLFxuICB0eXBlIEZpZWxkS2V5LFxuICB0eXBlIEZpZWxkT3B0aW9ucyxcbiAgdHlwZSBJZFZhbHVlLFxuICB0eXBlIEtleSxcbiAgdHlwZSBNb25nb0lkLFxuICB0eXBlIE9uRmllbGRDYWxsYmFjayxcbiAgUXVlcnlSYXcsXG4gIHR5cGUgUXVlcnlTZWxlY3QsXG4gIHR5cGUgUXVlcnlTb3J0LFxuICB0eXBlIFF1ZXJ5U29ydE1hcCxcbiAgdHlwZSBRdWVyeVdoZXJlLFxuICB0eXBlIFF1ZXJ5V2hlcmVNYXAsXG4gIHR5cGUgUmVsYXRpb25LZXksXG59IGZyb20gJy4uL3R5cGUvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0S2V5cyB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja0tleSA9IGtleW9mIFBpY2s8RmllbGRPcHRpb25zLCAnb25JbnNlcnQnIHwgJ29uVXBkYXRlJyB8ICdvbkRlbGV0ZSc+O1xuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRmllbGRLZXlzPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4sIHBheWxvYWQ6IEUsIGNhbGxiYWNrS2V5OiBDYWxsYmFja0tleSk6IEZpZWxkS2V5PEU+W10ge1xuICBjb25zdCBwZXJzaXN0YWJsZUtleXMgPSBnZXRLZXlzKHBheWxvYWQpLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgY29uc3QgZmllbGRPcHRzID0gbWV0YS5maWVsZHNba2V5IGFzIEZpZWxkS2V5PEU+XTtcbiAgICByZXR1cm4gZmllbGRPcHRzICYmIChjYWxsYmFja0tleSAhPT0gJ29uVXBkYXRlJyB8fCAoZmllbGRPcHRzLnVwZGF0YWJsZSA/PyB0cnVlKSk7XG4gIH0pIGFzIEZpZWxkS2V5PEU+W107XG4gIHJldHVybiBwZXJzaXN0YWJsZUtleXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZENhbGxiYWNrVmFsdWUodmFsOiBPbkZpZWxkQ2FsbGJhY2spIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicgPyB2YWwoKSA6IHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxPbkZpZWxkczxFPihtZXRhOiBFbnRpdHlNZXRhPEU+LCBwYXlsb2FkOiBFIHwgRVtdLCBjYWxsYmFja0tleTogQ2FsbGJhY2tLZXkpOiBFW10ge1xuICBjb25zdCBwYXlsb2FkcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdO1xuICBjb25zdCBrZXlzID0gZ2V0S2V5cyhtZXRhLmZpZWxkcykuZmlsdGVyKChrZXkpID0+IG1ldGEuZmllbGRzW2tleV1bY2FsbGJhY2tLZXldKTtcbiAgcmV0dXJuIHBheWxvYWRzLm1hcCgoaXQpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoaXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGl0W2tleV0gPSBnZXRGaWVsZENhbGxiYWNrVmFsdWUobWV0YS5maWVsZHNba2V5XVtjYWxsYmFja0tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXQ7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUGVyc2lzdGFibGVSZWxhdGlvbktleXM8RT4oXG4gIG1ldGE6IEVudGl0eU1ldGE8RT4sXG4gIHBheWxvYWQ6IEUsXG4gIGFjdGlvbjogQ2FzY2FkZVR5cGUsXG4pOiBSZWxhdGlvbktleTxFPltdIHtcbiAgY29uc3Qga2V5cyA9IGdldEtleXMocGF5bG9hZCk7XG4gIHJldHVybiBrZXlzLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgY29uc3QgcmVsT3B0cyA9IG1ldGEucmVsYXRpb25zW2tleSBhcyBSZWxhdGlvbktleTxFPl07XG4gICAgcmV0dXJuIHJlbE9wdHMgJiYgaXNDYXNjYWRhYmxlKGFjdGlvbiwgcmVsT3B0cy5jYXNjYWRlKTtcbiAgfSkgYXMgUmVsYXRpb25LZXk8RT5bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FzY2FkYWJsZShhY3Rpb246IENhc2NhZGVUeXBlLCBjb25maWd1cmF0aW9uPzogYm9vbGVhbiB8IENhc2NhZGVUeXBlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJhdGlvbiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3VyYXRpb24gPT09IGFjdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclJlbGF0aW9uS2V5czxFPihtZXRhOiBFbnRpdHlNZXRhPEU+LCBzZWxlY3Q6IFF1ZXJ5U2VsZWN0PEU+KTogUmVsYXRpb25LZXk8RT5bXSB7XG4gIGNvbnN0IGtleXMgPSBmaWx0ZXJQb3NpdGl2ZUtleXMoc2VsZWN0KTtcbiAgcmV0dXJuIGtleXMuZmlsdGVyKChrZXkpID0+IGtleSBpbiBtZXRhLnJlbGF0aW9ucykgYXMgUmVsYXRpb25LZXk8RT5bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZWN0aW5nUmVsYXRpb25zPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4sIHNlbGVjdDogUXVlcnlTZWxlY3Q8RT4pOiBib29sZWFuIHtcbiAgY29uc3Qga2V5cyA9IGZpbHRlclBvc2l0aXZlS2V5cyhzZWxlY3QpO1xuICByZXR1cm4ga2V5cy5zb21lKChrZXkpID0+IGtleSBpbiBtZXRhLnJlbGF0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclBvc2l0aXZlS2V5czxFPihzZWxlY3Q6IFF1ZXJ5U2VsZWN0PEU+KTogS2V5PEU+W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3QpKSB7XG4gICAgcmV0dXJuIHNlbGVjdCBhcyBLZXk8RT5bXTtcbiAgfVxuICByZXR1cm4gZ2V0S2V5cyhzZWxlY3QpLmZpbHRlcigoa2V5KSA9PiBzZWxlY3Rba2V5XSkgYXMgS2V5PEU+W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFNvcnRNYXA8RT4oc29ydDogUXVlcnlTb3J0PEU+KTogUXVlcnlTb3J0TWFwPEU+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc29ydCkpIHtcbiAgICByZXR1cm4gc29ydC5yZWR1Y2UoXG4gICAgICAoYWNjLCBpdCkgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdCkpIHtcbiAgICAgICAgICBhY2NbaXRbMF1dID0gaXRbMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjW2l0LmZpZWxkXSA9IGl0LnNvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICB7fSBhcyBRdWVyeVNvcnRNYXA8RT4sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc29ydCBhcyBRdWVyeVNvcnRNYXA8RT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdWdtZW50V2hlcmU8RT4oXG4gIG1ldGE6IEVudGl0eU1ldGE8RT4sXG4gIHRhcmdldDogUXVlcnlXaGVyZTxFPiA9IHt9LFxuICBzb3VyY2U6IFF1ZXJ5V2hlcmU8RT4gPSB7fSxcbik6IFF1ZXJ5V2hlcmU8RT4ge1xuICBjb25zdCB0YXJnZXRDb21wYXJpc29uID0gYnVsZFF1ZXJ5V2hlcmVBc01hcChtZXRhLCB0YXJnZXQpO1xuICBjb25zdCBzb3VyY2VDb21wYXJpc29uID0gYnVsZFF1ZXJ5V2hlcmVBc01hcChtZXRhLCBzb3VyY2UpO1xuICByZXR1cm4ge1xuICAgIC4uLnRhcmdldENvbXBhcmlzb24sXG4gICAgLi4uc291cmNlQ29tcGFyaXNvbixcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1bGRRdWVyeVdoZXJlQXNNYXA8RT4obWV0YTogRW50aXR5TWV0YTxFPiwgZmlsdGVyOiBRdWVyeVdoZXJlPEU+ID0ge30pOiBRdWVyeVdoZXJlTWFwPEU+IHtcbiAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIFF1ZXJ5UmF3KSB7XG4gICAgcmV0dXJuIHsgJGFuZDogW2ZpbHRlcl0gfSBhcyBRdWVyeVdoZXJlTWFwPEU+O1xuICB9XG4gIGlmIChpc0lkVmFsdWUoZmlsdGVyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBbbWV0YS5pZF06IGZpbHRlcixcbiAgICB9IGFzIFF1ZXJ5V2hlcmVNYXA8RT47XG4gIH1cbiAgcmV0dXJuIGZpbHRlciBhcyBRdWVyeVdoZXJlTWFwPEU+O1xufVxuXG5mdW5jdGlvbiBpc0lkVmFsdWU8RT4oZmlsdGVyOiBRdWVyeVdoZXJlPEU+KTogZmlsdGVyIGlzIElkVmFsdWU8RT4gfCBJZFZhbHVlPEU+W10ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIGZpbHRlcjtcbiAgcmV0dXJuIChcbiAgICB0eXBlID09PSAnc3RyaW5nJyB8fFxuICAgIHR5cGUgPT09ICdudW1iZXInIHx8XG4gICAgdHlwZSA9PT0gJ2JpZ2ludCcgfHxcbiAgICB0eXBlb2YgKGZpbHRlciBhcyBNb25nb0lkKS50b0hleFN0cmluZyA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEFycmF5LmlzQXJyYXkoZmlsdGVyKVxuICApO1xufVxuIl19