Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 35 additions & 3 deletions alchemy/src/cloudflare/zone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -473,13 +473,23 @@ async function updateZoneSettings(
minTlsVersion: "min_tls_version",
};

// Fetch current settings to avoid unnecessary updates
const currentSettings = await getZoneSettings(api, zoneId);

await Promise.all(
Object.entries(settings)
.filter(([_, value]) => value !== undefined)
.map(async ([key, value]) => {
const settingId = settingsMap[key as keyof typeof settings];
if (!settingId) return;

// Check if the setting is already at the desired value
const currentValue =
currentSettings[key as keyof typeof currentSettings];
if (currentValue === value) {
return;
}

const response = await api.patch(
`/zones/${zoneId}/settings/${settingId}`,
{
Expand All @@ -489,10 +499,32 @@ async function updateZoneSettings(

if (!response.ok) {
const data = await response.text();
if (response.status === 400 && data.includes("already enabled")) {
logger.warn(`Warning: Setting '${key}' already enabled`);
return;

// Handle various error scenarios gracefully
if (response.status === 400) {
// Some settings may be read-only or already in the desired state
if (
data.includes("already enabled") ||
data.includes("cannot be changed")
) {
logger.warn(`Setting '${key}' cannot be updated: ${data}`);
return;
}

// Parse error for better messaging
try {
const errorData = JSON.parse(data);
const errorMessage = errorData.errors?.[0]?.message || data;
logger.warn(`Failed to update setting '${key}': ${errorMessage}`);
return;
} catch {
// If we can't parse the error, log the raw response
logger.warn(`Failed to update setting '${key}': ${data}`);
return;
}
}

// For non-400 errors, throw to fail the operation
throw new Error(
`Failed to update zone setting ${key}: ${response.statusText}`,
);
Expand Down