diff --git a/packages/nx/src/utils/nx-plugin.ts b/packages/nx/src/utils/nx-plugin.ts index 50de25666e8bd..52abe15072d04 100644 --- a/packages/nx/src/utils/nx-plugin.ts +++ b/packages/nx/src/utils/nx-plugin.ts @@ -47,34 +47,30 @@ export function loadNxPlugins( ? nxPluginCache || (nxPluginCache = plugins.map((moduleName) => { let pluginPath: string; - let pluginName: string; - if (['.js', '.ts'].includes(path.extname(moduleName))) { - if ( - path.extname(moduleName) === '.ts' && - !tsNodeAndPathsRegistered - ) { - registerTSTranspiler(); - } - pluginPath = require.resolve(moduleName, { paths }); - pluginName = path.basename(moduleName); - } else { - const localPlugin = resolveLocalNxPlugin(moduleName); - pluginName = moduleName; - if (localPlugin) { + try { + pluginPath = require.resolve(moduleName, { + paths, + }); + } catch (e) { + if (e.code === 'MODULE_NOT_FOUND') { + const plugin = resolveLocalNxPlugin(moduleName); const main = readPluginMainFromProjectConfiguration( - localPlugin.projectConfig + plugin.projectConfig ); - pluginPath = main - ? path.join(workspaceRoot, main) - : localPlugin.path; + pluginPath = main ? path.join(workspaceRoot, main) : plugin.path; } else { - pluginPath = require.resolve(moduleName, { - paths, - }); + throw e; } } + const packageJsonPath = path.join(pluginPath, 'package.json'); + const { name } = + !['.ts', '.js'].some((x) => x === path.extname(pluginPath)) && // Not trying to point to a ts or js file + existsSync(packageJsonPath) // plugin has a package.json + ? readJsonFile(packageJsonPath) // read name from package.json + : { name: path.basename(pluginPath) }; // use the name of the file we point to const plugin = require(pluginPath) as NxPlugin; - plugin.name = pluginName; + plugin.name = name; + return plugin; })) : []; @@ -111,23 +107,27 @@ export function readPluginPackageJson( path: string; json: PackageJson; } { - // Check for matching local plugin - const localPluginPath = resolveLocalNxPlugin(pluginName); - if (localPluginPath) { - const localPluginPackageJson = path.join( - localPluginPath.path, - 'package.json' - ); - return { - path: localPluginPackageJson, - json: readJsonFile(localPluginPackageJson), - }; + let packageJsonPath: string; + try { + packageJsonPath = require.resolve(`${pluginName}/package.json`, { + paths, + }); + } catch (e) { + if (e.code === 'MODULE_NOT_FOUND') { + const localPluginPath = resolveLocalNxPlugin(pluginName); + if (localPluginPath) { + const localPluginPackageJson = path.join( + localPluginPath.path, + 'package.json' + ); + return { + path: localPluginPackageJson, + json: readJsonFile(localPluginPackageJson), + }; + } + } + throw e; } - - // Fallback to installed plugins - const packageJsonPath = require.resolve(`${pluginName}/package.json`, { - paths, - }); return { json: readJsonFile(packageJsonPath), path: packageJsonPath }; } @@ -223,8 +223,7 @@ function readTsConfigPaths(root: string = workspaceRoot) { .map((x) => path.join(root, x)) .filter((x) => existsSync(x))[0]; if (!tsconfigPath) { - tsconfigPaths = {}; - return {}; + throw new Error('unable to find tsconfig.base.json or tsconfig.json'); } const { compilerOptions } = readJsonFile(tsconfigPath); tsconfigPaths = compilerOptions?.paths;