UNPKG

@bitloops/bl-transpiler

Version:
102 lines 5.43 kB
import { BitloopsTypesMapping } from '../../../helpers/mappings.js'; import { ReturnOKErrorNodeTransformer } from './node-transformers/ReturnOkErrorNodeTransformer.js'; import { DomainEventHandlerNodeTransformer } from './node-transformers/DomainEventHandlerNodeTransformer.js'; import { IntegrationEventHandlerNodeTransformer } from './node-transformers/IntegrationEventHandlerNodeTransformer.js'; import { IntegrationEventNodeTransformer } from './node-transformers/IntegrationEventNodeTransformer.js'; import { ExecuteNodeTransformer } from './node-transformers/ExecuteNodeTransformer.js'; import { RepoPortNodeTransformer } from './node-transformers/RepoPortNodeTransformer.js'; import { ServicePortNodeTransformer } from './node-transformers/ServicePortNodeTransformer.js'; import { DomainServiceNodeTransformer } from './node-transformers/DomainServiceNodeTransformer.js'; import { IfErrorExpressionNodeTransformer } from './node-transformers/IfErrorExpressionNodeTransformer.js'; export class IntermediateASTToCompletedIntermediateASTTransformer { complete(intermediateAST) { const boundedContexts = this.completeCore(intermediateAST.core); const intermediateASTSetup = intermediateAST.setup; return { core: boundedContexts, setup: intermediateASTSetup, }; } completeCore(core) { let boundedContexts = {}; for (const [boundedContextName, boundedContext] of Object.entries(core)) { for (const [moduleName, ASTTree] of Object.entries(boundedContext)) { const treeUpdated = ASTTree.copy(); // TODO implement copy method const rootNode = treeUpdated.getRootNode(); treeUpdated.traverse(rootNode, (node) => { const transformer = this.getNodeTransformer({ intermediateASTNode: node, intermediateASTTree: treeUpdated, }); if (transformer) { transformer.run(); } }); treeUpdated.buildValueRecursiveBottomUp(rootNode); // Uncomment to validate parent refs and prevent bugs from model-to-model transformations // treeUpdated.validateParentRefs(); if (!boundedContexts) { boundedContexts = { [boundedContextName]: { [moduleName]: treeUpdated, }, }; } else if (!boundedContexts[boundedContextName]) { boundedContexts[boundedContextName] = { [moduleName]: treeUpdated, }; } else if (!boundedContexts[boundedContextName][moduleName]) { boundedContexts[boundedContextName][moduleName] = treeUpdated; } } } return boundedContexts; } getNodeTransformer(factoryParams) { const { intermediateASTNode, intermediateASTTree } = factoryParams; const type = intermediateASTNode.getNodeType(); switch (type) { case BitloopsTypesMapping.TIfErrorExpression: { const ifErrorExpressionNode = intermediateASTNode; return new IfErrorExpressionNodeTransformer(intermediateASTTree, ifErrorExpressionNode); } case BitloopsTypesMapping.TOkErrorReturnType: { const returnOkErrorNode = intermediateASTNode; return new ReturnOKErrorNodeTransformer(intermediateASTTree, returnOkErrorNode); } case BitloopsTypesMapping.TDomainEventHandler: { const domainEventHandlerNode = intermediateASTNode; return new DomainEventHandlerNodeTransformer(intermediateASTTree, domainEventHandlerNode); } case BitloopsTypesMapping.TIntegrationEventHandler: { const integrationEventHandlerNode = intermediateASTNode; return new IntegrationEventHandlerNodeTransformer(intermediateASTTree, integrationEventHandlerNode); } case BitloopsTypesMapping.TIntegrationEvent: { const integrationEventNode = intermediateASTNode; return new IntegrationEventNodeTransformer(intermediateASTTree, integrationEventNode); } case BitloopsTypesMapping.TExecute: { const executeNode = intermediateASTNode; return new ExecuteNodeTransformer(intermediateASTTree, executeNode); } case BitloopsTypesMapping.TRepoPort: { const repoPortNode = intermediateASTNode; return new RepoPortNodeTransformer(intermediateASTTree, repoPortNode); } case BitloopsTypesMapping.TServicePort: { const servicePortNode = intermediateASTNode; return new ServicePortNodeTransformer(intermediateASTTree, servicePortNode); } case BitloopsTypesMapping.TDomainService: { const servicePortNode = intermediateASTNode; return new DomainServiceNodeTransformer(intermediateASTTree, servicePortNode); } default: return null; } } } //# sourceMappingURL=IntermediateASTToAST.js.map