diff --git a/packages/@vuepress/core/lib/build.js b/packages/@vuepress/core/lib/build.js index a4b200e3f1..57aaefc728 100644 --- a/packages/@vuepress/core/lib/build.js +++ b/packages/@vuepress/core/lib/build.js @@ -63,21 +63,23 @@ module.exports = async function build (sourceDir, cliOptions = {}) { .map(renderHeadTag) .join('\n ') + // if the user does not have a custom 404.md, generate the theme's default + if (!ctx.pages.some(p => p.path === '/404.html')) { + ctx.addPage({ path: '/404.html' }) + } + // render pages logger.wait('Rendering static HTML...') - for (const page of ctx.pages) { - await renderPage(page) - } - // if the user does not have a custom 404.md, generate the theme's default - if (!ctx.pages.some(p => p.path === '/404.html')) { - await renderPage({ path: '/404.html' }) + const pagePaths = [] + for (const page of ctx.pages) { + pagePaths.push(await renderPage(page)) } readline.clearLine(process.stdout, 0) readline.cursorTo(process.stdout, 0) - await ctx.pluginAPI.options.generated.apply() + await ctx.pluginAPI.options.generated.apply(pagePaths) // DONE. const relativeDir = path.relative(cwd, outDir) @@ -155,6 +157,7 @@ module.exports = async function build (sourceDir, cliOptions = {}) { const filePath = path.resolve(outDir, filename) await fs.ensureDir(path.dirname(filePath)) await fs.writeFile(filePath, html) + return filePath } function renderPageMeta (meta) { diff --git a/packages/@vuepress/core/lib/plugin-api/abstract/AsyncOption.js b/packages/@vuepress/core/lib/plugin-api/abstract/AsyncOption.js index 2685ef09af..364b375d93 100644 --- a/packages/@vuepress/core/lib/plugin-api/abstract/AsyncOption.js +++ b/packages/@vuepress/core/lib/plugin-api/abstract/AsyncOption.js @@ -30,7 +30,7 @@ class AsyncOption extends Option { this.add( name, isFunction(value) - ? await value(...args) + ? await Promise.resolve(value(...args)) : value ) } catch (error) { @@ -60,7 +60,7 @@ class AsyncOption extends Option { this.add( name, isFunction(value) - ? await value(...args) + ? await Promise.resolve(value(...args)) : value ) } catch (error) { @@ -84,7 +84,7 @@ class AsyncOption extends Option { async pipeline (input) { for (const fn of this.values) { - input = await fn(input) + input = await Promise.resolve(fn(input)) } return input } diff --git a/packages/@vuepress/core/lib/plugin-api/constants.js b/packages/@vuepress/core/lib/plugin-api/constants.js index e9bcb63591..b9339f57de 100644 --- a/packages/@vuepress/core/lib/plugin-api/constants.js +++ b/packages/@vuepress/core/lib/plugin-api/constants.js @@ -5,7 +5,7 @@ const PLUGIN_OPTION_META_MAP = { READY: { name: 'ready', types: [Function] }, COMPILED: { name: 'compiled', types: [Function] }, UPDATED: { name: 'updated', types: [Function] }, - GENERATED: { name: 'generated', types: [Function] }, + GENERATED: { name: 'generated', types: [Function], async: true }, // options CHAIN_WEBPACK: { name: 'chainWebpack', types: [Function] }, ENHANCE_DEV_SERVER: { name: 'enhanceDevServer', types: [Function] }, diff --git a/packages/@vuepress/core/lib/plugin-api/index.js b/packages/@vuepress/core/lib/plugin-api/index.js index 459e71bf2e..324fe28da7 100644 --- a/packages/@vuepress/core/lib/plugin-api/index.js +++ b/packages/@vuepress/core/lib/plugin-api/index.js @@ -147,7 +147,7 @@ module.exports = class PluginAPI { initializeOptions () { Object.keys(PLUGIN_OPTION_MAP).forEach(key => { const option = PLUGIN_OPTION_MAP[key] - this.options[option.name] = instantiateOption(option.name) + this.options[option.name] = instantiateOption(option) }) } diff --git a/packages/@vuepress/core/lib/plugin-api/override/instantiateOption.js b/packages/@vuepress/core/lib/plugin-api/override/instantiateOption.js index 0f0669d9fc..202687076b 100644 --- a/packages/@vuepress/core/lib/plugin-api/override/instantiateOption.js +++ b/packages/@vuepress/core/lib/plugin-api/override/instantiateOption.js @@ -3,11 +3,12 @@ const ClientDynamicModulesOption = require('./ClientDynamicModulesOption') const GlobalUIComponentsOption = require('./GlobalUIComponentsOption') const DefineOption = require('./DefineOption') const AliasOption = require('./AliasOption') +const AsyncOption = require('../abstract/AsyncOption') const AdditionalPagesOption = require('./AdditionalPagesOption') const Option = require('../abstract/Option') const { PLUGIN_OPTION_MAP } = require('../constants') -module.exports = function instantiateOption (name) { +module.exports = function instantiateOption ({ name, async }) { switch (name) { case PLUGIN_OPTION_MAP.ENHANCE_APP_FILES.name: return new EnhanceAppFilesOption(name) @@ -27,6 +28,6 @@ module.exports = function instantiateOption (name) { case PLUGIN_OPTION_MAP.ADDITIONAL_PAGES.name: return new AdditionalPagesOption(name) - default: return new Option(name) + default: return async ? new AsyncOption(name) : new Option(name) } }