import {z} from 'zod' export type GetApiV1CookieConsentConfigsArgs = {name?: string | undefined, domains?: string | undefined, limit?: number | undefined, next?: string | undefined, sortBy?: ('name' | 'created' | 'updated' | 'lastPublished') | undefined, orgIds?: string | undefined, mode?: ('debug' | 'permissive' | 'production') | undefined, status?: ('unpublished' | 'in-progress' | 'published' | 'outdated' | 'error') | undefined, tattleRecordStopped?: boolean | undefined}; export type GetApiV1CookieConsentConfigsOptions = {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 cmpConfigResponseList = z.object({items: z.array(cmpConfigResponse), next: 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 }; /** * List Cookie Consent Configurations * * GET /v1/cookie-consent/configs */ export const getApiV1CookieConsentConfigs = async (args: GetApiV1CookieConsentConfigsArgs, options?: GetApiV1CookieConsentConfigsOptions) => { const {baseUrl = "https://api.osano.com", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.name != null) query.append("name", String(args.name)) if (args.domains != null) query.append("domains", String(args.domains)) if (args.limit != null) query.append("limit", String(args.limit)) if (args.next != null) query.append("next", String(args.next)) if (args.sortBy != null) query.append("sortBy", String(args.sortBy)) if (args.orgIds != null) query.append("orgIds", String(args.orgIds)) if (args.mode != null) query.append("mode", String(args.mode)) if (args.status != null) query.append("status", String(args.status)) if (args.tattleRecordStopped != null) query.append("tattleRecordStopped", String(args.tattleRecordStopped)) 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: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(cmpConfigResponseList, await res.json()) };