Code Architecture overview
Actual architecture diagram link: action executor schema
Architecture: 
Every app is a NestJs standalone app It allows us to use dependency injections in order to reuse the same libraries in different apps without including extra libraries (but there could be exceptions).
We don't want to overload our lambda function with code that we doesn't use, so we need to say our module bundler(Webpack) not to include libraries that we don't use. But once we have links in one module to another it will include entire codebase of extra module. So what we can do ?
We can achieve this behaviour creating mapping between Action type and Class
In app responsible for group of action we import ExecutorService and pass as a parameter GroupActionMapping.
Example: we have group of actions called CommonActionMapping. This group includes next actions with their action types: Log (log), Javascript (execute_javascript) and Conditional (conditional). So for each action inside the group action mapping we need to register their classes.
export const CommonActionMapping: ActionTypeToClassMap<CommonActionType> = {
[CommonActionType.EXECUTE_JAVASCRIPT]: ExecuteJavascript,
[CommonActionType.LOG]: Log,
[CommonActionType.DELAY]: Delay,
[CommonActionType.CONDITIONAL]: Conditional,
}
Also one important thing, is how we handle receiving and sending messages from and to sqs queue. Since we can have many different types of application, such as Serverless Lambda Zip/Docker, Fargate etc. The way how we extract message body and getting message can vary. Also it's not the responsibility of ExecutorService to work with sqs queue, so for that purposes was created SqsQueueModule. This module is responsible to work with SQS queue and call ExecutorService in order to execute action and send it's output back to sqs queue.
Important diagram that shows how libs and apps are coupled nx graph.
##TODO: Describe relations between
Action Type - Action Group - SQS-queue Name - NX app name