# metadata

key: ignoredPaths
value:
["node_modules",".git","dist","build",".next","vendor",".codegraph/cache",".gradle","generated",".idea","out","captures"]


# edges

type: exports
source: file:src/discord/events/guildMemberUpdate.test.ts
target: symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService
evidence: FakeService
id:
exports:file:src/discord/events/guildMemberUpdate.test.ts->symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService


type: exports
source: file:src/discord/events/guildMemberUpdate.test.ts
target: symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost
evidence: removeRoleForLostBoost
id:
exports:file:src/discord/events/guildMemberUpdate.test.ts->symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost


type: exports
source: file:src/discord/events/guildMemberUpdate.test.ts
target: symbol:src/discord/events/guildMemberUpdate.test.ts:member
evidence: member
id:
exports:file:src/discord/events/guildMemberUpdate.test.ts->symbol:src/discord/events/guildMemberUpdate.test.ts:member


type: exports
source: file:src/discord/events/guildMemberUpdate.ts
target: symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate
evidence: handleGuildMemberUpdate
id:
exports:file:src/discord/events/guildMemberUpdate.ts->symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeInteraction
evidence: FakeInteraction
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeInteraction


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand
evidence: isChatInputCommand
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply
evidence: reply
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeService
evidence: FakeService
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole
evidence: claimRole
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole
evidence: renameRole
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole
evidence: recolorRole
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon
evidence: setRoleIcon
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon


type: exports
source: file:src/discord/interactionHandler.test.ts
target: symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole
evidence: deleteRole
id:
exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:handleInteraction
evidence: handleInteraction
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:handleInteraction


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:toUserErrorMessage
evidence: toUserErrorMessage
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:toUserErrorMessage


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:requireGuildId
evidence: requireGuildId
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireGuildId


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:requireString
evidence: requireString
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireString


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:requireUser
evidence: requireUser
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireUser


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:requireAdministrator
evidence: requireAdministrator
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireAdministrator


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:requireIcon
evidence: requireIcon
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireIcon


type: exports
source: file:src/discord/interactionHandler.ts
target: symbol:src/discord/interactionHandler.ts:optionalIcon
evidence: optionalIcon
id:
exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:optionalIcon


type: exports
source: file:src/discord/registerCommands.test.ts
target: symbol:src/discord/registerCommands.test.ts:FakeRestClient
evidence: FakeRestClient
id:
exports:file:src/discord/registerCommands.test.ts->symbol:src/discord/registerCommands.test.ts:FakeRestClient


type: exports
source: file:src/discord/registerCommands.test.ts
target: symbol:src/discord/registerCommands.test.ts:FakeRestClient.put
evidence: put
id:
exports:file:src/discord/registerCommands.test.ts->symbol:src/discord/registerCommands.test.ts:FakeRestClient.put


type: exports
source: file:src/discord/registerCommands.ts
target: symbol:src/discord/registerCommands.ts:registerGuildCommands
evidence: registerGuildCommands
id:
exports:file:src/discord/registerCommands.ts->symbol:src/discord/registerCommands.ts:registerGuildCommands


type: exports
source: file:src/discord/registerCommands.ts
target: symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken
evidence: registerGuildCommandsWithToken
id:
exports:file:src/discord/registerCommands.ts->symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken


type: exports
source: file:src/domain/boostEligibility.ts
target: symbol:src/domain/boostEligibility.ts:assertBoostEligibility
evidence: assertBoostEligibility
id:
exports:file:src/domain/boostEligibility.ts->symbol:src/domain/boostEligibility.ts:assertBoostEligibility


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore
evidence: MemoryRoleStore
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser
evidence: findByUser
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create
evidence: create
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete
evidence: delete
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore
evidence: FailingCreateRoleStore
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create
evidence: create
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository
evidence: FakeRoleRepository
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles
evidence: listRoles
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole
evidence: createRole
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole
evidence: updateRole
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole
evidence: assignRole
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole
evidence: removeRole
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole


type: exports
source: file:src/services/boosterRoleService.test.ts
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole
evidence: deleteRole
id:
exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService
evidence: BoosterRoleService
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
evidence: claimRole
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
evidence: renameRole
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole
evidence: recolorRole
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon
evidence: setRoleIcon
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
evidence: deleteRole
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
evidence: removeRoleForLostBoost
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
evidence: rollbackClaim
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon
evidence: validateRoleIcon
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
evidence: getUserRecord
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord


type: exports
source: file:src/services/boosterRoleService.ts
target: symbol:src/services/boosterRoleService.ts:ignoreRollbackError
evidence: ignoreRollbackError
id:
exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:ignoreRollbackError


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository
evidence: DiscordRoleRepository
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles
evidence: listRoles
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
evidence: createRole
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
evidence: updateRole
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole
evidence: assignRole
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole
evidence: removeRole
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
evidence: deleteRole
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition
evidence: resolvePosition
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole
evidence: fetchRole
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole


type: exports
source: file:src/services/discordRoleRepository.ts
target: symbol:src/services/discordRoleRepository.ts:toDiscordColors
evidence: toDiscordColors
id:
exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:toDiscordColors


type: exports
source: file:src/services/drizzleBoosterRoleStore.ts
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore
evidence: DrizzleBoosterRoleStore
id:
exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore


type: exports
source: file:src/services/drizzleBoosterRoleStore.ts
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser
evidence: findByUser
id:
exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser


type: exports
source: file:src/services/drizzleBoosterRoleStore.ts
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create
evidence: create
id:
exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create


type: exports
source: file:src/services/drizzleBoosterRoleStore.ts
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete
evidence: delete
id:
exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete


type: depends-on
source: file:src/discord/events/guildMemberUpdate.test.ts
target: file:src/discord/events/guildMemberUpdate.ts
evidence: ./guildMemberUpdate
id:
depends-on:file:src/discord/events/guildMemberUpdate.test.ts->file:src/discord/events/guildMemberUpdate.ts


type: calls
source: symbol:src/discord/bot.ts:attachBotHandlers
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore
evidence: DrizzleBoosterRoleStore
resolution: unique-name
candidates: ["symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore"]
id:
calls:symbol:src/discord/bot.ts:attachBotHandlers->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore


type: calls
source: symbol:src/discord/bot.ts:attachBotHandlers
target: symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand
evidence: isChatInputCommand
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand"]
id:
calls:symbol:src/discord/bot.ts:attachBotHandlers->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand


type: calls
source: symbol:src/discord/bot.ts:attachBotHandlers
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService
evidence: BoosterRoleService
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService"]
id:
calls:symbol:src/discord/bot.ts:attachBotHandlers->symbol:src/services/boosterRoleService.ts:BoosterRoleService


type: calls
source: symbol:src/discord/bot.ts:attachBotHandlers
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository
evidence: DiscordRoleRepository
resolution: unique-name
candidates: ["symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository"]
id:
calls:symbol:src/discord/bot.ts:attachBotHandlers->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository


type: calls
source: symbol:src/discord/bot.ts:attachBotHandlers
target: symbol:src/discord/interactionHandler.ts:handleInteraction
evidence: handleInteraction
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:handleInteraction"]
id:
calls:symbol:src/discord/bot.ts:attachBotHandlers->symbol:src/discord/interactionHandler.ts:handleInteraction


type: calls
source: symbol:src/discord/bot.ts:attachBotHandlers
target: symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate
evidence: handleGuildMemberUpdate
resolution: unique-name
candidates: ["symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate"]
id:
calls:symbol:src/discord/bot.ts:attachBotHandlers->symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate


type: calls
source: symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate
target: symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost
evidence: removeRoleForLostBoost
resolution: ambiguous-name
id:
calls:symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate->symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost

candidates:
["symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost","symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost"]


type: calls
source: symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
evidence: removeRoleForLostBoost
resolution: ambiguous-name
id:
calls:symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate->symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost

