nukak
Version:
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
93 lines • 13 kB
JavaScript
import { getKeys } from '../util/index.js';
import { QueryRaw, } from '../type/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGVjdC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvZGlhbGVjdC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBUUwsUUFBUSxHQVFULE1BQU0sa0JBQWtCLENBQUM7QUFJMUIsTUFBTSxVQUFVLGVBQWUsQ0FBSSxJQUFtQixFQUFFLE9BQVUsRUFBRSxXQUF3QjtJQUMxRixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFrQixDQUFDLENBQUM7UUFDbEQsT0FBTyxTQUFTLElBQUksQ0FBQyxXQUFXLEtBQUssVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBa0IsQ0FBQztJQUNwQixPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQW9CO0lBQ3hELE9BQU8sT0FBTyxHQUFHLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFJLElBQW1CLEVBQUUsT0FBZ0IsRUFBRSxXQUF3QjtJQUM3RixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVB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bnQiOlsiaW1wb3J0IHsgZ2V0S2V5cyB9IGZyb20gJy4uL3V0aWwvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgRW50aXR5TWV0YSxcbiAgRmllbGRLZXksXG4gIFF1ZXJ5U2VsZWN0LFxuICBDYXNjYWRlVHlwZSxcbiAgUmVsYXRpb25LZXksXG4gIEZpZWxkT3B0aW9ucyxcbiAgS2V5LFxuICBRdWVyeVJhdyxcbiAgUXVlcnlTb3J0LFxuICBRdWVyeVNvcnRNYXAsXG4gIFF1ZXJ5V2hlcmUsXG4gIFF1ZXJ5V2hlcmVNYXAsXG4gIE9uRmllbGRDYWxsYmFjayxcbiAgTW9uZ29JZCxcbiAgSWRWYWx1ZSxcbn0gZnJvbSAnLi4vdHlwZS9pbmRleC5qcyc7XG5cbmV4cG9ydCB0eXBlIENhbGxiYWNrS2V5ID0ga2V5b2YgUGljazxGaWVsZE9wdGlvbnMsICdvbkluc2VydCcgfCAnb25VcGRhdGUnIHwgJ29uRGVsZXRlJz47XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJGaWVsZEtleXM8RT4obWV0YTogRW50aXR5TWV0YTxFPiwgcGF5bG9hZDogRSwgY2FsbGJhY2tLZXk6IENhbGxiYWNrS2V5KTogRmllbGRLZXk8RT5bXSB7XG4gIGNvbnN0IHBlcnNpc3RhYmxlS2V5cyA9IGdldEtleXMocGF5bG9hZCkuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCBmaWVsZE9wdHMgPSBtZXRhLmZpZWxkc1trZXkgYXMgRmllbGRLZXk8RT5dO1xuICAgIHJldHVybiBmaWVsZE9wdHMgJiYgKGNhbGxiYWNrS2V5ICE9PSAnb25VcGRhdGUnIHx8IChmaWVsZE9wdHMudXBkYXRhYmxlID8/IHRydWUpKTtcbiAgfSkgYXMgRmllbGRLZXk8RT5bXTtcbiAgcmV0dXJuIHBlcnNpc3RhYmxlS2V5cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkQ2FsbGJhY2tWYWx1ZSh2YWw6IE9uRmllbGRDYWxsYmFjaykge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHZhbCgpIDogdmFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsbE9uRmllbGRzPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4sIHBheWxvYWQ6IEUgfCBFW10sIGNhbGxiYWNrS2V5OiBDYWxsYmFja0tleSk6IEVbXSB7XG4gIGNvbnN0IHBheWxvYWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF07XG4gIGNvbnN0IGtleXMgPSBnZXRLZXlzKG1ldGEuZmllbGRzKS5maWx0ZXIoKGtleSkgPT4gbWV0YS5maWVsZHNba2V5XVtjYWxsYmFja0tleV0pO1xuICByZXR1cm4gcGF5bG9hZHMubWFwKChpdCkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChpdFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXRba2V5XSA9IGdldEZpZWxkQ2FsbGJhY2tWYWx1ZShtZXRhLmZpZWxkc1trZXldW2NhbGxiYWNrS2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdDtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJQZXJzaXN0YWJsZVJlbGF0aW9uS2V5czxFPihcbiAgbWV0YTogRW50aXR5TWV0YTxFPixcbiAgcGF5bG9hZDogRSxcbiAgYWN0aW9uOiBDYXNjYWRlVHlwZSxcbik6IFJlbGF0aW9uS2V5PEU+W10ge1xuICBjb25zdCBrZXlzID0gZ2V0S2V5cyhwYXlsb2FkKTtcbiAgcmV0dXJuIGtleXMuZmlsdGVyKChrZXkpID0+IHtcbiAgICBjb25zdCByZWxPcHRzID0gbWV0YS5yZWxhdGlvbnNba2V5IGFzIFJlbGF0aW9uS2V5PEU+XTtcbiAgICByZXR1cm4gcmVsT3B0cyAmJiBpc0Nhc2NhZGFibGUoYWN0aW9uLCByZWxPcHRzLmNhc2NhZGUpO1xuICB9KSBhcyBSZWxhdGlvbktleTxFPltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDYXNjYWRhYmxlKGFjdGlvbjogQ2FzY2FkZVR5cGUsIGNvbmZpZ3VyYXRpb24/OiBib29sZWFuIHwgQ2FzY2FkZVR5cGUpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmF0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gY29uZmlndXJhdGlvbjtcbiAgfVxuICByZXR1cm4gY29uZmlndXJhdGlvbiA9PT0gYWN0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmVsYXRpb25LZXlzPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4sIHNlbGVjdDogUXVlcnlTZWxlY3Q8RT4pOiBSZWxhdGlvbktleTxFPltdIHtcbiAgY29uc3Qga2V5cyA9IGZpbHRlclBvc2l0aXZlS2V5cyhzZWxlY3QpO1xuICByZXR1cm4ga2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5IGluIG1ldGEucmVsYXRpb25zKSBhcyBSZWxhdGlvbktleTxFPltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZWxlY3RpbmdSZWxhdGlvbnM8RT4obWV0YTogRW50aXR5TWV0YTxFPiwgc2VsZWN0OiBRdWVyeVNlbGVjdDxFPik6IGJvb2xlYW4ge1xuICBjb25zdCBrZXlzID0gZmlsdGVyUG9zaXRpdmVLZXlzKHNlbGVjdCk7XG4gIHJldHVybiBrZXlzLnNvbWUoKGtleSkgPT4ga2V5IGluIG1ldGEucmVsYXRpb25zKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyUG9zaXRpdmVLZXlzPEU+KHNlbGVjdDogUXVlcnlTZWxlY3Q8RT4pOiBLZXk8RT5bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdCkpIHtcbiAgICByZXR1cm4gc2VsZWN0IGFzIEtleTxFPltdO1xuICB9XG4gIHJldHVybiBnZXRLZXlzKHNlbGVjdCkuZmlsdGVyKChrZXkpID0+IHNlbGVjdFtrZXldKSBhcyBLZXk8RT5bXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29ydE1hcDxFPihzb3J0OiBRdWVyeVNvcnQ8RT4pOiBRdWVyeVNvcnRNYXA8RT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShzb3J0KSkge1xuICAgIHJldHVybiBzb3J0LnJlZHVjZSgoYWNjLCBpdCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXQpKSB7XG4gICAgICAgIGFjY1tpdFswXV0gPSBpdFsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1tpdC5maWVsZF0gPSBpdC5zb3J0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBRdWVyeVNvcnRNYXA8RT4pO1xuICB9XG4gIHJldHVybiBzb3J0IGFzIFF1ZXJ5U29ydE1hcDxFPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1Z21lbnRXaGVyZTxFPihcbiAgbWV0YTogRW50aXR5TWV0YTxFPixcbiAgdGFyZ2V0OiBRdWVyeVdoZXJlPEU+ID0ge30sXG4gIHNvdXJjZTogUXVlcnlXaGVyZTxFPiA9IHt9LFxuKTogUXVlcnlXaGVyZTxFPiB7XG4gIGNvbnN0IHRhcmdldENvbXBhcmlzb24gPSBidWxkUXVlcnlXaGVyZUFzTWFwKG1ldGEsIHRhcmdldCk7XG4gIGNvbnN0IHNvdXJjZUNvbXBhcmlzb24gPSBidWxkUXVlcnlXaGVyZUFzTWFwKG1ldGEsIHNvdXJjZSk7XG4gIHJldHVybiB7XG4gICAgLi4udGFyZ2V0Q29tcGFyaXNvbixcbiAgICAuLi5zb3VyY2VDb21wYXJpc29uLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVsZFF1ZXJ5V2hlcmVBc01hcDxFPihtZXRhOiBFbnRpdHlNZXRhPEU+LCBmaWx0ZXI6IFF1ZXJ5V2hlcmU8RT4gPSB7fSk6IFF1ZXJ5V2hlcmVNYXA8RT4ge1xuICBpZiAoZmlsdGVyIGluc3RhbmNlb2YgUXVlcnlSYXcpIHtcbiAgICByZXR1cm4geyAkYW5kOiBbZmlsdGVyXSB9IGFzIFF1ZXJ5V2hlcmVNYXA8RT47XG4gIH1cbiAgaWYgKGlzSWRWYWx1ZShmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFttZXRhLmlkXTogZmlsdGVyLFxuICAgIH0gYXMgUXVlcnlXaGVyZU1hcDxFPjtcbiAgfVxuICByZXR1cm4gZmlsdGVyIGFzIFF1ZXJ5V2hlcmVNYXA8RT47XG59XG5cbmZ1bmN0aW9uIGlzSWRWYWx1ZTxFPihmaWx0ZXI6IFF1ZXJ5V2hlcmU8RT4pOiBmaWx0ZXIgaXMgSWRWYWx1ZTxFPiB8IElkVmFsdWU8RT5bXSB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgZmlsdGVyO1xuICByZXR1cm4gKFxuICAgIHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgICB0eXBlID09PSAnYmlnaW50JyB8fFxuICAgIHR5cGVvZiAoZmlsdGVyIGFzIE1vbmdvSWQpLnRvSGV4U3RyaW5nID09PSAnZnVuY3Rpb24nIHx8XG4gICAgQXJyYXkuaXNBcnJheShmaWx0ZXIpXG4gICk7XG59XG4iXX0=