import type { GuardStrategy, GuardContext, GuardChange } from './types.js'; /** * Pure functions that execute the work declared by a `GuardStrategy`. * Stateless — `GuardRegistry` decides when to call these. * * @internal */ export declare const GuardExecutor: { /** * Compare existing vs incoming for each `frozenFields.fields` entry * when `frozenFields.when(existing)` is true. Throws * `FieldFrozenError` listing every changed frozen field. * * @param skipFields — field names that are schema-owned computed fields. * These are excluded from the comparison because `incoming` carries the * raw user input (computed fields not yet evaluated), so comparing * `existing[field]` vs `incoming[field]` would always look like a * change even when the computed result is unchanged. */ checkFrozenFields>(guard: GuardStrategy, id: string, existing: T | null, incoming: T, skipFields?: ReadonlySet): Promise; /** * Run a single guard's invariant over its slice of the change-set. * Any throw is converted to `InvariantError` unless it already is one. */ runInvariant>(guard: GuardStrategy, changes: ReadonlyArray>, ctx: GuardContext): Promise; };