(value: any, expected: string, received: string)
| 2009 | |
| 2010 | // Helper function to convert value to expected type |
| 2011 | const convertValue = (value: any, expected: string, received: string): any => { |
| 2012 | // Expected string |
| 2013 | if (expected === 'string') { |
| 2014 | if (received === 'object' || received === 'array') { |
| 2015 | return JSON.stringify(value) |
| 2016 | } |
| 2017 | if (received === 'number' || received === 'boolean') { |
| 2018 | return String(value) |
| 2019 | } |
| 2020 | } |
| 2021 | // Expected number |
| 2022 | else if (expected === 'number') { |
| 2023 | if (received === 'string') { |
| 2024 | const parsed = parseFloat(value) |
| 2025 | if (!isNaN(parsed)) { |
| 2026 | return parsed |
| 2027 | } |
| 2028 | } |
| 2029 | if (received === 'boolean') { |
| 2030 | return value ? 1 : 0 |
| 2031 | } |
| 2032 | } |
| 2033 | // Expected boolean |
| 2034 | else if (expected === 'boolean') { |
| 2035 | if (received === 'string') { |
| 2036 | const lower = String(value).toLowerCase().trim() |
| 2037 | if (lower === 'true' || lower === '1' || lower === 'yes') { |
| 2038 | return true |
| 2039 | } |
| 2040 | if (lower === 'false' || lower === '0' || lower === 'no') { |
| 2041 | return false |
| 2042 | } |
| 2043 | } |
| 2044 | if (received === 'number') { |
| 2045 | return value !== 0 |
| 2046 | } |
| 2047 | } |
| 2048 | // Expected object |
| 2049 | else if (expected === 'object') { |
| 2050 | if (received === 'string') { |
| 2051 | try { |
| 2052 | const parsed = JSON.parse(value) |
| 2053 | if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) { |
| 2054 | return parsed |
| 2055 | } |
| 2056 | } catch { |
| 2057 | // Invalid JSON, return undefined to skip conversion |
| 2058 | } |
| 2059 | } |
| 2060 | } |
| 2061 | // Expected array |
| 2062 | else if (expected === 'array') { |
| 2063 | if (received === 'string') { |
| 2064 | try { |
| 2065 | const parsed = JSON.parse(value) |
| 2066 | if (Array.isArray(parsed)) { |
| 2067 | return parsed |
| 2068 | } |
no test coverage detected