import * as z from "zod" import { CLOUDFLARE_PAGE_INFO_SCHEMA } from "@automate.ax/integration-contracts/cloudflare" import type { IntegrationScopeRequirement } from "../../automation/integrations" export const CLOUDFLARE_ACCOUNT_SETTINGS_READ_SCOPE = "account-settings.read" export const CLOUDFLARE_ZONE_READ_SCOPE = "zone.read" export const CLOUDFLARE_ZONE_WRITE_SCOPE = "zone.write" export const CLOUDFLARE_DNS_READ_SCOPE = "dns.read" export const CLOUDFLARE_DNS_WRITE_SCOPE = "dns.write" export const CLOUDFLARE_CACHE_PURGE_SCOPE = "cache.purge" export const CLOUDFLARE_HEALTH_CHECK_READ_SCOPE = "healthcheck.read" export const CLOUDFLARE_HEALTH_CHECK_WRITE_SCOPE = "healthcheck.write" export const CLOUDFLARE_NOTIFICATIONS_READ_SCOPE = "notifications.read" export const CLOUDFLARE_NOTIFICATIONS_WRITE_SCOPE = "notifications.write" export const CLOUDFLARE_BROWSER_RENDERING_WRITE_SCOPE = "browser-rendering.write" /** * Offers Cloudflare OAuth with an API-token fallback for one exact permission. * * @param requiredScope - Least-privilege Cloudflare OAuth scope. */ export function cloudflareAccountRequirement( requiredScope: IntegrationScopeRequirement, ) { return { connections: [ { connectionMethodId: "oauth", requiredScope }, { connectionMethodId: "api-token" }, ], } as const } export const CLOUDFLARE_ID_SCHEMA = z.string().trim().min(1) export const CLOUDFLARE_PAGE_INPUT_SCHEMA = { page: z.number().int().positive().prefault(1), perPage: z.number().int().min(5).max(50).prefault(20), } /** * Builds the public output schema for one Cloudflare page. * * @param item - Schema for one normalized result item. */ export function cloudflarePageSchema(item: T) { return z.object({ items: item.array(), pageInfo: CLOUDFLARE_PAGE_INFO_SCHEMA.optional(), }) } /** * Renames a provider page into the public result shape. * * @param page - Normalized provider page. * @param page.result - Normalized result items. * @param page.resultInfo - Optional provider pagination metadata. */ export function toCloudflarePage(page: { result: T[] resultInfo?: z.output }) { return { items: page.result, pageInfo: page.resultInfo } }