@@ -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