UNPKG

json-partial

Version:

Parses a json file looking for partials. If found the partial is read and applied to the json file. On exit saves the json with the provided output name.

115 lines (100 loc) 3.25 kB
"use strict"; var TOSTRING = Object.prototype.toString; var TYPES = { 'undefined': 'undefined', 'number': 'number', 'boolean': 'boolean', 'string': 'string', '[object Function]': 'function', '[object RegExp]': 'regexp', '[object Array]': 'array', '[object Date]': 'date', '[object Error]': 'error' }; var path = require("path"); var xchg = require("extchange"); var pretty = require("js-object-pretty-print").pretty; var bbPromise = require("bluebird"); var fs = bbPromise.promisifyAll(require("fs")); var merge = require("merge"); function valueType(o) { var type = TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null'); return type; } function expandPartials(jsonNode, baseDir) { var jsonxNode = jsonNode.jsonx; if (jsonxNode) { if (valueType(jsonxNode) !== "array") { jsonxNode = [jsonxNode]; } jsonxNode.forEach(function (jsonx) { var fullpath, data; fullpath = jsonx.fullpath || path.join(baseDir, jsonx.file); data = require(fullpath); jsonx.data = jsonx.data || {}; jsonNode[jsonx.field] = merge.recursive(true, data, jsonx.data); }); delete jsonNode.jsonx; } } function traverseObject(jsonObject, baseDir) { if (valueType(jsonObject) !== "object") { return; } expandPartials(jsonObject, baseDir); Object.keys(jsonObject).forEach(function (property) { var element = jsonObject[property], type = valueType(element); if (type === "array") { element.forEach(function (elementItem) { traverseObject(elementItem, baseDir); }); } else if (type === "object") { traverseObject(element, baseDir); } }); return jsonObject; } function reportError(error) { console.log(error); } function expandFile(fullPath) { fs.readFileAsync(fullPath, "utf8").then(function (data) { var jsonx, json, baseDir; try { jsonx = JSON.parse(data); baseDir = jsonx.jsonxBaseDir || __dirname; delete jsonx.jsonxBaseDir; json = traverseObject(jsonx, baseDir); fullPath = xchg(fullPath, "json"); fs.writeFileAsync(xchg(fullPath, "json"), pretty(json, 4, "JSON"), "utf8").then(function () { console.log("Created file: " + fullPath); }).catch(reportError); } catch (e) { reportError(e); } }).catch(reportError); } function parseDir(dirPath) { fs.readdirAsync(dirPath, "utf8").then(function (files) { files.forEach(function (name) { var fullPath = path.join(dirPath, name); fs.statAsync(fullPath).then(function (stats) { if (stats.isDirectory()) { parseDir(fullPath); } if (stats.isFile() && path.extname(name).toLowerCase() === ".jsonx") { expandFile(fullPath); } }); }); }).catch(reportError); } module.exports = { expand: traverseObject, expandFile: expandFile, parseDir: parseDir };