2.0.0 • Published 2 years ago

ember-config-cat v2.0.0

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

ember-config-cat

Build

This addon includes a service which wraps a ConfigCat client and aims at easing any feature flagging in your applications.

Compatibility

  • Ember.js v3.24 or above
  • Ember CLI v3.24 or above
  • Node.js v12 or above

Installation

ember install ember-config-cat

Usage

Options

# environment.js

module.exports = function (environment) {
  let ENV = {
    emberConfigCat: {
      // your options goes here
    }
  };
};
OptionDefaultDescriptionLinks
mode'auto'Polling mode: 'auto'/'lazy'/'manual'🔗
localfalseEnabling local mode: will only use default flag values-
flags-Default values for feature-flags-
sdkKeyYour SDK Key🔗
requestTimeoutMs30000Amount of time the SDK waits before returning cached values🔗
maxInitWaitTimeSeconds5Maximum waiting time between client init and config fetch🔗
pollIntervalSeconds60Polling interval🔗
cacheTimeToLiveSeconds60Cache TTL🔗
dataGovernance0 (Global)Determine the CDN location of the data: 0 for Global / 1 for EuOnly🔗
logLevel-Set a custom log level🔗
  • requestTimeoutMs and dataGovernance are common polling options to the three available modes
  • All default values except mode, local and autoStart are defined in the ConfigCat SDK
  • You may define either local or sdkKey but the addon will fallback to local mode if no sdkKey is provided.

Content Security Policy (CSP)

If your app is using ember-cli-content-security-policy, you may need to add this into environment.js to allow ConfigCat requests.

module.exports = function (environment) {
  let ENV = {
    contentSecurityPolicy: {
      'connect-src': ['https://cdn-global.configcat.com'],
    },
  };
};

Initializing the client

Without user identification

import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class WhateverRoute extends Route {
  @service configCat;

  beforeModel() {
    return this.configCat.initClient();
  }
}

With user identification

A ConfigCat user object is made of four properties (identifier, email, country and custom): structure Calling .identifyUser() will initialize the client if needed.

import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class WhateverRoute extends Route {
  @service configCat;

  async model() {
    const user = this.authenticate();
    await this.configCat.identifyUser({
      identifier: user.id,
      email: user.email,
    });
  }
}

Using feature-flag values

import Component from '@glimmer/component';
import { inject as service } from '@ember/service';

export default class WhateverComponent extends Component {
  @service configCat;

  get isEnabled() {
    return this.configCat.flags.isAwesomeFeatureEnabled;
  }
}
{{#if this.isEnabled}}
  Enabled
{{else}}
  Disabled
{{/if}}

Template helpers

NameParametersDescription
is-flag-enabledkeyChecks if the flag is enabled
get-flag-valuekeyGets the current flag value
has-flag-valuekey, valueCompares the current flag value against a provided parameters

Clearing data

import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';

export default class WhateverComponent extends Component {
  @service configCat;

  @action onClear() {
    this.configCat.dispose();
  }
}

Public methods and properties

NameTypeDescription
flagstracked propertyReturns available feature-flags and values
identifyUsermethodIdentifies user and update feature-flags values
updatemethodUpdates feature-flags values
disposemethodReleases everything related to the ConfigCat client

Testing

ember-config-cat comes with a couple of test-helpers:

// ...
import { setupConfigCat, TestContext } from 'ember-config-cat/test-support';

module('...', function (hooks) {
  // ...
  setupConfigCat(hooks);

  test('...', async function (this: TestContext, assert) {
    // configuring one flag
    this.withFlag('featureA', true);

    // configuring several flags
    this.withFlags({ featureB: true, pricing: 10 });

    // ...
  });
});

Contributing

See the Contributing guide for details.

References

We draw our inspiration from the ember-launch-darkly addon

Docs

License

This project is licensed under the MIT License.