integreat
Version:
Node.js integration layer
59 lines • 1.83 kB
JavaScript
import { isTypedData, isReference, isDate, isObject } from '../../utils/is.js';
import unwrapValue from '../../utils/unwrapValue.js';
function extractId(value) {
if (isObject(value)) {
return unwrapValue(value.id);
}
else {
return isDate(value) ? value.getTime() : value;
}
}
function extractProps(value) {
if (isObject(value)) {
const { isNew, isDeleted } = value;
return {
...(isNew === true ? { isNew } : {}),
...(isDeleted === true ? { isDeleted } : {}),
};
}
return {};
}
const refKeys = ['id', '$ref', 'isNew', 'isDeleted'];
const hasMoreProps = (value) => {
if (!isObject(value)) {
return false;
}
const keys = Object.keys(value).filter((key) => !refKeys.includes(key));
return keys.length > 0;
};
export default function castNonPrimitive(type, schemas) {
return (value, isRev = false) => {
if (isReference(value) && value.$ref !== type) {
return undefined;
}
if (isTypedData(value) || hasMoreProps(value)) {
if (typeof value.$type === 'string' && value.$type !== type) {
return undefined;
}
else {
const cast = schemas.get(type)?.castFn;
return typeof cast === 'function' ? cast(value, isRev) : value;
}
}
const id = extractId(value);
if (typeof id === 'string' || (typeof id === 'number' && !isNaN(id))) {
return {
id: String(id),
...(isRev ? {} : { $ref: type }),
...extractProps(value),
};
}
else if (id === null) {
return null;
}
else {
return undefined;
}
};
}
//# sourceMappingURL=nonPrimitive.js.map