Featurevisor module
@messagevisor/module-featurevisor connects Messagevisor feature and experiment conditions to an existing Featurevisor SDK instance.
Install#
$ npm install --save \ @messagevisor/sdk \ @messagevisor/module-featurevisor \ @featurevisor/sdkSDK setup#
Create your Featurevisor instance first, then pass it to the Messagevisor module:
import { createInstance } from "@featurevisor/sdk";import { createMessagevisor } from "@messagevisor/sdk";import { createFeaturevisorModule } from "@messagevisor/module-featurevisor";const f = createInstance({ datafile: featurevisorDatafile,});const m = createMessagevisor({ datafile: messagevisorDatafile, modules: [ createFeaturevisorModule({ instance: f, // passContext: true, // `false` by default }), ],});The module registers resolvers on the Messagevisor SDK instance:
featureconditions callf.isEnabled(featureKey)experimentconditions callf.getVariation(experimentKey)
By default, Messagevisor does not pass its own evaluation context to Featurevisor. Enable passContext when you want Messagevisor's SDK-level and per-call context to be forwarded to Featurevisor evaluations.
Feature conditions#
Use feature conditions when a translation override should follow a Featurevisor flag:
translations: en: Checkoutoverrides: - key: new-checkout conditions: feature: new-checkout operator: isEnabled translations: en: Faster checkoutYou can also match when the flag is disabled:
overrides: - key: classic-checkout conditions: feature: new-checkout operator: isDisabled translations: en: Classic checkoutExperiment conditions#
Use experiment conditions when copy should follow the active Featurevisor variation:
translations: en: Continueoverrides: - key: bold-copy conditions: experiment: checkout-copy operator: hasVariation value: bold translations: en: Try the faster checkoutThe experiment key maps to the Featurevisor feature key passed to getVariation. If Featurevisor returns null, the condition does not match.
Context#
By default, the module relies on context already configured on the Featurevisor instance. Messagevisor context is not forwarded:
const m = createMessagevisor({ datafile: messagevisorDatafile, context: { platform: "web", }, modules: [createFeaturevisorModule({ instance: f })],});Set passContext: true when Featurevisor should receive Messagevisor's combined SDK-level and per-call context:
const m = createMessagevisor({ datafile: messagevisorDatafile, context: { platform: "web", }, modules: [createFeaturevisorModule({ instance: f, passContext: true })],});m.translate("checkout.title", {}, { context: { userId: "user-123", },});With passContext: true, Featurevisor receives { platform: "web", userId: "user-123" } for the flag or variation evaluation.
Project setup#
Register the module wherever Messagevisor runtime evaluation happens. In application code, add it to the SDK instance as shown above.
If CLI workflows such as evaluate, examples, tests, or catalog output need Featurevisor-backed conditions, register the module in messagevisor.config.js and provide a Featurevisor instance that can be created in that environment:
const { createInstance } = require("@featurevisor/sdk");const { createFeaturevisorModule } = require("@messagevisor/module-featurevisor");const f = createInstance({ datafile: require("./featurevisor-datafile.json"),});module.exports = { modules: [createFeaturevisorModule({ instance: f })],};Edge cases and behavior notes#
Keys map directly#
Messagevisor passes the authored feature or experiment key directly to Featurevisor.
Module order usually does not matter#
This module registers condition resolvers during setup. It does not format or transform message output, so it can usually be placed before or after formatting modules.
No resolver means no match#
Without this module, or another resolver integration, Messagevisor feature and experiment conditions evaluate as non-matches.

