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; });
}