declare const AUDIENCES: readonly ["all", "signed-in", "signed-out"]; export type Audience = (typeof AUDIENCES)[number]; export interface SectionAudience { audience?: string; customerTags?: readonly string[]; } export interface AudienceViewer { signedIn: boolean; /** Shopify customer tags. Absent, null or non-array means "no tags". */ tags?: readonly string[] | null; } /** * Whether a section carries a rule at all — i.e. whether `matchesAudience` can * return anything but `true`. Lets a caller skip evaluation, or treat targeted * and untargeted rows differently, without duplicating the no-op conditions. */ export declare const hasAudienceTargeting: (target: SectionAudience | undefined) => boolean; /** * Whether `viewer` should see a section carrying `target` (SWI-1366). * * The no-op contract: `undefined`, `{}`, or `all` with an empty tag list all * return `true`, so every block authored before this ticket renders to * everyone. An unrecognised `audience` degrades to `all` for the same reason * `resolveDefaultView` normalises rather than trusting its input — the * customiser's `applyPreview` merges its payload into the reactive ui options * without validating them, so the parsed type lies in preview. * * `audience` and `customerTags` are AND-ed. Tags match ANY and only exist on a * customer record, so a tag list also requires being signed in — which makes * `signed-out` plus tags a contradiction that matches nobody. That's reported * honestly rather than silently repaired; the customiser labels steer away * from it. */ export declare const matchesAudience: (target: SectionAudience | undefined, viewer: AudienceViewer) => boolean; export {};