Skip to content

Commit db7ff0a

Browse files
committed
refactor: standardize flag terminology and improve client implementation
- Updated `ReflagClient` to replace deprecated feature references with flag terminology, including renaming methods and properties for consistency. - Removed deprecated `featureOverrides` handling and adjusted related logic to focus solely on `flagOverrides`. - Enhanced documentation and comments throughout the codebase to clarify the transition from features to flags. - Updated tests to reflect the new flag-based approach, ensuring proper functionality and alignment with the updated terminology.
1 parent 5f9b565 commit db7ff0a

9 files changed

Lines changed: 243 additions & 2568 deletions

File tree

packages/node-sdk/src/client.ts

Lines changed: 122 additions & 625 deletions
Large diffs are not rendered by default.

packages/node-sdk/src/config.ts

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { readFileSync } from "fs";
22

33
import { version } from "../package.json";
44

5-
import { FeatureOverrides, LOG_LEVELS, TypedFlags } from "./types";
5+
import { LOG_LEVELS, TypedFlags } from "./types";
66
import { isObject, ok } from "./utils";
77

88
export const API_BASE_URL = "https://front.bucket.co";
@@ -22,41 +22,6 @@ export const FLAGS_REFETCH_MS = 60 * 1000; // re-fetch every 60 seconds
2222
export const BATCH_MAX_SIZE = 100;
2323
export const BATCH_INTERVAL_MS = 10 * 1000;
2424

25-
function parseFeatureOverrides(config: object | undefined): FeatureOverrides {
26-
if (!config) {
27-
return {};
28-
}
29-
30-
if ("featureOverrides" in config && isObject(config.featureOverrides)) {
31-
Object.entries(config.featureOverrides).forEach(([key, value]) => {
32-
ok(
33-
typeof value === "boolean" || isObject(value),
34-
`invalid type "${typeof value}" for key ${key}, expected boolean or object`,
35-
);
36-
if (isObject(value)) {
37-
ok(
38-
"isEnabled" in value && typeof value.isEnabled === "boolean",
39-
`invalid type "${typeof value.isEnabled}" for key ${key}.isEnabled, expected boolean`,
40-
);
41-
ok(
42-
value.config === undefined || isObject(value.config),
43-
`invalid type "${typeof value.config}" for key ${key}.config, expected object or undefined`,
44-
);
45-
if (isObject(value.config)) {
46-
ok(
47-
"key" in value.config && typeof value.config.key === "string",
48-
`invalid type "${typeof value.config.key}" for key ${key}.config.key, expected string`,
49-
);
50-
}
51-
}
52-
});
53-
54-
return config.featureOverrides;
55-
}
56-
57-
return {};
58-
}
59-
6025
function parseFlagOverrides(config: object | undefined): TypedFlags {
6126
if (!config) {
6227
return {};
@@ -115,7 +80,6 @@ function loadConfigFile(file: string) {
11580
);
11681

11782
return {
118-
featureOverrides: parseFeatureOverrides(config),
11983
flagOverrides: parseFlagOverrides(config),
12084
secretKey,
12185
logLevel,
@@ -125,21 +89,15 @@ function loadConfigFile(file: string) {
12589
}
12690

12791
function loadEnvVars() {
128-
const secretKey =
129-
process.env.REFLAG_SECRET_KEY ?? process.env.BUCKET_SECRET_KEY;
130-
const enabledFlags =
131-
process.env.REFLAG_FLAGS_ENABLED ?? process.env.BUCKET_FEATURES_ENABLED;
132-
const disabledFlags =
133-
process.env.REFLAG_FLAGS_DISABLED ?? process.env.BUCKET_FEATURES_DISABLED;
134-
const logLevel = process.env.REFLAG_LOG_LEVEL ?? process.env.BUCKET_LOG_LEVEL;
135-
const apiBaseUrl =
136-
process.env.REFLAG_API_BASE_URL ??
137-
process.env.BUCKET_API_BASE_URL ??
138-
process.env.BUCKET_HOST;
139-
140-
const offlineVar = process.env.REFLAG_OFFLINE ?? process.env.BUCKET_OFFLINE;
92+
const secretKey = process.env.REFLAG_SECRET_KEY;
93+
const enabledFlags = process.env.REFLAG_FLAGS_ENABLED;
94+
const disabledFlags = process.env.REFLAG_FLAGS_DISABLED;
95+
const logLevel = process.env.REFLAG_LOG_LEVEL;
96+
const apiBaseUrl = process.env.REFLAG_API_BASE_URL;
14197
const offline =
142-
offlineVar !== undefined ? ["true", "on"].includes(offlineVar) : undefined;
98+
process.env.REFLAG_OFFLINE !== undefined
99+
? ["true", "on"].includes(process.env.REFLAG_OFFLINE)
100+
: undefined;
143101

144102
let flagOverrides: Record<string, boolean> = {};
145103
if (enabledFlags) {
@@ -187,6 +145,5 @@ export function loadConfig(file?: string) {
187145
...fileConfig?.flagOverrides,
188146
...envConfig.flagOverrides,
189147
},
190-
featureOverrides: fileConfig?.featureOverrides ?? {},
191148
};
192149
}

packages/node-sdk/src/edgeClient.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ export type EdgeClientOptions = Omit<
1515
* // set the REFLAG_SECRET_KEY environment variable or pass the secret key in the constructor
1616
* const client = new EdgeClient();
1717
*
18-
* // evaluate a feature flag
18+
* // evaluate a flag
1919
* const context = {
2020
* user: { id: "user-id" },
2121
* company: { id: "company-id" },
2222
* }
23-
* const { isEnabled } = client.getFeature(context, "feature-flag-key");
23+
* const isEnabled = client.getFlag(context, "flag-key");
2424
*
2525
* ```
2626
*/

packages/node-sdk/src/index.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
export {
2-
BoundBucketClient,
3-
BoundReflagClient,
4-
BucketClient,
5-
ReflagClient,
6-
} from "./client";
1+
export { BoundReflagClient, ReflagClient } from "./client";
72
export { EdgeClient, EdgeClientOptions } from "./edgeClient";
83
export type {
94
Attributes,
@@ -12,12 +7,6 @@ export type {
127
ClientOptions,
138
Context,
149
ContextWithTracking,
15-
Feature,
16-
FeatureDefinition,
17-
FeatureOverride,
18-
FeatureOverrides,
19-
FeatureOverridesFn,
20-
Features,
2110
FlagDefinition,
2211
FlagKey,
2312
FlagOverridesFn,
@@ -29,7 +18,5 @@ export type {
2918
LogLevel,
3019
TrackingMeta,
3120
TrackOptions,
32-
TypedFeatureKey,
33-
TypedFeatures,
3421
TypedFlags,
3522
} from "./types";

packages/node-sdk/src/periodicallyUpdatingCache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export default function periodicallyUpdatingCache<T>(
3434
if (newValue === undefined) {
3535
return;
3636
}
37-
logger?.info("refreshed features");
37+
logger?.info("refreshed flags");
3838

3939
cachedValue = newValue;
4040

0 commit comments

Comments
 (0)