Skip to content

Commit 7ce355d

Browse files
authored
Merge pull request #16010 from Budibase/debug-ui
Feature flag debug UI
2 parents 7ded003 + a5eefbf commit 7ce355d

File tree

24 files changed

+371
-115
lines changed

24 files changed

+371
-115
lines changed

packages/backend-core/src/constants/misc.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export enum Cookie {
99
ACCOUNT_RETURN_URL = "budibase:account:returnurl",
1010
DatasourceAuth = "budibase:datasourceauth",
1111
OIDC_CONFIG = "budibase:oidc:config",
12+
FeatureFlags = "budibase:featureflags",
1213
}
1314

1415
export { Header } from "@budibase/shared-core"

packages/backend-core/src/context/mainContext.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,17 @@ export function setFeatureFlags(key: string, value: Record<string, boolean>) {
460460
context.featureFlagCache[key] = value
461461
}
462462

463+
export function getFeatureFlagOverrides(): Record<string, boolean> {
464+
return getCurrentContext()?.featureFlagOverrides || {}
465+
}
466+
467+
export async function doInFeatureFlagOverrideContext<T>(
468+
value: Record<string, boolean>,
469+
callback: () => Promise<T>
470+
) {
471+
return await newContext({ featureFlagOverrides: value }, callback)
472+
}
473+
463474
export function getTableForView(viewId: string): Table | undefined {
464475
const context = getCurrentContext()
465476
if (!context) {

packages/backend-core/src/context/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@ export type ContextMap = {
2424
featureFlagCache?: {
2525
[key: string]: Record<string, boolean>
2626
}
27+
featureFlagOverrides?: Record<string, boolean>
2728
viewToTableCache?: Record<string, Table>
2829
}

packages/backend-core/src/features/features.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,21 @@ export class FlagSet<T extends { [name: string]: boolean }> {
175175
}
176176
}
177177

178+
const overrides = context.getFeatureFlagOverrides()
179+
for (const [key, value] of Object.entries(overrides)) {
180+
if (!this.isFlagName(key)) {
181+
continue
182+
}
183+
184+
if (typeof value !== "boolean") {
185+
continue
186+
}
187+
188+
// @ts-expect-error - TS does not like you writing into a generic type.
189+
flagValues[key] = value
190+
tags[`flags.${key}.source`] = "override"
191+
}
192+
178193
context.setFeatureFlags(this.setId, flagValues)
179194
for (const [key, value] of Object.entries(flagValues)) {
180195
tags[`flags.${key}.value`] = value
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Ctx, FeatureFlagCookie } from "@budibase/types"
2+
import { Middleware, Next } from "koa"
3+
import { getCookie } from "../utils"
4+
import { Cookie } from "../constants"
5+
import { doInFeatureFlagOverrideContext } from "../context"
6+
7+
export default (async (ctx: Ctx, next: Next) => {
8+
const cookie = getCookie<FeatureFlagCookie>(ctx, Cookie.FeatureFlags)
9+
const flags = cookie?.flags || {}
10+
await doInFeatureFlagOverrideContext(flags, async () => {
11+
await next()
12+
})
13+
}) as Middleware

packages/backend-core/src/middleware/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ export { default as correlation } from "../logging/correlation/middleware"
2020
export { default as errorHandling } from "./errorHandling"
2121
export { default as querystringToBody } from "./querystringToBody"
2222
export { default as csp } from "./contentSecurityPolicy"
23+
export { default as featureFlagCookie } from "./featureFlagCookie"
2324
export * as joiValidator from "./joi-validator"
2425
export { default as ip } from "./ip"

0 commit comments

Comments
 (0)