Skip to content

Commit

Permalink
fix: async/await bug (#685)
Browse files Browse the repository at this point in the history
* fix: async/await bug

* tighten types

* cleanup

* import types
  • Loading branch information
carlbrugger authored Oct 28, 2024
1 parent 77df987 commit aa6c10b
Show file tree
Hide file tree
Showing 14 changed files with 154 additions and 114 deletions.
9 changes: 9 additions & 0 deletions .changeset/eleven-badgers-shout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@flatfile/plugin-convert-sql-ddl': patch
'@flatfile/plugin-convert-openapi-schema': patch
'@flatfile/plugin-convert-json-schema': patch
'@flatfile/plugin-convert-yaml-schema': patch
'@flatfile/plugin-connect-via-merge': patch
---

This release fixes an async/await bug
169 changes: 107 additions & 62 deletions flatfilers/sandbox/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,68 +1,113 @@
import api, { Flatfile } from '@flatfile/api'
import type { FlatfileListener } from '@flatfile/listener'
import { importLLMRecords } from '@flatfile/plugin-import-llm-records'
import { configureSpace } from '@flatfile/plugin-space-configure'
import {
PartialSheetConfig,
PartialWorkbookConfig,
configureSpaceWithJsonSchema,
fetchExternalReference,
} from '@flatfile/plugin-convert-json-schema'

export default async function (listener: FlatfileListener) {
listener.use(
importLLMRecords({
llmSecretName: 'OPENAI_API_KEY',
model: 'gpt-4o',
job: 'generateExampleRecords',
numberOfRecords: 10,
debug: true,
})
)
listener.use(
configureSpace({
workbooks: [
{
name: 'Sandbox',
sheets: [
{
name: 'Sales',
slug: 'sales',
fields: [
{
key: 'date',
type: 'string',
label: 'Date',
},
{
key: 'product',
type: 'string',
label: 'Product',
},
{
key: 'category',
type: 'string',
label: 'Category',
},
{
key: 'region',
type: 'string',
label: 'Region',
},
{
key: 'salesAmount',
type: 'number',
label: 'Sales Amount',
},
],
actions: [
{
operation: 'generateExampleRecords',
label: 'Generate Example Records',
description:
'This custom action code generates example records using Anthropic.',
primary: false,
mode: 'foreground',
type: 'string',
},
],
},
],
export default function (listener: FlatfileListener) {
const workbookActions: Flatfile.Action[] = [
{
operation: 'submitAction',
mode: 'foreground',
label: 'Submit data',
type: 'string',
description: 'Submit this data to a webhook.',
primary: true,
},
]

const sheetActions: Flatfile.Action[] = [
{
operation: 'duplicateSheet',
mode: 'foreground',
label: 'Duplicate',
description: 'Duplicate this sheet.',
primary: true,
},
]

const personModel: PartialSheetConfig = {
source: {
$id: 'https://raw.githubusercontent.com/FlatFilers/flatfile-docs-kitchen-sink/main/typescript/dynamic-configurations-json-schema/example-schemas/person.json',
$schema: 'https://json-schema.org/draft/2020-12/schema',
title: 'Person',
type: 'object',
properties: {
firstName: {
type: 'string',
description: "The person's first name.",
},
lastName: {
type: 'string',
description: "The person's last name.",
},
age: {
description:
'Age in years which must be equal to or greater than zero.',
type: 'integer',
minimum: 0,
},
],
},
},
slug: 'person',
name: 'Person',
actions: sheetActions,
}

const customerModel: PartialSheetConfig = {
source:
'https://raw.githubusercontent.com/FlatFilers/flatfile-docs-kitchen-sink/main/typescript/dynamic-configurations-json-schema/example-schemas/customer.json',
slug: 'customer',
name: 'Customer',
actions: sheetActions,
}

const productModel: PartialSheetConfig = {
source: () =>
fetchExternalReference(
'https://raw.githubusercontent.com/FlatFilers/flatfile-docs-kitchen-sink/main/typescript/dynamic-configurations-json-schema/example-schemas/product.json'
),
slug: 'product',
name: 'Product',
actions: sheetActions,
}

const workbookOne: PartialWorkbookConfig = {
name: 'Store Workbook',
sheets: [customerModel, productModel],
actions: workbookActions,
}

const workbookTwo: PartialWorkbookConfig = {
name: 'Person Workbook',
sheets: [personModel],
actions: workbookActions,
}

const callback = async (event, workbookIds, tick) => {
const { spaceId } = event.context
await api.documents.create(spaceId, {
title: 'Welcome',
body: `<div>
<h1>Welcome!</h1>
<h2>To get started, follow these steps:</h2>
<h2>1. Step One</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
<h3>Remember, if you need any assistance, you can always refer back to this page by clicking "Welcome" in the left-hand sidebar!</h3>
</div>`,
})
await tick(80, 'Document created')
}

listener.use(
configureSpaceWithJsonSchema(
{
workbooks: [workbookOne, workbookTwo],
},
callback
)
)
}
4 changes: 4 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 2 additions & 6 deletions plugins/graphql-schema/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Flatfile } from '@flatfile/api'
import type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'
import type { FlatfileEvent } from '@flatfile/listener'
import { configureSpace } from '@flatfile/plugin-space-configure'
import { generateSetup } from './setup.factory'
import type { GraphQLSetupFactory } from './types'
Expand All @@ -12,9 +12,5 @@ export function configureSpaceGraphQL(
tick: (progress: number, message?: string) => Promise<Flatfile.JobResponse>
) => any | Promise<any>
) {
return async (listener: FlatfileListener) => {
listener.use(
configureSpace((event) => generateSetup(setupFactory, event), callback)
)
}
return configureSpace((event) => generateSetup(setupFactory, event), callback)
}
8 changes: 3 additions & 5 deletions plugins/json-schema/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Flatfile } from '@flatfile/api'
import type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'
import type { FlatfileEvent } from '@flatfile/listener'
import { configureSpace } from '@flatfile/plugin-space-configure'
import { JsonSetupFactory, generateSetup } from './setup.factory'
import { generateSetup, type JsonSetupFactory } from './setup.factory'

export function configureSpaceWithJsonSchema(
setupFactory: JsonSetupFactory,
Expand All @@ -11,9 +11,7 @@ export function configureSpaceWithJsonSchema(
tick: (progress?: number, message?: string) => Promise<Flatfile.JobResponse>
) => any | Promise<any>
) {
return async function (listener: FlatfileListener) {
listener.use(configureSpace(await generateSetup(setupFactory), callback))
}
return configureSpace(() => generateSetup(setupFactory), callback)
}

export * from './setup.factory'
9 changes: 4 additions & 5 deletions plugins/json-schema/src/setup.factory.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Flatfile } from '@flatfile/api'
import { SetupFactory } from '@flatfile/plugin-space-configure'
import type { Flatfile } from '@flatfile/api'
import type { Setup } from '@flatfile/plugin-space-configure'
import fetch from 'cross-fetch'

export type JsonSetupFactory = {
Expand All @@ -20,13 +20,12 @@ export interface PartialSheetConfig

export async function generateSetup(
setupFactory: JsonSetupFactory
): Promise<SetupFactory> {
): Promise<Setup> {
const workbooks = await Promise.all(
setupFactory.workbooks.map(async (workbook) => {
const sheets = await Promise.all(
workbook.sheets.map(async (partialSheetConfig: PartialSheetConfig) => {
const model = await getModel(partialSheetConfig.source)
delete partialSheetConfig.source
const fields = await generateFields(model)

return {
Expand Down Expand Up @@ -72,7 +71,7 @@ function isValidUrl(url: string) {
}

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

const getOrigin = (url: string) => {
try {
Expand Down
3 changes: 3 additions & 0 deletions plugins/merge-connection/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@
"@flatfile/plugin-job-handler": "^0.6.1",
"@mergeapi/merge-node-client": "^1.0.4"
},
"devDependencies": {
"@flatfile/plugin-space-configure": "^0.6.1"
},
"peerDependencies": {
"@flatfile/api": "^1.9.19",
"@flatfile/listener": "^1.1.0"
Expand Down
7 changes: 3 additions & 4 deletions plugins/merge-connection/src/create.workbook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import type { Flatfile } from '@flatfile/api'
import { FlatfileClient } from '@flatfile/api'
import type { FlatfileEvent } from '@flatfile/listener'
import {
PartialSheetConfig,
SetupFactory,
type PartialSheetConfig,
generateSetup,
} from '@flatfile/plugin-convert-openapi-schema'
import type { Setup } from '@flatfile/plugin-space-configure'
import { MergeClient } from '@mergeapi/merge-node-client'
import {
CATEGORY_MODELS,
Expand Down Expand Up @@ -103,15 +103,14 @@ export function handleCreateConnectedWorkbooks() {
}
})

const setup: SetupFactory = await generateSetup({
const config: Setup = await generateSetup({
workbooks: [
{
source: `https://api.merge.dev/api/${category}/v1/schema`,
sheets,
},
],
})
const config = typeof setup === 'function' ? await setup(event) : setup
config.workbooks.map((workbook) => {
workbook.sheets.map((sheet) => {
sheet.fields.map((field) => {
Expand Down
8 changes: 3 additions & 5 deletions plugins/openapi-schema/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Flatfile } from '@flatfile/api'
import type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'
import type { FlatfileEvent } from '@flatfile/listener'
import { configureSpace } from '@flatfile/plugin-space-configure'
import { OpenAPISetupFactory, generateSetup } from './setup.factory'
import { generateSetup, type OpenAPISetupFactory } from './setup.factory'

export function configureSpaceWithOpenAPI(
setupFactory: OpenAPISetupFactory,
Expand All @@ -11,9 +11,7 @@ export function configureSpaceWithOpenAPI(
tick: (progress?: number, message?: string) => Promise<Flatfile.JobResponse>
) => any | Promise<any>
) {
return async function (listener: FlatfileListener) {
listener.use(configureSpace(await generateSetup(setupFactory), callback))
}
return configureSpace(() => generateSetup(setupFactory), callback)
}

export type { SetupFactory } from '@flatfile/plugin-space-configure'
Expand Down
10 changes: 4 additions & 6 deletions plugins/openapi-schema/src/setup.factory.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Flatfile } from '@flatfile/api'
import { PartialWb, SetupFactory } from '@flatfile/plugin-space-configure'
import type { Flatfile } from '@flatfile/api'
import type { PartialWb, Setup } from '@flatfile/plugin-space-configure'
import fetch from 'cross-fetch'

export type OpenAPISetupFactory = {
Expand Down Expand Up @@ -40,7 +40,7 @@ interface ApiSchemas {

export async function generateSetup(
setupFactory: OpenAPISetupFactory
): Promise<SetupFactory> {
): Promise<Setup> {
try {
const workbooks: PartialWb[] = await Promise.all(
setupFactory.workbooks.map(async (workbook) => {
Expand Down Expand Up @@ -80,8 +80,6 @@ export async function generateSetup(
)
).filter(Boolean)

delete workbook.source

return {
name: data.info.title,
...workbook,
Expand All @@ -100,7 +98,7 @@ export async function generateFields(
data: any,
origin: any
): Promise<Flatfile.Property[]> {
if (!data.properties) return []
if (!data || !data.properties) return []

const fields = await Promise.all(
Object.keys(data.properties).map((key) =>
Expand Down
10 changes: 4 additions & 6 deletions plugins/sql-ddl-converter/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
import type { Flatfile } from '@flatfile/api'
import type { FlatfileEvent, FlatfileListener } from '@flatfile/listener'
import type { FlatfileEvent } from '@flatfile/listener'
import { configureSpace } from '@flatfile/plugin-space-configure'
import { SqlSetupFactory, generateSetup } from './setup.factory'
import { generateSetup, type SqlSetupFactory } from './setup.factory'

export function configureSpaceWithSqlDDL(
setup: SqlSetupFactory,
setupFactory: SqlSetupFactory,
callback?: (
event: FlatfileEvent,
workbookIds: string[],
tick: (progress?: number, message?: string) => Promise<Flatfile.JobResponse>
) => any | Promise<any>
) {
return async function (listener: FlatfileListener) {
listener.use(configureSpace(await generateSetup(setup), callback))
}
return configureSpace(() => generateSetup(setupFactory), callback)
}

export * from './setup.factory'
Loading

0 comments on commit aa6c10b

Please sign in to comment.