/CodeGate

Primary LanguageTypeScript

CodeGate

CodeGate is an open-source Feature Flag library focused on productivity. Use it anywhere Javascript or Typescript is written. Our API minimizes context switching through:

  • Configuration-in-code for easy referencing, versioning and collaboration. Never leave developer environment.
  • Declarative gating model, maximizing re-usability and understandability of gating logic.
  • Promise based for flexibility and easy rule making. Can utilize any Javascript/Typescript features and libraries in custom logic.

Core Usage

Gate

if (await gate()) {
  return <DesignA />;
} else {
  return <DesignB />;
}

Gates allow developers to manage the conditional execution of codepaths. By configuring a gate's targeting rules we can:

  • provide different user experiences conditioned on the users location
  • limit codepaths to employees only so new features can be safely tested in production
  • gradually rollout features to users to mitigate risk
  • condition on complex logic using boolean expressions (AND, OR, NOT)

Targeting Rules

const gate = BuildGate({
  targeting: [
    ruleA, // short form
    {condition: ruleB, allow: 50} // long form
  ],
  ...
})

Targeting rules are used to define the behavior of a gate. They're evaluated in sequence and once a rule is matched, subsequent rules are ignored. All users that match ruleA will pass the gate, users that don't match ruleA will next be evaluated by ruleB. If they match ruleB, only 50% will pass. If they don't match ruleB they will not pass the gate. NEED TO ADD MORE ABOUT WHAT HAPPENS AFTER YOU MATCH A GATE AND WHAT SHORT AND LONG FORM MEAN

Rules are functions that return Promises that resolve to true for successful matches and false for unsuccesful matches.

const ruleA = function (params) {
  return new Promise((resolve, reject) => {
    resolve(matchingLogic() ? true : false);
  });
};

We can also pass paramters to our rules when we call the gate

await gate({ userId: '1234' });

A rule that utilizes passed in params looks like

const useParamsRule = function (params) {
  return new Promise((resolve, reject) => {
    const allowList = ['1234'];
    resolve(allowList.includes(params.userId));
  });
};

Complex Rules

Built-In Rules

  • Node Environment restriction
  • Geo Restriction
  • ip Restriction
  • Subnet Restriction
  • Time based Restriction
  • Nested gates
  • Percentage Restriction

Aditional Features

Type Saftey

Debug Mode

Audit Logging

Error Handling

Disable Usage Analytics

References

https://martinfowler.com/articles/feature-toggles.html

Special Thanks

  • @jtlong3rd Typescript guru and programming mentor

License

Apache-2.0

TODO

  • [] Error Handling
    • [] What happens when one of the rules rejects?
    • [] What happens if BuildGate() breaks in some way?
    • [] What happen if CheckGate() breaks in some way?
  • [] Debug mode - log results of every step to console
  • [] audit log - allow record keeping of gate checks
  • [] Easy way to manually test gate, call function in node repl or browser console?
  • [] opt-out. Product usage analytics for codegate.