@eggjs/utils
Version:
Utils for all egg projects
78 lines • 6.22 kB
JavaScript
import { debuglog } from 'node:util';
import path from 'node:path';
import assert from 'node:assert';
import { existsSync } from 'node:fs';
import { readJSONSync } from './utils.js';
import { importResolve } from './import.js';
const debug = debuglog('@eggjs/utils/framework');
const initCwd = process.cwd();
/**
* 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
*/
export function getFrameworkPath(options) {
const { framework, baseDir } = options;
const pkgPath = path.join(baseDir, 'package.json');
assert(existsSync(pkgPath), `${pkgPath} should exist`);
const moduleDir = path.join(baseDir, 'node_modules');
// 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(existsSync(framework), `${framework} should exist`);
return framework;
}
// 1.2 framework is a npm package that required by application
// framework: 'frameworkName'
return assertAndReturn(framework, moduleDir);
}
const pkg = readJSONSync(pkgPath);
// 2. framework is not specified
// 2.1 use framework name from pkg.egg.framework
if (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'),
]);
try {
// find framework from global, especially for monorepo
let globalModuleDir;
// if frameworkName is scoped package, like @ali/egg
if (frameworkName.startsWith('@') && frameworkName.includes('/')) {
globalModuleDir = path.join(importResolve(`${frameworkName}/package.json`), '../../..');
}
else {
globalModuleDir = path.join(importResolve(`${frameworkName}/package.json`), '../..');
}
moduleDirs.add(globalModuleDir);
}
catch (err) {
// ignore
debug('importResolve %s on %s error: %s', frameworkName, moduleDir, err);
}
for (const moduleDir of moduleDirs) {
const frameworkPath = path.join(moduleDir, frameworkName);
if (existsSync(frameworkPath))
return frameworkPath;
}
throw new Error(`${frameworkName} is not found in ${Array.from(moduleDirs)}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZyYW1ld29yay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFFakQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBTzlCOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFnQjtJQUMvQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNuRCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsT0FBTyxlQUFlLENBQUMsQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVyRCxpQ0FBaUM7SUFDakMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLG9DQUFvQztRQUNwQyxpRUFBaUU7UUFDakUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLFNBQVMsZUFBZSxDQUFDLENBQUM7WUFDM0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELDhEQUE4RDtRQUM5RCw2QkFBNkI7UUFDN0IsT0FBTyxlQUFlLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsZ0NBQWdDO0lBQ2hDLGdEQUFnRDtJQUNoRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDdkIsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixPQUFPLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLGFBQXFCLEVBQUUsU0FBaUI7SUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDekIsU0FBUztRQUNULHdEQUF3RDtRQUN4RCwyQ0FBMkM7UUFDM0Msa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLGNBQWMsQ0FBQztRQUN4QyxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDO0tBQ25DLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQztRQUNILHNEQUFzRDtRQUN0RCxJQUFJLGVBQWUsQ0FBQztRQUNwQixvREFBb0Q7UUFDcEQsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDekIsYUFBYSxDQUFDLEdBQUcsYUFBYSxlQUFlLENBQUMsRUFDOUMsVUFBVSxDQUNYLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUN6QixhQUFhLENBQUMsR0FBRyxhQUFhLGVBQWUsQ0FBQyxFQUM5QyxPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7UUFDRCxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsU0FBUztRQUNULEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFELElBQUksVUFBVSxDQUFDLGFBQWEsQ0FBQztZQUFFLE9BQU8sYUFBYSxDQUFDO0lBQ3RELENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsYUFBYSxvQkFBb0IsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEYsQ0FBQyJ9