Object mapper on steroid.
OMOS helps you map transform your object with ease.
To install OMOS:
npm install --save omos
or if you prefer Yarn:
yarn add omos
OMOS is a function that will take a schema as the first argument and source object as second argument and return the result. Simple as that!
import { transformWith } from 'omos';
const schema = {
properties: [
{
from: "accountInformation.address.state",
to: "profile.homeLocation",
},
{
from: "accountInformation.hobbies",
to: "accountInformation.hobbies",
},
{
from: ["accountInformation.firstName", "accountInformation.lastName"],
to: "profile.fullName",
compute: (firstName, lastName) => `${firstName} ${lastName}`,
},
{
from: "nbaProfile.mostPointPerGame",
to: "carrer.mostPoint",
},
],
};
const sourceObject = {
accountInformation: {
firstName: "Micheal",
lastName: "Jordan",
hobbies: ["Play Basketball", "Play Golf", "Count Rings"],
address: {
state: "Chicago"
}
},
nbaProfile: {
mostPointPerGame: 69,
},
}
const result = transformWith(schema, sourceObject);
The result should be:
{
profile: {
fullName: "Micheal Jordan",
homeLocation: "Chicago",
},
accountInformation: {
hobbies: [ 'Play Basketball', 'Play Golf', 'Count Rings' ],
},
carrer: {
mostPoint: 69,
},
};
Schema for OMOS is is javascript object that requires a key named properties
The value of properties
is a array of matches.
Each match must contains from
and to
key value, which is the key path to value of source object and target object.
{
from: "accountInformation.address.state",
to: "profile.homeLocation",
}
OMOS will fetch the data (even undefined) and write it to new object.
But we all know that life is not simple like that. In some scenarioes, we need to compute the result value based on one or multiple fields in source object. You can use compute
function to do such things.
In case of multiple inputs, the order will be kept when value will be pass to compute
.
{
from: "to",
to: "destination",
compute: (value) => {
return value.toUpperCase();
}
}
{
from: ["accountInformation.firstName", "accountInformation.lastName"],
to: "profile.fullName",
compute: (firstName, lastName) => `${firstName} ${lastName}`,
}
If you want to have some init value (as template) for your object. You can pass it to initValue
field inside schema
{
initValue: {
message: "This is a initValue for result object",
},
properties: [
{},...
],
}
Any contribution to this module is appreacited. Just fork the repo then send a merge reqeuest.