You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.7 KiB
86 lines
1.7 KiB
'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;
|
|
|