Skip to content

Commit 139b82b

Browse files
[FME-9594] fix build, add github workflow, add evaluationWithDetails
1 parent 4bd7af2 commit 139b82b

File tree

5 files changed

+74
-34
lines changed

5 files changed

+74
-34
lines changed

.github/workflows/ci-cd.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
name: ci-cd
2+
on:
3+
pull_request:
4+
branches:
5+
- master
6+
- development
7+
push:
8+
branches:
9+
- '*'
10+
11+
concurrency:
12+
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.run_number || github.event.pull_request.number }}
13+
cancel-in-progress: true
14+
15+
permissions:
16+
contents: read
17+
id-token: write
18+
19+
jobs:
20+
build:
21+
name: Build
22+
runs-on: ubuntu-latest
23+
steps:
24+
- name: Checkout code
25+
uses: actions/checkout@v4
26+
27+
- name: Setup Node.js
28+
uses: actions/setup-node@v4
29+
with:
30+
node-version: 'lts/*'
31+
cache: 'npm'
32+
33+
- name: npm ci
34+
run: npm ci
35+
36+
- name: npm ts tests
37+
run: npm run test-ts-decls
38+
39+
- name: npm check
40+
run: npm run check
41+
42+
- name: npm test-browser
43+
run: npm run test-browser
44+
45+
- name: npm test-node
46+
run: npm run test-node
47+
48+
- name: npm build
49+
run: BUILD_BRANCH=$(echo "${GITHUB_REF#refs/heads/}") npm run build

scripts/build_esm_replace_imports.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
# replace splitio-commons imports to use ES modules
44
replace '@splitsoftware/splitio-commons/src' '@splitsoftware/splitio-commons/esm' ./es -r
55

6+
# Fix import extension in es/index.js
7+
sed -i '' -e "s|from './lib/js-split-provider'|from './lib/js-split-provider.js'|" es/index.js
8+
69
if [ $? -eq 0 ]
710
then
811
exit 0

src/__tests__/nodeSuites/client.spec.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,13 @@ export default async function(assert) {
4747
};
4848

4949
const getBooleanSplitWithKeyTest = async (client) => {
50-
let result = await client.getBooleanValue('my_feature', false);
51-
assert.equals(result, true);
50+
let result = await client.getBooleanDetails('my_feature', false);
51+
assert.equals(result.value, true);
52+
assert.looseEquals(result.flagMetadata, { desc: 'this applies only to ON treatment' });
5253

53-
result = await client.getBooleanValue('my_feature', true, { targetingKey: 'randomKey' });
54-
assert.equals(result, false);
54+
result = await client.getBooleanDetails('my_feature', true, { targetingKey: 'randomKey' });
55+
assert.equals(result.value, false);
56+
assert.looseEquals(result.flagMetadata, {});
5557
};
5658

5759
const getStringSplitTest = async (client) => {

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export * from './lib/js-split-provider.js';
1+
export * from './lib/js-split-provider';

src/lib/js-split-provider.ts

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type Consumer = {
2020
};
2121

2222
const CONTROL_VALUE_ERROR_MESSAGE = "Received the 'control' value from Split.";
23+
const CONTROL_TREATMENT = "control";
2324

2425
export class OpenFeatureSplitProvider implements Provider {
2526
metadata = {
@@ -53,32 +54,15 @@ export class OpenFeatureSplitProvider implements Provider {
5354
this.transformContext(context)
5455
);
5556

56-
let value: boolean;
57-
switch (details.value as unknown) {
58-
case "on":
59-
value = true;
60-
break;
61-
case "off":
62-
value = false;
63-
break;
64-
case "true":
65-
value = true;
66-
break;
67-
case "false":
68-
value = false;
69-
break;
70-
case true:
71-
value = true;
72-
break;
73-
case false:
74-
value = false;
75-
break;
76-
case "control":
77-
throw new FlagNotFoundError(CONTROL_VALUE_ERROR_MESSAGE);
78-
default:
79-
throw new ParseError(`Invalid boolean value for ${details.value}`);
57+
if ( details.value === "on" || details.value === "true" ) {
58+
return { ...details, value: true };
59+
}
60+
61+
if ( details.value === "off" || details.value === "false" ) {
62+
return { ...details, value: false };
8063
}
81-
return { ...details, value };
64+
65+
throw new ParseError(`Invalid boolean value for ${details.value}`);
8266
}
8367

8468
async resolveStringEvaluation(
@@ -90,9 +74,6 @@ export class OpenFeatureSplitProvider implements Provider {
9074
flagKey,
9175
this.transformContext(context)
9276
);
93-
if (details.value === "control") {
94-
throw new FlagNotFoundError(CONTROL_VALUE_ERROR_MESSAGE);
95-
}
9677
return details;
9778
}
9879

@@ -130,14 +111,19 @@ export class OpenFeatureSplitProvider implements Provider {
130111
);
131112
} else {
132113
await this.initialized;
133-
const value = this.client.getTreatment(
114+
const {treatment: value, config}: SplitIO.TreatmentWithConfig = this.client.getTreatmentWithConfig(
134115
consumer.key,
135116
flagKey,
136117
consumer.attributes
137118
);
119+
if (value === CONTROL_TREATMENT) {
120+
throw new FlagNotFoundError(CONTROL_VALUE_ERROR_MESSAGE);
121+
}
122+
const flagMetadata = config ? JSON.parse(config) : undefined;
138123
const details: ResolutionDetails<string> = {
139124
value: value,
140125
variant: value,
126+
flagMetadata: flagMetadata,
141127
reason: StandardResolutionReasons.TARGETING_MATCH,
142128
};
143129
return details;

0 commit comments

Comments
 (0)