Pass types through context callbacks.

This commit is contained in:
Sam Rose 2023-11-08 16:17:24 +00:00
parent 47292b8ab4
commit e3a4c34f8d
No known key found for this signature in database
7 changed files with 23 additions and 22 deletions

View File

@ -19,7 +19,7 @@ async function populateFromDB(appId: string) {
return doWithDB(
appId,
(db: Database) => {
return db.get(DocumentType.APP_METADATA)
return db.get<App>(DocumentType.APP_METADATA)
},
{ skip_setup: true }
)

View File

@ -4,7 +4,7 @@ import { ContextMap } from "./types"
export default class Context {
static storage = new AsyncLocalStorage<ContextMap>()
static run(context: ContextMap, func: any) {
static run<T>(context: ContextMap, func: () => T) {
return Context.storage.run(context, () => func())
}

View File

@ -98,17 +98,17 @@ function updateContext(updates: ContextMap): ContextMap {
return context
}
async function newContext(updates: ContextMap, task: any) {
async function newContext<T>(updates: ContextMap, task: () => T) {
// see if there already is a context setup
let context: ContextMap = updateContext(updates)
return Context.run(context, task)
}
export async function doInAutomationContext(params: {
export async function doInAutomationContext<T>(params: {
appId: string
automationId: string
task: any
}): Promise<any> {
task: () => T
}): Promise<T> {
const tenantId = getTenantIDFromAppID(params.appId)
return newContext(
{
@ -144,10 +144,10 @@ export async function doInTenant<T>(
return newContext(updates, task)
}
export async function doInAppContext(
export async function doInAppContext<T>(
appId: string | null,
task: any
): Promise<any> {
task: () => T
): Promise<T> {
if (!appId && !env.isTest()) {
throw new Error("appId is required")
}
@ -165,10 +165,10 @@ export async function doInAppContext(
return newContext(updates, task)
}
export async function doInIdentityContext(
export async function doInIdentityContext<T>(
identity: IdentityContext,
task: any
): Promise<any> {
task: () => T
): Promise<T> {
if (!identity) {
throw new Error("identity is required")
}

View File

@ -1,7 +1,7 @@
import { directCouchQuery, DatabaseImpl } from "./couch"
import { CouchFindOptions, Database } from "@budibase/types"
import { CouchFindOptions, Database, DatabaseOpts } from "@budibase/types"
export function getDB(dbName: string, opts?: any): Database {
export function getDB(dbName: string, opts?: DatabaseOpts): Database {
return new DatabaseImpl(dbName, opts)
}
@ -11,7 +11,7 @@ export function getDB(dbName: string, opts?: any): Database {
export async function doWithDB<T>(
dbName: string,
cb: (db: Database) => Promise<T>,
opts = {}
opts?: DatabaseOpts
) {
const db = getDB(dbName, opts)
// need this to be async so that we can correctly close DB after all

View File

@ -94,7 +94,7 @@ export async function externalTrigger(
automation: Automation,
params: { fields: Record<string, any>; timeout?: number },
{ getResponses }: { getResponses?: boolean } = {}
) {
): Promise<any> {
if (
automation.definition != null &&
automation.definition.trigger != null &&

View File

@ -510,13 +510,14 @@ class TestConfiguration {
// create dev app
// clear any old app
this.appId = null
await context.doInAppContext(null, async () => {
this.app = await this._req(
this.app = await context.doInAppContext(null, async () => {
const app = await this._req(
{ name: appName },
null,
controllers.app.create
)
this.appId = this.app?.appId!
this.appId = app.appId!
return app
})
return await context.doInAppContext(this.appId, async () => {
// create production app
@ -525,7 +526,7 @@ class TestConfiguration {
this.allApps.push(this.prodApp)
this.allApps.push(this.app)
return this.app
return this.app!
})
}
@ -537,7 +538,7 @@ class TestConfiguration {
return context.doInAppContext(prodAppId, async () => {
const db = context.getProdAppDB()
return await db.get(dbCore.DocumentType.APP_METADATA)
return await db.get<App>(dbCore.DocumentType.APP_METADATA)
})
}

View File

@ -241,7 +241,7 @@ class Orchestrator {
})
}
async execute() {
async execute(): Promise<any> {
// this will retrieve from context created at start of thread
this._context.env = await sdkUtils.getEnvironmentVariables()
let automation = this._automation