diff --git a/src/common/commonResolvers.ts b/src/common/commonResolvers.ts index 2bd9f46..e349f6b 100644 --- a/src/common/commonResolvers.ts +++ b/src/common/commonResolvers.ts @@ -8,7 +8,7 @@ import { Driver } from '../generated/graphql'; import GivenEventModel from '../given-event/GivenEventModel'; import DripListSplitReceiverModel from '../models/DripListSplitReceiverModel'; import type { Context } from '../server'; -import shouldNeverHappen from '../utils/shouldNeverHappen'; +import unreachableError from '../utils/unreachableError'; import type { AddressDriverId, DripListId, ProjectId } from './types'; import { DependencyType } from './types'; import getUserAddress from '../utils/getUserAddress'; @@ -33,20 +33,20 @@ async function resolveTotalSplit( const { fundeeDripListId, funderDripListId, funderProjectId } = parent; recipientAccountId = fundeeDripListId; incomingAccountId = - funderDripListId || funderProjectId || shouldNeverHappen(); + funderDripListId || funderProjectId || unreachableError(); } else if (parent instanceof RepoDriverSplitReceiverModel) { const { fundeeProjectId, funderDripListId, funderProjectId } = parent; recipientAccountId = fundeeProjectId; incomingAccountId = - funderDripListId || funderProjectId || shouldNeverHappen(); + funderDripListId || funderProjectId || unreachableError(); } else if (parent instanceof AddressDriverSplitReceiverModel) { const { fundeeAccountId, funderDripListId, funderProjectId } = parent; recipientAccountId = fundeeAccountId; incomingAccountId = - funderDripListId || funderProjectId || shouldNeverHappen(); + funderDripListId || funderProjectId || unreachableError(); } else { - shouldNeverHappen('Invalid SupportItem type'); + unreachableError('Invalid SupportItem type'); } const splitEvents = await SplitEventModel.findAll({ @@ -91,7 +91,7 @@ const commonResolvers = { case AddressDriverSplitReceiverType.DripListDependency: return 'DripListSupport'; default: - return shouldNeverHappen('Invalid SupportItem type'); + return unreachableError('Invalid SupportItem type'); } } @@ -116,7 +116,7 @@ const commonResolvers = { return { driver: Driver.REPO, - accountId: project ? project.id : shouldNeverHappen(), + accountId: project ? project.id : unreachableError(), }; }, date: (parent: { blockTimestamp: Date }): Date => parent.blockTimestamp, @@ -150,7 +150,7 @@ const commonResolvers = { return { driver: Driver.NFT, - accountId: dripList ? dripList.id : shouldNeverHappen(), + accountId: dripList ? dripList.id : unreachableError(), }; }, date: (parent: { blockTimestamp: Date }): Date => parent.blockTimestamp, diff --git a/src/common/getProvider.ts b/src/common/getProvider.ts index b47c939..6eb53a6 100644 --- a/src/common/getProvider.ts +++ b/src/common/getProvider.ts @@ -1,6 +1,6 @@ import type { Provider } from 'ethers'; import { FetchRequest, JsonRpcProvider, WebSocketProvider } from 'ethers'; -import shouldNeverHappen from '../utils/shouldNeverHappen'; +import unreachableError from '../utils/unreachableError'; import appSettings from './appSettings'; let providerInstance: Provider | null = null; @@ -16,7 +16,7 @@ export default function getProvider(): Provider { } else if (rpcUrl.startsWith('wss')) { providerInstance = new WebSocketProvider(rpcUrl); } else { - shouldNeverHappen(`Invalid RPC URL: ${rpcUrl}`); + unreachableError(`Invalid RPC URL: ${rpcUrl}`); } } diff --git a/src/drip-list/dripListResolvers.ts b/src/drip-list/dripListResolvers.ts index 9fe58eb..1726739 100644 --- a/src/drip-list/dripListResolvers.ts +++ b/src/drip-list/dripListResolvers.ts @@ -11,7 +11,7 @@ import type { SplitsReceiver, } from '../generated/graphql'; import { Driver } from '../generated/graphql'; -import shouldNeverHappen from '../utils/shouldNeverHappen'; +import unreachableError from '../utils/unreachableError'; import type { Context } from '../server'; import type GitProjectModel from '../project/ProjectModel'; import assert, { isDripListId } from '../utils/assert'; @@ -65,8 +65,8 @@ const dripListResolvers = { dripList.previousOwnerAddress, owner: (dripList: DripListModel): AddressDriverAccount => ({ driver: Driver.ADDRESS, - accountId: dripList.ownerAccountId || shouldNeverHappen(), - address: (dripList.ownerAddress as string) || shouldNeverHappen(), + accountId: dripList.ownerAccountId || unreachableError(), + address: (dripList.ownerAddress as string) || unreachableError(), }), account: (dripList: DripListModel): NftDriverAccount => ({ driver: Driver.NFT, @@ -126,7 +126,7 @@ const dripListResolvers = { ) .find( (p) => (p as any).id === receiver.fundeeProjectId, - ) as unknown as Project) || shouldNeverHappen(), + ) as unknown as Project) || unreachableError(), })); const receiversOfTypeDripListModels = @@ -153,7 +153,7 @@ const dripListResolvers = { ) .find( (p) => (p as any).id === receiver.fundeeDripListId, - ) as unknown as DripList) || shouldNeverHappen(), + ) as unknown as DripList) || unreachableError(), }), ); diff --git a/src/project/projectResolvers.ts b/src/project/projectResolvers.ts index c4193cf..d09d48a 100644 --- a/src/project/projectResolvers.ts +++ b/src/project/projectResolvers.ts @@ -7,7 +7,7 @@ import type { import type ProjectModel from './ProjectModel'; import { ProjectVerificationStatus } from './ProjectModel'; import { splitProjectName } from './projectUtils'; -import shouldNeverHappen from '../utils/shouldNeverHappen'; +import unreachableError from '../utils/unreachableError'; import { Driver } from '../generated/graphql'; import type { SplitsReceiver, @@ -115,7 +115,7 @@ const projectResolvers = { }, ClaimedProject: { color: (project: ProjectModel): string => - project.color || shouldNeverHappen(), + project.color || unreachableError(), description: (project: ProjectModel): string | null => project.description, emoji: (project: ProjectModel): string => project.emoji || '💧', avatar: (project: ProjectModel): any => { @@ -131,24 +131,23 @@ const projectResolvers = { }, owner: (project: ProjectModel): AddressDriverAccount => ({ driver: Driver.ADDRESS, - accountId: project.ownerAccountId || shouldNeverHappen(), - address: (project.ownerAddress as string) || shouldNeverHappen(), + accountId: project.ownerAccountId || unreachableError(), + address: (project.ownerAddress as string) || unreachableError(), }), account: (project: ProjectModel): RepoDriverAccount => ({ driver: Driver.REPO, accountId: project.id, }), source: (project: ProjectModel): Source => ({ - url: project.url || shouldNeverHappen(), - repoName: splitProjectName(project.name || shouldNeverHappen()).repoName, - ownerName: splitProjectName(project.name || shouldNeverHappen()) - .ownerName, - forge: (project.forge as Forge) || shouldNeverHappen(), + url: project.url || unreachableError(), + repoName: splitProjectName(project.name || unreachableError()).repoName, + ownerName: splitProjectName(project.name || unreachableError()).ownerName, + forge: (project.forge as Forge) || unreachableError(), }), verificationStatus: (project: ProjectModel): ProjectVerificationStatus => project.verificationStatus === ProjectVerificationStatus.Claimed ? project.verificationStatus - : shouldNeverHappen(), + : unreachableError(), splits: async ( project: ProjectModel, _: any, @@ -218,7 +217,7 @@ const projectResolvers = { ) .find( (p) => (p as any).id === receiver.fundeeProjectId, - ) as unknown as Project) || shouldNeverHappen(), + ) as unknown as Project) || unreachableError(), }), ); @@ -246,7 +245,7 @@ const projectResolvers = { ) .find( (p) => (p as any).id === receiver.fundeeDripListId, - ) as unknown as DripList) || shouldNeverHappen(), + ) as unknown as DripList) || unreachableError(), }), ); @@ -321,7 +320,7 @@ const projectResolvers = { return 'AddressReceiver'; } - return shouldNeverHappen(); + return unreachableError(); }, }, UnclaimedProject: { @@ -333,12 +332,11 @@ const projectResolvers = { }, source(project: ProjectModel): Source { return { - url: project.url || shouldNeverHappen(), - repoName: splitProjectName(project.name || shouldNeverHappen()) - .repoName, - ownerName: splitProjectName(project.name || shouldNeverHappen()) + url: project.url || unreachableError(), + repoName: splitProjectName(project.name || unreachableError()).repoName, + ownerName: splitProjectName(project.name || unreachableError()) .ownerName, - forge: (project.forge as Forge) || shouldNeverHappen(), + forge: (project.forge as Forge) || unreachableError(), }; }, verificationStatus(project: ProjectModel): ProjectVerificationStatus { diff --git a/src/project/projectUtils.ts b/src/project/projectUtils.ts index 1d8adc1..4603e91 100644 --- a/src/project/projectUtils.ts +++ b/src/project/projectUtils.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers'; import type { FakeUnclaimedProject, Forge, ProjectId } from '../common/types'; -import shouldNeverHappen from '../utils/shouldNeverHappen'; +import unreachableError from '../utils/unreachableError'; import type ProjectModel from './ProjectModel'; import { ProjectVerificationStatus } from './ProjectModel'; import { RepoDriver__factory } from '../generated/contracts'; @@ -50,7 +50,7 @@ function toContractForge(forge: Forge): 0 | 1 { case `GitLab`: return 1; default: - return shouldNeverHappen(`Forge ${forge} not supported.`); + return unreachableError(`Forge ${forge} not supported.`); } } @@ -90,7 +90,7 @@ function toForge(forge: string): Forge { case 'gitlab': return `GitLab`; default: - return shouldNeverHappen(`Forge ${forge} not supported.`); + return unreachableError(`Forge ${forge} not supported.`); } } diff --git a/src/stream/streamResolvers.ts b/src/stream/streamResolvers.ts index c85f82f..f2ea5bd 100644 --- a/src/stream/streamResolvers.ts +++ b/src/stream/streamResolvers.ts @@ -1,6 +1,6 @@ import { Driver, type StreamWhereInput } from '../generated/graphql'; import type { Context } from '../server'; -import shouldNeverHappen from '../utils/shouldNeverHappen'; +import unreachableError from '../utils/unreachableError'; const streamResolvers = { Query: { @@ -24,7 +24,7 @@ const streamResolvers = { ); } - throw shouldNeverHappen(); + throw unreachableError(); }, sender: (parent: any, _: any, { dataSources }: Context) => { if (parent.sender.driver === Driver.ADDRESS) { @@ -35,7 +35,7 @@ const streamResolvers = { return dataSources.dripListsDb.getDripListById(parent.sender.accountId); } - throw shouldNeverHappen(); + throw unreachableError(); }, }, }; diff --git a/src/utils/shouldNeverHappen.ts b/src/utils/shouldNeverHappen.ts deleted file mode 100644 index a7b0526..0000000 --- a/src/utils/shouldNeverHappen.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default function shouldNeverHappen(message?: string): never { - throw new Error(`This should never happen.${message ? ` ${message}` : ''}`); -} diff --git a/src/utils/unreachableError.ts b/src/utils/unreachableError.ts new file mode 100644 index 0000000..62ed2c2 --- /dev/null +++ b/src/utils/unreachableError.ts @@ -0,0 +1,3 @@ +export default function unreachableError(message?: string): never { + throw new Error(`Unreachable code${message ? `: ${message}` : '.'}`); +}