qwqdanchun.github.io/node_modules/hexo/lib/plugins/console/config.js

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;