From faf48e9b166e3e6e2ce90bd1349d526c7e53c890 Mon Sep 17 00:00:00 2001 From: Sam Zhou Date: Fri, 22 May 2020 05:04:40 -0400 Subject: [PATCH] fix(v2): Resolve plugins relative to siteDir (#2789) --- packages/docusaurus/src/server/plugins/init.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/docusaurus/src/server/plugins/init.ts b/packages/docusaurus/src/server/plugins/init.ts index 244483467e..de8d098fd8 100644 --- a/packages/docusaurus/src/server/plugins/init.ts +++ b/packages/docusaurus/src/server/plugins/init.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import Module from 'module'; import importFresh from 'import-fresh'; import {LoadContext, Plugin, PluginConfig} from '@docusaurus/types'; @@ -15,9 +16,16 @@ export function initPlugins({ pluginConfigs: PluginConfig[]; context: LoadContext; }): Plugin[] { + // We need to resolve plugins from the perspective of the siteDir, since the siteDir's package.json + // declares the dependency on these plugins. + // We need to fallback to createRequireFromPath since createRequire is only available in node v12. + // See: https://nodejs.org/api/modules.html#modules_module_createrequire_filename + const createRequire = Module.createRequire || Module.createRequireFromPath; + const pluginRequire = createRequire(context.siteDir); + const plugins: Plugin[] = pluginConfigs .map((pluginItem) => { - let pluginModuleImport; + let pluginModuleImport: string | undefined; let pluginOptions = {}; if (!pluginItem) { @@ -37,7 +45,9 @@ export function initPlugins({ // The pluginModuleImport value is any valid // module identifier - npm package or locally-resolved path. - const pluginModule: any = importFresh(pluginModuleImport); + const pluginModule: any = importFresh( + pluginRequire.resolve(pluginModuleImport), + ); return (pluginModule.default || pluginModule)(context, pluginOptions); }) .filter(Boolean);