import * as z from "zod/mini"; export const SCOPE_IDS: readonly [ "functionality.storage", "security.storage", "analytics.storage", "analytics.measurement", "personalization.storage", "ads.storage", "ads.user_data", "ads.personalization", ] = [ "functionality.storage", "security.storage", "analytics.storage", "analytics.measurement", "personalization.storage", "ads.storage", "ads.user_data", "ads.personalization", ]; export const scopeIdSchema = z.enum(SCOPE_IDS); export type Scope = (typeof SCOPE_IDS)[number]; export function isScope(value: unknown): value is Scope { return scopeIdSchema.safeParse(value).success; } export type ScopeMeta = { description: string; }; const scopeMetaById: Record = { "functionality.storage": { description: "Allow essential storage for core widget behavior (e.g., frequency capping, dismissals, draft answers).", }, "security.storage": { description: "Allow storage used for fraud/abuse prevention and integrity checks.", }, "analytics.storage": { description: "Allow storage for analytics identifiers enabling consistent cross-session measurement.", }, "analytics.measurement": { description: "Allow sending analytics events; can operate without storage when needed.", }, "personalization.storage": { description: "Allow storage used to personalize the widget UI/targeting (non-ads).", }, "ads.storage": { description: "Allow storage for advertising identifiers and conversion cookies.", }, "ads.user_data": { description: "Allow sending user data to ad platforms when legally permitted.", }, "ads.personalization": { description: "Allow personalized advertising signals and interest-based targeting.", }, }; export function getScopeMeta(id: Scope): ScopeMeta { return scopeMetaById[id]; } export function listScopes(): ReadonlyArray<{ id: Scope } & ScopeMeta> { return SCOPE_IDS.map((id) => ({ id, ...getScopeMeta(id), })); }