UNPKG

@bitloops/bl-transpiler

Version:
458 lines 39.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SYMBOL_TABLE_TEST_CASES = void 0; /** * Bitloops Language CLI * Copyright (C) 2022 Bitloops S.A. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. * * For further information you can contact legal(at)bitloops.com. */ const SymbolEntry_js_1 = require("../../../../../src/semantic-analysis/type-inference/SymbolEntry.js"); const SymbolTableManager_js_1 = require("../../../../../src/semantic-analysis/type-inference/SymbolTableManager.js"); const types_js_1 = require("../../../../../src/types.js"); const file_js_1 = require("../../../../../src/utils/file.js"); const SymbolTableBuilder_js_1 = require("../../../builder/SymbolTableBuilder.js"); const METADATA_TYPE = '{ context: { jwt: string; userId: string } }'; const CONTEXT_TYPE = '{ jwt: string; userId: string }'; const SCOPE_NAMES = SymbolTableManager_js_1.SymbolTableManager.SCOPE_NAMES; exports.SYMBOL_TABLE_TEST_CASES = [ { description: 'Should create symbol table for command handler', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/command-handler-if.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('WithdrawMoneyCommandHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('WithdrawMoneyCommandHandler')) .insert('this.integrationEventBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('IntegrationEventBusPort')) .insert('this.accountRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('AccountWriteRepoPort')) .insertChildScope('execute', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('command', new SymbolEntry_js_1.ParameterSymbolEntry('WithdrawMoneyCommand')) .insert('command.accountId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.amount', new SymbolEntry_js_1.MemberDotSymbolEntry('int32')) .insert('command.metadata', new SymbolEntry_js_1.MemberDotSymbolEntry(METADATA_TYPE)) .insert('command.metadata.context', new SymbolEntry_js_1.MemberDotSymbolEntry(CONTEXT_TYPE)) .insert('command.metadata.context.jwt', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.metadata.context.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('accountId', 'UUIDv4', true) .insert('this.accountRepo.getById()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(AccountEntity), Errors(UnexpectedError))')) .insert('this.accountRepo.getById().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('AccountEntity')) .insertChildScope('ifError0', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertVariableSymbolEntry('accountEntity', 'AccountEntity', true) .insertChildScope('if0', new SymbolTableBuilder_js_1.SymbolTableBuilder().insertVariableSymbolEntry('result', 'string', true)) .insertVariableSymbolEntry('result', 'string', true) .insert('accountEntity.withdrawAmount()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(void), Errors(DomainErrors.InvalidMonetaryValueError))')) .insert('this.accountRepo.update()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(void), Errors(UnexpectedError))')) .insert('this.accountRepo.update().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('void')) .insertChildScope('ifError1', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('err', new SymbolEntry_js_1.ParameterSymbolEntry('UnexpectedError'))))) .insertChildScope('AccountWriteRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AccountProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('WithdrawMoneyCommand', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AccountEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('AccountEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('AccountProps'))) .insertChildScope('withdrawAmount', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('amount', new SymbolEntry_js_1.ParameterSymbolEntry('int32')))) .build(), }, { description: 'Should create symbol table for command handler with 2 ifs', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/command-handler-two-if.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('WithdrawMoneyCommandHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('WithdrawMoneyCommandHandler')) .insert('this.integrationEventBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('IntegrationEventBusPort')) .insert('this.accountRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('AccountWriteRepoPort')) .insertChildScope('execute', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('command', new SymbolEntry_js_1.ParameterSymbolEntry('WithdrawMoneyCommand')) .insert('command.accountId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.amount', new SymbolEntry_js_1.MemberDotSymbolEntry('int32')) .insert('command.metadata', new SymbolEntry_js_1.MemberDotSymbolEntry(METADATA_TYPE)) .insert('command.metadata.context', new SymbolEntry_js_1.MemberDotSymbolEntry(CONTEXT_TYPE)) .insert('command.metadata.context.jwt', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.metadata.context.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('accountId', 'UUIDv4', true) .insert('this.accountRepo.getById()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(AccountEntity), Errors(UnexpectedError))')) .insert('this.accountRepo.getById().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('AccountEntity')) .insertChildScope('ifError0', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('err', new SymbolEntry_js_1.ParameterSymbolEntry('UnexpectedError'))) .insertVariableSymbolEntry('accountEntity', 'AccountEntity', true) .insertChildScope('if0', new SymbolTableBuilder_js_1.SymbolTableBuilder().insertVariableSymbolEntry('result', 'string', true)) .insertChildScope('if1', new SymbolTableBuilder_js_1.SymbolTableBuilder().insertVariableSymbolEntry('message', 'string', true)) .insertVariableSymbolEntry('result', 'string', true) .insert('accountEntity.withdrawAmount()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(void), Errors(DomainErrors.InvalidMonetaryValueError))')) .insert('this.accountRepo.update()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(void), Errors(UnexpectedError))')) .insert('this.accountRepo.update().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('void')) .insertChildScope('ifError1', new SymbolTableBuilder_js_1.SymbolTableBuilder()))) .insertChildScope('AccountWriteRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AccountProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('WithdrawMoneyCommand', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AccountEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('AccountEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('AccountProps'))) .insertChildScope('withdrawAmount', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('amount', new SymbolEntry_js_1.ParameterSymbolEntry('int32')))) .build(), }, { description: 'Should create symbol table for command handler with switch', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/command-handler-switch.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('WithdrawMoneyCommandHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('WithdrawMoneyCommandHandler')) .insert('this.integrationEventBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('IntegrationEventBusPort')) .insert('this.accountRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('AccountWriteRepoPort')) .insertChildScope('execute', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('command', new SymbolEntry_js_1.ParameterSymbolEntry('WithdrawMoneyCommand')) .insert('command.accountId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.amount', new SymbolEntry_js_1.MemberDotSymbolEntry('int32')) .insert('command.metadata', new SymbolEntry_js_1.MemberDotSymbolEntry(METADATA_TYPE)) .insert('command.metadata.context', new SymbolEntry_js_1.MemberDotSymbolEntry(CONTEXT_TYPE)) .insert('command.metadata.context.jwt', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.metadata.context.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('accountId', 'UUIDv4', true) .insert('this.accountRepo.getById()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(AccountEntity), Errors(UnexpectedError))')) .insert('this.accountRepo.getById().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('AccountEntity')) .insertChildScope('ifError0', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertVariableSymbolEntry('accountEntity', 'AccountEntity', true) .insertChildScope('if0', new SymbolTableBuilder_js_1.SymbolTableBuilder().insertVariableSymbolEntry('result', 'string', true)) .insertVariableSymbolEntry('animal', 'string', true) .insertChildScope('switch0', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('case0', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('default', new SymbolTableBuilder_js_1.SymbolTableBuilder())) .insert('accountEntity.withdrawAmount()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(void), Errors(DomainErrors.InvalidMonetaryValueError))')))) .insertChildScope('AccountWriteRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AccountProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('WithdrawMoneyCommand', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AccountEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('AccountEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('AccountProps'))) .insertChildScope('withdrawAmount', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('amount', new SymbolEntry_js_1.ParameterSymbolEntry('int32')))) .build(), }, { description: 'Should create symbol table for query handler with if/else', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/query-handler-with-else.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('GetAccountQueryHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('GetAccountQueryHandler')) .insert('this.integrationEventBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('IntegrationEventBusPort')) .insert('this.accountRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('AccountReadRepoPort')) .insertChildScope('execute', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('query', new SymbolEntry_js_1.ParameterSymbolEntry('GetAccountQuery')) .insert('query.accountId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('query.metadata', new SymbolEntry_js_1.MemberDotSymbolEntry(METADATA_TYPE)) .insert('query.metadata.context', new SymbolEntry_js_1.MemberDotSymbolEntry(CONTEXT_TYPE)) .insert('query.metadata.context.jwt', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('query.metadata.context.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('requestId', 'string', true) .insert('this.accountRepo.getById()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(AccountReadModel), Errors(UnexpectedError))')) .insertVariableSymbolEntry('account', '(OK(AccountReadModel), Errors(UnexpectedError))', true) .insertChildScope('if0', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('else0', new SymbolTableBuilder_js_1.SymbolTableBuilder()))) .insertChildScope('AccountReadRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('GetAccountQuery', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .build(), }, { description: 'Should create symbol table for entity', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/entity.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('TodoEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('TodoEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('TodoProps')) .insertVariableSymbolEntry('todo', 'TodoEntity', false) .insert('props.id', new SymbolEntry_js_1.MemberDotSymbolEntry('UUIDv4')) .insertVariableSymbolEntry('isNew', 'bool', true) .insertChildScope('if0', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('todo.id', new SymbolEntry_js_1.MemberDotSymbolEntry('UUIDv4')) .insert('todo.id.toString()', new SymbolEntry_js_1.MethodCallSymbolEntry('string')) .insert('todo.title', new SymbolEntry_js_1.MemberDotSymbolEntry('TitleVO')) .insert('todo.title.title', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('todo.completed', new SymbolEntry_js_1.MemberDotSymbolEntry('bool')) .insertVariableSymbolEntry('event', 'TodoAddedDomainEvent', true) .insert('todo.addDomainEvent()', new SymbolEntry_js_1.MethodCallSymbolEntry('void')))) .insertChildScope('complete', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this.completed', new SymbolEntry_js_1.MemberDotSymbolEntry('bool')) .insert('this.id', new SymbolEntry_js_1.MemberDotSymbolEntry('UUIDv4')) .insert('this.id.toString()', new SymbolEntry_js_1.MethodCallSymbolEntry('string')) .insert('this.title', new SymbolEntry_js_1.MemberDotSymbolEntry('TitleVO')) .insert('this.title.title', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('event', 'TodoCompletedDomainEvent', true) .insert('this.addDomainEvent()', new SymbolEntry_js_1.MethodCallSymbolEntry('void'))) .insertChildScope('isCompleted', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this.completed', new SymbolEntry_js_1.MemberDotSymbolEntry('bool')) .insertVariableSymbolEntry('a', 'bool', true))) .insertChildScope('TitleProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('TodoProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('TitleVO', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('TitleVO')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('TitleProps')))) .build(), }, { description: 'Should create symbol table for value object', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/valueObject.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('TitleVO', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('TitleVO')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('props.title', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('TitleProps')))) .insertChildScope('TitleProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .build(), }, { description: 'Should create symbol table for domain event handler', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/domain-event-handler.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('SendEmailAfterMoneyDepositedDomainEventHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('SendEmailAfterMoneyDepositedDomainEventHandler')) .insert('this.commandBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('CommandBusPort')) .insert('this.queryBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('QueryBusPort')) .insert('this.customerService', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('CustomerServicePort')) .insertChildScope('handle', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('event', new SymbolEntry_js_1.ParameterSymbolEntry('DepositsIncrementedDomainEvent')) .insert('event.customerId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('event.amount', new SymbolEntry_js_1.MemberDotSymbolEntry('float')) .insert('event.metadata', new SymbolEntry_js_1.MemberDotSymbolEntry(METADATA_TYPE)) .insert('event.metadata.context', new SymbolEntry_js_1.MemberDotSymbolEntry(CONTEXT_TYPE)) .insert('event.metadata.context.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('event.metadata.context.jwt', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('command', 'SendEmailCommand', true) .insert('this.commandBus.publish()', new SymbolEntry_js_1.MethodCallSymbolEntry('void')))) .insertChildScope('DepositsIncrementedDomainEvent', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .build(), }, { description: 'Should create symbol table for integration event handler', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/integration-event-handler.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('MoneyDepositedIntegrationEventHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('MoneyDepositedIntegrationEventHandler')) .insert('this.commandBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('CommandBusPort')) .insert('this.queryBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('QueryBusPort')) .insertChildScope('handle', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('event', new SymbolEntry_js_1.IntegrationEventParameterSymbolEntry('MoneyDepositedIntegrationEvent', { boundedContext: 'Hello world', module: 'demo', eventVersion: 'v1', })) .insert('event.accountId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insertVariableSymbolEntry('accountId', 'string', true) .insertVariableSymbolEntry('command', 'IncrementDepositsCommand', true) .insert('this.commandBus.publish()', new SymbolEntry_js_1.MethodCallSymbolEntry('void')))) .insertChildScope('IntegrationMoneyDepositedSchemaV1', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('MoneyDepositedIntegrationEvent', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('event', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('MoneyDepositedDomainEvent')) .insertChildScope('v1', new SymbolTableBuilder_js_1.SymbolTableBuilder())) .build(), }, { description: 'Should create symbol table for domain service', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/domain-service.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('MarketingNotificationDomainService', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('MarketingNotificationDomainService')) .insert('this.notificationTemplateRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('NotificationTemplateReadRepoPort')) .insertChildScope('getNotificationTemplateToBeSent', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('user', new SymbolEntry_js_1.ParameterSymbolEntry('UserEntity')) .insertVariableSymbolEntry('emailOrigin', types_js_1.bitloopsPrimitivesObj.string, true) .insertVariableSymbolEntry('notificationTemplate', 'NotificationTemplateReadModel', false) .insert('user.isFirstTodo()', new SymbolEntry_js_1.MethodCallSymbolEntry(types_js_1.bitloopsPrimitivesObj.bool)) .insertChildScope('if0', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this.notificationTemplateRepo.getByType()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(NotificationTemplateReadModel), Errors())')) .insert('this.notificationTemplateRepo.getByType().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('NotificationTemplateReadModel')) .insertChildScope('ifError0', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertVariableSymbolEntry('notificationTemplateResponse', 'NotificationTemplateReadModel', true)) .insertChildScope('else0', new SymbolTableBuilder_js_1.SymbolTableBuilder()))) .insertChildScope('NotificationTemplateReadRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('UserEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('UserEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('UserProps'))) .insertChildScope('isFirstTodo', new SymbolTableBuilder_js_1.SymbolTableBuilder())) .build(), }, { description: 'Should create symbol table for domain rule', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/rule.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('ValidEmailRule', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('email', new SymbolEntry_js_1.ParameterSymbolEntry(types_js_1.bitloopsPrimitivesObj.string)) .insertVariableSymbolEntry('re', types_js_1.bitloopsPrimitivesObj.regex, true) .insert('re.test()', new SymbolEntry_js_1.MethodCallSymbolEntry(types_js_1.bitloopsPrimitivesObj.bool))) .build(), }, { description: 'Should create symbol table for integration event', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/integration-event.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('TodoCompletedIntegrationEvent', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('event', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('TodoCompletedDomainEvent')) .insertChildScope('v1', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertVariableSymbolEntry('todoCompleted', 'IntegrationTodoCompletedSchemaV1', true) .insert('event.aggregateId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('event.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')))) .insertChildScope('TodoCompletedDomainEvent', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .build(), }, { description: 'Should create symbol table for rule with logical operators', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/rule-with-logical-operators.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('ValidNameRule', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('name', new SymbolEntry_js_1.ParameterSymbolEntry(types_js_1.bitloopsPrimitivesObj.string)) .insert('name.length', new SymbolEntry_js_1.MemberDotSymbolEntry(types_js_1.bitloopsPrimitivesObj.int32))) .build(), }, { description: 'Should create symbol table for domain service with 2 methodCalls in a row', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/domain-service-2-method-calls.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('MarketingNotificationDomainService', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('MarketingNotificationDomainService')) .insert('this.notificationTemplateRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('NotificationTemplateReadRepoPort')) .insertChildScope('geEmailToBeSent', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('user', new SymbolEntry_js_1.ParameterSymbolEntry('UserEntity')) .insert('user.getEmail()', new SymbolEntry_js_1.MethodCallSymbolEntry('EmailEntity')) .insert('user.getEmail().getAddress()', new SymbolEntry_js_1.MethodCallSymbolEntry('string')) .insertVariableSymbolEntry('emailOrigin', types_js_1.bitloopsPrimitivesObj.string, true))) .insertChildScope('NotificationTemplateReadRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('UserEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('UserEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('UserProps'))) .insertChildScope('getEmail', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('num', new SymbolEntry_js_1.ParameterSymbolEntry('int32')))) .insertChildScope('EmailEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('EmailEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('EmailProps'))) .insertChildScope('getAddress', new SymbolTableBuilder_js_1.SymbolTableBuilder())) .build(), }, { description: 'Should create symbol table for domain service with 2 methodCalls in a row and left is ifError', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/domain-service-2-method-calls-if-error.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('MarketingNotificationDomainService', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('MarketingNotificationDomainService')) .insert('this.notificationTemplateRepo', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('NotificationTemplateReadRepoPort')) .insertChildScope('geEmailToBeSent', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('user', new SymbolEntry_js_1.ParameterSymbolEntry('UserEntity')) .insert('user.getEmail()', new SymbolEntry_js_1.MethodCallSymbolEntry('(OK(EmailEntity), Errors())')) .insert('user.getEmail().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('EmailEntity')) .insertChildScope('ifError0', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insert('userEmail', new SymbolEntry_js_1.VariableSymbolEntry('EmailEntity', true)) .insert('userEmail.getAddress()', new SymbolEntry_js_1.MethodCallSymbolEntry(types_js_1.bitloopsPrimitivesObj.string)) .insert('emailAddress', new SymbolEntry_js_1.VariableSymbolEntry(types_js_1.bitloopsPrimitivesObj.string, true)))) .insertChildScope('NotificationTemplateReadRepoPort', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('UserEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('UserEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('UserProps'))) .insertChildScope('getEmail', new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('num', new SymbolEntry_js_1.ParameterSymbolEntry('int32')))) .insertChildScope('EmailEntity', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('EmailEntity')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder().insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('EmailProps'))) .insertChildScope('getAddress', new SymbolTableBuilder_js_1.SymbolTableBuilder())) .build(), }, { description: 'Should create symbol table for value object evaluation', inputCore: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/valueObject-evaluation.bl'), inputSetup: file_js_1.FileUtil.readFileString('transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl'), expectedSymbolTable: new SymbolTableBuilder_js_1.SymbolTableBuilder() .insertChildScope('AddTodoCommand', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('TitleVO', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('TitleVO')) .insertChildScope(SCOPE_NAMES.DOMAIN_CREATE, new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('props', new SymbolEntry_js_1.ParameterSymbolEntry('TitleProps')) .insert('props.title', new SymbolEntry_js_1.MemberDotSymbolEntry('string')))) .insertChildScope('TitleProps', new SymbolTableBuilder_js_1.SymbolTableBuilder()) .insertChildScope('AddTodoCommandHandler', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('this', new SymbolEntry_js_1.ClassTypeThisSymbolEntry('AddTodoCommandHandler')) .insert('this.integrationEventBus', new SymbolEntry_js_1.ClassTypeParameterSymbolEntry('IntegrationEventBusPort')) .insertChildScope('execute', new SymbolTableBuilder_js_1.SymbolTableBuilder() .insert('command', new SymbolEntry_js_1.ParameterSymbolEntry('AddTodoCommand')) .insert('command.title', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.metadata', new SymbolEntry_js_1.MemberDotSymbolEntry(METADATA_TYPE)) .insert('command.metadata.context', new SymbolEntry_js_1.MemberDotSymbolEntry(CONTEXT_TYPE)) .insert('command.metadata.context.jwt', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('command.metadata.context.userId', new SymbolEntry_js_1.MemberDotSymbolEntry('string')) .insert('titlevo', new SymbolEntry_js_1.VariableSymbolEntry('TitleVO', true)) .insert('TitleVO.create()', new SymbolEntry_js_1.ValueObjectEvaluationSymbolEntry('(OK(TitleVO), Errors(DomainErrors.TitleOutOfBoundsError))')) .insert('TitleVO.create().ifError()', new SymbolEntry_js_1.MethodCallSymbolEntry('TitleVO')) .insertChildScope('ifError0', new SymbolTableBuilder_js_1.SymbolTableBuilder()))) .build(), }, // { // description: 'Should create symbol table for command handler using static method', // inputCore: FileUtil.readFileString( // 'transpiler/__tests__/end-to-end/semantics/mocks/symbol-table/command-handler-static-method.bl', // ), // inputSetup: FileUtil.readFileString( // 'transpiler/__tests__/end-to-end/semantics/mocks/semantic-errors/setup.bl', // ), // expectedSymbolTable: new SymbolTableBuilder() // .insertChildScope( // 'WithdrawMoneyCommandHandler', // new SymbolTableBuilder() // .insert('this', new ClassTypeThisSymbolEntry('WithdrawMoneyCommandHandler')) // .insert( // 'this.integrationEventBus', // new ClassTypeParameterSymbolEntry('IntegrationEventBusPort'), // ) // .insert('this.accountRepo', new ClassTypeParameterSymbolEntry('AccountWriteRepoPort')) // .insertChildScope( // 'execute', // new SymbolTableBuilder() // .insert('command', new ParameterSymbolEntry('WithdrawMoneyCommand')) // .insert('command.accountId', new MemberDotSymbolEntry('string')) // .insert('command.amount', new MemberDotSymbolEntry('int32')) // .insert('command.metadata', new MemberDotSymbolEntry(METADATA_TYPE)) // .insert('command.metadata.context', new MemberDotSymbolEntry(CONTEXT_TYPE)) // .insert('command.metadata.context.jwt', new MemberDotSymbolEntry('string')) // .insert('command.metadata.context.userId', new MemberDotSymbolEntry('string')) // .insertVariableSymbolEntry('accountEntity', 'AccountEntity', true), // ), // ) // .insertChildScope('AccountWriteRepoPort', new SymbolTableBuilder()) // .insertChildScope('AccountProps', new SymbolTableBuilder()) // .insertChildScope('WithdrawMoneyCommand', new SymbolTableBuilder()) // .insertChildScope( // 'AccountEntity', // new SymbolTableBuilder() // .insert('this', new ClassTypeThisSymbolEntry('AccountEntity')) // .insertChildScope( // SCOPE_NAMES.DOMAIN_CREATE, // new SymbolTableBuilder().insert('props', new ParameterSymbolEntry('AccountProps')), // ) // .insertChildScope( // 'withdrawAmount', // new SymbolTableBuilder().insert('amount', new ParameterSymbolEntry('int32')), // ), // ) // .build(), // }, ]; //# sourceMappingURL=symbol-table.js.map