candidates:
["symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost","symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand
evidence: isChatInputCommand
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:requireGuildId
evidence: requireGuildId
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:requireGuildId"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:requireGuildId


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole
evidence: claimRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
evidence: claimRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:requireString
evidence: requireString
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:requireString"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:requireString


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:optionalIcon
evidence: optionalIcon
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:optionalIcon"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:optionalIcon


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply
evidence: reply
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole
evidence: renameRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
evidence: renameRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole
evidence: recolorRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole
evidence: recolorRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon
evidence: setRoleIcon
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon","symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon
evidence: setRoleIcon
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon","symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:requireIcon
evidence: requireIcon
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:requireIcon"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:requireIcon


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole","symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole","symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole

candidates:
["symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole","symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole","symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole"]


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:requireAdministrator
evidence: requireAdministrator
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:requireAdministrator"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:requireAdministrator


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:requireUser
evidence: requireUser
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:requireUser"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:requireUser


type: calls
source: symbol:src/discord/interactionHandler.ts:handleInteraction
target: symbol:src/discord/interactionHandler.ts:toUserErrorMessage
evidence: toUserErrorMessage
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:toUserErrorMessage"]
id:
calls:symbol:src/discord/interactionHandler.ts:handleInteraction->symbol:src/discord/interactionHandler.ts:toUserErrorMessage


type: calls
source: symbol:src/discord/interactionHandler.ts:requireIcon
target: symbol:src/discord/interactionHandler.ts:optionalIcon
evidence: optionalIcon
resolution: unique-name
candidates: ["symbol:src/discord/interactionHandler.ts:optionalIcon"]
id:
calls:symbol:src/discord/interactionHandler.ts:requireIcon->symbol:src/discord/interactionHandler.ts:optionalIcon


type: calls
source: symbol:src/discord/registerCommands.ts:registerGuildCommands
target: symbol:src/discord/registerCommands.test.ts:FakeRestClient.put
evidence: put
resolution: unique-name
candidates: ["symbol:src/discord/registerCommands.test.ts:FakeRestClient.put"]
id:
calls:symbol:src/discord/registerCommands.ts:registerGuildCommands->symbol:src/discord/registerCommands.test.ts:FakeRestClient.put


type: calls
source: symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken
target: symbol:src/discord/registerCommands.ts:registerGuildCommands
evidence: registerGuildCommands
resolution: unique-name
candidates: ["symbol:src/discord/registerCommands.ts:registerGuildCommands"]
id:
calls:symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken->symbol:src/discord/registerCommands.ts:registerGuildCommands


type: calls
source: symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable
target: symbol:src/domain/roleGuards.ts:normalizeName
evidence: normalizeName
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:normalizeName"]
id:
calls:symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable->symbol:src/domain/roleGuards.ts:normalizeName


type: calls
source: symbol:src/domain/roleGuards.ts:validateRoleName
target: symbol:src/domain/roleGuards.ts:normalizeName
evidence: normalizeName
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:normalizeName"]
id:
calls:symbol:src/domain/roleGuards.ts:validateRoleName->symbol:src/domain/roleGuards.ts:normalizeName


type: calls
source: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete"]


type: calls
source: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete"]


type: extends
source: symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore
evidence: MemoryRoleStore
id:
extends:symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/domain/boostEligibility.ts:assertBoostEligibility
evidence: assertBoostEligibility
resolution: unique-name
candidates: ["symbol:src/domain/boostEligibility.ts:assertBoostEligibility"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/domain/boostEligibility.ts:assertBoostEligibility


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser
evidence: findByUser
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser
evidence: findByUser
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/domain/roleGuards.ts:validateRoleName
evidence: validateRoleName
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:validateRoleName"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/domain/roleGuards.ts:validateRoleName


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/domain/roleGuards.ts:normalizeHexColor
evidence: normalizeHexColor
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:normalizeHexColor"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/domain/roleGuards.ts:normalizeHexColor


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable
evidence: assertRoleNameIsAvailable
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles
evidence: listRoles
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles
evidence: listRoles
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/domain/roleGuards.ts:assertRolePositionIsSafe
evidence: assertRolePositionIsSafe
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:assertRolePositionIsSafe"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/domain/roleGuards.ts:assertRolePositionIsSafe


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole
evidence: createRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
evidence: createRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon
evidence: validateRoleIcon
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole
evidence: assignRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole
evidence: assignRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create
evidence: create
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create","symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create
evidence: create
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create","symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create
evidence: create
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create","symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
evidence: rollbackClaim
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole->symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
evidence: getUserRecord
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/domain/roleGuards.ts:validateRoleName
evidence: validateRoleName
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:validateRoleName"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/domain/roleGuards.ts:validateRoleName


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable
evidence: assertRoleNameIsAvailable
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles
evidence: listRoles
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles
evidence: listRoles
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
evidence: getUserRecord
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole->symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole
target: symbol:src/domain/roleGuards.ts:normalizeHexColor
evidence: normalizeHexColor
resolution: unique-name
candidates: ["symbol:src/domain/roleGuards.ts:normalizeHexColor"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole->symbol:src/domain/roleGuards.ts:normalizeHexColor


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
evidence: getUserRecord
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon->symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon
evidence: validateRoleIcon
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon->symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
evidence: updateRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
evidence: getUserRecord
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole->symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser
evidence: findByUser
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser

candidates:
["symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser","symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser
evidence: findByUser
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/boosterRoleService.ts:ignoreRollbackError
evidence: ignoreRollbackError
resolution: unique-name
candidates: ["symbol:src/services/boosterRoleService.ts:ignoreRollbackError"]
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/boosterRoleService.ts:ignoreRollbackError


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole
evidence: removeRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole
evidence: removeRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole

candidates:
["symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole","symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole"]


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
evidence: deleteRole
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser
evidence: findByUser
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser


type: calls
source: symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser
evidence: findByUser
resolution: ambiguous-name
id:
calls:symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create
evidence: create
resolution: ambiguous-name
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
target: symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create
evidence: create
resolution: ambiguous-name
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole->symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create
evidence: create
resolution: ambiguous-name
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
target: symbol:src/services/discordRoleRepository.ts:toDiscordColors
evidence: toDiscordColors
resolution: unique-name
candidates: ["symbol:src/services/discordRoleRepository.ts:toDiscordColors"]
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole->symbol:src/services/discordRoleRepository.ts:toDiscordColors


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition
evidence: resolvePosition
resolution: unique-name
candidates: ["symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition"]
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole
evidence: fetchRole
resolution: unique-name
candidates: ["symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole"]
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole
target: symbol:src/services/discordRoleRepository.ts:toDiscordColors
evidence: toDiscordColors
resolution: unique-name
candidates: ["symbol:src/services/discordRoleRepository.ts:toDiscordColors"]
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole->symbol:src/services/discordRoleRepository.ts:toDiscordColors


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
target: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole
evidence: fetchRole
resolution: unique-name
candidates: ["symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole"]
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
target: symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete


type: calls
source: symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole
target: symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete
evidence: delete
resolution: ambiguous-name
id:
calls:symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete


# scan_cache

path: drizzle.config.ts
hash: 1d8eadf163d27fe85c9a2b8a6421eeca6c0244f6c93a8048dcad658ccbe6c00a
language: typescript
scannerVersion: 3
importMapEntries: [["defineConfig","drizzle-kit"]]
nodes:
[{"id":"file:drizzle.config.ts","type":"file","name":"drizzle.config.ts","path":"drizzle.config.ts","language":"typescript"},{"id":"module:drizzle-kit","type":"module","name":"drizzle-kit","path":"drizzle-kit"}]

localEdges:
[{"id":"imports:file:drizzle.config.ts->module:drizzle-kit","type":"imports","source":"file:drizzle.config.ts","target":"module:drizzle-kit","evidence":"drizzle-kit"}]


path: src/config/index.ts
hash: 76a4b85dad2cefdab92a0930bce60403b384841a40706b78aa427273846fc210
language: typescript
scannerVersion: 3
importMapEntries: []
nodes:
[{"id":"file:src/config/index.ts","type":"file","name":"index.ts","path":"src/config/index.ts","language":"typescript"},{"id":"symbol:src/config/index.ts:loadConfig","type":"function","name":"loadConfig","path":"src/config/index.ts","language":"typescript","line":10,"startLine":10,"endLine":19},{"id":"symbol:src/config/index.ts:requireEnv","type":"function","name":"requireEnv","path":"src/config/index.ts","language":"typescript","line":21,"startLine":21,"endLine":27}]

localEdges:
[{"id":"exports:file:src/config/index.ts->symbol:src/config/index.ts:loadConfig","type":"exports","source":"file:src/config/index.ts","target":"symbol:src/config/index.ts:loadConfig","evidence":"loadConfig"},{"id":"exports:file:src/config/index.ts->symbol:src/config/index.ts:requireEnv","type":"exports","source":"file:src/config/index.ts","target":"symbol:src/config/index.ts:requireEnv","evidence":"requireEnv"}]


path: src/config/permissions.ts
hash: ce5874fb76928927fa0ea9c27eaed271fbc6e830c42adeea2318549847fed5be
language: typescript
scannerVersion: 3
localEdges: []
importMapEntries: []
nodes:
[{"id":"file:src/config/permissions.ts","type":"file","name":"permissions.ts","path":"src/config/permissions.ts","language":"typescript"}]


path: src/db/index.ts
hash: 604988f16fe6f47de551f6d63dadbc4a9eeb280540856701a59ef2a3b6c5651b
language: typescript
scannerVersion: 3
importMapEntries: [["drizzle","drizzle-orm/postgres-js"],["schema","./schema"]]
nodes:
[{"id":"file:src/db/index.ts","type":"file","name":"index.ts","path":"src/db/index.ts","language":"typescript"},{"id":"symbol:src/db/index.ts:createDb","type":"function","name":"createDb","path":"src/db/index.ts","language":"typescript","line":5,"startLine":5,"endLine":8},{"id":"module:drizzle-orm/postgres-js","type":"module","name":"drizzle-orm/postgres-js","path":"drizzle-orm/postgres-js"},{"id":"module:postgres","type":"module","name":"postgres","path":"postgres"},{"id":"module:./schema","type":"module","name":"./schema","path":"./schema"}]

localEdges:
[{"id":"exports:file:src/db/index.ts->symbol:src/db/index.ts:createDb","type":"exports","source":"file:src/db/index.ts","target":"symbol:src/db/index.ts:createDb","evidence":"createDb"},{"id":"imports:file:src/db/index.ts->module:drizzle-orm/postgres-js","type":"imports","source":"file:src/db/index.ts","target":"module:drizzle-orm/postgres-js","evidence":"drizzle-orm/postgres-js"},{"id":"imports:file:src/db/index.ts->module:postgres","type":"imports","source":"file:src/db/index.ts","target":"module:postgres","evidence":"postgres"},{"id":"imports:file:src/db/index.ts->module:./schema","type":"imports","source":"file:src/db/index.ts","target":"module:./schema","evidence":"./schema"}]


path: src/db/schema.ts
hash: f7371559dcbcabe1d31dafd89e2742be7b97638448791190f8a75f2c8d00679e
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/db/schema.ts","type":"file","name":"schema.ts","path":"src/db/schema.ts","language":"typescript"},{"id":"module:drizzle-orm/pg-core","type":"module","name":"drizzle-orm/pg-core","path":"drizzle-orm/pg-core"}]

localEdges:
[{"id":"imports:file:src/db/schema.ts->module:drizzle-orm/pg-core","type":"imports","source":"file:src/db/schema.ts","target":"module:drizzle-orm/pg-core","evidence":"drizzle-orm/pg-core"}]

importMapEntries:
[["bigint","drizzle-orm/pg-core"],["pgTable","drizzle-orm/pg-core"],["text","drizzle-orm/pg-core"],["uniqueIndex","drizzle-orm/pg-core"]]


path: src/discord/bot.ts
hash: 1616d22a8542166af54856afdcb73325c999aee2341bc7aaf6d0688de2617b63
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/discord/bot.ts","type":"file","name":"bot.ts","path":"src/discord/bot.ts","language":"typescript"},{"id":"symbol:src/discord/bot.ts:attachBotHandlers","type":"function","name":"attachBotHandlers","path":"src/discord/bot.ts","language":"typescript","line":10,"startLine":10,"endLine":37},{"id":"symbol:src/discord/bot.ts:memberHasRole","type":"function","name":"memberHasRole","path":"src/discord/bot.ts","language":"typescript","line":39,"startLine":39,"endLine":53},{"id":"symbol:src/discord/bot.ts:resolveAnchorPosition","type":"function","name":"resolveAnchorPosition","path":"src/discord/bot.ts","language":"typescript","line":55,"startLine":55,"endLine":55},{"id":"symbol:src/discord/bot.ts:botRolePosition","type":"function","name":"botRolePosition","path":"src/discord/bot.ts","language":"typescript","line":62,"startLine":62,"endLine":62},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"},{"id":"module:../config","type":"module","name":"../config","path":"../config"},{"id":"module:../db","type":"module","name":"../db","path":"../db"},{"id":"module:../services/boosterRoleService","type":"module","name":"../services/boosterRoleService","path":"../services/boosterRoleService"},{"id":"module:../services/drizzleBoosterRoleStore","type":"module","name":"../services/drizzleBoosterRoleStore","path":"../services/drizzleBoosterRoleStore"},{"id":"module:../services/discordRoleRepository","type":"module","name":"../services/discordRoleRepository","path":"../services/discordRoleRepository"},{"id":"module:./events/guildMemberUpdate","type":"module","name":"./events/guildMemberUpdate","path":"./events/guildMemberUpdate"},{"id":"module:./interactionHandler","type":"module","name":"./interactionHandler","path":"./interactionHandler"}]

localEdges:
[{"id":"exports:file:src/discord/bot.ts->symbol:src/discord/bot.ts:attachBotHandlers","type":"exports","source":"file:src/discord/bot.ts","target":"symbol:src/discord/bot.ts:attachBotHandlers","evidence":"attachBotHandlers"},{"id":"exports:file:src/discord/bot.ts->symbol:src/discord/bot.ts:memberHasRole","type":"exports","source":"file:src/discord/bot.ts","target":"symbol:src/discord/bot.ts:memberHasRole","evidence":"memberHasRole"},{"id":"exports:file:src/discord/bot.ts->symbol:src/discord/bot.ts:resolveAnchorPosition","type":"exports","source":"file:src/discord/bot.ts","target":"symbol:src/discord/bot.ts:resolveAnchorPosition","evidence":"resolveAnchorPosition"},{"id":"exports:file:src/discord/bot.ts->symbol:src/discord/bot.ts:botRolePosition","type":"exports","source":"file:src/discord/bot.ts","target":"symbol:src/discord/bot.ts:botRolePosition","evidence":"botRolePosition"},{"id":"imports:file:src/discord/bot.ts->module:discord.js","type":"imports","source":"file:src/discord/bot.ts","target":"module:discord.js","evidence":"discord.js"},{"id":"imports:file:src/discord/bot.ts->module:../config","type":"imports","source":"file:src/discord/bot.ts","target":"module:../config","evidence":"../config"},{"id":"imports:file:src/discord/bot.ts->module:../db","type":"imports","source":"file:src/discord/bot.ts","target":"module:../db","evidence":"../db"},{"id":"imports:file:src/discord/bot.ts->module:../services/boosterRoleService","type":"imports","source":"file:src/discord/bot.ts","target":"module:../services/boosterRoleService","evidence":"../services/boosterRoleService"},{"id":"imports:file:src/discord/bot.ts->module:../services/drizzleBoosterRoleStore","type":"imports","source":"file:src/discord/bot.ts","target":"module:../services/drizzleBoosterRoleStore","evidence":"../services/drizzleBoosterRoleStore"},{"id":"imports:file:src/discord/bot.ts->module:../services/discordRoleRepository","type":"imports","source":"file:src/discord/bot.ts","target":"module:../services/discordRoleRepository","evidence":"../services/discordRoleRepository"},{"id":"imports:file:src/discord/bot.ts->module:./events/guildMemberUpdate","type":"imports","source":"file:src/discord/bot.ts","target":"module:./events/guildMemberUpdate","evidence":"./events/guildMemberUpdate"},{"id":"imports:file:src/discord/bot.ts->module:./interactionHandler","type":"imports","source":"file:src/discord/bot.ts","target":"module:./interactionHandler","evidence":"./interactionHandler"}]

importMapEntries:
[["Client","discord.js"],["AppConfig","../config"],["createDb","../db"],["BoosterRoleService","../services/boosterRoleService"],["DrizzleBoosterRoleStore","../services/drizzleBoosterRoleStore"],["DiscordRoleRepository","../services/discordRoleRepository"],["handleGuildMemberUpdate","./events/guildMemberUpdate"],["handleInteraction","./interactionHandler"]]


path: src/discord/client.ts
hash: af2f63abd0cce0430cec1f87d5890388eb29dce7c1a5ab52dede7e5065212193
language: typescript
scannerVersion: 3
importMapEntries: [["Client","discord.js"],["GatewayIntentBits","discord.js"]]
nodes:
[{"id":"file:src/discord/client.ts","type":"file","name":"client.ts","path":"src/discord/client.ts","language":"typescript"},{"id":"symbol:src/discord/client.ts:createDiscordClient","type":"function","name":"createDiscordClient","path":"src/discord/client.ts","language":"typescript","line":3,"startLine":3,"endLine":7},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"}]

localEdges:
[{"id":"exports:file:src/discord/client.ts->symbol:src/discord/client.ts:createDiscordClient","type":"exports","source":"file:src/discord/client.ts","target":"symbol:src/discord/client.ts:createDiscordClient","evidence":"createDiscordClient"},{"id":"imports:file:src/discord/client.ts->module:discord.js","type":"imports","source":"file:src/discord/client.ts","target":"module:discord.js","evidence":"discord.js"}]


path: src/discord/commands/booster-role.ts
hash: bbfaa26ffb2dfc568107cefc36d54eeea4ff3bd711fee34b91d0b75abde4cdf9
language: typescript
scannerVersion: 3
importMapEntries: [["SlashCommandBuilder","discord.js"]]
nodes:
[{"id":"file:src/discord/commands/booster-role.ts","type":"file","name":"booster-role.ts","path":"src/discord/commands/booster-role.ts","language":"typescript"},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"}]

localEdges:
[{"id":"imports:file:src/discord/commands/booster-role.ts->module:discord.js","type":"imports","source":"file:src/discord/commands/booster-role.ts","target":"module:discord.js","evidence":"discord.js"}]


path: src/discord/events/guildMemberUpdate.test.ts
hash: 63fa308091936d3628750b3af8e6f84b9c5c36447c8fdda2d1bd688fb25e0893
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/discord/events/guildMemberUpdate.test.ts","type":"file","name":"guildMemberUpdate.test.ts","path":"src/discord/events/guildMemberUpdate.test.ts","language":"typescript"},{"id":"symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService","type":"class","name":"FakeService","path":"src/discord/events/guildMemberUpdate.test.ts","language":"typescript","line":4,"startLine":4,"endLine":10},{"id":"symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost","type":"method","name":"removeRoleForLostBoost","path":"src/discord/events/guildMemberUpdate.test.ts","startLine":7,"endLine":9},{"id":"symbol:src/discord/events/guildMemberUpdate.test.ts:member","type":"function","name":"member","path":"src/discord/events/guildMemberUpdate.test.ts","language":"typescript","line":12,"startLine":12,"endLine":18},{"id":"module:bun:test","type":"module","name":"bun:test","path":"bun:test"},{"id":"module:./guildMemberUpdate","type":"module","name":"./guildMemberUpdate","path":"./guildMemberUpdate"}]

localEdges:
[{"id":"exports:file:src/discord/events/guildMemberUpdate.test.ts->symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService","type":"exports","source":"file:src/discord/events/guildMemberUpdate.test.ts","target":"symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService","evidence":"FakeService"},{"id":"exports:file:src/discord/events/guildMemberUpdate.test.ts->symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost","type":"exports","source":"file:src/discord/events/guildMemberUpdate.test.ts","target":"symbol:src/discord/events/guildMemberUpdate.test.ts:FakeService.removeRoleForLostBoost","evidence":"removeRoleForLostBoost"},{"id":"exports:file:src/discord/events/guildMemberUpdate.test.ts->symbol:src/discord/events/guildMemberUpdate.test.ts:member","type":"exports","source":"file:src/discord/events/guildMemberUpdate.test.ts","target":"symbol:src/discord/events/guildMemberUpdate.test.ts:member","evidence":"member"},{"id":"imports:file:src/discord/events/guildMemberUpdate.test.ts->module:bun:test","type":"imports","source":"file:src/discord/events/guildMemberUpdate.test.ts","target":"module:bun:test","evidence":"bun:test"},{"id":"imports:file:src/discord/events/guildMemberUpdate.test.ts->module:./guildMemberUpdate","type":"imports","source":"file:src/discord/events/guildMemberUpdate.test.ts","target":"module:./guildMemberUpdate","evidence":"./guildMemberUpdate"}]

importMapEntries:
[["describe","bun:test"],["expect","bun:test"],["test","bun:test"],["handleGuildMemberUpdate","./guildMemberUpdate"]]


path: src/discord/events/guildMemberUpdate.ts
hash: 7086911d5a6848135f58be3f6d45aae530a693e0293eb7b571f8868da76c6cd4
language: typescript
scannerVersion: 3
importMapEntries: []
nodes:
[{"id":"file:src/discord/events/guildMemberUpdate.ts","type":"file","name":"guildMemberUpdate.ts","path":"src/discord/events/guildMemberUpdate.ts","language":"typescript"},{"id":"symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate","type":"function","name":"handleGuildMemberUpdate","path":"src/discord/events/guildMemberUpdate.ts","language":"typescript","line":11,"startLine":16,"endLine":23}]

localEdges:
[{"id":"exports:file:src/discord/events/guildMemberUpdate.ts->symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate","type":"exports","source":"file:src/discord/events/guildMemberUpdate.ts","target":"symbol:src/discord/events/guildMemberUpdate.ts:handleGuildMemberUpdate","evidence":"handleGuildMemberUpdate"}]


path: src/discord/interactionHandler.test.ts
hash: f4584cc48a102637aae982dccde46131666f3f5d116b7697618156391818b45e
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/discord/interactionHandler.test.ts","type":"file","name":"interactionHandler.test.ts","path":"src/discord/interactionHandler.test.ts","language":"typescript"},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeInteraction","type":"class","name":"FakeInteraction","path":"src/discord/interactionHandler.test.ts","language":"typescript","line":7,"startLine":7,"endLine":30},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand","type":"method","name":"isChatInputCommand","path":"src/discord/interactionHandler.test.ts","startLine":16,"endLine":18},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply","type":"method","name":"reply","path":"src/discord/interactionHandler.test.ts","startLine":20,"endLine":22},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeService","type":"class","name":"FakeService","path":"src/discord/interactionHandler.test.ts","language":"typescript","line":32,"startLine":32,"endLine":55},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole","type":"method","name":"claimRole","path":"src/discord/interactionHandler.test.ts","startLine":35,"endLine":38},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole","type":"method","name":"renameRole","path":"src/discord/interactionHandler.test.ts","startLine":40,"endLine":42},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole","type":"method","name":"recolorRole","path":"src/discord/interactionHandler.test.ts","startLine":44,"endLine":46},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon","type":"method","name":"setRoleIcon","path":"src/discord/interactionHandler.test.ts","startLine":48,"endLine":50},{"id":"symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole","type":"method","name":"deleteRole","path":"src/discord/interactionHandler.test.ts","startLine":52,"endLine":54},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"},{"id":"module:bun:test","type":"module","name":"bun:test","path":"bun:test"},{"id":"module:./interactionHandler","type":"module","name":"./interactionHandler","path":"./interactionHandler"}]

