Implement initial version of composite property mapper
parent
0049bb9a53
commit
68da848e76
@ -0,0 +1,82 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const dotty = require("dotty");
|
||||||
|
const deepAssign = require("deep-assign");
|
||||||
|
|
||||||
|
module.exports = function createPropertyMapper(propertyMap) {
|
||||||
|
let mappings = Object.keys(propertyMap).map((sourceProperty) => {
|
||||||
|
let destinationPath = propertyMap[sourceProperty];
|
||||||
|
|
||||||
|
if (typeof destinationPath === "function") {
|
||||||
|
return {
|
||||||
|
sourceProperty: sourceProperty,
|
||||||
|
transformer: destinationPath
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let destinationPathParts = destinationPath.split(".");
|
||||||
|
let destinationObject = destinationPathParts[0];
|
||||||
|
let destinationProperty = destinationPathParts.slice(1).join(".");
|
||||||
|
|
||||||
|
return {
|
||||||
|
sourceProperty: sourceProperty,
|
||||||
|
destinationObject: destinationObject,
|
||||||
|
destinationProperty: destinationProperty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return function mapProperties(properties) {
|
||||||
|
return mappings.map((mapping) => {
|
||||||
|
if (properties[mapping.sourceProperty] != null) {
|
||||||
|
return Object.assign({
|
||||||
|
value: properties[mapping.sourceProperty]
|
||||||
|
}, mapping);
|
||||||
|
}
|
||||||
|
}).filter((item) => {
|
||||||
|
return (item != null);
|
||||||
|
}).reduce((objects, item) => {
|
||||||
|
function ensureObject(object) {
|
||||||
|
if (objects[object] == null) {
|
||||||
|
objects[object] = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.destinationProperty != null) {
|
||||||
|
ensureObject(item.destinationObject);
|
||||||
|
dotty.put(objects[item.destinationObject], item.destinationProperty, item.value);
|
||||||
|
} else {
|
||||||
|
let results = item.transformer(item.value);
|
||||||
|
|
||||||
|
Object.keys(results).forEach((object) => {
|
||||||
|
ensureObject(object);
|
||||||
|
deepAssign(objects[object], results[object]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return objects;
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let mapper = module.exports({
|
||||||
|
foo: "one.foo",
|
||||||
|
bar: "two.bar",
|
||||||
|
twoFoo: "two.foo",
|
||||||
|
baz: (value) => {
|
||||||
|
return {
|
||||||
|
one: {
|
||||||
|
baz: value
|
||||||
|
},
|
||||||
|
two: {
|
||||||
|
baz: value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(mapper({
|
||||||
|
foo: "hello one foo!",
|
||||||
|
bar: "hello bar!",
|
||||||
|
twoFoo: "hello two foo!",
|
||||||
|
baz: "hello baz!"
|
||||||
|
}));
|
Loading…
Reference in New Issue