UNPKG

835 BJavaScriptView Raw
1const path = require('path');
2
3const {
4 faillog,
5} = require('./log');
6
7const {
8 yellow,
9} = require('./colorStr');
10
11const {
12 hasFile,
13} = require('./fileOp');
14
15const getPkgJson = require('./getPkgJson');
16
17let cacheDir; // 缓存结果
18
19/**
20 * 存在 node_modules 的目录视作项目的 root 目录
21 */
22module.exports = () => {
23 if (cacheDir) {
24 return cacheDir;
25 }
26
27 let layer = 10; // 限制从当前目录向上找 10 层
28 let curDir = __dirname;
29 while (layer--) {
30 // 子模块的情形需要排除自身
31 if (hasFile(curDir, ['node_modules', 'package.json']) && getPkgJson(curDir).name !== '@new4/utils') {
32 cacheDir = curDir;
33 return curDir;
34 }
35 curDir = path.join(curDir, '..');
36 }
37 return faillog(`no directory ${yellow('node_modules')} found after searching ${yellow(layer)} layers`);
38};