localEdges:
[{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeInteraction","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeInteraction","evidence":"FakeInteraction"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeInteraction.isChatInputCommand","evidence":"isChatInputCommand"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeInteraction.reply","evidence":"reply"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeService","evidence":"FakeService"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeService.claimRole","evidence":"claimRole"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeService.renameRole","evidence":"renameRole"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeService.recolorRole","evidence":"recolorRole"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeService.setRoleIcon","evidence":"setRoleIcon"},{"id":"exports:file:src/discord/interactionHandler.test.ts->symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole","type":"exports","source":"file:src/discord/interactionHandler.test.ts","target":"symbol:src/discord/interactionHandler.test.ts:FakeService.deleteRole","evidence":"deleteRole"},{"id":"imports:file:src/discord/interactionHandler.test.ts->module:discord.js","type":"imports","source":"file:src/discord/interactionHandler.test.ts","target":"module:discord.js","evidence":"discord.js"},{"id":"imports:file:src/discord/interactionHandler.test.ts->module:bun:test","type":"imports","source":"file:src/discord/interactionHandler.test.ts","target":"module:bun:test","evidence":"bun:test"},{"id":"imports:file:src/discord/interactionHandler.test.ts->module:./interactionHandler","type":"imports","source":"file:src/discord/interactionHandler.test.ts","target":"module:./interactionHandler","evidence":"./interactionHandler"}]

