Transform any data easily from one shape to another.
$ npm i sdmpr
Common JS
const { SimpleDataMapper } = require("sdmpr")
or
TS
import { SimpleDataMapper } from "sdmpr"
or
import sdmpr from "sdmpr"
Easiest Usage:
const d1 = { first_name: "Pixie", lastName: "Dorry", address: { cityName: "SD", postalcode: "92101" } }
const d2 = SimpleDataMapper.toCamelCase(d1)
const d3 = SimpleDataMapper.toSnakeCase(d1)
const d4 = SimpleDataMapper.toLowerCase(d1)
const d5 = SimpleDataMapper.toUpperCase(d1)
console.log("Original->", d1)
console.log("Camel Case->", d2)
console.log("Snake Case->", d3)
console.log("Lower Case->", d4)
console.log("Upper Case->", d5)
Output:
Original-> {
first_name: 'Pixie',
lastName: 'Dorry',
address: { cityName: 'SD', postalcode: '92101' }
}
Camel Case-> {
firstName: 'Pixie',
lastName: 'Dorry',
address: { cityName: 'SD', postalcode: '92101' }
}
Snake Case-> {
first_name: 'Pixie',
last_name: 'Dorry',
address: { city_name: 'SD', postalcode: '92101' }
}
Lower Case-> {
first_name: 'Pixie',
lastname: 'Dorry',
address: { cityname: 'SD', postalcode: '92101' }
}
Upper Case-> {
FIRST_NAME: 'Pixie',
LASTNAME: 'Dorry',
ADDRESS: { CITYNAME: 'SD', POSTALCODE: '92101' }
}
Example 1: Simple one to one transformation
const data1 = {
first_name: "Evo", last_name: "Zumo", age: 16, gender: "M",
addresses: [
{
street: "123 Str",
city_name: "San Diego",
state_name: "CA",
postal_code: "92120"
},
{
street: "Main Str Suite 100",
city_name: "San Diego",
state_name: "CA",
postal_code: "92101"
}
]
}
const transformedData1 = SimpleDataMapper.create()
.map("first_name", "firstName")
.map("last_name", "lastName")
.map("age")
.map("addresses[0]", "firstAddress")
.transform(data1)
const log = (msg: string, obj: any) => {
console.log(msg, JSON.stringify(obj, null, 2))
}
log("Data1->", data1)
log("TransformedData1->", transformedData1)
Sample Output:
Data1-> {
"first_name": "Evo",
"last_name": "Zumo",
"age": 16,
"gender": "M",
"addresses": [
{
"street": "123 Str",
"city_name": "San Diego",
"state_name": "CA",
"postal_code": "92120"
},
{
"street": "Main Str Suite 100",
"city_name": "San Diego",
"state_name": "CA",
"postal_code": "92101"
}
]
}
TransformedData1-> {
"firstName": "Evo",
"lastName": "Zumo",
"age": 16,
"firstAddress": {
"street": "123 Str",
"city_name": "San Diego",
"state_name": "CA",
"postal_code": "92120"
}
}
Example 2: Callback demo and nested fields in the output.
const data1 = {
first_name: "Pixie", last_name: "Dorry", age: 3, gender: "F",
addresses: [
{
street: "123 Str",
city_name: "San Diego",
state_name: "CA",
postal_code: "92120"
}
]
}
const mapper1 = SimpleDataMapper.create()
.map("first_name", "person.firstName")
.map("last_name", "person.lastName", (lastName: string) => lastName && lastName.toUpperCase())
.map("age", "person.age")
.map("addresses[0].city_name", "person.address.city")
.map("addresses[0].postal_code", "person.address.zip")
const transformedData1 = mapper1.transform(data1)
log("TransformedData1->", transformedData1)
Sample Output:
TransformedData1-> {
"person": {
"firstName": "Pixie",
"lastName": "DORRY",
"age": 3,
"address": {
"city": "San Diego",
"zip": "92120"
}
}
}
Example 3: Using collect method.
const mapper1 = SimpleDataMapper.create()
.collect(["first_name", "last_name"], "fullName1")
.collect(["first_name", "last_name"], (data: any[]) => {
// You have full control here!
return {
fullName2: `${data[0]} ${data[1] && data[1].toUpperCase()}`,
extra: {
info: "Just shows that you can add anything if you like!",
now: new Date()
}
}
})
Sample Output:
TransformedData1-> {
"fullName1": "Pixie Dorry",
"fullName2": "Pixie DORRY",
"extra": {
"info": "Just shows that you can add anything if you like!",
"now": "2019-08-26T06:35:12.397Z"
}
}
Example 4: Showing reports.
const mapper1 = SimpleDataMapper.create(true)
.map("first_name", "firstName")
.map("lasname", "lastName") // <- Wrong field name (for demo)!
.map("age")
.collect(["first_name", "last_name"], "fullName")
Sample Output:
TransformedData1-> {
"firstName": "Pixie",
"age": 3,
"fullName": "Pixie Dorry",
"__reports__": {
"transformation": {
"transformed": [
"age -> age",
"first_name -> firstName"
],
"untransformed": [
"addresses",
"gender",
"last_name"
],
"skipped": [
"lasname"
]
},
"collection": {
"collected": [
"first_name",
"last_name"
],
"uncollected": []
}
}
}
Example 5: Camel & Snake case conversions.
const data1 = {
first_name: "Pixie", last_name: "Dorry", age: 3.14, gender: "F",
some_comments: [
{ text: "This is the first comment.", created_at: "2019-09-01" },
{ text: "Yet another one!", created_at: "2019-09-02" }
],
mixed_caseStyle: true,
all_addresses: [
{
street: "123 Main Str",
city_name: "San Diego",
state_name: "CA",
postal_code: "92120",
suite_numbers: [101, 102]
}
]
}
// Fastest and easiest way to change case style to camel or snake naming conventions!
const data2 = SimpleDataMapper.changeCase(data1, CaseStyle.CAMEL)
const data3 = SimpleDataMapper.changeCase(data2, CaseStyle.SNAKE)
Sample output:
Data2-> {
"firstName": "Pixie",
"lastName": "Dorry",
"age": 3.14,
"gender": "F",
"someComments": [
{
"text": "This is the first comment.",
"createdAt": "2019-09-01"
},
{
"text": "Yet another one!",
"createdAt": "2019-09-02"
}
],
"mixedCaseStyle": true,
"allAddresses": [
{
"street": "123 Main Str",
"cityName": "San Diego",
"stateName": "CA",
"postalCode": "92120",
"suiteNumbers": [
101,
102
]
}
]
}
Data3-> {
"first_name": "Pixie",
"last_name": "Dorry",
"age": 3.14,
"gender": "F",
"some_comments": [
{
"text": "This is the first comment.",
"created_at": "2019-09-01"
},
{
"text": "Yet another one!",
"created_at": "2019-09-02"
}
],
"mixed_case_style": true,
"all_addresses": [
{
"street": "123 Main Str",
"city_name": "San Diego",
"state_name": "CA",
"postal_code": "92120",
"suite_numbers": [
101,
102
]
}
]
}
More interesting transformation:
// This example is the most detailed transformation that demonstrates all features including
// reports in the SimpleDataMapper. Please notice that we don't have "abc" and "middle_name" fields
// in the data, so they will show up as "skipped" under "transformation" and "uncollected" under
// "collection" respectively in the reports section, because they wouldn't be found as field names.
const data6 = SimpleDataMapper.create()
.collect(["first_name", "last_name", "middle_name"], "full_name") // Collecting fields to construct "full_name"
.map("first_name", "user.known_names.first_name")
.map("last_name", "user.known_names.last_name")
.map("age", "user.age")
.map("all_addresses")
.map("abc", "xyz") // No 'abc' field in the data!
.mapToCamelCase({ keep: ["full_name"] }) // Will transform all except "full_name" to camel case!
.report(true)
.transform(data1)
And, here is the sample output:
Data6-> {
"user": {
"knownNames": {
"firstName": "Pixie",
"lastName": "Dorry"
},
"age": 3.14
},
"allAddresses": [
{
"street": "123 Main Str",
"cityName": "San Diego",
"stateName": "CA",
"postalCode": "92120",
"suiteNumbers": [
101,
102
]
}
],
"full_name": "Pixie Dorry",
"__reports__": {
"transformation": {
"transformed": [
"age -> user.age",
"all_addresses -> all_addresses",
"first_name -> user.known_names.first_name",
"last_name -> user.known_names.last_name"
],
"untransformed": [
"gender",
"mixed_caseStyle",
"some_comments"
],
"skipped": [
"abc"
]
},
"collection": {
"collected": [
"first_name",
"last_name"
],
"uncollected": [
"middle_name"
]
}
}
}
For details, take a look at the example5.ts
file.