Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 43 additions & 55 deletions plugins/openapi-schema/src/setup.factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,30 +55,25 @@ export async function generateSetup(
const data = await response.json()
const schemas: ApiSchemas = data.components.schemas

const sheets: Flatfile.SheetConfig[] = (
await Promise.all(
workbook.sheets.map(async (sheet) => {
const modelName = sheet.model
delete sheet.model
const schema = schemas[modelName]
if (!schema) {
console.error(`Schema not found for table name ${sheet.slug}`)
return
}
const fields: Flatfile.Property[] = await generateFields(
schema,
schemas
)

return {
name: modelName,
slug: modelName,
...sheet,
fields,
} as Flatfile.SheetConfig
})
)
).filter(Boolean)
const sheets: Flatfile.SheetConfig[] = workbook.sheets
.map((sheet) => {
const modelName = sheet.model
delete sheet.model
const schema = schemas[modelName]
if (!schema) {
console.error(`Schema not found for table name ${sheet.slug}`)
return
}
const fields: Flatfile.Property[] = generateFields(schema, schemas)

return {
name: modelName,
slug: modelName,
...sheet,
fields,
} as Flatfile.SheetConfig
})
.filter(Boolean)

return {
name: data.info.title,
Expand All @@ -94,65 +89,58 @@ export async function generateSetup(
}
}

export async function generateFields(
data: any,
origin: any
): Promise<Flatfile.Property[]> {
export function generateFields(data: any, origin: any): Flatfile.Property[] {
if (!data || !data.properties) return []

const fields = await Promise.all(
Object.keys(data.properties).map((key) =>
getPropertyType(
data,
data.properties[key],
key,
(data.required && data.required.includes(key)) || false,
origin
)
const fields = Object.keys(data.properties).map((key) =>
getPropertyType(
data,
data.properties[key],
key,
(data.required && data.required.includes(key)) || false,
origin
)
)
return fields.flat().filter(Boolean)
}

export async function getPropertyType(
export function getPropertyType(
schema: any,
property: any,
parentKey = '',
isRequired = false,
origin: string
): Promise<Flatfile.Property[]> {
): Flatfile.Property[] {
if (property.$ref) {
return getPropertyType(
schema,
await resolveReference(origin, property.$ref),
resolveReference(origin, property.$ref),
parentKey,
false,
origin
)
}

if (property.type === 'object' && property.properties) {
return (
await Promise.all(
Object.keys(property.properties).map(async (key) => {
return getPropertyType(
property,
property.properties[key],
parentKey ? `${parentKey}_${key}` : key,
(property.required && property.required.includes(key)) || false,
origin
)
})
)
).flat()
return Object.keys(property.properties)
.map((key) => {
return getPropertyType(
property,
property.properties[key],
parentKey ? `${parentKey}_${key}` : key,
(property.required && property.required.includes(key)) || false,
origin
)
})
.flat()
}

if (property.allOf) {
// Handle allOf construct
let combinedProperty = {}
for (const prop of property.allOf) {
if (prop.$ref) {
const resolved = await resolveReference(origin, prop.$ref)
const resolved = resolveReference(origin, prop.$ref)
combinedProperty = { ...combinedProperty, ...resolved }
} else {
combinedProperty = { ...combinedProperty, ...prop }
Expand Down Expand Up @@ -221,7 +209,7 @@ export async function getPropertyType(
return fieldTypes[fieldConfig.type] ? [fieldConfig] : []
}

export async function resolveReference(schema: any, ref: string): Promise<any> {
export function resolveReference(schema: any, ref: string): any {
const segments = ref.split('/')
const modelName = segments[segments.length - 1]

Expand Down