@medusajs/utils
Version:
Medusa utilities functions shared by Medusa core and Modules
67 lines • 2.44 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlagRouter = void 0;
const common_1 = require("../../common");
class FlagRouter {
constructor(flags) {
this.flags = {};
this.flags = flags;
}
/**
* Check if a feature flag is enabled.
* There are two ways of using this method:
* 1. `isFeatureEnabled("myFeatureFlag")`
* 2. `isFeatureEnabled({ myNestedFeatureFlag: "someNestedFlag" })`
* We use 1. for top-level feature flags and 2. for nested feature flags. Almost all flags are top-level.
* An example of a nested flag is workflows. To use it, you would do:
* `isFeatureEnabled({ workflows: Workflows.CreateCart })`
* @param flag - The flag to check
* @return {boolean} - Whether the flag is enabled or not
*/
isFeatureEnabled(flag) {
if ((0, common_1.isObject)(flag)) {
const [nestedFlag, value] = Object.entries(flag)[0];
if (typeof this.flags[nestedFlag] === "boolean") {
return this.flags[nestedFlag];
}
return !!this.flags[nestedFlag]?.[value];
}
const flags = (Array.isArray(flag) ? flag : [flag]);
return flags.every((flag_) => {
if (!(0, common_1.isString)(flag_)) {
throw Error("Flag must be a string an array of string or an object");
}
return !!this.flags[flag_];
});
}
/**
* Sets a feature flag.
* Flags take two shapes:
* `setFlag("myFeatureFlag", true)`
* `setFlag("myFeatureFlag", { nestedFlag: true })`
* These shapes are used for top-level and nested flags respectively, as explained in isFeatureEnabled.
* @param key - The key of the flag to set.
* @param value - The value of the flag to set.
* @return {void} - void
*/
setFlag(key, value) {
if ((0, common_1.isObject)(value)) {
const existing = this.flags[key];
if (!existing) {
this.flags[key] = value;
return;
}
this.flags[key] = { ...this.flags[key], ...value };
return;
}
this.flags[key] = value;
}
listFlags() {
return Object.entries(this.flags || {}).map(([key, value]) => ({
key,
value,
}));
}
}
exports.FlagRouter = FlagRouter;
//# sourceMappingURL=flag-router.js.map
;