importMapEntries:
[["MessageFlags","discord.js"],["PermissionFlagsBits","discord.js"],["describe","bun:test"],["expect","bun:test"],["test","bun:test"],["handleInteraction","./interactionHandler"],["type BoosterRoleCommandService","./interactionHandler"],["type ChatInputInteractionLike","./interactionHandler"]]


path: src/discord/interactionHandler.ts
hash: 0205ecc04b66009155a196c6b8c6303623534a63118f70164218f76322fe9a3b
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/discord/interactionHandler.ts","type":"file","name":"interactionHandler.ts","path":"src/discord/interactionHandler.ts","language":"typescript"},{"id":"symbol:src/discord/interactionHandler.ts:handleInteraction","type":"function","name":"handleInteraction","path":"src/discord/interactionHandler.ts","language":"typescript","line":32,"startLine":36,"endLine":100},{"id":"symbol:src/discord/interactionHandler.ts:toUserErrorMessage","type":"function","name":"toUserErrorMessage","path":"src/discord/interactionHandler.ts","language":"typescript","line":102,"startLine":102,"endLine":114},{"id":"symbol:src/discord/interactionHandler.ts:requireGuildId","type":"function","name":"requireGuildId","path":"src/discord/interactionHandler.ts","language":"typescript","line":116,"startLine":116,"endLine":119},{"id":"symbol:src/discord/interactionHandler.ts:requireString","type":"function","name":"requireString","path":"src/discord/interactionHandler.ts","language":"typescript","line":121,"startLine":121,"endLine":125},{"id":"symbol:src/discord/interactionHandler.ts:requireUser","type":"function","name":"requireUser","path":"src/discord/interactionHandler.ts","language":"typescript","line":127,"startLine":127,"endLine":127},{"id":"symbol:src/discord/interactionHandler.ts:requireAdministrator","type":"function","name":"requireAdministrator","path":"src/discord/interactionHandler.ts","language":"typescript","line":133,"startLine":133,"endLine":137},{"id":"symbol:src/discord/interactionHandler.ts:requireIcon","type":"function","name":"requireIcon","path":"src/discord/interactionHandler.ts","language":"typescript","line":139,"startLine":139,"endLine":143},{"id":"symbol:src/discord/interactionHandler.ts:optionalIcon","type":"function","name":"optionalIcon","path":"src/discord/interactionHandler.ts","language":"typescript","line":145,"startLine":145,"endLine":154},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"},{"id":"module:../logger","type":"module","name":"../logger","path":"../logger"},{"id":"module:../services/boosterRoleService","type":"module","name":"../services/boosterRoleService","path":"../services/boosterRoleService"}]

