schangxiang@126.com
2025-09-19 0821aa23eabe557c0d9ef5dbe6989c68be35d1fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
'use strict';
 
const fs = require('fs');
const path = require('path');
const assert = require('assert');
const os = require('os');
const mkdirp = require('mkdirp');
 
const tmpDir = os.tmpdir();
const logger = {
  debug: noop,
  info: noop,
  warn: noop,
  error: noop,
};
 
exports.getPlugins = opt => {
  const loader = getLoader(opt);
  loader.loadPlugin();
  return loader.allPlugins;
};
 
exports.getLoadUnits = opt => {
  const loader = getLoader(opt);
  loader.loadPlugin();
  return loader.getLoadUnits();
};
 
exports.getConfig = opt => {
  const loader = getLoader(opt);
  loader.loadPlugin();
  loader.loadConfig();
  return loader.config;
};
 
function getLoader({ framework, baseDir, env }) {
  assert(framework, 'framework is required');
  assert(fs.existsSync(framework), `${framework} should exist`);
  if (!(baseDir && fs.existsSync(baseDir))) {
    baseDir = path.join(tmpDir, String(Date.now()), 'tmpapp');
    mkdirp.sync(baseDir);
    fs.writeFileSync(path.join(baseDir, 'package.json'), JSON.stringify({ name: 'tmpapp' }));
  }
 
  const EggLoader = findEggCore({ baseDir, framework }).EggLoader;
  const { Application } = require(framework);
  if (env) process.env.EGG_SERVER_ENV = env;
  return new EggLoader({
    baseDir,
    logger,
    app: Object.create(Application.prototype),
  });
}
 
function findEggCore({ baseDir, framework }) {
  try {
    const name = 'egg-core';
    return require(name);
  } catch (_) {
    let eggCorePath = path.join(baseDir, 'node_modules/egg-core');
    if (!fs.existsSync(eggCorePath)) {
      eggCorePath = path.join(framework, 'node_modules/egg-core');
    }
    assert(fs.existsSync(eggCorePath), `Can't find egg-core from ${baseDir} and ${framework}`);
    return require(eggCorePath);
  }
}
 
function noop() {}