0fc344e6a3
Co-authored-by: Joe Haddad <joe.haddad@zeit.co>
44 lines
1.2 KiB
TypeScript
44 lines
1.2 KiB
TypeScript
import { loader } from 'webpack'
|
|
import { parse } from 'querystring'
|
|
import { PluginMetaData, getPluginId } from '../../plugins/collect-plugins'
|
|
|
|
export type NextPluginLoaderQuery = {
|
|
middleware: string
|
|
}
|
|
|
|
export const pluginLoaderOptions: {
|
|
plugins: PluginMetaData[]
|
|
} = {
|
|
plugins: [],
|
|
}
|
|
|
|
const nextPluginLoader: loader.Loader = function () {
|
|
const { middleware }: NextPluginLoaderQuery =
|
|
typeof this.query === 'string' ? parse(this.query.substr(1)) : this.query
|
|
|
|
const plugins = pluginLoaderOptions.plugins.filter((plugin) => {
|
|
return plugin.middleware.includes(middleware)
|
|
})
|
|
|
|
const pluginIds: string[] = []
|
|
const pluginConfigs: any[] = []
|
|
|
|
return `
|
|
${plugins
|
|
.map((plugin) => {
|
|
const pluginId = getPluginId(plugin.pkgName)
|
|
pluginIds.push(pluginId)
|
|
pluginConfigs.push(plugin.config || {})
|
|
return `import ${pluginId} from '${plugin.directory}/src/${middleware}'`
|
|
})
|
|
.join('\n')}
|
|
|
|
export default function (ctx) {
|
|
return Promise.all([${pluginIds
|
|
.map((id, idx) => `${id}(ctx, ${JSON.stringify(pluginConfigs[idx])})`)
|
|
.join(',')}])
|
|
}
|
|
`
|
|
}
|
|
|
|
export default nextPluginLoader
|