Skip to content

Commit 6b161a7

Browse files
committed
fix(square): validate parsed JSON field shapes (array vs object)
parseJsonField now enforces the expected shape so a valid-but-wrong-type value (e.g. a JSON string where an array is expected for locationIds/objectTypes/ paymentIds/catalogObjectIds/states, or a non-object for order/invoice/etc.) fails locally with a clear message instead of a confusing Square API error.
1 parent 580e981 commit 6b161a7

1 file changed

Lines changed: 37 additions & 19 deletions

File tree

apps/sim/blocks/blocks/square.ts

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -708,29 +708,47 @@ export const SquareBlock: BlockConfig<SquareResponse> = {
708708
const normalizedFile = normalizeFileInput(params.file, { single: true })
709709

710710
// Parse a JSON-typed input, naming the field in any error so the user
711-
// knows exactly which input to fix.
712-
const parseJsonField = (value: unknown, field: string): unknown => {
711+
// knows exactly which input to fix, and validating the parsed shape so a
712+
// valid-but-wrong-type value (e.g. a string where an array is expected)
713+
// fails locally instead of as a confusing Square API error.
714+
const parseJsonField = (
715+
value: unknown,
716+
field: string,
717+
expected: 'object' | 'array'
718+
): unknown => {
713719
if (value === undefined || value === null || value === '') return undefined
714-
if (typeof value !== 'string') return value
715-
try {
716-
return JSON.parse(value)
717-
} catch (error) {
718-
throw new Error(
719-
`Invalid JSON in "${field}": ${error instanceof Error ? error.message : 'unknown error'}`
720-
)
720+
let parsed: unknown = value
721+
if (typeof value === 'string') {
722+
try {
723+
parsed = JSON.parse(value)
724+
} catch (error) {
725+
throw new Error(
726+
`Invalid JSON in "${field}": ${error instanceof Error ? error.message : 'unknown error'}`
727+
)
728+
}
721729
}
730+
if (expected === 'array' && !Array.isArray(parsed)) {
731+
throw new Error(`"${field}" must be a JSON array`)
732+
}
733+
if (
734+
expected === 'object' &&
735+
(parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
736+
) {
737+
throw new Error(`"${field}" must be a JSON object`)
738+
}
739+
return parsed
722740
}
723741

724-
const parsedAddress = parseJsonField(address, 'address')
725-
const parsedQuery = parseJsonField(query, 'query')
726-
const parsedOrder = parseJsonField(order, 'order')
727-
const parsedInvoice = parseJsonField(invoice, 'invoice')
728-
const parsedObject = parseJsonField(object, 'object')
729-
const parsedLocationIds = parseJsonField(locationIds, 'locationIds')
730-
const parsedObjectTypes = parseJsonField(objectTypes, 'objectTypes')
731-
const parsedPaymentIds = parseJsonField(paymentIds, 'paymentIds')
732-
const parsedCatalogObjectIds = parseJsonField(catalogObjectIds, 'catalogObjectIds')
733-
const parsedStates = parseJsonField(states, 'states')
742+
const parsedAddress = parseJsonField(address, 'address', 'object')
743+
const parsedQuery = parseJsonField(query, 'query', 'object')
744+
const parsedOrder = parseJsonField(order, 'order', 'object')
745+
const parsedInvoice = parseJsonField(invoice, 'invoice', 'object')
746+
const parsedObject = parseJsonField(object, 'object', 'object')
747+
const parsedLocationIds = parseJsonField(locationIds, 'locationIds', 'array')
748+
const parsedObjectTypes = parseJsonField(objectTypes, 'objectTypes', 'array')
749+
const parsedPaymentIds = parseJsonField(paymentIds, 'paymentIds', 'array')
750+
const parsedCatalogObjectIds = parseJsonField(catalogObjectIds, 'catalogObjectIds', 'array')
751+
const parsedStates = parseJsonField(states, 'states', 'array')
734752

735753
// Coerce a numeric input, failing locally with a clear message rather than
736754
// forwarding NaN to Square when the value is non-numeric.

0 commit comments

Comments
 (0)