Files
supabase/apps/studio/components/interfaces/Database/Wrappers/Wrappers.utils.ts
2024-03-04 20:48:22 +08:00

99 lines
3.1 KiB
TypeScript

import { WRAPPER_HANDLERS } from './Wrappers.constants'
import type { WrapperMeta } from './Wrappers.types'
export const makeValidateRequired = (options: { name: string; required: boolean }[]) => {
const requiredOptionsSet = new Set(
options.filter((option) => option.required).map((option) => option.name)
)
const requiredArrayOptionsSet = new Set(
Array.from(requiredOptionsSet).filter((option) => option.includes('.'))
)
const requiredArrayOptions = Array.from(requiredArrayOptionsSet)
return (values: any) => {
const errors = Object.fromEntries(
Object.entries(values)
.flatMap(([key, value]) =>
Array.isArray(value)
? [[key, value], ...value.map((v, i) => [`${key}.${i}`, v])]
: [[key, value]]
)
.filter(([_key, value]) => {
const [key, idx] = _key.split('.')
if (
idx !== undefined &&
requiredOptionsSet.has(key) &&
Object.keys(value).some((subKey) => requiredArrayOptionsSet.has(`${key}.${subKey}`))
) {
const arrayOption = requiredArrayOptions.find((option) => option.startsWith(`${key}.`))
if (arrayOption) {
const subKey = arrayOption.split('.')[1]
return !value[subKey]
}
return false
}
return requiredOptionsSet.has(key) && (Array.isArray(value) ? value.length < 1 : !value)
})
.map(([key]) => {
if (key === 'table_name') return [key, 'Please provide a name for your table']
else if (key === 'columns') return [key, 'Please select at least one column']
else return [key, 'This field is required']
})
)
return errors
}
}
export const formatWrapperTables = (wrapper: any, wrapperMeta?: WrapperMeta) => {
const tables = wrapper?.tables ?? []
return tables.map((table: any) => {
let index: number = 0
const options = Object.fromEntries(table.options.map((option: string) => option.split('=')))
switch (wrapper.handler) {
case WRAPPER_HANDLERS.STRIPE:
index =
wrapperMeta?.tables.findIndex(
(x) => x.options.find((x) => x.name === 'object')?.defaultValue === options.object
) ?? 0
break
case WRAPPER_HANDLERS.FIREBASE:
if (options.object === 'auth/users') {
index =
wrapperMeta?.tables.findIndex((x) =>
x.options.find((x) => x.defaultValue === 'auth/users')
) ?? 0
} else {
index = wrapperMeta?.tables.findIndex((x) => x.label === 'Firestore Collection') ?? 0
}
break
case WRAPPER_HANDLERS.S3:
case WRAPPER_HANDLERS.AIRTABLE:
case WRAPPER_HANDLERS.LOGFLARE:
case WRAPPER_HANDLERS.BIG_QUERY:
case WRAPPER_HANDLERS.CLICK_HOUSE:
break
}
return {
...options,
index,
columns: table.columns,
is_new_schema: false,
schema: table.schema,
schema_name: table.schema,
table_name: table.name,
}
})
}
export const convertKVStringArrayToJson = (values: string[]) => {
return Object.fromEntries(values.map((value) => value.split('=')))
}