diff --git a/blocks/flag.ts b/blocks/flag.ts index f4937d5b..ca480c74 100644 --- a/blocks/flag.ts +++ b/blocks/flag.ts @@ -5,6 +5,7 @@ import JsonViewer from "../components/JsonViewer.tsx"; import type { Block, BlockModule, InstanceOf } from "../engine/block.ts"; import { isDeferred } from "../engine/core/resolver.ts"; import { type Device, deviceOf } from "../utils/userAgent.ts"; + export type Flag = InstanceOf; export interface FlagObj { @@ -64,7 +65,7 @@ const flagBlock: Block> = { >(func: { default: FlagFunc; }) => - ($live: TConfig, { request }: HttpContext) => { + async ($live: TConfig, { request }: HttpContext) => { const flag = func.default($live); let device: Device | null = null; const ctx = { @@ -75,12 +76,16 @@ const flagBlock: Block> = { }, }; if (isMultivariate(flag)) { - const value = ((flag?.variants ?? []).find((variant) => - typeof variant?.rule === "function" && variant?.rule(ctx) - ) as Variant)?.value ?? - ((flag?.variants ?? [])[flag?.variants?.length - 1] as Variant) - ?.value; - return isDeferred(value) ? value() : value; + const variants = flag.variants || []; + + const results = await Promise.all( + variants.map((variant) => + typeof variant?.rule === "function" ? variant.rule(ctx) : false + ), + ); + const match = variants.find((_, index) => results[index]) || variants[0]; + + return isDeferred(match?.value) ? match?.value() : match?.value; } const matchValue = typeof flag?.matcher === "function" ? flag.matcher(ctx)