2024-06-05 00:34:27 +08:00

58 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 }
}