plugin.js 1.7 KB

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