An ember-cli addon to provide feature flags.
Referencing the features service must be done using get
as it is a proxy.
ember install ember-feature-flags
This addon provides a service named features
available for injection into your routes, controllers, components, etc.
For example you may check if a feature is enabled:
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
export default class BillingPlansController extends Controller {
@service features;
get plans() {
if (this.features.isEnabled('newBillingPlans')) {
// Return new plans
} else {
// Return old plans
}
}
}
Check whether a feature is enabled in a template by using the feature-flag
template helper:
Features can be toggled at runtime, and are bound:
this.features.enable('newHomepage');
this.features.disable('newHomepage');
Features can be set in bulk, resetting all existing features:
this.features.setup({
"new-billing-plans": true,
"new-homepage": false
})
You may want to set the flags based on the result of a fetch:
// routes/application.js
@service features;
beforeModel() {
return fetch('/my-flag/api').then((data) => {
features.setup(data.json());
});
}
NOTE: setup
methods reset previously setup flags and their state.
You can get list of known feature flags via flags
computed property:
this.get('features').setup({
"new-billing-plans": true,
"new-homepage": false
});
this.get('features.flags') // ['newBillingPlans', 'newHomepage']
You can configure a set of initial feature flags in your app's config/environment.js
file. This
is an easy way to change settings for a given environment. For example:
// config/environment.js
module.exports = function(environment) {
var ENV = {
featureFlags: {
'show-spinners': true,
'download-cats': false
}
};
if (environment === 'production') {
ENV.featureFlags['download-cats'] = true;
}
return ENV;
};
Will log when a feature flag is queried and found to be off, useful to prevent cursing at the app, wondering why your feature is not working.
Turns on or off a feature for the test in which it is called.
Requires ember-cli-qunit >= 4.1.0 and the newer style of tests that use setupTest
, setupRenderingTest
, setupApplicationTest
.
Example:
import { enableFeature, disableFeature } from 'ember-feature-flags/test-support';
module('Acceptance | Awesome page', function(hooks) {
setupApplicationTest(hooks);
test('it displays the expected welcome message', async function (assert) {
enableFeature('new-welcome-message');
await visit('/');
assert.dom('h1.welcome-message').hasText('Welcome to the new website!');
disableFeature('new-welcome-message');
await settled();
assert.dom('h1.welcome-message').hasText('This is our old website, upgrade coming soon');
});
});
If you use this.features.isEnabled()
in components under integration test, you will need to inject a stub service in your tests. Using ember-qunit 0.4.16 or later, here's how to do this:
let featuresService = Service.extend({
isEnabled() {
return false;
}
});
moduleForComponent('my-component', 'Integration | Component | my component', {
integration: true,
beforeEach() {
this.register('service:features', featuresService);
getOwner(this).inject('component', 'features', 'service:features');
}
});
Note: for Ember before 2.3.0, you'll need to use ember-getowner-polyfill.
git clone
this repository- cd ember-feature-flags`
yarn install
ember serve
- Visit your app at http://localhost:4200.
ember try:each
(Test against multiple ember versions)ember test
ember test --server
- See RELEASE.md