57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
import type { App, PluginObject } from 'vuepress/core'
|
|
import { path } from 'vuepress/utils'
|
|
import * as cpx2 from 'cpx2'
|
|
import type { UseNetlifyFunctionPluginsOptions } from '../shared/index.js'
|
|
import { getOptions, netlifyFunctionsPlugin } from './plugin.js'
|
|
|
|
interface UseNetlifyFunctionResult {
|
|
/**
|
|
* functions 请求前缀
|
|
*/
|
|
proxyPrefix: string
|
|
|
|
/**
|
|
* 在 插件的 onPrepare 钩子中调用,监听 当前插件的 functions 目录
|
|
*/
|
|
preparePluginFunctions: () => void
|
|
/**
|
|
* 在 插件的 onGenerate 钩子中调用,将 当前插件的 functions 文件推送到 dest中
|
|
*/
|
|
generatePluginFunctions: () => void
|
|
}
|
|
export function useNetlifyFunctionsPlugin(app: App, options: UseNetlifyFunctionPluginsOptions): UseNetlifyFunctionResult {
|
|
if (typeof options === 'undefined')
|
|
throw new Error('useNetlifyFunctionsPlugin [options] argument not found.')
|
|
|
|
if (typeof options.directory !== 'string' || !options.directory) {
|
|
throw new Error(
|
|
`useNetlifyFunctionsPlugin [options.directory] must be a string\n exp: path.join(__dirname, 'functions')`,
|
|
)
|
|
}
|
|
const plugins = app.pluginApi.plugins
|
|
if (
|
|
!plugins.some(
|
|
(plugin: PluginObject) =>
|
|
plugin.name === 'vuepress-plugin-netlify-functions',
|
|
)
|
|
)
|
|
app.use(netlifyFunctionsPlugin())
|
|
|
|
const { proxyPrefix, directory } = getOptions()
|
|
const source = path.join(options.directory, '**/*.js')
|
|
|
|
function preparePluginFunctions(): void {
|
|
if (!app.env.isBuild) {
|
|
cpx2.watch(source, directory.temp, {
|
|
ignore: ['!**/*.d.js'],
|
|
})
|
|
}
|
|
}
|
|
|
|
function generatePluginFunctions(): void {
|
|
cpx2.copy(source, directory.dest)
|
|
}
|
|
|
|
return { proxyPrefix, preparePluginFunctions, generatePluginFunctions }
|
|
}
|