diff --git a/.changeset/shiny-pets-listen.md b/.changeset/shiny-pets-listen.md new file mode 100644 index 0000000000..f4dce2adb3 --- /dev/null +++ b/.changeset/shiny-pets-listen.md @@ -0,0 +1,5 @@ +--- +"@medusajs/workflows": patch +--- + +feat(workflows): Improve typings diff --git a/packages/workflows/src/handlers/attach-inventory-items.ts b/packages/workflows/src/handlers/attach-inventory-items.ts index c366aaa4ba..732432eeb3 100644 --- a/packages/workflows/src/handlers/attach-inventory-items.ts +++ b/packages/workflows/src/handlers/attach-inventory-items.ts @@ -1,10 +1,10 @@ import { InventoryItemDTO, ProductTypes } from "@medusajs/types" import { InputAlias } from "../definitions" -import { PipelineHandlerResult, WorkflowArguments } from "../helper" +import { WorkflowArguments } from "../helper" import { ProductVariantInventoryItem } from "@medusajs/medusa/src" -export async function attachInventoryItems({ +export async function attachInventoryItems({ container, data, }: WorkflowArguments & { @@ -12,13 +12,13 @@ export async function attachInventoryItems({ variant: ProductTypes.ProductVariantDTO [InputAlias.InventoryItems]: InventoryItemDTO }[] -}): Promise> { +}): Promise { const manager = container.resolve("manager") const productVariantInventoryService = container .resolve("productVariantInventoryService") .withTransaction(manager) - return (await Promise.all( + return await Promise.all( data .filter((d) => d) .map(async ({ variant, [InputAlias.InventoryItems]: inventoryItem }) => { @@ -27,5 +27,5 @@ export async function attachInventoryItems({ inventoryItem.id ) }) - )) as PipelineHandlerResult + ) } diff --git a/packages/workflows/src/handlers/create-inventory-items.ts b/packages/workflows/src/handlers/create-inventory-items.ts index cbb55c944f..9336036db9 100644 --- a/packages/workflows/src/handlers/create-inventory-items.ts +++ b/packages/workflows/src/handlers/create-inventory-items.ts @@ -5,18 +5,16 @@ import { } from "@medusajs/types" import { InputAlias } from "../definitions" -import { PipelineHandlerResult, WorkflowArguments } from "../helper" +import { WorkflowArguments } from "../helper" -export async function createInventoryItems< - T = { variant: any; inventoryItem: InventoryItemDTO }[] ->({ +export async function createInventoryItems({ container, data, }: WorkflowArguments & { data: { [InputAlias.Products]: ProductTypes.ProductDTO[] } -}): Promise> { +}): Promise<{ variant: any; inventoryItem: InventoryItemDTO }[]> { const manager = container.resolve("manager") const inventoryService: IInventoryService = container.resolve("inventoryService") @@ -33,7 +31,7 @@ export async function createInventoryItems< [] ) - return (await Promise.all( + return await Promise.all( variants.map(async (variant) => { if (!variant.manage_inventory) { return @@ -56,5 +54,5 @@ export async function createInventoryItems< return { variant, inventoryItem } }) - )) as PipelineHandlerResult + ) } diff --git a/packages/workflows/src/handlers/create-products.ts b/packages/workflows/src/handlers/create-products.ts index bce090e289..79667249e5 100644 --- a/packages/workflows/src/handlers/create-products.ts +++ b/packages/workflows/src/handlers/create-products.ts @@ -1,14 +1,14 @@ import { InputAlias } from "../definitions" import { ProductTypes } from "@medusajs/types" -import { PipelineHandlerResult, WorkflowArguments } from "../helper" +import { WorkflowArguments } from "../helper" -export async function createProducts({ +export async function createProducts({ container, context, data, }: WorkflowArguments & { data: { [InputAlias.Products]: ProductTypes.CreateProductDTO[] } -}): Promise> { +}): Promise { const productModuleService = container.resolve("productModuleService") return await productModuleService.create(data[InputAlias.Products], context) diff --git a/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts b/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts index 0a041cc35a..009378b01d 100644 --- a/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts +++ b/packages/workflows/src/handlers/middlewares/create-products-prepare-data.ts @@ -1,7 +1,6 @@ import { InputAlias } from "../../definitions" -import { PipelineHandlerResult } from "../../helper" -export function createProductsPrepareData({ data }): PipelineHandlerResult { +export function createProductsPrepareData({ data }) { return { alias: InputAlias.Products as string, value: [{}], diff --git a/packages/workflows/src/handlers/remove-inventory-items.ts b/packages/workflows/src/handlers/remove-inventory-items.ts index 5ee6baef07..530de4f2f4 100644 --- a/packages/workflows/src/handlers/remove-inventory-items.ts +++ b/packages/workflows/src/handlers/remove-inventory-items.ts @@ -1,26 +1,26 @@ import { InventoryItemDTO } from "@medusajs/types" import { InputAlias } from "../definitions" -import { PipelineHandlerResult, WorkflowArguments } from "../helper" +import { WorkflowArguments } from "../helper" -export async function removeInventoryItems({ +export async function removeInventoryItems({ container, data, }: WorkflowArguments & { data: { [InputAlias.InventoryItems]: InventoryItemDTO }[] -}): Promise> { +}) { const manager = container.resolve("manager") const inventoryService = container.resolve("inventoryService") const context = { transactionManager: manager } - return (await Promise.all( + return await Promise.all( data.map(async ({ [InputAlias.InventoryItems]: inventoryItem }) => { return await inventoryService!.deleteInventoryItem( inventoryItem.id, context ) }) - )) as PipelineHandlerResult + ) } diff --git a/packages/workflows/src/handlers/remove-products.ts b/packages/workflows/src/handlers/remove-products.ts index 2faf072422..274bd97e01 100644 --- a/packages/workflows/src/handlers/remove-products.ts +++ b/packages/workflows/src/handlers/remove-products.ts @@ -1,15 +1,15 @@ import { InputAlias } from "../definitions" import { ProductTypes } from "@medusajs/types" -import { PipelineHandlerResult, WorkflowArguments } from "../helper" +import { WorkflowArguments } from "../helper" -export async function removeProducts({ +export async function removeProducts({ container, data, }: WorkflowArguments & { data: { [InputAlias.Products]: ProductTypes.ProductDTO[] } -}): Promise> { +}) { const productModuleService = container.resolve("productModuleService") return await productModuleService.softDelete( data[InputAlias.Products].map((p) => p.id) diff --git a/packages/workflows/src/helper/pipe.ts b/packages/workflows/src/helper/pipe.ts index 634e7bbf59..d471cd0584 100644 --- a/packages/workflows/src/helper/pipe.ts +++ b/packages/workflows/src/helper/pipe.ts @@ -22,25 +22,23 @@ interface PipelineInput { compensate?: WorkflowStepMiddlewareInput | WorkflowStepMiddlewareInput[] } -export type WorkflowArguments = { +export type WorkflowArguments = { container: MedusaContainer payload: unknown - data: any + data: T metadata: TransactionMetadata context: Context | SharedContext } -export type PipelineHandlerResult = T extends undefined - ? WorkflowStepMiddlewareReturn | WorkflowStepMiddlewareReturn[] - : T - export type PipelineHandler = ( args: WorkflowArguments -) => PipelineHandlerResult | Promise> +) => T extends undefined + ? Promise + : T -export function pipe( +export function pipe( input: PipelineInput, - ...functions: PipelineHandler[] + ...functions: [...PipelineHandler[], PipelineHandler] ): WorkflowStepHandler { return async ({ container, @@ -92,8 +90,10 @@ export function pipe( data[action.alias] = action.value } } - } else if (result?.alias) { - data[result.alias] = result.value + } else if ((result as WorkflowStepMiddlewareReturn)?.alias) { + data[(result as WorkflowStepMiddlewareReturn).alias] = ( + result as WorkflowStepMiddlewareReturn + ).value } return result diff --git a/packages/workflows/src/helper/workflow-export.ts b/packages/workflows/src/helper/workflow-export.ts index b04a4a3887..b77718ba87 100644 --- a/packages/workflows/src/helper/workflow-export.ts +++ b/packages/workflows/src/helper/workflow-export.ts @@ -56,6 +56,9 @@ export const exportWorkflow = ( resultFrom: defaultResult, } ) => { + resultFrom ??= defaultResult + throwOnError ??= true + const transaction = await originalRun( context?.transactionId ?? ulid(), input,