Skip to content

Commit 7687d28

Browse files
committed
fix(supabase): only parse Edge Function body/headers for invoke_function
Stale or invalid functionBody/functionHeaders left in the block (common when switching operations) were parsed and validated for every operation, so they could throw before unrelated tools ran even while hidden. Moved parsing and validation inside the invoke_function guard; added a regression test.
1 parent a3d3f57 commit 7687d28

2 files changed

Lines changed: 55 additions & 43 deletions

File tree

apps/sim/blocks/blocks/supabase.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,21 @@ describe('SupabaseBlock', () => {
3030
expect(params).not.toHaveProperty('headers')
3131
})
3232

33+
it('ignores stale invalid Edge Function fields on other operations', () => {
34+
// Hidden Edge Function inputs left over from a prior selection must not be
35+
// parsed/validated (and must never throw) for unrelated operations.
36+
expect(() =>
37+
buildParams({
38+
operation: 'query',
39+
projectId: 'proj',
40+
apiKey: 'key',
41+
table: 'users',
42+
functionBody: '{not valid json',
43+
functionHeaders: '["a","b"]',
44+
})
45+
).not.toThrow()
46+
})
47+
3348
it('passes method, body, and headers through for invoke_function', () => {
3449
const params = buildParams({
3550
operation: 'invoke_function',

apps/sim/blocks/blocks/supabase.ts

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,45 +1095,6 @@ Return ONLY the PostgREST filter expression - no explanations, no markdown, no e
10951095
parsedPaths = paths
10961096
}
10971097

1098-
let parsedFunctionBody
1099-
if (functionBody && typeof functionBody === 'string' && functionBody.trim()) {
1100-
try {
1101-
parsedFunctionBody = JSON.parse(functionBody)
1102-
} catch (parseError) {
1103-
const errorMsg = getErrorMessage(parseError, 'Unknown JSON error')
1104-
throw new Error(
1105-
`Invalid Edge Function body format: ${errorMsg}. Please provide a valid JSON object.`
1106-
)
1107-
}
1108-
} else if (functionBody && typeof functionBody === 'object') {
1109-
parsedFunctionBody = functionBody
1110-
}
1111-
1112-
let parsedFunctionHeaders
1113-
if (functionHeaders && typeof functionHeaders === 'string' && functionHeaders.trim()) {
1114-
try {
1115-
parsedFunctionHeaders = JSON.parse(functionHeaders)
1116-
} catch (parseError) {
1117-
const errorMsg = getErrorMessage(parseError, 'Unknown JSON error')
1118-
throw new Error(
1119-
`Invalid Edge Function headers format: ${errorMsg}. Please provide a valid JSON object.`
1120-
)
1121-
}
1122-
} else if (functionHeaders && typeof functionHeaders === 'object') {
1123-
parsedFunctionHeaders = functionHeaders
1124-
}
1125-
1126-
if (
1127-
parsedFunctionHeaders !== undefined &&
1128-
(typeof parsedFunctionHeaders !== 'object' ||
1129-
parsedFunctionHeaders === null ||
1130-
Array.isArray(parsedFunctionHeaders))
1131-
) {
1132-
throw new Error(
1133-
'Edge Function headers must be a JSON object of header name to value (not an array).'
1134-
)
1135-
}
1136-
11371098
let parsedAllowedMimeTypes
11381099
if (allowedMimeTypes && typeof allowedMimeTypes === 'string' && allowedMimeTypes.trim()) {
11391100
try {
@@ -1174,11 +1135,47 @@ Return ONLY the PostgREST filter expression - no explanations, no markdown, no e
11741135
if (method !== undefined) {
11751136
result.method = method
11761137
}
1177-
if (parsedFunctionBody !== undefined) {
1178-
result.body = parsedFunctionBody
1138+
1139+
if (functionBody && typeof functionBody === 'string' && functionBody.trim()) {
1140+
try {
1141+
result.body = JSON.parse(functionBody)
1142+
} catch (parseError) {
1143+
const errorMsg = getErrorMessage(parseError, 'Unknown JSON error')
1144+
throw new Error(
1145+
`Invalid Edge Function body format: ${errorMsg}. Please provide a valid JSON object.`
1146+
)
1147+
}
1148+
} else if (functionBody && typeof functionBody === 'object') {
1149+
result.body = functionBody
11791150
}
1180-
if (parsedFunctionHeaders !== undefined) {
1181-
result.headers = parsedFunctionHeaders
1151+
1152+
if (functionHeaders) {
1153+
let parsedHeaders
1154+
if (typeof functionHeaders === 'string' && functionHeaders.trim()) {
1155+
try {
1156+
parsedHeaders = JSON.parse(functionHeaders)
1157+
} catch (parseError) {
1158+
const errorMsg = getErrorMessage(parseError, 'Unknown JSON error')
1159+
throw new Error(
1160+
`Invalid Edge Function headers format: ${errorMsg}. Please provide a valid JSON object.`
1161+
)
1162+
}
1163+
} else if (typeof functionHeaders === 'object') {
1164+
parsedHeaders = functionHeaders
1165+
}
1166+
1167+
if (parsedHeaders !== undefined) {
1168+
if (
1169+
typeof parsedHeaders !== 'object' ||
1170+
parsedHeaders === null ||
1171+
Array.isArray(parsedHeaders)
1172+
) {
1173+
throw new Error(
1174+
'Edge Function headers must be a JSON object of header name to value (not an array).'
1175+
)
1176+
}
1177+
result.headers = parsedHeaders
1178+
}
11821179
}
11831180
}
11841181

0 commit comments

Comments
 (0)