2
0
Files
bot/apps/builder/src/features/blocks/integrations/webhook/helpers/getDeepKeys.ts

56 lines
1.4 KiB
TypeScript
Raw Normal View History

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const getDeepKeys = (obj: any): string[] => {
let keys: string[] = []
for (const key in obj) {
if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
const subkeys = getDeepKeys(obj[key])
keys = keys.concat(
subkeys.map(function (subkey) {
return key + parseKey(subkey)
})
)
} else if (Array.isArray(obj[key])) {
if (obj[key].length === 0) continue
if (typeof obj[key][0] !== 'object') {
keys.push(key)
keys = keys.concat(
obj[key].map((_: string, index: number) => `${key}[${index}]`)
)
continue
}
const subkeys = getDeepKeys(obj[key][0])
if (obj[key].length > 1) {
keys = keys.concat(
subkeys.map(function (subkey) {
return `${key}.flatMap(item => item${parseKey(subkey)})`
})
)
}
keys = keys.concat(
subkeys.map(function (subkey) {
return `${key}[0]${parseKey(subkey)}`
})
)
} else {
keys.push(key)
}
}
return keys
}
const parseKey = (key: string) => {
if (
(key.includes(' ') ||
key.includes('-') ||
!isNaN(key as unknown as number)) &&
!key.includes('.flatMap(item => item') &&
!key.includes("['") &&
!key.includes("']")
) {
return `['${key}']`
}
return `.${key}`
}