fractal-transformer
Version:
Transform data for presentation and transformation layer for complex data output, the like found in RESTful APIs, and works really well with JSON. Its like a view layer for your JSON/YAML/etc.
61 lines (52 loc) • 1.55 kB
JavaScript
const _ = require('lodash');
const path = require('path');
const fs = require('fs');
const config = {
transformerDir: 'transformers',
};
function augmentedData(data) {
return _(data);
}
function fractal(data, transformer) {
let adata = augmentedData(data);
let response = {};
if (_.isEmpty(transformer) && !_.isFunction(transformer)) {
throw ("Invalid Transformer");
}
if (fs.existsSync(path.join(config.transformerDir, transformer + '.js'))) {
response = fractal(adata.value(), require(path.resolve(config.transformerDir, transformer + '.js')))
} else if (_.isFunction(transformer)) {
return transformer(adata);
} else if (_.isObject(transformer)) {
_.each(transformer, function (value, key) {
if (_.isArray(transformer[key])) {
response[key] = transformer[key]
} else {
response[key] = fractal(adata.value(), transformer[key])
}
});
} else {
response = adata.get(transformer) || ""
}
return response;
}
function transform(data, transformer) {
if (_.isEmpty(data)) {
return '';
}
if (_.isArray(data)) {
let newArr = [];
_.map(data, function (item) {
newArr.push(fractal(item, transformer))
});
return newArr
} else {
return fractal(data, transformer)
}
}
module.exports = function (user_config) {
if (!_.isEmpty(user_config)) {
_.merge(config, user_config);
}
return transform;
};