'use strict'; const path = require('path'); const assert = require('assert'); const fs = require('fs'); const utility = require('utility'); const initCwd = process.cwd(); module.exports = { getFrameworkPath }; /** * Find the framework directory, lookup order * - specify framework path * - get framework name from * - use egg by default * @param {Object} options - options * @param {String} options.baseDir - the current directory of application * @param {String} [options.framework] - the directory of framework * @return {String} frameworkPath */ function getFrameworkPath({ framework, baseDir }) { const pkgPath = path.join(baseDir, 'package.json'); assert(fs.existsSync(pkgPath), `${pkgPath} should exist`); const moduleDir = path.join(baseDir, 'node_modules'); const pkg = utility.readJSONSync(pkgPath); // 1. pass framework or customEgg if (framework) { // 1.1 framework is an absolute path // framework: path.join(baseDir, 'node_modules/${frameworkName}') if (path.isAbsolute(framework)) { assert(fs.existsSync(framework), `${framework} should exist`); return framework; } // 1.2 framework is a npm package that required by application // framework: 'frameworkName' return assertAndReturn(framework, moduleDir); } // 2. framework is not specified // 2.1 use framework name from pkg.egg.framework if (pkg.egg && pkg.egg.framework) { return assertAndReturn(pkg.egg.framework, moduleDir); } // 2.2 use egg by default return assertAndReturn('egg', moduleDir); } function assertAndReturn(frameworkName, moduleDir) { const moduleDirs = new Set([ moduleDir, // find framework from process.cwd, especially for test, // the application is in test/fixtures/app, // and framework is install in ${cwd}/node_modules path.join(process.cwd(), 'node_modules'), // prevent from mocking process.cwd path.join(initCwd, 'node_modules'), ]); for (const moduleDir of moduleDirs) { const frameworkPath = path.join(moduleDir, frameworkName); if (fs.existsSync(frameworkPath)) return frameworkPath; } throw new Error(`${frameworkName} is not found in ${Array.from(moduleDirs)}`); }