diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f45f6dfa..e2c46a41 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -73,6 +73,6 @@ export { useConnection } from './composables/useConnection' export { useHandleConnections } from './composables/useHandleConnections' export { useNodesData } from './composables/useNodesData' -export { VueFlowError, ErrorCode } from './utils/errors' +export { VueFlowError, ErrorCode, isErrorOfType } from './utils/errors' export * from './types' diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 60fa8ceb..84b2562a 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -35,15 +35,23 @@ const messages = { [ErrorCode.EDGE_NOT_FOUND]: (id: string) => `Edge not found\nEdge: ${id}`, } as const -export class VueFlowError extends Error { +type ErrorArgs = (typeof messages)[T] extends (...args: any[]) => string + ? Parameters<(typeof messages)[T]> + : never + +export class VueFlowError = ErrorArgs> extends Error { + name = 'VueFlowError' code: T - constructor( - code: T, - ...args: (typeof messages)[T] extends (...args: any[]) => string ? Parameters<(typeof messages)[T]> : never - ) { + args: Args + + constructor(code: T, ...args: Args) { // @ts-expect-error - TS doesn't know that the message is a key of messages super(messages[code]?.(...args)) - this.code = code + this.args = args } } + +export function isErrorOfType(error: VueFlowError, code: T): error is VueFlowError { + return error.code === code +}