This is the JS/TS client library for Vexilla, a static file-based VCS-native feature flag system.
To get started is easy. Follow these steps to get started with integration.
Using npm or yarn, install the package. Typescript types are shipped with it.
npm install --save @vexilla/client
or
yarn add @vexilla/client
You will need to create a Client within your app. This optionally takes in the customInstanceHash
for use with gradual rollout as well as Selective features.
After creation, call fetchFlags
. This can be chained from the constructor since it returns the client instance.
Important Note: All methods that make HTTP requests take in a callback for the request itself. This allows you to use your existing dependencies or standard library methods to keep this bundle smaller and less opinionated.
this.client = new VexillaClient({
baseUrl: "https://BUCKET_NAME.s3-website-AWS_REGION.amazonaws.com",
environment: process.env.ENVIRONMENT,
customInstanceHash: userId,
});
this.client.getFlags("features.json");
Use the created client to check if a feature should
be on.
client.should(FEATURE_NAME);
import { VexillaClient } from '@vexilla/client';
export class FeatureFlagsService {
private client;
constructor() {
this.client = new VexillaClient({
baseUrl: 'https://BUCKET_NAME.s3-website-AWS_REGION.amazonaws.com',
environment: process.env.ENVIRONMENT,
customInstanceHash: userId
});
this.client.getFlags('features.json');
}
should(featureName) {
return this.client?.should(featureName);
}
}
Feature flags are useful for enabling or disabling parts of your application without having to redeploy. In some cases, such as mobile applications, the redeploy could take up to a week.
See more about them here:
Feature Flags are also a fundamental building block for things such as A/B testing.
The process is simple but has several steps to get up and running. Please see our in-depth guides in our documentation.
Returns a new instance of the Vexilla client
-
environment
string
: The name or ID of the environment you are targeting. This will be used in the lookups of flags and their config. -
baseUrl
string
: The base URL where your JSON files are stored. When fetching flags Vexilla will append the coerced file name to the url. No trailing slash. -
instanceId
string
: The ID, often for a user, to use by default for determining gradual flags and selective flags.
Fetches the manifest file for facilitating name->id lookups. Does not set the value on the client. You would need to call set_manifest
after. Alternatively, you can use sync_manifest
to do both steps with less code.
- fetchHook
(url: string) => string
: A callback that is passed the url of the manifest file. You can bring your own http request library.
Sets a fetched manifest within the Client instance.
- manifest
Manifest
: The manifest file to persist into the client. Usually fetched viaget_manifest
.
Fetches and sets the manifest within the client to facilitate name->Id lookups.
- fetch
(url: &str) => string
: A callback that is passed the url of the manifest file. You can bring your own http request library.
Fetches the flags for a specific flagGroup. Can use the ID or the name of the group for the lookup.
-
fileName
string
: The Name or ID of the flag group you would like to fetch. -
fetch
(url: string) -> string
: A callback that is passed the url of the flag group file. You can bring your own http request library.
Sets a fetched flag group within the Client instance.
-
group_id
&str
: The ID or name of the flag group that you would like to set. -
flags
FlagGroup
: The collection of flags you would like to set. Typically from agetFlags
call.syncFlags
wraps both functions to streamline the process.
Fetches and sets the flag group within the client to facilitate name->Id lookups.
-
fileName
string
: The Name or ID of the flag group you would like to fetch. -
fetch
(url: string) -> string
: A callback that is passed the url of the flag group file. You can bring your own http request library.
Checks if a toggle, gradual, or selective flag should be enabled. Other methods exist for other flag types, such as value. Includes an optional customInstanceId
that will be used instead of the value passed to the constructor.
-
groupName
string
: The ID or name of the flag group that you would like to check. -
featureName
string
: The ID or name of the feature flag that you would like to check. -
customInstanceHash[optional]
string | number
: The custom instance value that you would like to compare against. The value that will be used instead of the value passed to the constructor.
defaultValue: string | number | null = null): boolean
Checks if a toggle, gradual, or selective flag should be enabled. Other methods exist for other flag types, such as value. Includes an optional customInstanceHash
that will be used instead of the value passed to the constructor.
-
groupName
string
: The ID or name of the flag group that you would like to check. -
featureName
string
: The ID or name of the feature flag that you would like to check. -
customInstanceHash[optional]
string | number
: The custom instance value that you would like to compare against. The value that will be used instead of the value passed to the constructor.
value(groupName: string, featureName: string, defaultValue: string | number | null = null): string | number | null
Gets a string value based on environment. Can be useful for things like pricing and subscription plans.
-
groupName
string
: The ID or name of the flag group that you would like to check. -
featureName
string
: The ID or name of the feature flag that you would like to check. -
default
string | number | null
: The default value if the flag is off via scheduling or cannot be fetched.
We have created a tool to generate types for usage in your code. It will crawl your JSON structures and create consts or enums to help prevent typos and other "magic string" related issues. You just need to pass the URL of the JSON file where it is hosted.
To use the tool, you can run it directly from NPM.
npx vexilla types js REMOTE_JSON_URL
You can also use a precompiled binary for your platform. This install script will automatically choose the right binary for you:
curl -o- -s https://raw.githubusercontent.com/vexilla/vexilla/main/install.sh | bash
The install script also accepts a target install path:
curl -o- -s https://raw.githubusercontent.com/vexilla/vexilla/main/install.sh | bash -s -- -b /usr/local/bin/
If you prefer to download the binary manually you can get it from the releases section in Github, https://github.com/vexilla/vexilla/releases
Have you run into a bug? Is there a feature you feel is missing? Feel free to create a GitHub Issue.
Another way to get support or help is to reach out in our Discord community.
Would you like to contribute to this client SDK? There are many ways you can help. Reporting issues or creating PRs are the most obvious. Helping triage the issues and PRs of others would also be a huge help. Being a vibrant member of the community on Discord is another way to help out.
If you would like to contribute to the app, docs, or other parts of the project, please go see our Contribution Guide.
We would love to add your company's logo to our usage section on the website. Please submit your name and logo url in this issue.
No sponsors yet. This could be a link and icon for your company here.
Current Vexilla code is released under a combination of two licenses, the Business Source License (BSL) and the MIT License.
Please see the License file for more info.