localEdges:
[{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:handleInteraction","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:handleInteraction","evidence":"handleInteraction"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:toUserErrorMessage","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:toUserErrorMessage","evidence":"toUserErrorMessage"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireGuildId","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:requireGuildId","evidence":"requireGuildId"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireString","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:requireString","evidence":"requireString"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireUser","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:requireUser","evidence":"requireUser"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireAdministrator","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:requireAdministrator","evidence":"requireAdministrator"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:requireIcon","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:requireIcon","evidence":"requireIcon"},{"id":"exports:file:src/discord/interactionHandler.ts->symbol:src/discord/interactionHandler.ts:optionalIcon","type":"exports","source":"file:src/discord/interactionHandler.ts","target":"symbol:src/discord/interactionHandler.ts:optionalIcon","evidence":"optionalIcon"},{"id":"imports:file:src/discord/interactionHandler.ts->module:discord.js","type":"imports","source":"file:src/discord/interactionHandler.ts","target":"module:discord.js","evidence":"discord.js"},{"id":"imports:file:src/discord/interactionHandler.ts->module:../logger","type":"imports","source":"file:src/discord/interactionHandler.ts","target":"module:../logger","evidence":"../logger"},{"id":"imports:file:src/discord/interactionHandler.ts->module:../services/boosterRoleService","type":"imports","source":"file:src/discord/interactionHandler.ts","target":"module:../services/boosterRoleService","evidence":"../services/boosterRoleService"}]

importMapEntries:
[["MessageFlags","discord.js"],["PermissionFlagsBits","discord.js"],["logger","../logger"],["BoosterRoleRecord","../services/boosterRoleService"],["RoleIcon","../services/boosterRoleService"]]


path: src/discord/registerCommands.test.ts
hash: 80d9bbe2051adfff8220f57884a424313ba835ddd5b69ceb838bb68d3673c887
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/discord/registerCommands.test.ts","type":"file","name":"registerCommands.test.ts","path":"src/discord/registerCommands.test.ts","language":"typescript"},{"id":"symbol:src/discord/registerCommands.test.ts:FakeRestClient","type":"class","name":"FakeRestClient","path":"src/discord/registerCommands.test.ts","language":"typescript","line":4,"startLine":4,"endLine":13},{"id":"symbol:src/discord/registerCommands.test.ts:FakeRestClient.put","type":"method","name":"put","path":"src/discord/registerCommands.test.ts","startLine":8,"endLine":12},{"id":"module:bun:test","type":"module","name":"bun:test","path":"bun:test"},{"id":"module:./registerCommands","type":"module","name":"./registerCommands","path":"./registerCommands"}]

localEdges:
[{"id":"exports:file:src/discord/registerCommands.test.ts->symbol:src/discord/registerCommands.test.ts:FakeRestClient","type":"exports","source":"file:src/discord/registerCommands.test.ts","target":"symbol:src/discord/registerCommands.test.ts:FakeRestClient","evidence":"FakeRestClient"},{"id":"exports:file:src/discord/registerCommands.test.ts->symbol:src/discord/registerCommands.test.ts:FakeRestClient.put","type":"exports","source":"file:src/discord/registerCommands.test.ts","target":"symbol:src/discord/registerCommands.test.ts:FakeRestClient.put","evidence":"put"},{"id":"imports:file:src/discord/registerCommands.test.ts->module:bun:test","type":"imports","source":"file:src/discord/registerCommands.test.ts","target":"module:bun:test","evidence":"bun:test"},{"id":"imports:file:src/discord/registerCommands.test.ts->module:./registerCommands","type":"imports","source":"file:src/discord/registerCommands.test.ts","target":"module:./registerCommands","evidence":"./registerCommands"}]

importMapEntries:
[["describe","bun:test"],["expect","bun:test"],["test","bun:test"],["registerGuildCommands","./registerCommands"],["type DiscordRestClient","./registerCommands"]]


path: src/discord/registerCommands.ts
hash: 5717bab023b985ef9ad6071b78989e19a15557fcf82fdb177a6869331a9d57b9
language: typescript
scannerVersion: 3
importMapEntries: [["REST","discord.js"],["Routes","discord.js"],["boosterRoleCommand","./commands/booster-role"]]
nodes:
[{"id":"file:src/discord/registerCommands.ts","type":"file","name":"registerCommands.ts","path":"src/discord/registerCommands.ts","language":"typescript"},{"id":"symbol:src/discord/registerCommands.ts:registerGuildCommands","type":"function","name":"registerGuildCommands","path":"src/discord/registerCommands.ts","language":"typescript","line":13,"startLine":13,"endLine":17},{"id":"symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken","type":"function","name":"registerGuildCommandsWithToken","path":"src/discord/registerCommands.ts","language":"typescript","line":19,"startLine":19,"endLine":22},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"},{"id":"module:./commands/booster-role","type":"module","name":"./commands/booster-role","path":"./commands/booster-role"}]

localEdges:
[{"id":"exports:file:src/discord/registerCommands.ts->symbol:src/discord/registerCommands.ts:registerGuildCommands","type":"exports","source":"file:src/discord/registerCommands.ts","target":"symbol:src/discord/registerCommands.ts:registerGuildCommands","evidence":"registerGuildCommands"},{"id":"exports:file:src/discord/registerCommands.ts->symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken","type":"exports","source":"file:src/discord/registerCommands.ts","target":"symbol:src/discord/registerCommands.ts:registerGuildCommandsWithToken","evidence":"registerGuildCommandsWithToken"},{"id":"imports:file:src/discord/registerCommands.ts->module:discord.js","type":"imports","source":"file:src/discord/registerCommands.ts","target":"module:discord.js","evidence":"discord.js"},{"id":"imports:file:src/discord/registerCommands.ts->module:./commands/booster-role","type":"imports","source":"file:src/discord/registerCommands.ts","target":"module:./commands/booster-role","evidence":"./commands/booster-role"}]


path: src/domain/boostEligibility.test.ts
hash: 4f083e40aca35e9b66120112787f6fffa7f3805ab85b9df65d23510e4471c9ae
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/domain/boostEligibility.test.ts","type":"file","name":"boostEligibility.test.ts","path":"src/domain/boostEligibility.test.ts","language":"typescript"},{"id":"module:bun:test","type":"module","name":"bun:test","path":"bun:test"},{"id":"module:./boostEligibility","type":"module","name":"./boostEligibility","path":"./boostEligibility"}]

localEdges:
[{"id":"imports:file:src/domain/boostEligibility.test.ts->module:bun:test","type":"imports","source":"file:src/domain/boostEligibility.test.ts","target":"module:bun:test","evidence":"bun:test"},{"id":"imports:file:src/domain/boostEligibility.test.ts->module:./boostEligibility","type":"imports","source":"file:src/domain/boostEligibility.test.ts","target":"module:./boostEligibility","evidence":"./boostEligibility"}]

importMapEntries:
[["describe","bun:test"],["expect","bun:test"],["test","bun:test"],["assertBoostEligibility","./boostEligibility"]]


path: src/domain/boostEligibility.ts
hash: 80433d8fed76c210fdd4eb8948a904baaa7a90922bd19622af43a38a0f79c8a6
language: typescript
scannerVersion: 3
importMapEntries: []
nodes:
[{"id":"file:src/domain/boostEligibility.ts","type":"file","name":"boostEligibility.ts","path":"src/domain/boostEligibility.ts","language":"typescript"},{"id":"symbol:src/domain/boostEligibility.ts:assertBoostEligibility","type":"function","name":"assertBoostEligibility","path":"src/domain/boostEligibility.ts","language":"typescript","line":5,"startLine":5,"endLine":9}]

localEdges:
[{"id":"exports:file:src/domain/boostEligibility.ts->symbol:src/domain/boostEligibility.ts:assertBoostEligibility","type":"exports","source":"file:src/domain/boostEligibility.ts","target":"symbol:src/domain/boostEligibility.ts:assertBoostEligibility","evidence":"assertBoostEligibility"}]


path: src/domain/roleGuards.test.ts
hash: efe2a87100dcbb0e898f72db1ebecf23a20d99742f58934e0c1fb2b07097d9e1
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/domain/roleGuards.test.ts","type":"file","name":"roleGuards.test.ts","path":"src/domain/roleGuards.test.ts","language":"typescript"},{"id":"module:bun:test","type":"module","name":"bun:test","path":"bun:test"},{"id":"module:./roleGuards","type":"module","name":"./roleGuards","path":"./roleGuards"}]

localEdges:
[{"id":"imports:file:src/domain/roleGuards.test.ts->module:bun:test","type":"imports","source":"file:src/domain/roleGuards.test.ts","target":"module:bun:test","evidence":"bun:test"},{"id":"imports:file:src/domain/roleGuards.test.ts->module:./roleGuards","type":"imports","source":"file:src/domain/roleGuards.test.ts","target":"module:./roleGuards","evidence":"./roleGuards"}]

importMapEntries:
[["describe","bun:test"],["expect","bun:test"],["test","bun:test"],["assertCanManageStoredRole","./roleGuards"],["assertCosmeticPermissions","./roleGuards"],["assertRoleNameIsAvailable","./roleGuards"],["assertRolePositionIsSafe","./roleGuards"],["normalizeHexColor","./roleGuards"],["validateRoleName","./roleGuards"]]


path: src/domain/roleGuards.ts
hash: 0cc687e8aefaa809d5c5debe8e2e8c99b5107b2ae87a3423944f3ae894657902
language: typescript
scannerVersion: 3
importMapEntries: [["forbiddenRolePermissions","../config/permissions"]]
nodes:
[{"id":"file:src/domain/roleGuards.ts","type":"file","name":"roleGuards.ts","path":"src/domain/roleGuards.ts","language":"typescript"},{"id":"symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable","type":"function","name":"assertRoleNameIsAvailable","path":"src/domain/roleGuards.ts","language":"typescript","line":17,"startLine":17,"endLine":24},{"id":"symbol:src/domain/roleGuards.ts:assertCanManageStoredRole","type":"function","name":"assertCanManageStoredRole","path":"src/domain/roleGuards.ts","language":"typescript","line":26,"startLine":26,"endLine":38},{"id":"symbol:src/domain/roleGuards.ts:assertCosmeticPermissions","type":"function","name":"assertCosmeticPermissions","path":"src/domain/roleGuards.ts","language":"typescript","line":40,"startLine":40,"endLine":46},{"id":"symbol:src/domain/roleGuards.ts:assertRolePositionIsSafe","type":"function","name":"assertRolePositionIsSafe","path":"src/domain/roleGuards.ts","language":"typescript","line":48,"startLine":48,"endLine":52},{"id":"symbol:src/domain/roleGuards.ts:validateRoleName","type":"function","name":"validateRoleName","path":"src/domain/roleGuards.ts","language":"typescript","line":54,"startLine":54,"endLine":66},{"id":"symbol:src/domain/roleGuards.ts:normalizeHexColor","type":"function","name":"normalizeHexColor","path":"src/domain/roleGuards.ts","language":"typescript","line":68,"startLine":68,"endLine":76},{"id":"symbol:src/domain/roleGuards.ts:normalizeName","type":"function","name":"normalizeName","path":"src/domain/roleGuards.ts","language":"typescript","line":78,"startLine":78,"endLine":80},{"id":"module:../config/permissions","type":"module","name":"../config/permissions","path":"../config/permissions"}]

localEdges:
[{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:assertRoleNameIsAvailable","evidence":"assertRoleNameIsAvailable"},{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:assertCanManageStoredRole","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:assertCanManageStoredRole","evidence":"assertCanManageStoredRole"},{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:assertCosmeticPermissions","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:assertCosmeticPermissions","evidence":"assertCosmeticPermissions"},{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:assertRolePositionIsSafe","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:assertRolePositionIsSafe","evidence":"assertRolePositionIsSafe"},{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:validateRoleName","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:validateRoleName","evidence":"validateRoleName"},{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:normalizeHexColor","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:normalizeHexColor","evidence":"normalizeHexColor"},{"id":"exports:file:src/domain/roleGuards.ts->symbol:src/domain/roleGuards.ts:normalizeName","type":"exports","source":"file:src/domain/roleGuards.ts","target":"symbol:src/domain/roleGuards.ts:normalizeName","evidence":"normalizeName"},{"id":"imports:file:src/domain/roleGuards.ts->module:../config/permissions","type":"imports","source":"file:src/domain/roleGuards.ts","target":"module:../config/permissions","evidence":"../config/permissions"}]


path: src/index.ts
hash: 8e1037245ee32fdea486cecec978f374236fee038000daacb3d98698fd47fbe7
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/index.ts","type":"file","name":"index.ts","path":"src/index.ts","language":"typescript"},{"id":"module:./config","type":"module","name":"./config","path":"./config"},{"id":"module:./discord/bot","type":"module","name":"./discord/bot","path":"./discord/bot"},{"id":"module:./discord/client","type":"module","name":"./discord/client","path":"./discord/client"},{"id":"module:./discord/registerCommands","type":"module","name":"./discord/registerCommands","path":"./discord/registerCommands"},{"id":"module:./logger","type":"module","name":"./logger","path":"./logger"}]

localEdges:
[{"id":"imports:file:src/index.ts->module:./config","type":"imports","source":"file:src/index.ts","target":"module:./config","evidence":"./config"},{"id":"imports:file:src/index.ts->module:./discord/bot","type":"imports","source":"file:src/index.ts","target":"module:./discord/bot","evidence":"./discord/bot"},{"id":"imports:file:src/index.ts->module:./discord/client","type":"imports","source":"file:src/index.ts","target":"module:./discord/client","evidence":"./discord/client"},{"id":"imports:file:src/index.ts->module:./discord/registerCommands","type":"imports","source":"file:src/index.ts","target":"module:./discord/registerCommands","evidence":"./discord/registerCommands"},{"id":"imports:file:src/index.ts->module:./logger","type":"imports","source":"file:src/index.ts","target":"module:./logger","evidence":"./logger"}]

importMapEntries:
[["loadConfig","./config"],["attachBotHandlers","./discord/bot"],["createDiscordClient","./discord/client"],["registerGuildCommandsWithToken","./discord/registerCommands"],["logger","./logger"]]


path: src/logger.ts
hash: 5c3edfc55b23d7840078c70169426c2e9a89bd9dce1e3a5f325efd27bedd6cef
language: typescript
scannerVersion: 3
importMapEntries: [["winston","winston"]]
nodes:
[{"id":"file:src/logger.ts","type":"file","name":"logger.ts","path":"src/logger.ts","language":"typescript"},{"id":"module:winston","type":"module","name":"winston","path":"winston"}]

localEdges:
[{"id":"imports:file:src/logger.ts->module:winston","type":"imports","source":"file:src/logger.ts","target":"module:winston","evidence":"winston"}]


path: src/services/boosterRoleService.test.ts
hash: ea92e6ff53dccb2a4ed2f726d06ee0c3f20d353686a7b2b79c25a55e884a1784
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/services/boosterRoleService.test.ts","type":"file","name":"boosterRoleService.test.ts","path":"src/services/boosterRoleService.test.ts","language":"typescript"},{"id":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore","type":"class","name":"MemoryRoleStore","path":"src/services/boosterRoleService.test.ts","language":"typescript","line":4,"startLine":4,"endLine":18},{"id":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser","type":"method","name":"findByUser","path":"src/services/boosterRoleService.test.ts","startLine":7,"endLine":9},{"id":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create","type":"method","name":"create","path":"src/services/boosterRoleService.test.ts","startLine":11,"endLine":13},{"id":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete","type":"method","name":"delete","path":"src/services/boosterRoleService.test.ts","startLine":15,"endLine":17},{"id":"symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore","type":"class","name":"FailingCreateRoleStore","path":"src/services/boosterRoleService.test.ts","language":"typescript","line":20,"startLine":20,"endLine":24},{"id":"symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create","type":"method","name":"create","path":"src/services/boosterRoleService.test.ts","startLine":21,"endLine":23},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository","type":"class","name":"FakeRoleRepository","path":"src/services/boosterRoleService.test.ts","language":"typescript","line":26,"startLine":26,"endLine":66},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles","type":"method","name":"listRoles","path":"src/services/boosterRoleService.test.ts","startLine":38,"endLine":40},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole","type":"method","name":"createRole","path":"src/services/boosterRoleService.test.ts","startLine":42,"endLine":46},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole","type":"method","name":"updateRole","path":"src/services/boosterRoleService.test.ts","startLine":48,"endLine":52},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole","type":"method","name":"assignRole","path":"src/services/boosterRoleService.test.ts","startLine":54,"endLine":56},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole","type":"method","name":"removeRole","path":"src/services/boosterRoleService.test.ts","startLine":58,"endLine":60},{"id":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole","type":"method","name":"deleteRole","path":"src/services/boosterRoleService.test.ts","startLine":62,"endLine":65},{"id":"module:bun:test","type":"module","name":"bun:test","path":"bun:test"},{"id":"module:./boosterRoleService","type":"module","name":"./boosterRoleService","path":"./boosterRoleService"}]

