Skip to content

Commit 8aec214

Browse files
committed
Change plugin API to first-order function, use Babel Style for configure extra options
1 parent 5cdb744 commit 8aec214

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

lib/prepare.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const yamlParser = require('js-yaml')
55
const tomlParser = require('toml')
66
const createMarkdown = require('./markdown')
77
const tempPath = path.resolve(__dirname, 'app/.temp')
8-
const { inferTitle, extractHeaders, parseFrontmatter, loadPlugin } = require('./util')
8+
const { inferTitle, extractHeaders, parseFrontmatter, loadPlugin, cloneOptions } = require('./util')
99

1010
fs.ensureDirSync(tempPath)
1111

@@ -77,20 +77,20 @@ if (!Object.assign) Object.assign = require('object-assign')`
7777
// 7. handle user plugins
7878
if (options.siteConfig.plugins && Array.isArray(options.siteConfig.plugins)) {
7979
const { plugins } = options.siteConfig
80+
8081
for (const plugin of plugins) {
8182
let pluginRequired
83+
let pluginOptions
84+
const vuepressOptions = cloneOptions(options)
8285
if (typeof plugin === 'string') {
83-
pluginRequired = loadPlugin(plugin, options)
84-
}
85-
if (typeof plugin === 'object') {
86-
pluginRequired = loadPlugin(plugin.resolve, options)
87-
if (plugin.options) {
88-
pluginRequired = pluginRequired(plugin.options)
89-
}
86+
pluginRequired = loadPlugin(plugin, sourceDir)
87+
} else if (Array.isArray(plugin)) {
88+
pluginRequired = loadPlugin(plugin[0], sourceDir)
89+
pluginOptions = plugin[1]
9090
}
9191
if (pluginRequired) {
9292
try {
93-
await pluginRequired(options)
93+
await pluginRequired({ vuepressOptions, pluginOptions })
9494
} catch (e) {
9595
throw e
9696
}

lib/util/index.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ exports.extractHeaders = (content, include = [], md) => {
8585
return res
8686
}
8787

88-
exports.loadPlugin = (pluginPath, options) => {
88+
exports.loadPlugin = (pluginPath, sourceDir) => {
8989
const fs = require('fs-extra')
9090
const path = require('path')
91-
const vuepressDir = path.resolve(options.sourceDir, '.vuepress')
91+
const vuepressDir = path.resolve(sourceDir, '.vuepress')
9292
let plugin
9393
try {
9494
if (fs.existsSync(path.resolve(vuepressDir, pluginPath))) {
@@ -101,3 +101,26 @@ exports.loadPlugin = (pluginPath, options) => {
101101
}
102102
return plugin
103103
}
104+
105+
exports.cloneOptions = (options) => {
106+
const optionClone = {}
107+
const readonlyProperties = ['sourceDir', 'outDir', 'publicPath', 'markdown', 'themePath', 'useDefaultTheme', 'notFoundPath']
108+
const writableProperties = ['siteConfig', 'pageFiles', 'siteData']
109+
110+
readonlyProperties.forEach(prop => {
111+
Object.defineProperty(optionClone, prop, {
112+
value: options[prop],
113+
enumerable: true
114+
})
115+
})
116+
117+
writableProperties.forEach(prop => {
118+
Object.defineProperty(optionClone, prop, {
119+
value: options[prop],
120+
writable: true,
121+
enumerable: true
122+
})
123+
})
124+
125+
return optionClone
126+
}

0 commit comments

Comments
 (0)