Skip to content

Commit a80420f

Browse files
committed
enhanced ff filter parameter: preserve fallback to string
1 parent e5c0dd7 commit a80420f

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

src/featureManagement/featureFlagConverter.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export function convert(featureFlag: AzAppConfigFeatureFlag): FeatureFlag {
2626
const clientFilter: FeatureFilter = { name: filter.name };
2727
if (filter.parameters != null) {
2828
clientFilter.parameters = Object.fromEntries(
29-
Object.entries(filter.parameters).map(([name, value]) => [name, parseJsonValue(value, featureFlag.name)]));
29+
Object.entries(filter.parameters).map(([name, value]) => [name, parseParameterValue(value)]));
3030
}
3131
return clientFilter;
3232
})
@@ -94,6 +94,19 @@ export function convert(featureFlag: AzAppConfigFeatureFlag): FeatureFlag {
9494
return result;
9595
}
9696

97+
function parseParameterValue(value: string): unknown {
98+
const trimmedValue = value.trim();
99+
if (trimmedValue.length > 0 && (trimmedValue[0] === "{" || trimmedValue[0] === "[")) {
100+
try {
101+
return JSON.parse(value) as unknown;
102+
} catch {
103+
// The value may intentionally be a string that resembles JSON.
104+
}
105+
}
106+
107+
return value;
108+
}
109+
97110
function parseJsonValue(value: string, featureFlagName: string): unknown {
98111
try {
99112
return JSON.parse(value) as unknown;

test/featureFlag.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ describe("enhanced feature flags", function () {
569569
parameters: {
570570
Audience: JSON.stringify(audience),
571571
JsonArray: " [\"one\",\"two\"] ",
572-
PlainText: JSON.stringify("not-json"),
572+
PlainText: "not-json",
573573
Percentage: "50"
574574
}
575575
}]
@@ -587,10 +587,10 @@ describe("enhanced feature flags", function () {
587587
expect(parameters.Audience).deep.equals(audience);
588588
expect(parameters.JsonArray).deep.equals(["one", "two"]);
589589
expect(parameters.PlainText).equals("not-json");
590-
expect(parameters.Percentage).equals(50);
590+
expect(parameters.Percentage).equals("50");
591591
});
592592

593-
it("should throw for invalid JSON in enhanced feature flag filter parameters", () => {
593+
it("should preserve invalid JSON in enhanced feature flag filter parameters as a string", () => {
594594
const enhancedFeatureFlag = createMockedEnhancedFeatureFlag("InvalidParameter", {
595595
conditions: {
596596
filters: [{
@@ -600,7 +600,8 @@ describe("enhanced feature flags", function () {
600600
}
601601
});
602602

603-
expectEnhancedFeatureFlagJsonError(() => convert(enhancedFeatureFlag), "InvalidParameter");
603+
const featureFlag = convert(enhancedFeatureFlag);
604+
expect(featureFlag.conditions.client_filters[0].parameters?.Value).equals("{not-json}");
604605
});
605606

606607
it("should parse enhanced feature flag variants based on content type", () => {

0 commit comments

Comments
 (0)