FeaturevisorFeaturevisor

Advanced

Datasource & Adapters

By default, Featurevisor CLI uses the file system for reading and writing data in your project, given it's a Git repository after all. But the configuration API allows you to switch to any source via adapters.

Accessing datasource

It's unlikely that you will make use of the Datasource API yourself directly, unless you are a plugin developer.

The datasource object allows you to read and write data from/to the Featurevisor project, so that you don't have to deal with the file system (or any other custom source of your project data) directly.

You can refer to the full datasource API for more details.

Datasource methods

Once you have access to the datasource object, you can use the following methods from its instance:

Revision

See state files for more details.

const revision = await datasource.readRevision();
await datasource.writeRevision(revision + 1);

Features

See features for more details.

const features = await datasource.listFeatures();
const fooFeatureExists = await datasource.featureExists("foo");
const fooFeature = await datasource.readFeature("foo");
await datasource.writeFeature("foo", { ...fooFeature, ...newData });
await datasource.deleteFeature("foo");

Segments

See segments for more details.

const segments = await datasource.listSegments();
const fooSegmentExists = await datasource.segmentExists("foo");
const fooSegment = await datasource.readSegment("foo");
await datasource.writeSegment("foo", { ...fooSegment, ...newData });
await datasource.deleteSegment("foo");

Attributes

See attributes for more details.

const attributes = await datasource.listAttributes();
const fooAttributeExists = await datasource.attributeExists("foo");
const fooAttribute = await datasource.readAttribute("foo");
await datasource.writeAttribute("foo", { ...fooAttribute, ...newData });
await datasource.deleteAttribute("foo");

Groups

See groups for more details.

const groups = await datasource.listGroups();
const fooGroupExists = await datasource.groupExists("foo");
const fooGroup = await datasource.readGroup("foo");
await datasource.writeGroup("foo", { ...fooGroup, ...newData });
await datasource.deleteGroup("foo");

Tests

See testing for more details.

const tests = await datasource.listTests();
const fooTest = await datasource.readTest("foo");
await datasource.writeTest("foo", { ...fooTest, ...newData });
await datasource.deleteTest("foo");

State

See state files for more details.

const existingState = await datasource.readState(environment);
datasource.writeState(environment, { ...existingState, ...newState });

History

To get history of changes made to a specific entity:

const fooChanges = await datasource.listHistoryEntries("feature", "foo");

The first argument for entity type can be one of:

  • feature
  • segment
  • attribute
  • group
  • test

Adapters

Because a Featurevisor project is a Git repository by default, Featurevisor CLI ships with a default adapter that reads and writes data from/to the file system which is called FilesystemAdapter.

You don't have to configure this adapter explicitly anywhere, unless you are writing a custom one.

Writing a custom adapter

You can write your own custom datasource adapter as follows:

// adapters/custom-adapter.ts
import { Adapter } from "@featurevisor/core";

export class CustomAdapter extends Adapter {
  // ...implement the methods here
}

Refer to the implementation of FilesystemAdapter to understand more.

Using a custom adapter

You can swap out the default file system adapter with your custom adapter via you configuration file as found in featurevisor.config.js:

// featurevisor.config.js

const { CustomAdapter } = require("./adapters/custom-adapter");

module.exports = {
  environments: ["staging", "production"],
  tags: ["web", "mobile"],

  adapter: CustomAdapter,
}
Previous
Plugins