localEdges:
[{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore","evidence":"MemoryRoleStore"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.findByUser","evidence":"findByUser"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.create","evidence":"create"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:MemoryRoleStore.delete","evidence":"delete"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore","evidence":"FailingCreateRoleStore"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FailingCreateRoleStore.create","evidence":"create"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository","evidence":"FakeRoleRepository"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.listRoles","evidence":"listRoles"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.createRole","evidence":"createRole"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.updateRole","evidence":"updateRole"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.assignRole","evidence":"assignRole"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.removeRole","evidence":"removeRole"},{"id":"exports:file:src/services/boosterRoleService.test.ts->symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole","type":"exports","source":"file:src/services/boosterRoleService.test.ts","target":"symbol:src/services/boosterRoleService.test.ts:FakeRoleRepository.deleteRole","evidence":"deleteRole"},{"id":"imports:file:src/services/boosterRoleService.test.ts->module:bun:test","type":"imports","source":"file:src/services/boosterRoleService.test.ts","target":"module:bun:test","evidence":"bun:test"},{"id":"imports:file:src/services/boosterRoleService.test.ts->module:./boosterRoleService","type":"imports","source":"file:src/services/boosterRoleService.test.ts","target":"module:./boosterRoleService","evidence":"./boosterRoleService"}]

