import type { Chain, ChainFormatters } from '../../types/chain.js' import type { Assign, Prettify } from '../../types/utils.js' export type DefineChainReturnType = Prettify< chain & (chain['extendSchema'] extends Record ? { extend: ( extended: extended, ) => Assign } : {}) > export function defineChain< formatters extends ChainFormatters, const chain extends Chain, >(chain: chain): DefineChainReturnType, chain>> { const chainInstance = { formatters: undefined, fees: undefined, serializers: undefined, ...chain, } as Assign, chain> function extend(base: typeof chainInstance) { type ExtendFn = (base: typeof chainInstance) => unknown return (fnOrExtended: ExtendFn | Record) => { const properties = ( typeof fnOrExtended === 'function' ? fnOrExtended(base) : fnOrExtended ) as (typeof chainInstance)['extendSchema'] const combined = { ...base, ...properties } return Object.assign(combined, { extend: extend(combined) }) } } return Object.assign(chainInstance, { extend: extend(chainInstance), }) as never } export function extendSchema>(): schema { return {} as schema }