UNPKG

1.8 kBJavaScriptView Raw
1'use strict';
2
3const yaml = require('js-yaml');
4const fs = require('hexo-fs');
5const pathFn = require('path');
6const Promise = require('bluebird');
7
8function configConsole(args) {
9 const key = args._[0];
10 let value = args._[1];
11 const self = this;
12
13 if (!key) {
14 console.log(this.config);
15 return Promise.resolve();
16 }
17
18 if (!value) {
19 value = getProperty(this.config, key);
20 if (value) console.log(value);
21 return Promise.resolve();
22 }
23
24 const configPath = this.config_path;
25 const extname = pathFn.extname(configPath);
26
27 return fs.exists(configPath).then(exist => {
28 if (!exist) return {};
29 return self.render.render({path: configPath});
30 }).then(config => {
31 if (!config) config = {};
32
33 let result = '';
34
35 setProperty(config, key, castValue(value));
36
37 if (extname === '.json') {
38 result = JSON.stringify(config);
39 } else {
40 result = yaml.dump(config);
41 }
42
43 return fs.writeFile(configPath, result);
44 });
45}
46
47function getProperty(obj, key) {
48 const split = key.split('.');
49 let result = obj[split[0]];
50
51 for (let i = 1, len = split.length; i < len; i++) {
52 result = result[split[i]];
53 }
54
55 return result;
56}
57
58function setProperty(obj, key, value) {
59 const split = key.split('.');
60 let cursor = obj;
61 let name = '';
62 const lastKey = split.pop();
63
64 for (let i = 0, len = split.length; i < len; i++) {
65 name = split[i];
66 cursor = cursor[name] = cursor[name] || {};
67 }
68
69 cursor[lastKey] = value;
70}
71
72function castValue(value) {
73 switch (value) {
74 case 'true':
75 return true;
76
77 case 'false':
78 return false;
79
80 case 'null':
81 return null;
82
83 case 'undefined':
84 return undefined;
85 }
86
87 const num = Number(value);
88 if (!isNaN(num)) return num;
89
90 return value;
91}
92
93module.exports = configConsole;