async register()

in packages/core/alfa-core/src/base.tsx [35:87]


  async register<P = {}>(passInConfig: IAppConfig<P>) {
    const logger = new Logger();
    if (!passInConfig) {
      logger.error({ E_CODE: 'RuntimeError', E_MSG: 'cannot find config before start.' });
      return Promise.reject(new Error('[alfa-core] cannot find config before start.'));
    }

    this.config = mergeConfig(passInConfig, logger);

    const { name, version, env } = this.config;

    logger.setContext({
      NAME: name,
      VERSION: version,
      ENV: env,
    });

    const chains: Array<ChainPromise<IAppConfig<P>> | undefined> = [];

    const flattenHookHandlers = (handler: HookHandler<IAppConfig<P>>) => {
      const { fulfilled, rejected } = handler;

      chains.push(fulfilled, rejected);
    };

    // resolve entry from config
    this.beforeResolve.handlers.forEach(flattenHookHandlers);

    // TODO: handle beforeResolve error
    chains.push(this.resolve, undefined);

    // modify resolved config
    this.afterResolve.handlers.forEach(flattenHookHandlers);

    chains.push(this.init, undefined);

    // update props before load
    this.beforeLoad.handlers.forEach(flattenHookHandlers);

    // TODO: handle beforeLoad error
    chains.push(this.load, undefined);

    // modify context after load
    this.afterLoad.handlers.forEach(flattenHookHandlers);

    let promise = Promise.resolve(this.config);

    while (chains.length) {
      promise = promise.then(chains.shift(), chains.shift());
    }

    return promise.catch((e) => { throw e; });
  }