importMapEntries:
[["describe","bun:test"],["expect","bun:test"],["test","bun:test"],["BoosterRoleService","./boosterRoleService"],["type BoosterRoleRecord","./boosterRoleService"],["type RoleRepository","./boosterRoleService"]]


path: src/services/boosterRoleService.ts
hash: 2196948218b473777130c58de5d85aea4e8b66bba2b9a7ec57fa1a491792e6ab
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/services/boosterRoleService.ts","type":"file","name":"boosterRoleService.ts","path":"src/services/boosterRoleService.ts","language":"typescript"},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService","type":"class","name":"BoosterRoleService","path":"src/services/boosterRoleService.ts","language":"typescript","line":48,"startLine":48,"endLine":177},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole","type":"method","name":"claimRole","path":"src/services/boosterRoleService.ts","startLine":59,"endLine":112},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole","type":"method","name":"renameRole","path":"src/services/boosterRoleService.ts","startLine":114,"endLine":120},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole","type":"method","name":"recolorRole","path":"src/services/boosterRoleService.ts","startLine":122,"endLine":126},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon","type":"method","name":"setRoleIcon","path":"src/services/boosterRoleService.ts","startLine":128,"endLine":133},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole","type":"method","name":"deleteRole","path":"src/services/boosterRoleService.ts","startLine":135,"endLine":140},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost","type":"method","name":"removeRoleForLostBoost","path":"src/services/boosterRoleService.ts","startLine":142,"endLine":149},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim","type":"method","name":"rollbackClaim","path":"src/services/boosterRoleService.ts","startLine":151,"endLine":158},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon","type":"method","name":"validateRoleIcon","path":"src/services/boosterRoleService.ts","startLine":160,"endLine":168},{"id":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord","type":"method","name":"getUserRecord","path":"src/services/boosterRoleService.ts","startLine":170,"endLine":176},{"id":"symbol:src/services/boosterRoleService.ts:ignoreRollbackError","type":"function","name":"ignoreRollbackError","path":"src/services/boosterRoleService.ts","language":"typescript","line":179,"startLine":179,"endLine":184},{"id":"module:../domain/boostEligibility","type":"module","name":"../domain/boostEligibility","path":"../domain/boostEligibility"},{"id":"module:../domain/roleGuards","type":"module","name":"../domain/roleGuards","path":"../domain/roleGuards"}]

localEdges:
[{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService","evidence":"BoosterRoleService"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.claimRole","evidence":"claimRole"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.renameRole","evidence":"renameRole"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.recolorRole","evidence":"recolorRole"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.setRoleIcon","evidence":"setRoleIcon"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.deleteRole","evidence":"deleteRole"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.removeRoleForLostBoost","evidence":"removeRoleForLostBoost"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.rollbackClaim","evidence":"rollbackClaim"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.validateRoleIcon","evidence":"validateRoleIcon"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:BoosterRoleService.getUserRecord","evidence":"getUserRecord"},{"id":"exports:file:src/services/boosterRoleService.ts->symbol:src/services/boosterRoleService.ts:ignoreRollbackError","type":"exports","source":"file:src/services/boosterRoleService.ts","target":"symbol:src/services/boosterRoleService.ts:ignoreRollbackError","evidence":"ignoreRollbackError"},{"id":"imports:file:src/services/boosterRoleService.ts->module:../domain/boostEligibility","type":"imports","source":"file:src/services/boosterRoleService.ts","target":"module:../domain/boostEligibility","evidence":"../domain/boostEligibility"},{"id":"imports:file:src/services/boosterRoleService.ts->module:../domain/roleGuards","type":"imports","source":"file:src/services/boosterRoleService.ts","target":"module:../domain/roleGuards","evidence":"../domain/roleGuards"}]

importMapEntries:
[["assertBoostEligibility","../domain/boostEligibility"],["assertRoleNameIsAvailable","../domain/roleGuards"],["assertRolePositionIsSafe","../domain/roleGuards"],["normalizeHexColor","../domain/roleGuards"],["validateRoleName","../domain/roleGuards"],["type ExistingRole","../domain/roleGuards"]]


path: src/services/discordRoleRepository.ts
hash: b1f22301513ca9b23165a151166c8a9e6593b6e31a06963e7439325cbbe01f2e
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/services/discordRoleRepository.ts","type":"file","name":"discordRoleRepository.ts","path":"src/services/discordRoleRepository.ts","language":"typescript"},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository","type":"class","name":"DiscordRoleRepository","path":"src/services/discordRoleRepository.ts","language":"typescript","line":4,"startLine":4,"endLine":58},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles","type":"method","name":"listRoles","path":"src/services/discordRoleRepository.ts","startLine":9,"endLine":12},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole","type":"method","name":"createRole","path":"src/services/discordRoleRepository.ts","startLine":14,"endLine":23},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole","type":"method","name":"updateRole","path":"src/services/discordRoleRepository.ts","startLine":25,"endLine":32},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole","type":"method","name":"assignRole","path":"src/services/discordRoleRepository.ts","startLine":34,"endLine":37},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole","type":"method","name":"removeRole","path":"src/services/discordRoleRepository.ts","startLine":39,"endLine":42},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole","type":"method","name":"deleteRole","path":"src/services/discordRoleRepository.ts","startLine":44,"endLine":47},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition","type":"method","name":"resolvePosition","path":"src/services/discordRoleRepository.ts","startLine":49,"endLine":51},{"id":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole","type":"method","name":"fetchRole","path":"src/services/discordRoleRepository.ts","startLine":53,"endLine":57},{"id":"symbol:src/services/discordRoleRepository.ts:toDiscordColors","type":"function","name":"toDiscordColors","path":"src/services/discordRoleRepository.ts","language":"typescript","line":60,"startLine":60,"endLine":60},{"id":"module:discord.js","type":"module","name":"discord.js","path":"discord.js"},{"id":"module:./boosterRoleService","type":"module","name":"./boosterRoleService","path":"./boosterRoleService"}]

