import {z} from 'zod' export type CmpConfigWithDefaults = {name: string, domains: Array, orgIds?: Array | undefined, mode: 'debug' | 'permissive' | 'production', configuration: {additionalLinks?: Array> | undefined, allowTimeout?: boolean | undefined, amazonConsent?: boolean | undefined, ccpaRelaxed?: boolean | undefined, codeSplitting?: boolean | undefined, crossDeviceNoticeSeconds?: number | undefined, crossDomain?: boolean | undefined, deleteStorageOnOptout?: boolean | undefined, dntSupport?: boolean | undefined, doNotSellCategories?: (Array<'MARKETING' | 'ANALYTICS' | 'PERSONALIZATION'>) | undefined, enableDoNotSell?: boolean | undefined, enableDoNotSellDefault?: boolean | undefined, externalStylesheet?: boolean | undefined, forcedClassifyEnabled?: boolean | undefined, forceManagePreferences?: boolean | undefined, googleConsent?: boolean | undefined, gpcSupport?: boolean | undefined, iframeBlocking?: ('' | 'debug' | 'permissive' | 'production') | undefined, localStorageBlocking?: ('' | 'debug' | 'permissive' | 'production') | undefined, managePreferencesEnabled?: boolean | undefined, microsoftConsent?: boolean | undefined, palette?: ({buttonAcceptBackgroundColor?: (string | null) | undefined, buttonAcceptBackgroundColorHover?: (string | null) | undefined, buttonAcceptBorderColor?: (string | null) | undefined, buttonAcceptForegroundColor?: (string | null) | undefined, buttonBackgroundColor?: (string | null) | undefined, buttonBackgroundColorHover?: (string | null) | undefined, buttonBorderColor?: (string | null) | undefined, buttonCloseColor?: (string | null) | undefined, buttonDenyBackgroundColor?: (string | null) | undefined, buttonDenyBackgroundColorHover?: (string | null) | undefined, buttonDenyBorderColor?: (string | null) | undefined, buttonDenyForegroundColor?: (string | null) | undefined, buttonRejectAllBackgroundColor?: (string | null) | undefined, buttonRejectAllBackgroundColorHover?: (string | null) | undefined, buttonRejectAllBorderColor?: (string | null) | undefined, buttonRejectAllForegroundColor?: (string | null) | undefined, buttonForegroundColor?: (string | null) | undefined, buttonManageBackgroundColor?: (string | null) | undefined, buttonManageBorderColor?: (string | null) | undefined, buttonManageForegroundColor?: (string | null) | undefined, buttonManageBackgroundColorHover?: (string | null) | undefined, dialogBackgroundColor?: (string | null) | undefined, dialogForegroundColor?: (string | null) | undefined, dialogGpcBackgroundColor?: (string | null) | undefined, dialogGpcBorderColor?: (string | null) | undefined, dialogGpcForegroundColor?: (string | null) | undefined, dialogGpcColor?: (string | null) | undefined, dialogType?: ('bar' | 'box' | null) | undefined, displayPosition?: (string | null) | undefined, gpcBackgroundColor?: (string | null) | undefined, gpcBorderColor?: (string | null) | undefined, gpcForegroundColor?: (string | null) | undefined, gpcColor?: (string | null) | undefined, gpcBackgroundColorHover?: (string | null) | undefined, infoDialogBackgroundColor?: (string | null) | undefined, infoDialogForegroundColor?: (string | null) | undefined, infoDialogOverlayColor?: (string | null) | undefined, infoDialogButtonBackgroundColor?: (string | null) | undefined, infoDialogButtonBackgroundColorHover?: (string | null) | undefined, infoDialogButtonBorderColor?: (string | null) | undefined, infoDialogButtonCloseColor?: (string | null) | undefined, infoDialogButtonForegroundColor?: (string | null) | undefined, infoDialogGpcBackgroundColor?: (string | null) | undefined, infoDialogGpcBorderColor?: (string | null) | undefined, infoDialogGpcForegroundColor?: (string | null) | undefined, infoDialogGpcColor?: (string | null) | undefined, infoDialogLinkColor?: (string | null) | undefined, infoDialogPosition?: ('right' | 'left' | null) | undefined, infoDialogToggleOffTrackColor?: (string | null) | undefined, infoDialogToggleOffThumbColor?: (string | null) | undefined, infoDialogToggleOnTrackColor?: (string | null) | undefined, infoDialogToggleOnThumbColor?: (string | null) | undefined, linkColor?: (string | null) | undefined, optOutWidgetPosition?: ('right' | 'left' | null) | undefined, theme?: ('classic' | 'modern' | null) | undefined, toggleOffThumbColor?: (string | null) | undefined, toggleOffTrackColor?: (string | null) | undefined, toggleOnTrackColor?: (string | null) | undefined, toggleOnThumbColor?: (string | null) | undefined, toggleButtonOffColor?: (string | null) | undefined, toggleButtonOnColor?: (string | null) | undefined, toggleOffBackgroundColor?: (string | null) | undefined, toggleOnBackgroundColor?: (string | null) | undefined, widgetPosition?: ('right' | 'left' | null) | undefined, focusOutlineColor?: (string | null) | undefined}) | undefined, policyLinkInDrawer?: boolean | undefined, policyLinkText?: ('cookieNotice' | 'cookiePolicy' | 'storagePoloicy' | 'privacyNotice' | 'privacyPolicy') | undefined, showConsentUuid?: boolean | undefined, showCrossDeviceNotice?: boolean | undefined, showOptOutWidget?: boolean | undefined, showWidget?: boolean | undefined, storagePolicyHref: string, tattleSampling?: number | undefined, timeoutSeconds?: number | undefined, translations?: ({messaging?: ({categories?: {[key: string]: unknown} | undefined, closeButton?: {[key: string]: unknown} | undefined, default?: {[key: string]: unknown} | undefined, timer?: {[key: string]: unknown} | undefined, usageHow?: {[key: string]: unknown} | undefined, usageList?: {[key: string]: unknown} | undefined, usageWhat?: {[key: string]: unknown} | undefined, viewCookies?: {[key: string]: unknown} | undefined, viewDisclosures?: {[key: string]: unknown} | undefined}) | undefined, drawer?: ({description?: {[key: string]: unknown} | undefined, header?: {[key: string]: unknown} | undefined}) | undefined, doNotSell?: ({description?: {[key: string]: unknown} | undefined, header?: {[key: string]: unknown} | undefined}) | undefined, categories?: ({ANALYTICS?: ({description?: {[key: string]: unknown} | undefined, label?: {[key: string]: unknown} | undefined}) | undefined, ESSENTIAL?: ({description?: {[key: string]: unknown} | undefined, label?: {[key: string]: unknown} | undefined}) | undefined, MARKETING?: ({description?: {[key: string]: unknown} | undefined, label?: {[key: string]: unknown} | undefined}) | undefined, OPT_OUT?: ({description?: {[key: string]: unknown} | undefined, label?: {[key: string]: unknown} | undefined}) | undefined, PERSONALIZATION?: ({description?: {[key: string]: unknown} | undefined, label?: {[key: string]: unknown} | undefined}) | undefined}) | undefined, buttons?: ({accept?: {[key: string]: unknown} | undefined, acceptAll?: {[key: string]: unknown} | undefined, deny?: {[key: string]: unknown} | undefined, denyAll?: {[key: string]: unknown} | undefined, denyNonEssential?: {[key: string]: unknown} | undefined, dialog?: ({denyAll?: ({fr?: {[key: string]: unknown} | undefined}) | undefined, openDrawer?: ({fr?: {[key: string]: unknown} | undefined}) | undefined}) | undefined, managePreferences?: {[key: string]: unknown} | undefined, rejectNonEssential?: {[key: string]: unknown} | undefined, save?: {[key: string]: unknown} | undefined}) | undefined, optOut?: ({active?: {[key: string]: unknown} | undefined, honored?: {[key: string]: unknown} | undefined, signalActive?: {[key: string]: unknown} | undefined, signalHonored?: {[key: string]: unknown} | undefined}) | undefined}) | undefined, variantMapping?: ({byJurisdiction?: ({[key: string]: 'one' | 'three'}) | undefined, behavior?: 'fallbackToOsano' | undefined} | {byJurisdiction: {[key: string]: 'one' | 'three'}, behavior: 'fallbackToOsano'}) | undefined}}; export type CreateApiV1CookieConsentConfigsArgs = {body: CmpConfigWithDefaults}; export type CreateApiV1CookieConsentConfigsOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const cmpConfigResponse = z.object({name: z.string().optional(), domains: z.array(z.string()).optional(), orgIds: z.array(z.string()).optional(), mode: z.enum(["debug", "permissive", "production"]).optional(), configuration: z.object({additionalLinks: z.array(z.array(z.string())).optional(), allowTimeout: z.boolean().optional(), amazonConsent: z.boolean().optional(), ccpaRelaxed: z.boolean().optional(), codeSplitting: z.boolean().optional(), crossDeviceNoticeSeconds: z.number().int().gte(5).lte(30).optional(), crossDomain: z.boolean().optional(), deleteStorageOnOptout: z.boolean().optional(), dntSupport: z.boolean().optional(), doNotSellCategories: z.array(z.enum(["MARKETING", "ANALYTICS", "PERSONALIZATION"])).optional(), enableDoNotSell: z.boolean().optional(), enableDoNotSellDefault: z.boolean().optional(), externalStylesheet: z.boolean().optional(), forcedClassifyEnabled: z.boolean().optional(), forceManagePreferences: z.boolean().optional(), googleConsent: z.boolean().optional(), gpcSupport: z.boolean().optional(), iframeBlocking: z.enum(["", "debug", "permissive", "production"]).optional(), localStorageBlocking: z.enum(["", "debug", "permissive", "production"]).optional(), managePreferencesEnabled: z.boolean().optional(), microsoftConsent: z.boolean().optional(), palette: z.object({buttonAcceptBackgroundColor: z.string().nullable().optional(), buttonAcceptBackgroundColorHover: z.string().nullable().optional(), buttonAcceptBorderColor: z.string().nullable().optional(), buttonAcceptForegroundColor: z.string().nullable().optional(), buttonBackgroundColor: z.string().nullable().optional(), buttonBackgroundColorHover: z.string().nullable().optional(), buttonBorderColor: z.string().nullable().optional(), buttonCloseColor: z.string().nullable().optional(), buttonDenyBackgroundColor: z.string().nullable().optional(), buttonDenyBackgroundColorHover: z.string().nullable().optional(), buttonDenyBorderColor: z.string().nullable().optional(), buttonDenyForegroundColor: z.string().nullable().optional(), buttonRejectAllBackgroundColor: z.string().nullable().optional(), buttonRejectAllBackgroundColorHover: z.string().nullable().optional(), buttonRejectAllBorderColor: z.string().nullable().optional(), buttonRejectAllForegroundColor: z.string().nullable().optional(), buttonForegroundColor: z.string().nullable().optional(), buttonManageBackgroundColor: z.string().nullable().optional(), buttonManageBorderColor: z.string().nullable().optional(), buttonManageForegroundColor: z.string().nullable().optional(), buttonManageBackgroundColorHover: z.string().nullable().optional(), dialogBackgroundColor: z.string().nullable().optional(), dialogForegroundColor: z.string().nullable().optional(), dialogGpcBackgroundColor: z.string().nullable().optional(), dialogGpcBorderColor: z.string().nullable().optional(), dialogGpcForegroundColor: z.string().nullable().optional(), dialogGpcColor: z.string().nullable().optional(), dialogType: z.enum(["bar", "box"]).nullable().optional(), displayPosition: z.string().nullable().optional(), gpcBackgroundColor: z.string().nullable().optional(), gpcBorderColor: z.string().nullable().optional(), gpcForegroundColor: z.string().nullable().optional(), gpcColor: z.string().nullable().optional(), gpcBackgroundColorHover: z.string().nullable().optional(), infoDialogBackgroundColor: z.string().nullable().optional(), infoDialogForegroundColor: z.string().nullable().optional(), infoDialogOverlayColor: z.string().nullable().optional(), infoDialogButtonBackgroundColor: z.string().nullable().optional(), infoDialogButtonBackgroundColorHover: z.string().nullable().optional(), infoDialogButtonBorderColor: z.string().nullable().optional(), infoDialogButtonCloseColor: z.string().nullable().optional(), infoDialogButtonForegroundColor: z.string().nullable().optional(), infoDialogGpcBackgroundColor: z.string().nullable().optional(), infoDialogGpcBorderColor: z.string().nullable().optional(), infoDialogGpcForegroundColor: z.string().nullable().optional(), infoDialogGpcColor: z.string().nullable().optional(), infoDialogLinkColor: z.string().nullable().optional(), infoDialogPosition: z.enum(["right", "left"]).nullable().optional(), infoDialogToggleOffTrackColor: z.string().nullable().optional(), infoDialogToggleOffThumbColor: z.string().nullable().optional(), infoDialogToggleOnTrackColor: z.string().nullable().optional(), infoDialogToggleOnThumbColor: z.string().nullable().optional(), linkColor: z.string().nullable().optional(), optOutWidgetPosition: z.enum(["right", "left"]).nullable().optional(), theme: z.enum(["classic", "modern"]).nullable().optional(), toggleOffThumbColor: z.string().nullable().optional(), toggleOffTrackColor: z.string().nullable().optional(), toggleOnTrackColor: z.string().nullable().optional(), toggleOnThumbColor: z.string().nullable().optional(), toggleButtonOffColor: z.string().nullable().optional(), toggleButtonOnColor: z.string().nullable().optional(), toggleOffBackgroundColor: z.string().nullable().optional(), toggleOnBackgroundColor: z.string().nullable().optional(), widgetPosition: z.enum(["right", "left"]).nullable().optional(), focusOutlineColor: z.string().nullable().optional()}).optional(), policyLinkInDrawer: z.boolean().optional(), policyLinkText: z.enum(["cookieNotice", "cookiePolicy", "storagePoloicy", "privacyNotice", "privacyPolicy"]).optional(), showConsentUuid: z.boolean().optional(), showCrossDeviceNotice: z.boolean().optional(), showOptOutWidget: z.boolean().optional(), showWidget: z.boolean().optional(), storagePolicyHref: z.string().optional(), tattleSampling: z.number().gte(0).lte(1).optional(), timeoutSeconds: z.number().int().optional(), translations: z.object({messaging: z.object({categories: z.record(z.string(), z.unknown()).optional(), closeButton: z.record(z.string(), z.unknown()).optional(), default: z.record(z.string(), z.unknown()).optional(), timer: z.record(z.string(), z.unknown()).optional(), usageHow: z.record(z.string(), z.unknown()).optional(), usageList: z.record(z.string(), z.unknown()).optional(), usageWhat: z.record(z.string(), z.unknown()).optional(), viewCookies: z.record(z.string(), z.unknown()).optional(), viewDisclosures: z.record(z.string(), z.unknown()).optional()}).optional(), drawer: z.object({description: z.record(z.string(), z.unknown()).optional(), header: z.record(z.string(), z.unknown()).optional()}).optional(), doNotSell: z.object({description: z.record(z.string(), z.unknown()).optional(), header: z.record(z.string(), z.unknown()).optional()}).optional(), categories: z.object({ANALYTICS: z.object({description: z.record(z.string(), z.unknown()).optional(), label: z.record(z.string(), z.unknown()).optional()}).optional(), ESSENTIAL: z.object({description: z.record(z.string(), z.unknown()).optional(), label: z.record(z.string(), z.unknown()).optional()}).optional(), MARKETING: z.object({description: z.record(z.string(), z.unknown()).optional(), label: z.record(z.string(), z.unknown()).optional()}).optional(), OPT_OUT: z.object({description: z.record(z.string(), z.unknown()).optional(), label: z.record(z.string(), z.unknown()).optional()}).optional(), PERSONALIZATION: z.object({description: z.record(z.string(), z.unknown()).optional(), label: z.record(z.string(), z.unknown()).optional()}).optional()}).optional(), buttons: z.object({accept: z.record(z.string(), z.unknown()).optional(), acceptAll: z.record(z.string(), z.unknown()).optional(), deny: z.record(z.string(), z.unknown()).optional(), denyAll: z.record(z.string(), z.unknown()).optional(), denyNonEssential: z.record(z.string(), z.unknown()).optional(), dialog: z.object({denyAll: z.object({fr: z.record(z.string(), z.unknown()).optional()}).optional(), openDrawer: z.object({fr: z.record(z.string(), z.unknown()).optional()}).optional()}).optional(), managePreferences: z.record(z.string(), z.unknown()).optional(), rejectNonEssential: z.record(z.string(), z.unknown()).optional(), save: z.record(z.string(), z.unknown()).optional()}).optional(), optOut: z.object({active: z.record(z.string(), z.unknown()).optional(), honored: z.record(z.string(), z.unknown()).optional(), signalActive: z.record(z.string(), z.unknown()).optional(), signalHonored: z.record(z.string(), z.unknown()).optional()}).optional()}).optional(), variantMapping: z.union([z.object({byJurisdiction: z.record(z.string(), z.enum(["one", "three"])).optional(), behavior: z.literal("fallbackToOsano").optional()}), z.object({byJurisdiction: z.record(z.string(), z.enum(["one", "three"])), behavior: z.literal("fallbackToOsano")})]).optional()}).optional(), created: z.number().int().optional(), updated: z.number().int().optional(), publishStatus: z.enum(["unpublished", "in-progress", "published", "outdated", "error"]).optional(), lastPublished: z.number().int().optional(), publishedRevision: z.number().int().optional(), tattleRecordStopped: z.boolean().optional(), configId: z.string(), customerId: z.string().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Create New Cookie Consent Configuration * * POST /v1/cookie-consent/configs */ export const createApiV1CookieConsentConfigs = async (args: CreateApiV1CookieConsentConfigsArgs, options?: CreateApiV1CookieConsentConfigsOptions) => { const {baseUrl = "https://api.osano.com", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (ApiKeyAuth !== undefined) headers.set("x-osano-api-key", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/v1/cookie-consent/configs${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(cmpConfigResponse, await res.json()) };