config.js 1.8 KB

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