1.0.2 • Published 2 years ago

featureset-js v1.0.2

Weekly downloads
1
License
MIT
Repository
github
Last release
2 years ago

Featureset

A small, pluggable library that allows your code to detect if a feature should be enabled or disabled.

Goals for this library included:

  • The storage of state is separated from the code that uses the state, so that plugabble backend storage methods can be used to fit the needs of the project
  • Features should be scoped within the environment they are running in, so that test-environment features can be toggled separately from production-environment features without code changes

Usage

const featureset = require('featureset')

if(featureset.enabled('my-enabled-feature')) {
  // This will run...
}

if(featureset.enabled('my-disabled-feature')) {
  // This won't run...
}

if(featureset.enabled('my-undefined-feature')) {
  // This still won't run (undefined is falsy)...
}

Configuration

All features are scoped within an environment. The default environment is 'production', but can be set to any environment string you want through the initialize method.

featureset.initialize({ env: 'development' })

Map Store

The included map store can be used to retrieve features from another source and set them programmatically

const mystore = featureset.stores.map

mystore.set('production', 'my-enabled-feature', true)
mystore.set('production', 'my-disabled-feature', false)

featureset.initialize({ env: 'production', store: mystore })

JSON Store

The included JSON store works similarly to the map store, except values can be set by loading a JSON file directly, or Javascript object

const mystore = featureset.stores.json

mystore.loadFile('/features.json')

featureset.initialize({ env: 'production', store: mystore })

where features.json would have the format:

{ "production": { "my-enabled-feature": true, "my-disabled-feature": false } }

or

const mystore = featureset.stores.json

mystore.loadJs({
  production: {
    'my-enabled-feature': true,
    'my-disabled-feature': false
  }
})

featureset.initialize({ env: 'production', store: mystore })

Note that both the JSON file and the Javascript object have the same format; it is just whether or not it is coming in as JSON content, or an already parsed Javascript object.

API

featureset

  • initialize(options) - Method to initialize different options
    • env: an environment string used to provide scope for all feature requests
    • store: a backing store instance to be used for looking up feature requests
  • enabled(key) - Method for determining if a feature is enabled
  • stores - A set of included backend stores

Map Store (featureset.stores.map)

  • enabled(env, key) - Used by the library to look up feature values
  • set(env, key, value) - Sets scoped values on the store

JSON Store (featureset.stores.json)

  • enabled(env, key) - Used by the library to look up feature values
  • loadFile(path) - Load a JSON file into memory
  • loadJs(object) - Load the given Javascript object into memory

Custom Stores...

To create your own backend store, implement the enabled(env, key) method and pass the object to the featureset.initialize({ store: }).

Change History

VersionDescription
1.0.0Initial Release
1.0.1Security Update
1.0.2Security Update