@azure/app-configuration 1.9.2-alpha.20251027.1 → 1.9.2-alpha.20251029.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/featureFlag.d.ts +1 -0
- package/dist/browser/featureFlag.d.ts.map +1 -1
- package/dist/browser/featureFlag.js +4 -0
- package/dist/browser/featureFlag.js.map +1 -1
- package/dist/browser/internal/jsonModels.d.ts +2 -1
- package/dist/browser/internal/jsonModels.d.ts.map +1 -1
- package/dist/browser/internal/jsonModels.js.map +1 -1
- package/dist/commonjs/featureFlag.d.ts +1 -0
- package/dist/commonjs/featureFlag.d.ts.map +1 -1
- package/dist/commonjs/featureFlag.js +4 -0
- package/dist/commonjs/featureFlag.js.map +1 -1
- package/dist/commonjs/internal/jsonModels.d.ts +2 -1
- package/dist/commonjs/internal/jsonModels.d.ts.map +1 -1
- package/dist/commonjs/internal/jsonModels.js.map +1 -1
- package/dist/esm/featureFlag.d.ts +1 -0
- package/dist/esm/featureFlag.d.ts.map +1 -1
- package/dist/esm/featureFlag.js +4 -0
- package/dist/esm/featureFlag.js.map +1 -1
- package/dist/esm/internal/jsonModels.d.ts +2 -1
- package/dist/esm/internal/jsonModels.d.ts.map +1 -1
- package/dist/esm/internal/jsonModels.js.map +1 -1
- package/dist/react-native/featureFlag.d.ts +1 -0
- package/dist/react-native/featureFlag.d.ts.map +1 -1
- package/dist/react-native/featureFlag.js +4 -0
- package/dist/react-native/featureFlag.js.map +1 -1
- package/dist/react-native/internal/jsonModels.d.ts +2 -1
- package/dist/react-native/internal/jsonModels.d.ts.map +1 -1
- package/dist/react-native/internal/jsonModels.js.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACxE,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KACjC,CAAC;IACF;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;+CAEY,yBAAyB,CAAC,gBAAgB,CAAC,KACvD,yBAAyB;CA4B7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAAC,gBAAgB,CAAC,CAgCxC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,IAAI,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAIjF"}
|
|
@@ -32,6 +32,7 @@ export const FeatureFlagHelper = {
|
|
|
32
32
|
description: featureFlag.value.description,
|
|
33
33
|
conditions: {
|
|
34
34
|
client_filters: featureFlag.value.conditions.clientFilters,
|
|
35
|
+
requirement_type: featureFlag.value.conditions.requirementType ?? "Any",
|
|
35
36
|
},
|
|
36
37
|
display_name: featureFlag.value.displayName,
|
|
37
38
|
};
|
|
@@ -69,6 +70,9 @@ export function parseFeatureFlag(setting) {
|
|
|
69
70
|
key,
|
|
70
71
|
contentType: featureFlagContentType,
|
|
71
72
|
};
|
|
73
|
+
if (jsonFeatureFlagValue.conditions.requirement_type) {
|
|
74
|
+
featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;
|
|
75
|
+
}
|
|
72
76
|
return featureflag;
|
|
73
77
|
}
|
|
74
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ConfigurationSetting, ConfigurationSettingParam } from \"./models.js\";\nimport type { JsonFeatureFlagValue } from \"./internal/jsonModels.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * The prefix for feature flags.\n */\nexport const featureFlagPrefix = \".appconfig.featureflag/\";\n\n/**\n * The content type for a FeatureFlag\n */\nexport const featureFlagContentType = \"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\";\n\n/**\n * Value of a feature flag\n */\nexport interface FeatureFlagValue {\n /**\n * Id for the feature flag.\n */\n id?: string;\n /**\n * A Feature filter consistently evaluates the state of a feature flag.\n * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.\n * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.\n *\n * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\n requirementType?: \"All\" | \"Any\";\n };\n /**\n * Description of the feature.\n */\n description?: string;\n /**\n * Boolean flag to say if the feature flag is enabled.\n */\n enabled: boolean;\n /**\n * Display name for the feature to use for display rather than the ID.\n */\n displayName?: string;\n}\n\n/**\n * @internal\n */\nexport const FeatureFlagHelper = {\n /**\n * Takes the FeatureFlag (JSON) and returns a ConfigurationSetting (with the props encodeed in the value).\n */\n toConfigurationSettingParam: (\n featureFlag: ConfigurationSettingParam<FeatureFlagValue>,\n ): ConfigurationSettingParam => {\n logger.info(\"Encoding FeatureFlag value in a ConfigurationSetting:\", featureFlag);\n if (!featureFlag.value) {\n logger.error(\"FeatureFlag has an unexpected value\", featureFlag);\n throw new TypeError(`FeatureFlag has an unexpected value - ${featureFlag.value}`);\n }\n let key = featureFlag.key;\n if (typeof featureFlag.key === \"string\" && !featureFlag.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + featureFlag.key;\n }\n const jsonFeatureFlagValue: JsonFeatureFlagValue = {\n id: featureFlag.value.id ?? key.replace(featureFlagPrefix, \"\"),\n enabled: featureFlag.value.enabled,\n description: featureFlag.value.description,\n conditions: {\n client_filters: featureFlag.value.conditions.clientFilters,\n requirement_type: featureFlag.value.conditions.requirementType ?? \"Any\",\n },\n display_name: featureFlag.value.displayName,\n };\n\n const configSetting = {\n ...featureFlag,\n key,\n value: JSON.stringify(jsonFeatureFlagValue),\n };\n return configSetting;\n },\n};\n\n/**\n * Takes the ConfigurationSetting as input and returns the ConfigurationSetting<FeatureFlagValue> by parsing the value string.\n */\nexport function parseFeatureFlag(\n setting: ConfigurationSetting,\n): ConfigurationSetting<FeatureFlagValue> {\n logger.info(\"Parsing the value to return the FeatureFlagValue\", setting);\n if (!isFeatureFlag(setting)) {\n logger.error(\"Invalid FeatureFlag input\", setting);\n throw TypeError(\n `Setting with key ${setting.key} is not a valid FeatureFlag, make sure to have the correct content-type and a valid non-null value.`,\n );\n }\n\n const jsonFeatureFlagValue = JSON.parse(setting.value) as JsonFeatureFlagValue;\n\n let key = setting.key;\n if (typeof setting.key === \"string\" && !setting.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + setting.key;\n }\n const featureflag: ConfigurationSetting<FeatureFlagValue> = {\n ...setting,\n value: {\n id: jsonFeatureFlagValue.id,\n enabled: jsonFeatureFlagValue.enabled,\n description: jsonFeatureFlagValue.description,\n displayName: jsonFeatureFlagValue.display_name,\n conditions: { clientFilters: jsonFeatureFlagValue.conditions.client_filters },\n },\n key,\n contentType: featureFlagContentType,\n };\n\n if (jsonFeatureFlagValue.conditions.requirement_type) {\n featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;\n }\n return featureflag;\n}\n\n/**\n * Lets you know if the ConfigurationSetting is a feature flag.\n *\n * [Checks if the content type is featureFlagContentType `\"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\"`]\n */\nexport function isFeatureFlag(\n setting: ConfigurationSetting,\n): setting is ConfigurationSetting & Required<Pick<ConfigurationSetting, \"value\">> {\n return (\n setting && setting.contentType === featureFlagContentType && typeof setting.value === \"string\"\n );\n}\n"]}
|
|
@@ -7,10 +7,11 @@ export type JsonFeatureFlagValue = {
|
|
|
7
7
|
name: string;
|
|
8
8
|
parameters?: Record<string, unknown>;
|
|
9
9
|
}[];
|
|
10
|
+
requirement_type?: "All" | "Any";
|
|
10
11
|
};
|
|
11
12
|
description?: string;
|
|
12
13
|
enabled: boolean;
|
|
13
|
-
id
|
|
14
|
+
id: string;
|
|
14
15
|
display_name?: string;
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACzE,gBAAgB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n };\n description?: string;\n enabled: boolean;\n id
|
|
1
|
+
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n requirement_type?: \"All\" | \"Any\";\n };\n description?: string;\n enabled: boolean;\n id: string;\n display_name?: string;\n};\n\n// keyvault secret reference\n\n/**\n * @internal\n */\nexport interface JsonSecretReferenceValue {\n uri: string;\n}\n\n// snapshot reference\n\n/**\n * @internal\n */\nexport interface JsonSnapshotReferenceValue {\n snapshot_name: string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACxE,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KACjC,CAAC;IACF;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;+CAEY,yBAAyB,CAAC,gBAAgB,CAAC,KACvD,yBAAyB;CA4B7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAAC,gBAAgB,CAAC,CAgCxC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,IAAI,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAIjF"}
|
|
@@ -37,6 +37,7 @@ exports.FeatureFlagHelper = {
|
|
|
37
37
|
description: featureFlag.value.description,
|
|
38
38
|
conditions: {
|
|
39
39
|
client_filters: featureFlag.value.conditions.clientFilters,
|
|
40
|
+
requirement_type: featureFlag.value.conditions.requirementType ?? "Any",
|
|
40
41
|
},
|
|
41
42
|
display_name: featureFlag.value.displayName,
|
|
42
43
|
};
|
|
@@ -74,6 +75,9 @@ function parseFeatureFlag(setting) {
|
|
|
74
75
|
key,
|
|
75
76
|
contentType: exports.featureFlagContentType,
|
|
76
77
|
};
|
|
78
|
+
if (jsonFeatureFlagValue.conditions.requirement_type) {
|
|
79
|
+
featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;
|
|
80
|
+
}
|
|
77
81
|
return featureflag;
|
|
78
82
|
}
|
|
79
83
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;
|
|
1
|
+
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ConfigurationSetting, ConfigurationSettingParam } from \"./models.js\";\nimport type { JsonFeatureFlagValue } from \"./internal/jsonModels.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * The prefix for feature flags.\n */\nexport const featureFlagPrefix = \".appconfig.featureflag/\";\n\n/**\n * The content type for a FeatureFlag\n */\nexport const featureFlagContentType = \"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\";\n\n/**\n * Value of a feature flag\n */\nexport interface FeatureFlagValue {\n /**\n * Id for the feature flag.\n */\n id?: string;\n /**\n * A Feature filter consistently evaluates the state of a feature flag.\n * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.\n * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.\n *\n * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\n requirementType?: \"All\" | \"Any\";\n };\n /**\n * Description of the feature.\n */\n description?: string;\n /**\n * Boolean flag to say if the feature flag is enabled.\n */\n enabled: boolean;\n /**\n * Display name for the feature to use for display rather than the ID.\n */\n displayName?: string;\n}\n\n/**\n * @internal\n */\nexport const FeatureFlagHelper = {\n /**\n * Takes the FeatureFlag (JSON) and returns a ConfigurationSetting (with the props encodeed in the value).\n */\n toConfigurationSettingParam: (\n featureFlag: ConfigurationSettingParam<FeatureFlagValue>,\n ): ConfigurationSettingParam => {\n logger.info(\"Encoding FeatureFlag value in a ConfigurationSetting:\", featureFlag);\n if (!featureFlag.value) {\n logger.error(\"FeatureFlag has an unexpected value\", featureFlag);\n throw new TypeError(`FeatureFlag has an unexpected value - ${featureFlag.value}`);\n }\n let key = featureFlag.key;\n if (typeof featureFlag.key === \"string\" && !featureFlag.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + featureFlag.key;\n }\n const jsonFeatureFlagValue: JsonFeatureFlagValue = {\n id: featureFlag.value.id ?? key.replace(featureFlagPrefix, \"\"),\n enabled: featureFlag.value.enabled,\n description: featureFlag.value.description,\n conditions: {\n client_filters: featureFlag.value.conditions.clientFilters,\n requirement_type: featureFlag.value.conditions.requirementType ?? \"Any\",\n },\n display_name: featureFlag.value.displayName,\n };\n\n const configSetting = {\n ...featureFlag,\n key,\n value: JSON.stringify(jsonFeatureFlagValue),\n };\n return configSetting;\n },\n};\n\n/**\n * Takes the ConfigurationSetting as input and returns the ConfigurationSetting<FeatureFlagValue> by parsing the value string.\n */\nexport function parseFeatureFlag(\n setting: ConfigurationSetting,\n): ConfigurationSetting<FeatureFlagValue> {\n logger.info(\"Parsing the value to return the FeatureFlagValue\", setting);\n if (!isFeatureFlag(setting)) {\n logger.error(\"Invalid FeatureFlag input\", setting);\n throw TypeError(\n `Setting with key ${setting.key} is not a valid FeatureFlag, make sure to have the correct content-type and a valid non-null value.`,\n );\n }\n\n const jsonFeatureFlagValue = JSON.parse(setting.value) as JsonFeatureFlagValue;\n\n let key = setting.key;\n if (typeof setting.key === \"string\" && !setting.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + setting.key;\n }\n const featureflag: ConfigurationSetting<FeatureFlagValue> = {\n ...setting,\n value: {\n id: jsonFeatureFlagValue.id,\n enabled: jsonFeatureFlagValue.enabled,\n description: jsonFeatureFlagValue.description,\n displayName: jsonFeatureFlagValue.display_name,\n conditions: { clientFilters: jsonFeatureFlagValue.conditions.client_filters },\n },\n key,\n contentType: featureFlagContentType,\n };\n\n if (jsonFeatureFlagValue.conditions.requirement_type) {\n featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;\n }\n return featureflag;\n}\n\n/**\n * Lets you know if the ConfigurationSetting is a feature flag.\n *\n * [Checks if the content type is featureFlagContentType `\"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\"`]\n */\nexport function isFeatureFlag(\n setting: ConfigurationSetting,\n): setting is ConfigurationSetting & Required<Pick<ConfigurationSetting, \"value\">> {\n return (\n setting && setting.contentType === featureFlagContentType && typeof setting.value === \"string\"\n );\n}\n"]}
|
|
@@ -7,10 +7,11 @@ export type JsonFeatureFlagValue = {
|
|
|
7
7
|
name: string;
|
|
8
8
|
parameters?: Record<string, unknown>;
|
|
9
9
|
}[];
|
|
10
|
+
requirement_type?: "All" | "Any";
|
|
10
11
|
};
|
|
11
12
|
description?: string;
|
|
12
13
|
enabled: boolean;
|
|
13
|
-
id
|
|
14
|
+
id: string;
|
|
14
15
|
display_name?: string;
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACzE,gBAAgB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n };\n description?: string;\n enabled: boolean;\n id
|
|
1
|
+
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n requirement_type?: \"All\" | \"Any\";\n };\n description?: string;\n enabled: boolean;\n id: string;\n display_name?: string;\n};\n\n// keyvault secret reference\n\n/**\n * @internal\n */\nexport interface JsonSecretReferenceValue {\n uri: string;\n}\n\n// snapshot reference\n\n/**\n * @internal\n */\nexport interface JsonSnapshotReferenceValue {\n snapshot_name: string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACxE,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KACjC,CAAC;IACF;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;+CAEY,yBAAyB,CAAC,gBAAgB,CAAC,KACvD,yBAAyB;CA4B7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAAC,gBAAgB,CAAC,CAgCxC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,IAAI,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAIjF"}
|
package/dist/esm/featureFlag.js
CHANGED
|
@@ -32,6 +32,7 @@ export const FeatureFlagHelper = {
|
|
|
32
32
|
description: featureFlag.value.description,
|
|
33
33
|
conditions: {
|
|
34
34
|
client_filters: featureFlag.value.conditions.clientFilters,
|
|
35
|
+
requirement_type: featureFlag.value.conditions.requirementType ?? "Any",
|
|
35
36
|
},
|
|
36
37
|
display_name: featureFlag.value.displayName,
|
|
37
38
|
};
|
|
@@ -69,6 +70,9 @@ export function parseFeatureFlag(setting) {
|
|
|
69
70
|
key,
|
|
70
71
|
contentType: featureFlagContentType,
|
|
71
72
|
};
|
|
73
|
+
if (jsonFeatureFlagValue.conditions.requirement_type) {
|
|
74
|
+
featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;
|
|
75
|
+
}
|
|
72
76
|
return featureflag;
|
|
73
77
|
}
|
|
74
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ConfigurationSetting, ConfigurationSettingParam } from \"./models.js\";\nimport type { JsonFeatureFlagValue } from \"./internal/jsonModels.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * The prefix for feature flags.\n */\nexport const featureFlagPrefix = \".appconfig.featureflag/\";\n\n/**\n * The content type for a FeatureFlag\n */\nexport const featureFlagContentType = \"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\";\n\n/**\n * Value of a feature flag\n */\nexport interface FeatureFlagValue {\n /**\n * Id for the feature flag.\n */\n id?: string;\n /**\n * A Feature filter consistently evaluates the state of a feature flag.\n * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.\n * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.\n *\n * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\n requirementType?: \"All\" | \"Any\";\n };\n /**\n * Description of the feature.\n */\n description?: string;\n /**\n * Boolean flag to say if the feature flag is enabled.\n */\n enabled: boolean;\n /**\n * Display name for the feature to use for display rather than the ID.\n */\n displayName?: string;\n}\n\n/**\n * @internal\n */\nexport const FeatureFlagHelper = {\n /**\n * Takes the FeatureFlag (JSON) and returns a ConfigurationSetting (with the props encodeed in the value).\n */\n toConfigurationSettingParam: (\n featureFlag: ConfigurationSettingParam<FeatureFlagValue>,\n ): ConfigurationSettingParam => {\n logger.info(\"Encoding FeatureFlag value in a ConfigurationSetting:\", featureFlag);\n if (!featureFlag.value) {\n logger.error(\"FeatureFlag has an unexpected value\", featureFlag);\n throw new TypeError(`FeatureFlag has an unexpected value - ${featureFlag.value}`);\n }\n let key = featureFlag.key;\n if (typeof featureFlag.key === \"string\" && !featureFlag.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + featureFlag.key;\n }\n const jsonFeatureFlagValue: JsonFeatureFlagValue = {\n id: featureFlag.value.id ?? key.replace(featureFlagPrefix, \"\"),\n enabled: featureFlag.value.enabled,\n description: featureFlag.value.description,\n conditions: {\n client_filters: featureFlag.value.conditions.clientFilters,\n requirement_type: featureFlag.value.conditions.requirementType ?? \"Any\",\n },\n display_name: featureFlag.value.displayName,\n };\n\n const configSetting = {\n ...featureFlag,\n key,\n value: JSON.stringify(jsonFeatureFlagValue),\n };\n return configSetting;\n },\n};\n\n/**\n * Takes the ConfigurationSetting as input and returns the ConfigurationSetting<FeatureFlagValue> by parsing the value string.\n */\nexport function parseFeatureFlag(\n setting: ConfigurationSetting,\n): ConfigurationSetting<FeatureFlagValue> {\n logger.info(\"Parsing the value to return the FeatureFlagValue\", setting);\n if (!isFeatureFlag(setting)) {\n logger.error(\"Invalid FeatureFlag input\", setting);\n throw TypeError(\n `Setting with key ${setting.key} is not a valid FeatureFlag, make sure to have the correct content-type and a valid non-null value.`,\n );\n }\n\n const jsonFeatureFlagValue = JSON.parse(setting.value) as JsonFeatureFlagValue;\n\n let key = setting.key;\n if (typeof setting.key === \"string\" && !setting.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + setting.key;\n }\n const featureflag: ConfigurationSetting<FeatureFlagValue> = {\n ...setting,\n value: {\n id: jsonFeatureFlagValue.id,\n enabled: jsonFeatureFlagValue.enabled,\n description: jsonFeatureFlagValue.description,\n displayName: jsonFeatureFlagValue.display_name,\n conditions: { clientFilters: jsonFeatureFlagValue.conditions.client_filters },\n },\n key,\n contentType: featureFlagContentType,\n };\n\n if (jsonFeatureFlagValue.conditions.requirement_type) {\n featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;\n }\n return featureflag;\n}\n\n/**\n * Lets you know if the ConfigurationSetting is a feature flag.\n *\n * [Checks if the content type is featureFlagContentType `\"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\"`]\n */\nexport function isFeatureFlag(\n setting: ConfigurationSetting,\n): setting is ConfigurationSetting & Required<Pick<ConfigurationSetting, \"value\">> {\n return (\n setting && setting.contentType === featureFlagContentType && typeof setting.value === \"string\"\n );\n}\n"]}
|
|
@@ -7,10 +7,11 @@ export type JsonFeatureFlagValue = {
|
|
|
7
7
|
name: string;
|
|
8
8
|
parameters?: Record<string, unknown>;
|
|
9
9
|
}[];
|
|
10
|
+
requirement_type?: "All" | "Any";
|
|
10
11
|
};
|
|
11
12
|
description?: string;
|
|
12
13
|
enabled: boolean;
|
|
13
|
-
id
|
|
14
|
+
id: string;
|
|
14
15
|
display_name?: string;
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACzE,gBAAgB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n };\n description?: string;\n enabled: boolean;\n id
|
|
1
|
+
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n requirement_type?: \"All\" | \"Any\";\n };\n description?: string;\n enabled: boolean;\n id: string;\n display_name?: string;\n};\n\n// keyvault secret reference\n\n/**\n * @internal\n */\nexport interface JsonSecretReferenceValue {\n uri: string;\n}\n\n// snapshot reference\n\n/**\n * @internal\n */\nexport interface JsonSnapshotReferenceValue {\n snapshot_name: string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.d.ts","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAInF;;GAEG;AACH,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,sBAAsB,8DAA8D,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,UAAU,EAAE;QACV,aAAa,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACxE,eAAe,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KACjC,CAAC;IACF;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B;;OAEG;+CAEY,yBAAyB,CAAC,gBAAgB,CAAC,KACvD,yBAAyB;CA4B7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAAC,gBAAgB,CAAC,CAgCxC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,IAAI,oBAAoB,GAAG,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAIjF"}
|
|
@@ -32,6 +32,7 @@ export const FeatureFlagHelper = {
|
|
|
32
32
|
description: featureFlag.value.description,
|
|
33
33
|
conditions: {
|
|
34
34
|
client_filters: featureFlag.value.conditions.clientFilters,
|
|
35
|
+
requirement_type: featureFlag.value.conditions.requirementType ?? "Any",
|
|
35
36
|
},
|
|
36
37
|
display_name: featureFlag.value.displayName,
|
|
37
38
|
};
|
|
@@ -69,6 +70,9 @@ export function parseFeatureFlag(setting) {
|
|
|
69
70
|
key,
|
|
70
71
|
contentType: featureFlagContentType,
|
|
71
72
|
};
|
|
73
|
+
if (jsonFeatureFlagValue.conditions.requirement_type) {
|
|
74
|
+
featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;
|
|
75
|
+
}
|
|
72
76
|
return featureflag;
|
|
73
77
|
}
|
|
74
78
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"featureFlag.js","sourceRoot":"","sources":["../../src/featureFlag.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ConfigurationSetting, ConfigurationSettingParam } from \"./models.js\";\nimport type { JsonFeatureFlagValue } from \"./internal/jsonModels.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * The prefix for feature flags.\n */\nexport const featureFlagPrefix = \".appconfig.featureflag/\";\n\n/**\n * The content type for a FeatureFlag\n */\nexport const featureFlagContentType = \"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\";\n\n/**\n * Value of a feature flag\n */\nexport interface FeatureFlagValue {\n /**\n * Id for the feature flag.\n */\n id?: string;\n /**\n * A Feature filter consistently evaluates the state of a feature flag.\n * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.\n * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.\n *\n * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\n requirementType?: \"All\" | \"Any\";\n };\n /**\n * Description of the feature.\n */\n description?: string;\n /**\n * Boolean flag to say if the feature flag is enabled.\n */\n enabled: boolean;\n /**\n * Display name for the feature to use for display rather than the ID.\n */\n displayName?: string;\n}\n\n/**\n * @internal\n */\nexport const FeatureFlagHelper = {\n /**\n * Takes the FeatureFlag (JSON) and returns a ConfigurationSetting (with the props encodeed in the value).\n */\n toConfigurationSettingParam: (\n featureFlag: ConfigurationSettingParam<FeatureFlagValue>,\n ): ConfigurationSettingParam => {\n logger.info(\"Encoding FeatureFlag value in a ConfigurationSetting:\", featureFlag);\n if (!featureFlag.value) {\n logger.error(\"FeatureFlag has an unexpected value\", featureFlag);\n throw new TypeError(`FeatureFlag has an unexpected value - ${featureFlag.value}`);\n }\n let key = featureFlag.key;\n if (typeof featureFlag.key === \"string\" && !featureFlag.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + featureFlag.key;\n }\n const jsonFeatureFlagValue: JsonFeatureFlagValue = {\n id: featureFlag.value.id ?? key.replace(featureFlagPrefix, \"\"),\n enabled: featureFlag.value.enabled,\n description: featureFlag.value.description,\n conditions: {\n client_filters: featureFlag.value.conditions.clientFilters,\n requirement_type: featureFlag.value.conditions.requirementType ?? \"Any\",\n },\n display_name: featureFlag.value.displayName,\n };\n\n const configSetting = {\n ...featureFlag,\n key,\n value: JSON.stringify(jsonFeatureFlagValue),\n };\n return configSetting;\n },\n};\n\n/**\n * Takes the ConfigurationSetting as input and returns the ConfigurationSetting<FeatureFlagValue> by parsing the value string.\n */\nexport function parseFeatureFlag(\n setting: ConfigurationSetting,\n): ConfigurationSetting<FeatureFlagValue> {\n logger.info(\"Parsing the value to return the FeatureFlagValue\", setting);\n if (!isFeatureFlag(setting)) {\n logger.error(\"Invalid FeatureFlag input\", setting);\n throw TypeError(\n `Setting with key ${setting.key} is not a valid FeatureFlag, make sure to have the correct content-type and a valid non-null value.`,\n );\n }\n\n const jsonFeatureFlagValue = JSON.parse(setting.value) as JsonFeatureFlagValue;\n\n let key = setting.key;\n if (typeof setting.key === \"string\" && !setting.key.startsWith(featureFlagPrefix)) {\n key = featureFlagPrefix + setting.key;\n }\n const featureflag: ConfigurationSetting<FeatureFlagValue> = {\n ...setting,\n value: {\n id: jsonFeatureFlagValue.id,\n enabled: jsonFeatureFlagValue.enabled,\n description: jsonFeatureFlagValue.description,\n displayName: jsonFeatureFlagValue.display_name,\n conditions: { clientFilters: jsonFeatureFlagValue.conditions.client_filters },\n },\n key,\n contentType: featureFlagContentType,\n };\n\n if (jsonFeatureFlagValue.conditions.requirement_type) {\n featureflag.value.conditions.requirementType = jsonFeatureFlagValue.conditions.requirement_type;\n }\n return featureflag;\n}\n\n/**\n * Lets you know if the ConfigurationSetting is a feature flag.\n *\n * [Checks if the content type is featureFlagContentType `\"application/vnd.microsoft.appconfig.ff+json;charset=utf-8\"`]\n */\nexport function isFeatureFlag(\n setting: ConfigurationSetting,\n): setting is ConfigurationSetting & Required<Pick<ConfigurationSetting, \"value\">> {\n return (\n setting && setting.contentType === featureFlagContentType && typeof setting.value === \"string\"\n );\n}\n"]}
|
|
@@ -7,10 +7,11 @@ export type JsonFeatureFlagValue = {
|
|
|
7
7
|
name: string;
|
|
8
8
|
parameters?: Record<string, unknown>;
|
|
9
9
|
}[];
|
|
10
|
+
requirement_type?: "All" | "Any";
|
|
10
11
|
};
|
|
11
12
|
description?: string;
|
|
12
13
|
enabled: boolean;
|
|
13
|
-
id
|
|
14
|
+
id: string;
|
|
14
15
|
display_name?: string;
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"jsonModels.d.ts","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE;QACV,cAAc,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,EAAE,CAAC;QACzE,gBAAgB,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KAClC,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAID;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n };\n description?: string;\n enabled: boolean;\n id
|
|
1
|
+
{"version":3,"file":"jsonModels.js","sourceRoot":"","sources":["../../../src/internal/jsonModels.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @internal\n */\nexport type JsonFeatureFlagValue = {\n conditions: {\n client_filters: { name: string; parameters?: Record<string, unknown> }[];\n requirement_type?: \"All\" | \"Any\";\n };\n description?: string;\n enabled: boolean;\n id: string;\n display_name?: string;\n};\n\n// keyvault secret reference\n\n/**\n * @internal\n */\nexport interface JsonSecretReferenceValue {\n uri: string;\n}\n\n// snapshot reference\n\n/**\n * @internal\n */\nexport interface JsonSnapshotReferenceValue {\n snapshot_name: string;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@azure/app-configuration",
|
|
3
3
|
"author": "Microsoft Corporation",
|
|
4
4
|
"description": "An isomorphic client library for the Azure App Configuration service.",
|
|
5
|
-
"version": "1.9.2-alpha.
|
|
5
|
+
"version": "1.9.2-alpha.20251029.1",
|
|
6
6
|
"sdk-type": "client",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"node",
|
|
@@ -48,14 +48,14 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@azure/abort-controller": ">=2.1.3-alpha <2.1.3-alphb",
|
|
51
|
-
"@azure/core-auth": ">=1.10.
|
|
52
|
-
"@azure/core-client": ">=1.10.
|
|
53
|
-
"@azure/core-http-compat": ">=2.3.
|
|
51
|
+
"@azure/core-auth": ">=1.10.2-alpha <1.10.2-alphb",
|
|
52
|
+
"@azure/core-client": ">=1.10.2-alpha <1.10.2-alphb",
|
|
53
|
+
"@azure/core-http-compat": ">=2.3.2-alpha <2.3.2-alphb",
|
|
54
54
|
"@azure/core-lro": "^2.5.1",
|
|
55
55
|
"@azure/core-paging": ">=1.6.3-alpha <1.6.3-alphb",
|
|
56
|
-
"@azure/core-rest-pipeline": ">=1.22.
|
|
57
|
-
"@azure/core-tracing": ">=1.3.
|
|
58
|
-
"@azure/core-util": ">=1.13.
|
|
56
|
+
"@azure/core-rest-pipeline": ">=1.22.2-alpha <1.22.2-alphb",
|
|
57
|
+
"@azure/core-tracing": ">=1.3.2-alpha <1.3.2-alphb",
|
|
58
|
+
"@azure/core-util": ">=1.13.2-alpha <1.13.2-alphb",
|
|
59
59
|
"@azure/logger": ">=1.3.1-alpha <1.3.1-alphb",
|
|
60
60
|
"tslib": "^2.2.0"
|
|
61
61
|
},
|
|
@@ -79,9 +79,9 @@
|
|
|
79
79
|
"typescript": "~5.9.3",
|
|
80
80
|
"vitest": "^3.2.3",
|
|
81
81
|
"@azure-tools/test-credential": "^2.1.2",
|
|
82
|
+
"@azure-tools/test-recorder": "^4.1.1",
|
|
82
83
|
"@azure/dev-tool": "^1.0.0",
|
|
83
|
-
"@azure/eslint-plugin-azure-sdk": "^3.0.0"
|
|
84
|
-
"@azure-tools/test-recorder": "^4.1.1"
|
|
84
|
+
"@azure/eslint-plugin-azure-sdk": "^3.0.0"
|
|
85
85
|
},
|
|
86
86
|
"//sampleConfiguration": {
|
|
87
87
|
"productName": "Azure App Configuration",
|