87 lines
1.7 KiB
JavaScript
87 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
const yaml = require('js-yaml');
|
|
const fs = require('hexo-fs');
|
|
const { extname } = require('path');
|
|
const Promise = require('bluebird');
|
|
|
|
function configConsole(args) {
|
|
const key = args._[0];
|
|
let value = args._[1];
|
|
|
|
if (!key) {
|
|
console.log(this.config);
|
|
return Promise.resolve();
|
|
}
|
|
|
|
if (!value) {
|
|
value = getProperty(this.config, key);
|
|
if (value) console.log(value);
|
|
return Promise.resolve();
|
|
}
|
|
|
|
const configPath = this.config_path;
|
|
const ext = extname(configPath);
|
|
|
|
return fs.exists(configPath).then(exist => {
|
|
if (!exist) return {};
|
|
return this.render.render({path: configPath});
|
|
}).then(config => {
|
|
if (!config) config = {};
|
|
|
|
setProperty(config, key, castValue(value));
|
|
|
|
const result = ext === '.json' ? JSON.stringify(config) : yaml.dump(config);
|
|
|
|
return fs.writeFile(configPath, result);
|
|
});
|
|
}
|
|
|
|
function getProperty(obj, key) {
|
|
const split = key.split('.');
|
|
let result = obj[split[0]];
|
|
|
|
for (let i = 1, len = split.length; i < len; i++) {
|
|
result = result[split[i]];
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function setProperty(obj, key, value) {
|
|
const split = key.split('.');
|
|
let cursor = obj;
|
|
const lastKey = split.pop();
|
|
|
|
for (let i = 0, len = split.length; i < len; i++) {
|
|
const name = split[i];
|
|
cursor[name] = cursor[name] || {};
|
|
cursor = cursor[name];
|
|
}
|
|
|
|
cursor[lastKey] = value;
|
|
}
|
|
|
|
function castValue(value) {
|
|
switch (value) {
|
|
case 'true':
|
|
return true;
|
|
|
|
case 'false':
|
|
return false;
|
|
|
|
case 'null':
|
|
return null;
|
|
|
|
case 'undefined':
|
|
return undefined;
|
|
}
|
|
|
|
const num = Number(value);
|
|
if (!isNaN(num)) return num;
|
|
|
|
return value;
|
|
}
|
|
|
|
module.exports = configConsole;
|