feature-flip
Version:
Flexible React & React Native feature flagging/flipping/toggling for simple use cases
157 lines (118 loc) • 4.44 kB
Markdown
[](https://npmjs.org/package/feature-flip)
[](https://npmjs.org/package/feature-flip)
[](https://github.com/RichardLitt/standard-readme)
[](https://npmjs.org/package/feature-flip)
[](http://makeapullrequest.com)
Flexible React & React Native feature flagging/flipping/toggling for simple use cases
- [🏁 feature-flip](
- [📖 Table of Contents](
- [👀 Background](
- [Features](
- [⚙️ Install](
- [📖 Usage](
- [Kitchen sink](
- [Overridable value parsing](
- [📚 API](
- [💬 Contributing](
- [🪪 License](
This package facilitates a [feature flag-driven workflow](https://launchdarkly.com/blog/feature-flag-driven-development/) within React and React Native applications. It is intended for simple use cases where a local or remote configuration object is used. If you have more complex requirements such as incremental roll-outs please take a look at services such as [LaunchDarkly](https://launchdarkly.com/) or [Unleash](https://www.getunleash.io/).
- Tiny bundle size
- TypeScript support with [API docs](https://paka.dev/npm/feature-flip)
- React hook, HOC and render prop APIs
- Optional fallback for falsy or missing flags
- Support for nested flags with custom separator
- Overridable value parsing for unique cases such as semver
Install the package locally within you project folder with your package manager:
With `npm`:
```sh
npm install feature-flip
```
With `yarn`:
```sh
yarn add feature-flip
```
With `pnpm`:
```sh
pnpm add feature-flip
```
```tsx
import {
FeatureFlipsProvider,
FeatureFlip,
withFeatureFlip,
useFeatureFlip
} from "feature-flip";
const features = {
blog: {
header: true,
content: {
intro: "no"
},
footer: false
}
};
const Header = () => {
const isEnabled = useFeatureFlip("blog.header");
return isEnabled ? <header>Header</header> : null;
};
const Intro = withFeatureFlip("content.intro")(() => <p>Intro</p>);
export default function App() {
return (
<FeatureFlipsProvider value={features}>
<div>
<Header />
<main>
<Intro />
<p>This is the content</p>
<FeatureFlip name="missing-flag">
<p>Will not show</p>
</FeatureFlip>
</main>
<FeatureFlip
name="blog.footer"
fallback={<footer>Fallback footer</footer>}
>
<footer>Footer</footer>
</FeatureFlip>
</div>
</FeatureFlipsProvider>
);
}
```
By providing your own `onParseValue` configuration option you can handle special cases such as enable/disabling a flag based on a semantic version.
First create your custom handler:
```tsx
import semver from "semver";
import { defaultValueParser } from "feature-flip";
export const parseSemverValue = (value) => {
if (semver.valid(value)) return semver.satisfies(value);
// If it isn't a valid semver value, handle as normal
return defaultValueParser(value);
};
```
Now override the `config` option for your `FeatureFlipsProvider`:
```tsx
import {parseSemverValue} from "./parse-semver-value"
const features = {
// ...
}
const App = () => <FeatureFlipsProvider value={features} config={{
onParseValue: parseSemverValue
}}>
<Component />
</FeatureFlipsProvider>
```
For all configuration options, please see the [API docs](https://paka.dev/npm/feature-flip).
Got an idea for a new feature? Found a bug? Contributions are welcome! Please [open up an issue](https://github.com/tiaanduplessis/feature-flip/issues) or [make a pull request](https://makeapullrequest.com/).
[](./LICENSE)