diff --git a/lib/prepare.js b/lib/prepare.js index fdeeb67c..08564c1a 100644 --- a/lib/prepare.js +++ b/lib/prepare.js @@ -1,9 +1,8 @@ const path = require('path') const fs = require('fs-extra') const globby = require('globby') -const yamlParser = require('js-yaml') -const tomlParser = require('toml') const createMarkdown = require('./markdown') +const loadConfig = require('./util/loadConfig') const tempPath = path.resolve(__dirname, 'app/.temp') const { inferTitle, @@ -76,21 +75,7 @@ if (!Object.assign) Object.assign = require('object-assign')` async function resolveOptions (sourceDir) { const vuepressDir = path.resolve(sourceDir, '.vuepress') - const configPath = path.resolve(vuepressDir, 'config.js') - const configYmlPath = path.resolve(vuepressDir, 'config.yml') - const configTomlPath = path.resolve(vuepressDir, 'config.toml') - - delete require.cache[configPath] - - // resolve siteConfig - let siteConfig = {} - if (fs.existsSync(configYmlPath)) { - siteConfig = await parseConfig(configYmlPath) - } else if (fs.existsSync(configTomlPath)) { - siteConfig = await parseConfig(configTomlPath) - } else if (fs.existsSync(configPath)) { - siteConfig = require(configPath) - } + const siteConfig = loadConfig(vuepressDir) // normalize head tag urls for base const base = siteConfig.base || '/' @@ -361,31 +346,3 @@ function sort (arr) { return 0 }) } - -async function parseConfig (file) { - const content = await fs.readFile(file, 'utf-8') - const [extension] = /.\w+$/.exec(file) - let data - - switch (extension) { - case '.yml': - case '.yaml': - data = yamlParser.safeLoad(content) - break - - case '.toml': - data = tomlParser.parse(content) - // reformat to match config since TOML does not allow different data type - // https://github.com/toml-lang/toml#array - const format = [] - Object.keys(data.head).forEach(meta => { - data.head[meta].forEach(values => { - format.push([meta, values]) - }) - }) - data.head = format - break - } - - return data || {} -} diff --git a/lib/util/loadConfig.js b/lib/util/loadConfig.js new file mode 100644 index 00000000..d892477c --- /dev/null +++ b/lib/util/loadConfig.js @@ -0,0 +1,54 @@ +const fs = require('fs-extra') +const path = require('path') +const yamlParser = require('js-yaml') +const tomlParser = require('toml') + +module.exports = function loadConfig (vuepressDir, bustCache = false) { + const configPath = path.resolve(vuepressDir, 'config.js') + const configYmlPath = path.resolve(vuepressDir, 'config.yml') + const configTomlPath = path.resolve(vuepressDir, 'config.toml') + + if (bustCache) { + delete require.cache[configPath] + } + + // resolve siteConfig + let siteConfig = {} + if (fs.existsSync(configYmlPath)) { + siteConfig = parseConfig(configYmlPath) + } else if (fs.existsSync(configTomlPath)) { + siteConfig = parseConfig(configTomlPath) + } else if (fs.existsSync(configPath)) { + siteConfig = require(configPath) + } + + return siteConfig +} + +function parseConfig (file) { + const content = fs.readFileSync(file, 'utf-8') + const [extension] = /.\w+$/.exec(file) + let data + + switch (extension) { + case '.yml': + case '.yaml': + data = yamlParser.safeLoad(content) + break + + case '.toml': + data = tomlParser.parse(content) + // reformat to match config since TOML does not allow different data type + // https://github.com/toml-lang/toml#array + const format = [] + Object.keys(data.head).forEach(meta => { + data.head[meta].forEach(values => { + format.push([meta, values]) + }) + }) + data.head = format + break + } + + return data || {} +}