-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
119 lines (102 loc) · 3.83 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
const fs = require('fs');
const json3 = require('json3');
const debug = require('debug')('json-modify-file');
/**
* Load and parse content or return empty object
*/
function readJSON(filename) {
try {
const content = fs.readFileSync(filename, "utf-8");
const json = json3.parse(content)
return json;
} catch (error) {
console.error('[Error loading JSON]', error);
return {};
}
}
/**
* Replaces handlevars per property
*/
function replaceObj(value, vars, plop) {
let obj = value;
Object.keys(obj).forEach(function (item) {
obj[item] = plop.renderString(obj[item], vars);
});
return obj;
}
/**
* Replaces text or pass to object replacement
*/
function replace(value, vars, plop) {
return (typeof value === "object") ? replaceObj(value, vars, plop) : plop.renderString(value, vars);
}
module.exports = function (plop, cfg) {
// setup config defaults
let config = Object.assign({
prefix: 'json',
force: false
}, cfg || {});
plop.setDefaultInclude({ actionTypes: true });
plop.setActionType(`${config.prefix}-modify-file`, appendtoJSONFile);
function appendtoJSONFile(vars, config, plop) {
return new Promise((resolve, reject) => {
try {
const file_json = readJSON(config.JSONFile);
let json = appendJSON(file_json, vars, config, plop)
fs.writeFileSync(config.JSONFile,
JSON.stringify(json, null, 2))
resolve('Success');
} catch (error) {
reject(error);
}
});
}
/**
* Inserts entries into JSON arrays or objects
* * Split for easier testing
*
* Objects: pass property JSONEntryKey,
* otherwise the value is inserted as arrays
* @method
* @param {string} key JSON attribute (the array or object) to append to
* @param {string || object} value The string or object to appendJSON
* @param {object} vars User input on prompts passed by plop
* @return {json} modified JSON
*/
// function appendJSON(json, vars) {
function appendJSON(json, vars, config, plop) {
// JSON attribute to modify, allows templates
let property_name = config.hasOwnProperty("JSONEntryKey") ?
plop.renderString(config.JSONEntryKey, vars) : null;
debug(`Targets \nFile: ${config.JSONFile}\nForce:${config.force} (Replaces existing)\nTarget property: ${config.JSONKey}\nType:${property_name ? 'Object:' + property_name : 'Array'}`);
// If key exists use otherwise force OR error
if (!json.hasOwnProperty(config.JSONKey)) {
if (!config.force) {
throw 'JSON has no property: ' + config.JSONKey;
} else {
const emptyCollection = property_name ? {} : [];
json[config.JSONKey] = emptyCollection;
}
}
// If object and prop exists then force or error
if (!config.force && property_name && json[config.JSONKey].hasOwnProperty(property_name)) {
throw "Attribute: " + property_name + ' already exist in ' + config.JSONKey
}
// Process the Value - change this for handlebars
let stringified_insert_val = replace(json3.stringify(config.JSONEntryValue), vars, plop);
let insert_val = json3.parse(stringified_insert_val);
debug(`Adding: `, insert_val);
// Choosing object (key:value) OR push(value)
if (property_name) {
json[config.JSONKey][property_name] = insert_val;
} else {
if (Array.isArray(json[config.JSONKey])) {
json[config.JSONKey].push(insert_val);
} else {
throw `Array expected, did you forget to add a JSONEntryKey?`
}
}
return json;
// return json;
}
}