chore(framework,medusa): load custom flags before medusa config (#13312)

* chore(framework,medusa): load custom flags before medusa config

* test

* test runner

* changeset

* check manager featureFlags

* discover and register flags

* rm comments

* update changeset

* changeset

* use local cli

* execute from local medusa command

---------

Co-authored-by: Adrien de Peretti <adrien.deperetti@gmail.com>
This commit is contained in:
Carlos R. L. Rodrigues
2025-09-01 16:04:43 +02:00
committed by GitHub
co-authored by Adrien de Peretti
parent 2a94dbd243
commit b4c0f131b7
10 changed files with 118 additions and 36 deletions
@@ -1,16 +1,15 @@
import { trackFeatureFlag } from "@medusajs/telemetry"
import {
ContainerRegistrationKeys,
discoverFeatureFlagsFromDir,
discoverAndRegisterFeatureFlags,
FeatureFlag,
FlagRouter,
registerFeatureFlag,
} from "@medusajs/utils"
import { asFunction } from "awilix"
import { normalize } from "path"
import { configManager } from "../config"
import { container } from "../container"
import { FlagSettings } from "./types"
import { logger as defaultLogger } from "../logger"
container.register(
ContainerRegistrationKeys.FEATURE_FLAG_ROUTER,
@@ -24,7 +23,11 @@ container.register(
export async function featureFlagsLoader(
sourcePath?: string
): Promise<FlagRouter> {
const { featureFlags: projectConfigFlags = {}, logger } = configManager.config
const confManager = !!configManager.baseDir
? configManager.config
: { featureFlags: {}, logger: defaultLogger }
const { featureFlags: projectConfigFlags = {}, logger } = confManager
if (!sourcePath) {
return FeatureFlag
@@ -32,16 +35,13 @@ export async function featureFlagsLoader(
const flagDir = normalize(sourcePath)
const discovered = await discoverFeatureFlagsFromDir(flagDir)
for (const def of discovered) {
registerFeatureFlag({
flag: def as FlagSettings,
projectConfigFlags,
router: FeatureFlag,
logger,
track: (key) => trackFeatureFlag(key),
})
}
await discoverAndRegisterFeatureFlags({
flagDir,
projectConfigFlags,
router: FeatureFlag,
logger,
track: (key) => trackFeatureFlag(key),
})
return FeatureFlag
}
@@ -17,7 +17,7 @@ import {
ContainerRegistrationKeys,
createMedusaContainer,
defineJoinerConfig,
discoverFeatureFlagsFromDir,
discoverAndRegisterFeatureFlags,
DmlEntity,
dynamicImport,
FeatureFlag,
@@ -28,7 +28,6 @@ import {
MedusaModuleType,
Modules,
ModulesSdkUtils,
registerFeatureFlag,
stringifyCircular,
toMikroOrmEntities,
} from "@medusajs/utils"
@@ -579,7 +578,6 @@ export async function loadResources({
}
const flagDir = resolve(normalizedPath)
const discovered = await discoverFeatureFlagsFromDir(flagDir, 1)
const configModule = container.resolve(
ContainerRegistrationKeys.CONFIG_MODULE,
@@ -588,14 +586,13 @@ export async function loadResources({
}
) as ConfigModule
for (const def of discovered) {
registerFeatureFlag({
flag: def,
projectConfigFlags: configModule?.featureFlags ?? {},
router: FeatureFlag,
logger,
})
}
await discoverAndRegisterFeatureFlags({
flagDir,
projectConfigFlags: configModule?.featureFlags ?? {},
router: FeatureFlag,
logger,
maxDepth: 1,
})
const [moduleService, services, models, repositories] = await Promise.all([
dynamicImport(modulePath).then((moduleExports) => {
@@ -0,0 +1,43 @@
import { FlagSettings, Logger } from "@medusajs/types"
import { discoverFeatureFlagsFromDir } from "./discover-feature-flags"
import { FlagRouter } from "./flag-router"
import { registerFeatureFlag } from "./register-flag"
export interface DiscoverAndRegisterOptions {
flagDir: string
projectConfigFlags?: Record<string, any>
router: FlagRouter
logger?: Logger
track?: (key: string) => void
maxDepth?: number
}
/**
* Utility function to discover and register feature flags from a directory
*/
export async function discoverAndRegisterFeatureFlags(
options: DiscoverAndRegisterOptions
): Promise<void> {
const {
flagDir,
projectConfigFlags = {},
router,
logger,
track,
maxDepth,
} = options
const discovered = await discoverFeatureFlagsFromDir(flagDir, maxDepth)
for (const def of discovered) {
const registerOptions: Parameters<typeof registerFeatureFlag>[0] = {
flag: def as FlagSettings,
projectConfigFlags,
router,
logger,
track,
}
registerFeatureFlag(registerOptions)
}
}
@@ -1,3 +1,4 @@
export * from "./discover-feature-flags"
export * from "./discover-and-register-feature-flags"
export * from "./flag-router"
export * from "./register-flag"