| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 'use strict';const is = require('is-type-of');const path = require('path');const LOAD_BOOT_HOOK = Symbol('Loader#loadBootHook');module.exports = {  /**   * load app.js   *   * @example   * - old:   *   * ```js   * module.exports = function(app) {   *   doSomething();   * }   * ```   *   * - new:   *   * ```js   * module.exports = class Boot {   *   constructor(app) {   *     this.app = app;   *   }   *   configDidLoad() {   *     doSomething();   *   }   * }   * @since 1.0.0   */  loadCustomApp() {    this[LOAD_BOOT_HOOK]('app');    this.lifecycle.triggerConfigWillLoad();  },  /**   * Load agent.js, same as {@link EggLoader#loadCustomApp}   */  loadCustomAgent() {    this[LOAD_BOOT_HOOK]('agent');    this.lifecycle.triggerConfigWillLoad();  },  // FIXME: no logger used after egg removed  loadBootHook() {    // do nothing  },  [LOAD_BOOT_HOOK](fileName) {    this.timing.start(`Load ${fileName}.js`);    for (const unit of this.getLoadUnits()) {      const bootFilePath = this.resolveModule(path.join(unit.path, fileName));      if (!bootFilePath) {        continue;      }      const bootHook = this.requireFile(bootFilePath);      if (is.class(bootHook)) {        bootHook.prototype.fullPath = bootFilePath;        // if is boot class, add to lifecycle        this.lifecycle.addBootHook(bootHook);      } else if (is.function(bootHook)) {        // if is boot function, wrap to class        // for compatibility        this.lifecycle.addFunctionAsBootHook(bootHook);      } else {        this.options.logger.warn('[egg-loader] %s must exports a boot class', bootFilePath);      }    }    // init boots    this.lifecycle.init();    this.timing.end(`Load ${fileName}.js`);  },};
 |