localEdges:
[{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository","evidence":"DiscordRoleRepository"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.listRoles","evidence":"listRoles"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.createRole","evidence":"createRole"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.updateRole","evidence":"updateRole"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.assignRole","evidence":"assignRole"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.removeRole","evidence":"removeRole"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.deleteRole","evidence":"deleteRole"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.resolvePosition","evidence":"resolvePosition"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:DiscordRoleRepository.fetchRole","evidence":"fetchRole"},{"id":"exports:file:src/services/discordRoleRepository.ts->symbol:src/services/discordRoleRepository.ts:toDiscordColors","type":"exports","source":"file:src/services/discordRoleRepository.ts","target":"symbol:src/services/discordRoleRepository.ts:toDiscordColors","evidence":"toDiscordColors"},{"id":"imports:file:src/services/discordRoleRepository.ts->module:discord.js","type":"imports","source":"file:src/services/discordRoleRepository.ts","target":"module:discord.js","evidence":"discord.js"},{"id":"imports:file:src/services/discordRoleRepository.ts->module:./boosterRoleService","type":"imports","source":"file:src/services/discordRoleRepository.ts","target":"module:./boosterRoleService","evidence":"./boosterRoleService"}]

importMapEntries:
[["ColorResolvable","discord.js"],["Guild","discord.js"],["Role","discord.js"],["RoleRepository","./boosterRoleService"]]


path: src/services/drizzleBoosterRoleStore.ts
hash: d5b8199b4f2ddd7efb24b75cf2de96011d37bf9c56d24427405dd629e02106b5
language: typescript
scannerVersion: 3
nodes:
[{"id":"file:src/services/drizzleBoosterRoleStore.ts","type":"file","name":"drizzleBoosterRoleStore.ts","path":"src/services/drizzleBoosterRoleStore.ts","language":"typescript"},{"id":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore","type":"class","name":"DrizzleBoosterRoleStore","path":"src/services/drizzleBoosterRoleStore.ts","language":"typescript","line":21,"startLine":21,"endLine":43},{"id":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser","type":"method","name":"findByUser","path":"src/services/drizzleBoosterRoleStore.ts","startLine":24,"endLine":32},{"id":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create","type":"method","name":"create","path":"src/services/drizzleBoosterRoleStore.ts","startLine":34,"endLine":36},{"id":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete","type":"method","name":"delete","path":"src/services/drizzleBoosterRoleStore.ts","startLine":38,"endLine":42},{"id":"module:drizzle-orm","type":"module","name":"drizzle-orm","path":"drizzle-orm"},{"id":"module:../db/schema","type":"module","name":"../db/schema","path":"../db/schema"},{"id":"module:./boosterRoleService","type":"module","name":"./boosterRoleService","path":"./boosterRoleService"}]

localEdges:
[{"id":"exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore","type":"exports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore","evidence":"DrizzleBoosterRoleStore"},{"id":"exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser","type":"exports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.findByUser","evidence":"findByUser"},{"id":"exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create","type":"exports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.create","evidence":"create"},{"id":"exports:file:src/services/drizzleBoosterRoleStore.ts->symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete","type":"exports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"symbol:src/services/drizzleBoosterRoleStore.ts:DrizzleBoosterRoleStore.delete","evidence":"delete"},{"id":"imports:file:src/services/drizzleBoosterRoleStore.ts->module:drizzle-orm","type":"imports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"module:drizzle-orm","evidence":"drizzle-orm"},{"id":"imports:file:src/services/drizzleBoosterRoleStore.ts->module:../db/schema","type":"imports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"module:../db/schema","evidence":"../db/schema"},{"id":"imports:file:src/services/drizzleBoosterRoleStore.ts->module:./boosterRoleService","type":"imports","source":"file:src/services/drizzleBoosterRoleStore.ts","target":"module:./boosterRoleService","evidence":"./boosterRoleService"}]

importMapEntries:
[["and","drizzle-orm"],["eq","drizzle-orm"],["boosterRoles","../db/schema"],["BoosterRoleRecord","./boosterRoleService"],["BoosterRoleStore","./boosterRoleService"]]


