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:
co-authored by
Adrien de Peretti
parent
2a94dbd243
commit
b4c0f131b7
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user