@bitloops/bl-transpiler
Version:
The one and only Bitloops Language transpiler
458 lines • 39.7 kB
JavaScript
"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