documentation
Version:
a documentation generator
85 lines (76 loc) • 2.33 kB
JavaScript
import conf from './config.js';
import yaml from 'js-yaml';
import fs from 'fs';
import pify from 'pify';
import { readPackageUp } from 'read-pkg-up';
import path from 'path';
import stripComments from 'strip-json-comments';
function normalizeToc(config, basePath) {
if (!config || !config.toc) {
return config;
}
config.toc = config.toc.map(entry => {
if (entry && entry.file) {
entry.file = path.join(basePath, entry.file);
}
return entry;
});
return config;
}
/**
* Use the nearest package.json file for the default
* values of `name` and `version` config.
*
* @param {boolean} noPackage options which prevent ge info about project from package.json
* @returns {Promise<Object>} configuration with inferred parameters
*/
async function readPackage(noPackage) {
const global = conf.globalConfig;
if (noPackage) {
return {};
}
const param = ['name', 'homepage', 'version', 'description'];
try {
const { packageJson } = await readPackageUp();
return param.reduce((res, key) => {
res[`project-${key}`] = global[key] || packageJson[key];
return res;
}, {});
} catch (e) {
return {};
}
}
/**
* Merge a configuration file into program config, assuming that the location
* of the configuration file is given as one of those config.
*
* @param {String} config the user-provided config path, usually via argv
* @returns {Promise<Object>} configuration, which are parsed
* @throws {Error} if the file cannot be read.
*/
async function readConfigFile(config) {
if (typeof config !== 'string') {
return {};
}
const filePath = config;
const absFilePath = path.resolve(process.cwd(), filePath);
const rawFile = await pify(fs).readFile(absFilePath, 'utf8');
const basePath = path.dirname(absFilePath);
let obj = null;
if (path.extname(filePath) === '.json') {
obj = JSON.parse(stripComments(rawFile));
} else {
obj = yaml.load(rawFile);
}
if ('noPackage' in obj) {
obj['no-package'] = obj.noPackage;
delete obj.noPackage;
}
return normalizeToc(obj, basePath);
}
export default async function mergeConfig(config = {}) {
conf.add(config);
conf.add(await readConfigFile(conf.globalConfig.config));
conf.add(await readPackage(conf.globalConfig['no-package']));
return conf.globalConfig;
}