[{"data":1,"prerenderedAt":1476},["ShallowReactive",2],{"navigation_docs":3,"-sdks-openfeature-node-js":244,"-sdks-openfeature-node-js-surround":1469},[4,51,78,229],{"title":5,"icon":6,"modifiedAt":7,"path":8,"stem":9,"children":10,"page":6},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[11,16,21,26,31,36,41,46],{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":17,"path":18,"stem":19,"icon":20},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":22,"path":23,"stem":24,"icon":25},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":27,"path":28,"stem":29,"icon":30},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":32,"path":33,"stem":34,"icon":35},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":37,"path":38,"stem":39,"icon":40},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":42,"path":43,"stem":44,"icon":45},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F7.segments","i-lucide-squares-intersect",{"title":47,"path":48,"stem":49,"icon":50},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F8.pricing-and-billing","i-lucide-credit-card",{"title":52,"modifiedAt":53,"defaultOpen":54,"path":55,"stem":56,"children":57,"page":6},"Monitoring","2026-09-24T23:33:20.000Z",true,"\u002Fmonitoring","2.monitoring",[58,63,68,73],{"title":59,"path":60,"stem":61,"icon":62},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":64,"path":65,"stem":66,"icon":67},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":69,"path":70,"stem":71,"icon":72},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":74,"path":75,"stem":76,"icon":77},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":79,"modifiedAt":53,"defaultOpen":54,"path":80,"stem":81,"children":82,"page":6},"SDKs","\u002Fsdks","3.sdks",[83,88,109,134,150,181,224],{"title":84,"path":85,"stem":86,"icon":87},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":89,"modifiedAt":53,"icon":90,"defaultOpen":6,"path":91,"stem":92,"children":93,"page":6},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[94,99,104],{"title":95,"path":96,"stem":97,"icon":98},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":100,"path":101,"stem":102,"icon":103},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":105,"path":106,"stem":107,"icon":108},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":110,"modifiedAt":53,"icon":111,"defaultOpen":6,"path":112,"stem":113,"children":114,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[115,119,124,129],{"title":116,"path":117,"stem":118,"icon":103},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":120,"path":121,"stem":122,"icon":123},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":125,"path":126,"stem":127,"icon":128},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":130,"path":131,"stem":132,"icon":133},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":135,"modifiedAt":53,"icon":136,"defaultOpen":6,"path":137,"stem":138,"children":139,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[140,145],{"title":141,"path":142,"stem":143,"icon":144},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":146,"path":147,"stem":148,"icon":149},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":151,"modifiedAt":53,"icon":152,"defaultOpen":6,"path":153,"stem":154,"children":155,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[156,161,166,171,176],{"title":157,"path":158,"stem":159,"icon":160},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":162,"path":163,"stem":164,"icon":165},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":167,"path":168,"stem":169,"icon":170},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":172,"path":173,"stem":174,"icon":175},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":177,"path":178,"stem":179,"icon":180},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":182,"modifiedAt":53,"icon":183,"defaultOpen":6,"path":184,"stem":185,"children":186,"page":6},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature",[187,192,196,200,204,208,212,216,220],{"title":188,"path":189,"stem":190,"icon":183,"icons":191},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[183,98],{"title":125,"path":193,"stem":194,"icon":183,"icons":195},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[183,128],{"title":130,"path":197,"stem":198,"icon":183,"icons":199},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[183,133],{"title":120,"path":201,"stem":202,"icon":183,"icons":203},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[183,123],{"title":157,"path":205,"stem":206,"icon":183,"icons":207},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[183,160],{"title":162,"path":209,"stem":210,"icon":183,"icons":211},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[183,165],{"title":167,"path":213,"stem":214,"icon":183,"icons":215},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[183,170],{"title":172,"path":217,"stem":218,"icon":183,"icons":219},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[183,175],{"title":177,"path":221,"stem":222,"icon":183,"icons":223},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[183,180],{"title":225,"path":226,"stem":227,"icon":228},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":230,"modifiedAt":53,"defaultOpen":54,"path":231,"stem":232,"children":233,"page":6},"Integrations","\u002Fintegrations","4.integrations",[234,239],{"title":235,"path":236,"stem":237,"icon":238},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F1.terraform","cd-logos-terraform",{"title":240,"path":241,"stem":242,"icon":243},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F2.mcp","cd-logos-mcp",{"id":245,"title":246,"body":247,"description":1460,"extension":1461,"links":1462,"meta":1463,"navigation":1465,"path":205,"seo":1467,"stem":206,"__hash__":1468},"docs\u002F3.sdks\u002F6.openfeature\u002F5.node-js.md","OpenFeature Node.js Provider",{"type":248,"value":249,"toc":1450},"minimark",[250,254,260,265,282,289,293,299,389,393,410,555,559,564,567,574,689,696,700,703,785,792,796,799,910,915,919,933,940,1425,1446],[251,252],"div",{"hidden":54,"dataTitleIcon":253},"openfeature-nodejs",[255,256],"external-badges",{"package-url":257,"registry":258,"repo":259},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@configdirector\u002Fopenfeature-server-provider","npm","js-sdks\u002Ftree\u002Fmain\u002Fpackages\u002Fopenfeature-server-provider",[261,262,264],"h2",{"id":263},"introduction","Introduction",[266,267,268,269,277,278,281],"p",{},"The OpenFeature Node.js Provider is intended to be used in combination with the ",[270,271,276],"a",{"href":272,"rel":273,"target":275},"https:\u002F\u002Fopenfeature.dev\u002Fdocs\u002Freference\u002Fsdks\u002Fserver\u002Fjavascript\u002F",[274],"noopener","_blank","OpenFeature Node.js SDK",". The provider wraps the ConfigDirector ",[270,279,280],{"href":158},"Node.js SDK",".",[266,283,284,285,281],{},"The minimum Node.js version supported is ",[286,287,288],"code",{},"18.0",[261,290,292],{"id":291},"installation","Installation",[266,294,295,296],{},"The provider can be installed from NPM: ",[270,297,257],{"href":257,"rel":298,"target":275},[274],[300,301,302,333,353,371],"code-group",{},[303,304,309],"pre",{"className":305,"code":306,"filename":258,"language":307,"meta":308,"style":308},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","npm install --save @openfeature\u002Fserver-sdk @configdirector\u002Fopenfeature-server-provider\n","bash","",[286,310,311],{"__ignoreMap":308},[312,313,316,319,323,327,330],"span",{"class":314,"line":315},"line",1,[312,317,258],{"class":318},"sbgvK",[312,320,322],{"class":321},"s_sjI"," install",[312,324,326],{"class":325},"stzsN"," --save",[312,328,329],{"class":321}," @openfeature\u002Fserver-sdk",[312,331,332],{"class":321}," @configdirector\u002Fopenfeature-server-provider\n",[303,334,337],{"className":305,"code":335,"filename":336,"language":307,"meta":308,"style":308},"yarn add @openfeature\u002Fserver-sdk @openfeature\u002Fcore @configdirector\u002Fopenfeature-server-provider\n","yarn",[286,338,339],{"__ignoreMap":308},[312,340,341,343,346,348,351],{"class":314,"line":315},[312,342,336],{"class":318},[312,344,345],{"class":321}," add",[312,347,329],{"class":321},[312,349,350],{"class":321}," @openfeature\u002Fcore",[312,352,332],{"class":321},[303,354,357],{"className":305,"code":355,"filename":356,"language":307,"meta":95,"style":308},"pnpm add @openfeature\u002Fserver-sdk @openfeature\u002Fcore @configdirector\u002Fopenfeature-server-provider\n","pnpm",[286,358,359],{"__ignoreMap":308},[312,360,361,363,365,367,369],{"class":314,"line":315},[312,362,356],{"class":318},[312,364,345],{"class":321},[312,366,329],{"class":321},[312,368,350],{"class":321},[312,370,332],{"class":321},[303,372,375],{"className":305,"code":373,"filename":374,"language":307,"meta":308,"style":308},"bun add @openfeature\u002Fserver-sdk @openfeature\u002Fcore @configdirector\u002Fopenfeature-server-provider\n","bun",[286,376,377],{"__ignoreMap":308},[312,378,379,381,383,385,387],{"class":314,"line":315},[312,380,374],{"class":318},[312,382,345],{"class":321},[312,384,329],{"class":321},[312,386,350],{"class":321},[312,388,332],{"class":321},[261,390,392],{"id":391},"configure-and-initialize-the-client","Configure and initialize the client",[394,395,396,404,407],"ol",{},[397,398,399,400,403],"li",{},"Create an instance of the provider using your server SDK key. You can retrieve a server SDK key for each environment under ",[286,401,402],{},"SDK keys"," in the dashboard's navigation panel.",[397,405,406],{},"Set the OpenFeature provider.",[397,408,409],{},"Get a client instance from OpenFeature.",[303,411,415],{"className":412,"code":413,"language":414,"meta":308,"style":308},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import { OpenFeature } from \"@openfeature\u002Fserver-sdk\";\nimport { ConfigDirectorProvider } from \"@configdirector\u002Fopenfeature-server-provider\";\n\nconst provider = new ConfigDirectorProvider(\"YOUR-SERVER-SDK-KEY\");\nawait OpenFeature.setProviderAndWait(provider);\nconst client = OpenFeature.getClient();\n","ts",[286,416,417,450,473,479,515,533],{"__ignoreMap":308},[312,418,419,423,427,431,434,437,441,444,447],{"class":314,"line":315},[312,420,422],{"class":421},"sVHd0","import",[312,424,426],{"class":425},"sP7_E"," {",[312,428,430],{"class":429},"su5hD"," OpenFeature",[312,432,433],{"class":425}," }",[312,435,436],{"class":421}," from",[312,438,440],{"class":439},"sjJ54"," \"",[312,442,443],{"class":321},"@openfeature\u002Fserver-sdk",[312,445,446],{"class":439},"\"",[312,448,449],{"class":425},";\n",[312,451,453,455,457,460,462,464,466,469,471],{"class":314,"line":452},2,[312,454,422],{"class":421},[312,456,426],{"class":425},[312,458,459],{"class":429}," ConfigDirectorProvider",[312,461,433],{"class":425},[312,463,436],{"class":421},[312,465,440],{"class":439},[312,467,468],{"class":321},"@configdirector\u002Fopenfeature-server-provider",[312,470,446],{"class":439},[312,472,449],{"class":425},[312,474,476],{"class":314,"line":475},3,[312,477,478],{"emptyLinePlaceholder":54},"\n",[312,480,482,486,490,494,497,500,503,505,508,510,513],{"class":314,"line":481},4,[312,483,485],{"class":484},"sbsja","const",[312,487,489],{"class":488},"s_hVV"," provider",[312,491,493],{"class":492},"smGrS"," =",[312,495,496],{"class":492}," new",[312,498,459],{"class":499},"sGLFI",[312,501,502],{"class":429},"(",[312,504,446],{"class":439},[312,506,507],{"class":321},"YOUR-SERVER-SDK-KEY",[312,509,446],{"class":439},[312,511,512],{"class":429},")",[312,514,449],{"class":425},[312,516,518,521,523,525,528,531],{"class":314,"line":517},5,[312,519,520],{"class":421},"await",[312,522,430],{"class":429},[312,524,281],{"class":425},[312,526,527],{"class":499},"setProviderAndWait",[312,529,530],{"class":429},"(provider)",[312,532,449],{"class":425},[312,534,536,538,541,543,545,547,550,553],{"class":314,"line":535},6,[312,537,485],{"class":484},[312,539,540],{"class":488}," client",[312,542,493],{"class":492},[312,544,430],{"class":429},[312,546,281],{"class":425},[312,548,549],{"class":499},"getClient",[312,551,552],{"class":429},"()",[312,554,449],{"class":425},[556,557,558],"warning",{},"Server SDK keys are secret values. Do not commit them to your source code repository. Provide them at runtime via environment variables instead.",[560,561,563],"h3",{"id":562},"additional-configuration-options","Additional configuration options",[266,565,566],{},"Additional configuration options can be passed into the provider in the optional second argument of the constructor.",[266,568,569,570,573],{},"For example, the ",[286,571,572],{},"metadata"," can be provided like this:",[303,575,577],{"className":412,"code":576,"language":414,"meta":308,"style":308},"import { ConfigDirectorProvider } from \"@configdirector\u002Fopenfeature-server-provider\";\n\nconst provider = new ConfigDirectorProvider(\"YOUR-SERVER-SDK-KEY\", {\n  metadata: {\n    appName: \"YOUR-APP-NAME\",\n    appVersion: \"1.0.2\",\n  },\n});\n",[286,578,579,599,603,629,640,657,673,679],{"__ignoreMap":308},[312,580,581,583,585,587,589,591,593,595,597],{"class":314,"line":315},[312,582,422],{"class":421},[312,584,426],{"class":425},[312,586,459],{"class":429},[312,588,433],{"class":425},[312,590,436],{"class":421},[312,592,440],{"class":439},[312,594,468],{"class":321},[312,596,446],{"class":439},[312,598,449],{"class":425},[312,600,601],{"class":314,"line":452},[312,602,478],{"emptyLinePlaceholder":54},[312,604,605,607,609,611,613,615,617,619,621,623,626],{"class":314,"line":475},[312,606,485],{"class":484},[312,608,489],{"class":488},[312,610,493],{"class":492},[312,612,496],{"class":492},[312,614,459],{"class":499},[312,616,502],{"class":429},[312,618,446],{"class":439},[312,620,507],{"class":321},[312,622,446],{"class":439},[312,624,625],{"class":425},",",[312,627,628],{"class":425}," {\n",[312,630,631,635,638],{"class":314,"line":481},[312,632,634],{"class":633},"skxfh","  metadata",[312,636,637],{"class":425},":",[312,639,628],{"class":425},[312,641,642,645,647,649,652,654],{"class":314,"line":517},[312,643,644],{"class":633},"    appName",[312,646,637],{"class":425},[312,648,440],{"class":439},[312,650,651],{"class":321},"YOUR-APP-NAME",[312,653,446],{"class":439},[312,655,656],{"class":425},",\n",[312,658,659,662,664,666,669,671],{"class":314,"line":535},[312,660,661],{"class":633},"    appVersion",[312,663,637],{"class":425},[312,665,440],{"class":439},[312,667,668],{"class":321},"1.0.2",[312,670,446],{"class":439},[312,672,656],{"class":425},[312,674,676],{"class":314,"line":675},7,[312,677,678],{"class":425},"  },\n",[312,680,682,685,687],{"class":314,"line":681},8,[312,683,684],{"class":425},"}",[312,686,512],{"class":429},[312,688,449],{"class":425},[266,690,691,692,281],{},"The provider accepts the same configuration options as the Node.js SDK client, ",[270,693,695],{"href":694},"\u002Fsdks\u002Fserver\u002Fnode-js#additional-configuration-options","refer to the additional configuration options section of the Node.js SDK for a full list",[261,697,699],{"id":698},"retrieve-config-values","Retrieve config values",[266,701,702],{},"To retrieve config values, use the OpenFeature client:",[303,704,706],{"className":412,"code":705,"language":414,"meta":308,"style":308},"const booleanValue = client.getBooleanValue(\"my-config-key\", false);\n\nconst stringValue = client.getStringValue(\"my-string-config-key\", \"Default\");\n",[286,707,708,743,747],{"__ignoreMap":308},[312,709,710,712,715,717,719,721,724,726,728,731,733,735,739,741],{"class":314,"line":315},[312,711,485],{"class":484},[312,713,714],{"class":488}," booleanValue",[312,716,493],{"class":492},[312,718,540],{"class":429},[312,720,281],{"class":425},[312,722,723],{"class":499},"getBooleanValue",[312,725,502],{"class":429},[312,727,446],{"class":439},[312,729,730],{"class":321},"my-config-key",[312,732,446],{"class":439},[312,734,625],{"class":425},[312,736,738],{"class":737},"syTEX"," false",[312,740,512],{"class":429},[312,742,449],{"class":425},[312,744,745],{"class":314,"line":452},[312,746,478],{"emptyLinePlaceholder":54},[312,748,749,751,754,756,758,760,763,765,767,770,772,774,776,779,781,783],{"class":314,"line":475},[312,750,485],{"class":484},[312,752,753],{"class":488}," stringValue",[312,755,493],{"class":492},[312,757,540],{"class":429},[312,759,281],{"class":425},[312,761,762],{"class":499},"getStringValue",[312,764,502],{"class":429},[312,766,446],{"class":439},[312,768,769],{"class":321},"my-string-config-key",[312,771,446],{"class":439},[312,773,625],{"class":425},[312,775,440],{"class":439},[312,777,778],{"class":321},"Default",[312,780,446],{"class":439},[312,782,512],{"class":429},[312,784,449],{"class":425},[266,786,787,788,281],{},"For additional information regarding the OpenFeature client ",[270,789,791],{"href":272,"rel":790,"target":275},[274],"refer to the OpenFeature Node.js SDK documentation",[261,793,795],{"id":794},"user-context","User context",[266,797,798],{},"The user context can be provided as the third argument to value getter functions of the OpenFeature client. The OpenFeature Node.js provider evaluates targeting rules locally without additional network calls for different contexts.",[303,800,802],{"className":412,"code":801,"language":414,"meta":308,"style":308},"const booleanValue = client.getBooleanValue(\"my-config-key\", false, {\n  targetingKey: \"12345\", \u002F\u002F In OpenFeature, the `targetingKey` represents the context's user ID\n  name: \"Example User\",\n  traits: {\n    region: \"North America\", \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n  },\n});\n",[286,803,804,834,854,870,879,898,902],{"__ignoreMap":308},[312,805,806,808,810,812,814,816,818,820,822,824,826,828,830,832],{"class":314,"line":315},[312,807,485],{"class":484},[312,809,714],{"class":488},[312,811,493],{"class":492},[312,813,540],{"class":429},[312,815,281],{"class":425},[312,817,723],{"class":499},[312,819,502],{"class":429},[312,821,446],{"class":439},[312,823,730],{"class":321},[312,825,446],{"class":439},[312,827,625],{"class":425},[312,829,738],{"class":737},[312,831,625],{"class":425},[312,833,628],{"class":425},[312,835,836,839,841,843,846,848,850],{"class":314,"line":452},[312,837,838],{"class":633},"  targetingKey",[312,840,637],{"class":425},[312,842,440],{"class":439},[312,844,845],{"class":321},"12345",[312,847,446],{"class":439},[312,849,625],{"class":425},[312,851,853],{"class":852},"sutJx"," \u002F\u002F In OpenFeature, the `targetingKey` represents the context's user ID\n",[312,855,856,859,861,863,866,868],{"class":314,"line":475},[312,857,858],{"class":633},"  name",[312,860,637],{"class":425},[312,862,440],{"class":439},[312,864,865],{"class":321},"Example User",[312,867,446],{"class":439},[312,869,656],{"class":425},[312,871,872,875,877],{"class":314,"line":481},[312,873,874],{"class":633},"  traits",[312,876,637],{"class":425},[312,878,628],{"class":425},[312,880,881,884,886,888,891,893,895],{"class":314,"line":517},[312,882,883],{"class":633},"    region",[312,885,637],{"class":425},[312,887,440],{"class":439},[312,889,890],{"class":321},"North America",[312,892,446],{"class":439},[312,894,625],{"class":425},[312,896,897],{"class":852}," \u002F\u002F Any arbitrary traits which can be referenced in targeting rules\n",[312,899,900],{"class":314,"line":535},[312,901,678],{"class":425},[312,903,904,906,908],{"class":314,"line":675},[312,905,684],{"class":425},[312,907,512],{"class":429},[312,909,449],{"class":425},[266,911,787,912,281],{},[270,913,791],{"href":272,"rel":914,"target":275},[274],[261,916,918],{"id":917},"test-your-code","Test your code",[266,920,921,922,925,926,928,929,932],{},"Code that reads flags through OpenFeature is tested by swapping the provider, so it never has to change for a test and nothing from ConfigDirector is involved. The OpenFeature Node.js SDK ships an in-memory provider for that: ",[286,923,924],{},"TypedInMemoryProvider",", in ",[286,927,443],{}," 1.21 and newer, which serves the values your test sets. Earlier versions ship the same provider as ",[286,930,931],{},"InMemoryProvider",", now deprecated.",[266,934,935,936,939],{},"Each flag is a set of named variants and the ",[286,937,938],{},"defaultVariant"," it resolves to:",[303,941,944],{"className":412,"code":942,"filename":943,"language":414,"meta":308,"style":308},"import { OpenFeature, TypedInMemoryProvider } from \"@openfeature\u002Fserver-sdk\";\n\nconst provider = new TypedInMemoryProvider({\n  \"new-checkout\": { variants: { on: true, off: false }, defaultVariant: \"on\" },\n  \"max-items\": { variants: { default: 20 }, defaultVariant: \"default\" },\n});\n\nafterEach(() => OpenFeature.close());\n\ntest(\"shows the new checkout\", async () => {\n  await OpenFeature.setProviderAndWait(provider);\n  const client = OpenFeature.getClient();\n\n  expect(await client.getBooleanValue(\"new-checkout\", false)).toBe(true);\n  expect(await client.getNumberValue(\"max-items\", 0)).toBe(20);\n\n  provider.putConfiguration({\n    \"new-checkout\": { variants: { on: true, off: false }, defaultVariant: \"off\" },\n  });\n  expect(await client.getBooleanValue(\"new-checkout\", true)).toBe(false);\n});\n","checkout.test.ts",[286,945,946,971,975,992,1049,1092,1100,1104,1128,1133,1160,1181,1201,1206,1251,1295,1300,1315,1364,1374,1416],{"__ignoreMap":308},[312,947,948,950,952,954,956,959,961,963,965,967,969],{"class":314,"line":315},[312,949,422],{"class":421},[312,951,426],{"class":425},[312,953,430],{"class":429},[312,955,625],{"class":425},[312,957,958],{"class":429}," TypedInMemoryProvider",[312,960,433],{"class":425},[312,962,436],{"class":421},[312,964,440],{"class":439},[312,966,443],{"class":321},[312,968,446],{"class":439},[312,970,449],{"class":425},[312,972,973],{"class":314,"line":452},[312,974,478],{"emptyLinePlaceholder":54},[312,976,977,979,981,983,985,987,989],{"class":314,"line":475},[312,978,485],{"class":484},[312,980,489],{"class":488},[312,982,493],{"class":492},[312,984,496],{"class":492},[312,986,958],{"class":499},[312,988,502],{"class":429},[312,990,991],{"class":425},"{\n",[312,993,994,997,1001,1003,1005,1007,1010,1012,1014,1017,1019,1022,1024,1027,1029,1031,1034,1037,1039,1041,1044,1046],{"class":314,"line":481},[312,995,996],{"class":439},"  \"",[312,998,1000],{"class":999},"sZUrc","new-checkout",[312,1002,446],{"class":439},[312,1004,637],{"class":425},[312,1006,426],{"class":425},[312,1008,1009],{"class":633}," variants",[312,1011,637],{"class":425},[312,1013,426],{"class":425},[312,1015,1016],{"class":633}," on",[312,1018,637],{"class":425},[312,1020,1021],{"class":737}," true",[312,1023,625],{"class":425},[312,1025,1026],{"class":633}," off",[312,1028,637],{"class":425},[312,1030,738],{"class":737},[312,1032,1033],{"class":425}," },",[312,1035,1036],{"class":633}," defaultVariant",[312,1038,637],{"class":425},[312,1040,440],{"class":439},[312,1042,1043],{"class":321},"on",[312,1045,446],{"class":439},[312,1047,1048],{"class":425}," },\n",[312,1050,1051,1053,1056,1058,1060,1062,1064,1066,1068,1071,1073,1077,1079,1081,1083,1085,1088,1090],{"class":314,"line":517},[312,1052,996],{"class":439},[312,1054,1055],{"class":999},"max-items",[312,1057,446],{"class":439},[312,1059,637],{"class":425},[312,1061,426],{"class":425},[312,1063,1009],{"class":633},[312,1065,637],{"class":425},[312,1067,426],{"class":425},[312,1069,1070],{"class":633}," default",[312,1072,637],{"class":425},[312,1074,1076],{"class":1075},"srdBf"," 20",[312,1078,1033],{"class":425},[312,1080,1036],{"class":633},[312,1082,637],{"class":425},[312,1084,440],{"class":439},[312,1086,1087],{"class":321},"default",[312,1089,446],{"class":439},[312,1091,1048],{"class":425},[312,1093,1094,1096,1098],{"class":314,"line":535},[312,1095,684],{"class":425},[312,1097,512],{"class":429},[312,1099,449],{"class":425},[312,1101,1102],{"class":314,"line":675},[312,1103,478],{"emptyLinePlaceholder":54},[312,1105,1106,1109,1111,1113,1116,1118,1120,1123,1126],{"class":314,"line":681},[312,1107,1108],{"class":499},"afterEach",[312,1110,502],{"class":429},[312,1112,552],{"class":425},[312,1114,1115],{"class":484}," =>",[312,1117,430],{"class":429},[312,1119,281],{"class":425},[312,1121,1122],{"class":499},"close",[312,1124,1125],{"class":429},"())",[312,1127,449],{"class":425},[312,1129,1131],{"class":314,"line":1130},9,[312,1132,478],{"emptyLinePlaceholder":54},[312,1134,1136,1139,1141,1143,1146,1148,1150,1153,1156,1158],{"class":314,"line":1135},10,[312,1137,1138],{"class":499},"test",[312,1140,502],{"class":429},[312,1142,446],{"class":439},[312,1144,1145],{"class":321},"shows the new checkout",[312,1147,446],{"class":439},[312,1149,625],{"class":425},[312,1151,1152],{"class":484}," async",[312,1154,1155],{"class":425}," ()",[312,1157,1115],{"class":484},[312,1159,628],{"class":425},[312,1161,1163,1166,1168,1170,1172,1174,1177,1179],{"class":314,"line":1162},11,[312,1164,1165],{"class":421},"  await",[312,1167,430],{"class":429},[312,1169,281],{"class":425},[312,1171,527],{"class":499},[312,1173,502],{"class":633},[312,1175,1176],{"class":429},"provider",[312,1178,512],{"class":633},[312,1180,449],{"class":425},[312,1182,1184,1187,1189,1191,1193,1195,1197,1199],{"class":314,"line":1183},12,[312,1185,1186],{"class":484},"  const",[312,1188,540],{"class":488},[312,1190,493],{"class":492},[312,1192,430],{"class":429},[312,1194,281],{"class":425},[312,1196,549],{"class":499},[312,1198,552],{"class":633},[312,1200,449],{"class":425},[312,1202,1204],{"class":314,"line":1203},13,[312,1205,478],{"emptyLinePlaceholder":54},[312,1207,1209,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234,1237,1239,1242,1244,1247,1249],{"class":314,"line":1208},14,[312,1210,1211],{"class":499},"  expect",[312,1213,502],{"class":633},[312,1215,520],{"class":421},[312,1217,540],{"class":429},[312,1219,281],{"class":425},[312,1221,723],{"class":499},[312,1223,502],{"class":633},[312,1225,446],{"class":439},[312,1227,1000],{"class":321},[312,1229,446],{"class":439},[312,1231,625],{"class":425},[312,1233,738],{"class":737},[312,1235,1236],{"class":633},"))",[312,1238,281],{"class":425},[312,1240,1241],{"class":499},"toBe",[312,1243,502],{"class":633},[312,1245,1246],{"class":737},"true",[312,1248,512],{"class":633},[312,1250,449],{"class":425},[312,1252,1254,1256,1258,1260,1262,1264,1267,1269,1271,1273,1275,1277,1280,1282,1284,1286,1288,1291,1293],{"class":314,"line":1253},15,[312,1255,1211],{"class":499},[312,1257,502],{"class":633},[312,1259,520],{"class":421},[312,1261,540],{"class":429},[312,1263,281],{"class":425},[312,1265,1266],{"class":499},"getNumberValue",[312,1268,502],{"class":633},[312,1270,446],{"class":439},[312,1272,1055],{"class":321},[312,1274,446],{"class":439},[312,1276,625],{"class":425},[312,1278,1279],{"class":1075}," 0",[312,1281,1236],{"class":633},[312,1283,281],{"class":425},[312,1285,1241],{"class":499},[312,1287,502],{"class":633},[312,1289,1290],{"class":1075},"20",[312,1292,512],{"class":633},[312,1294,449],{"class":425},[312,1296,1298],{"class":314,"line":1297},16,[312,1299,478],{"emptyLinePlaceholder":54},[312,1301,1303,1306,1308,1311,1313],{"class":314,"line":1302},17,[312,1304,1305],{"class":429},"  provider",[312,1307,281],{"class":425},[312,1309,1310],{"class":499},"putConfiguration",[312,1312,502],{"class":633},[312,1314,991],{"class":425},[312,1316,1318,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1360,1362],{"class":314,"line":1317},18,[312,1319,1320],{"class":439},"    \"",[312,1322,1000],{"class":999},[312,1324,446],{"class":439},[312,1326,637],{"class":425},[312,1328,426],{"class":425},[312,1330,1009],{"class":633},[312,1332,637],{"class":425},[312,1334,426],{"class":425},[312,1336,1016],{"class":633},[312,1338,637],{"class":425},[312,1340,1021],{"class":737},[312,1342,625],{"class":425},[312,1344,1026],{"class":633},[312,1346,637],{"class":425},[312,1348,738],{"class":737},[312,1350,1033],{"class":425},[312,1352,1036],{"class":633},[312,1354,637],{"class":425},[312,1356,440],{"class":439},[312,1358,1359],{"class":321},"off",[312,1361,446],{"class":439},[312,1363,1048],{"class":425},[312,1365,1367,1370,1372],{"class":314,"line":1366},19,[312,1368,1369],{"class":425},"  }",[312,1371,512],{"class":633},[312,1373,449],{"class":425},[312,1375,1377,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1407,1409,1412,1414],{"class":314,"line":1376},20,[312,1378,1211],{"class":499},[312,1380,502],{"class":633},[312,1382,520],{"class":421},[312,1384,540],{"class":429},[312,1386,281],{"class":425},[312,1388,723],{"class":499},[312,1390,502],{"class":633},[312,1392,446],{"class":439},[312,1394,1000],{"class":321},[312,1396,446],{"class":439},[312,1398,625],{"class":425},[312,1400,1021],{"class":737},[312,1402,1236],{"class":633},[312,1404,281],{"class":425},[312,1406,1241],{"class":499},[312,1408,502],{"class":633},[312,1410,1411],{"class":737},"false",[312,1413,512],{"class":633},[312,1415,449],{"class":425},[312,1417,1419,1421,1423],{"class":314,"line":1418},21,[312,1420,684],{"class":425},[312,1422,512],{"class":429},[312,1424,449],{"class":425},[266,1426,1427,1429,1430,1433,1434,1437,1438,1441,1442,1445],{},[286,1428,1310],{}," replaces every flag and emits ",[286,1431,1432],{},"ConfigurationChanged"," with the keys it was given. A flag can also carry a ",[286,1435,1436],{},"contextEvaluator",", a function from the evaluation context to the name of the variant to serve, for a test of code that targets specific users. ",[286,1439,1440],{},"OpenFeature"," is one global, so shut it down after each test with ",[286,1443,1444],{},"OpenFeature.close()",", which lets the next test register its own provider.",[1447,1448,1449],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sZUrc, html code.shiki .sZUrc{--shiki-light:#E53935;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":308,"searchDepth":452,"depth":452,"links":1451},[1452,1453,1454,1457,1458,1459],{"id":263,"depth":452,"text":264},{"id":291,"depth":452,"text":292},{"id":391,"depth":452,"text":392,"children":1455},[1456],{"id":562,"depth":475,"text":563},{"id":698,"depth":452,"text":699},{"id":794,"depth":452,"text":795},{"id":917,"depth":452,"text":918},"ConfigDirector Provider for the OpenFeature Node.js SDK","md",null,{"modifiedAt":1464},"2026-10-12T00:22:49.000Z",{"title":157,"icon":183,"icons":1466},[183,160],{"title":246,"description":1460},"i0fdwo1dQ4ZNX-DHAFY8mXlXU0C2etGH3vq9uhfP2BI",[1470,1473],{"title":120,"path":201,"stem":202,"description":1471,"icon":183,"icons":1472,"children":-1},"ConfigDirector Provider for the OpenFeature Dart client SDK in Flutter applications",[183,123],{"title":162,"path":209,"stem":210,"description":1474,"icon":183,"icons":1475,"children":-1},"ConfigDirector Provider for the OpenFeature Python SDK",[183,165],1791783867769]