import type { CordoInteraction } from "../core" import type { RouteResponse } from "../core/files/route" import type { RoutingRespond } from "../core/routing/respond" import type { CordoComponentPayload, renderComponentList, StringComponentType } from "./component" const CordoModifierSymbol = Symbol.for('CordoModifier') export type CordoModifier = { [CordoModifierSymbol]: { name: string hooks?: { onRender?: (c: CordoComponentPayload) => CordoComponentPayload beforeRender?: (c: Array>) => Array> afterRender?: (c: ReturnType) => ReturnType beforeRouteResponse?: (response: RouteResponse, i: CordoInteraction, opts: RoutingRespond.RouteOpts) => void } } } export function createModifier(value: CordoModifier[typeof CordoModifierSymbol]): CordoModifier { return { [CordoModifierSymbol]: value } } export function isModifier(t: Record): t is CordoModifier { return !!t && CordoModifierSymbol in t } export function readModifier(mod: CordoModifier): CordoModifier[typeof CordoModifierSymbol] { return mod[CordoModifierSymbol]! }