UNPKG

@nymphjs/nymph

Version:

Nymph.js - Nymph ORM

131 lines 4.85 kB
import Entity from './Entity.js'; export function xor(a, b) { return !!(a && !b) || (!a && b); } export function uniqueStrings(array) { const obj = {}; for (let i = 0; i < array.length; ++i) { obj[array[i]] = true; } return Object.keys(obj); } export function classNamesToEntityConstructors(nymph, selectors, enforceRestEnabledFlag = false) { const newSelectors = []; for (const curSelector of selectors) { const newSelector = { type: curSelector.type }; for (const k in curSelector) { const key = k; const value = curSelector[key]; if (key === 'type') { continue; } if (value === undefined) { continue; } if (key === 'qref' || key === '!qref') { const tmpArr = (Array.isArray((value ?? [])[0]) ? value : [value]); for (let i = 0; i < tmpArr.length; i++) { const name = tmpArr[i][0]; const [qrefOptions, ...selectors] = tmpArr[i][1]; const QrefEntityClass = qrefOptions.class ? nymph.getEntityClass(qrefOptions.class) : nymph.getEntityClass('Entity'); if (enforceRestEnabledFlag && !QrefEntityClass.restEnabled) { throw new Error('Not accessible.'); } const options = { ...qrefOptions, class: QrefEntityClass }; if (!newSelector[key]) { newSelector[key] = []; } newSelector[key].push([ name, [ options, ...classNamesToEntityConstructors(nymph, selectors, enforceRestEnabledFlag), ], ]); } } else if (key === 'selector' || key === '!selector') { const tmpArr = (Array.isArray(value) ? value : [value]); newSelector[key] = classNamesToEntityConstructors(nymph, tmpArr, enforceRestEnabledFlag); } else { // @ts-ignore: ts doesn't know what value is here. newSelector[key] = value; } } newSelectors.push(newSelector); } return newSelectors; } export function entitiesToReferences(item, existingOnly) { if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) { return item; } else if (item instanceof Entity && typeof item.$toReference === 'function') { // Convert entities to references. return item.$toReference(existingOnly); } else if (Array.isArray(item)) { // Recurse into lower arrays. return item.map((entry) => entitiesToReferences(entry, existingOnly)); } else if (item instanceof Object) { let newObj = Object.create(item); for (let [key, value] of Object.entries(item)) { newObj[key] = entitiesToReferences(value, existingOnly); } return newObj; } // Not an entity or array, just return it. return item; } export function referencesToEntities(item, nymph, useSkipAc = false) { if (item == null || Buffer.isBuffer(item) || ArrayBuffer.isView(item)) { return item; } else if (Array.isArray(item)) { // Check if it's a reference. if (item[0] === 'nymph_entity_reference') { try { const EntityClass = nymph.getEntityClass(item[2]); const entity = EntityClass.factoryReference(item); entity.$useSkipAc(useSkipAc); entity.$nymph = nymph; return entity; } catch (e) { return item; } } else { // Recurse into lower arrays. return item.map((entry) => referencesToEntities(entry, nymph, useSkipAc)); } } else if (Entity && item instanceof Object && !(item instanceof Entity)) { for (let [key, value] of Object.entries(item)) { item[key] = referencesToEntities(value, nymph); } } // Not an array, just return it. return item; } export function sortObj(obj) { // adapted from // http://am.aurlien.net/post/1221493460/sorting-javascript-objects const tempArray = Object.keys(obj); tempArray.sort(); for (let i = 0; i < tempArray.length; i++) { const temp = obj[tempArray[i]]; delete obj[tempArray[i]]; // @ts-ignore: string can't be used to index type T?? yes, it can. obj[tempArray[i]] = temp; } return obj; } //# sourceMappingURL=utils.js.map