@azure/app-configuration 1.9.1-alpha.20250604.1 → 1.9.1-alpha.20250609.2

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.
@@ -25,7 +25,7 @@ export function appConfigKeyCredentialPolicy(credential, secret) {
25
25
  request.headers.set("x-ms-date", utcNow);
26
26
  request.headers.set("x-ms-content-sha256", contentHash);
27
27
  // Syntax for Authorization header
28
- // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
28
+ // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
29
29
  request.headers.set("Authorization", `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`);
30
30
  return next(request);
31
31
  },
@@ -1 +1 @@
1
- {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,kHAAkH;YAClH,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,4GAA4G;YAC5G,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
@@ -20,7 +20,7 @@ export interface FeatureFlagValue {
20
20
  * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.
21
21
  * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.
22
22
  *
23
- * [More Info](https://learn.microsoft.com/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
23
+ * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
24
24
  */
25
25
  conditions: {
26
26
  clientFilters: {
@@ -1 +1 @@
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/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\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 },\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 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"]}
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 };\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 },\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 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"]}
@@ -28,7 +28,7 @@ function appConfigKeyCredentialPolicy(credential, secret) {
28
28
  request.headers.set("x-ms-date", utcNow);
29
29
  request.headers.set("x-ms-content-sha256", contentHash);
30
30
  // Syntax for Authorization header
31
- // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
31
+ // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
32
32
  request.headers.set("Authorization", `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`);
33
33
  return next(request);
34
34
  },
@@ -1 +1 @@
1
- {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAelC,oEA4BC;AAnCD,gDAAwE;AACxE,2CAAqC;AAErC;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,kBAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,IAAA,6BAAiB,EAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,kBAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAiB,EAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,kHAAkH;YAClH,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAelC,oEA4BC;AAnCD,gDAAwE;AACxE,2CAAqC;AAErC;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,kBAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,IAAA,6BAAiB,EAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,kBAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAiB,EAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,4GAA4G;YAC5G,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
@@ -20,7 +20,7 @@ export interface FeatureFlagValue {
20
20
  * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.
21
21
  * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.
22
22
  *
23
- * [More Info](https://learn.microsoft.com/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
23
+ * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
24
24
  */
25
25
  conditions: {
26
26
  clientFilters: {
@@ -1 +1 @@
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/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\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 },\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 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"]}
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 };\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 },\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 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"]}
@@ -25,7 +25,7 @@ export function appConfigKeyCredentialPolicy(credential, secret) {
25
25
  request.headers.set("x-ms-date", utcNow);
26
26
  request.headers.set("x-ms-content-sha256", contentHash);
27
27
  // Syntax for Authorization header
28
- // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
28
+ // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
29
29
  request.headers.set("Authorization", `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`);
30
30
  return next(request);
31
31
  },
@@ -1 +1 @@
1
- {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,kHAAkH;YAClH,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,4GAA4G;YAC5G,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
@@ -20,7 +20,7 @@ export interface FeatureFlagValue {
20
20
  * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.
21
21
  * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.
22
22
  *
23
- * [More Info](https://learn.microsoft.com/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
23
+ * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
24
24
  */
25
25
  conditions: {
26
26
  clientFilters: {
@@ -1 +1 @@
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/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\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 },\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 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"]}
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 };\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 },\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 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"]}
@@ -25,7 +25,7 @@ export function appConfigKeyCredentialPolicy(credential, secret) {
25
25
  request.headers.set("x-ms-date", utcNow);
26
26
  request.headers.set("x-ms-content-sha256", contentHash);
27
27
  // Syntax for Authorization header
28
- // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
28
+ // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax
29
29
  request.headers.set("Authorization", `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`);
30
30
  return next(request);
31
31
  },
@@ -1 +1 @@
1
- {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,kHAAkH;YAClH,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/en-us/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
1
+ {"version":3,"file":"appConfigCredential.js","sourceRoot":"","sources":["../../src/appConfigCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,UAAkB,EAAE,MAAc;IAC7E,OAAO;QACL,IAAI,EAAE,8BAA8B;QACpC,KAAK,CAAC,WAAW,CAAC,OAAwB,EAAE,IAAiB;;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,QAAQ,EAAE,KAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;YACtF,MAAM,aAAa,GAAG,oCAAoC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,YAAY,GAAG,GAAG,IAAI,KAAK,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YACjF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;YAE1E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;YACxD,kCAAkC;YAClC,4GAA4G;YAC5G,OAAO,CAAC,OAAO,CAAC,GAAG,CACjB,eAAe,EACf,0BAA0B,UAAU,kBAAkB,aAAa,cAAc,SAAS,EAAE,CAC7F,CAAC;YAEF,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n PipelinePolicy,\n PipelineRequest,\n PipelineResponse,\n SendRequest,\n} from \"@azure/core-rest-pipeline\";\nimport { computeSha256Hash, computeSha256Hmac } from \"@azure/core-util\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Create an HTTP pipeline policy to authenticate a request\n * using an `AzureKeyCredential` for AppConfig.\n */\nexport function appConfigKeyCredentialPolicy(credential: string, secret: string): PipelinePolicy {\n return {\n name: \"AppConfigKeyCredentialPolicy\",\n async sendRequest(request: PipelineRequest, next: SendRequest): Promise<PipelineResponse> {\n const verb = request.method;\n const utcNow = new Date().toUTCString();\n logger.info(\"[appConfigKeyCredentialPolicy] Computing SHA-256 from the request body\");\n const contentHash = await computeSha256Hash(request.body?.toString() || \"\", \"base64\");\n const signedHeaders = \"x-ms-date;host;x-ms-content-sha256\";\n const url = new URL(request.url);\n const query = url.search;\n const urlPathAndQuery = query ? `${url.pathname}${query}` : url.pathname;\n const stringToSign = `${verb}\\n${urlPathAndQuery}\\n${utcNow};${url.host};${contentHash}`;\n logger.info(\"[appConfigKeyCredentialPolicy] Computing a SHA-256 Hmac signature\");\n const signature = await computeSha256Hmac(secret, stringToSign, \"base64\");\n\n request.headers.set(\"x-ms-date\", utcNow);\n request.headers.set(\"x-ms-content-sha256\", contentHash);\n // Syntax for Authorization header\n // Reference - https://learn.microsoft.com/azure/azure-app-configuration/rest-api-authentication-hmac#syntax\n request.headers.set(\n \"Authorization\",\n `HMAC-SHA256 Credential=${credential}&SignedHeaders=${signedHeaders}&Signature=${signature}`,\n );\n\n return next(request);\n },\n };\n}\n"]}
@@ -20,7 +20,7 @@ export interface FeatureFlagValue {
20
20
  * Our feature management library supports three types of built-in filters: Targeting, TimeWindow, and Percentage.
21
21
  * Custom filters can also be created based on different factors, such as device used, browser types, geographic location, etc.
22
22
  *
23
- * [More Info](https://learn.microsoft.com/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
23
+ * [More Info](https://learn.microsoft.com/azure/azure-app-configuration/howto-feature-filters-aspnet-core)
24
24
  */
25
25
  conditions: {
26
26
  clientFilters: {
@@ -1 +1 @@
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/en-us/azure/azure-app-configuration/howto-feature-filters-aspnet-core)\n */\n conditions: {\n clientFilters: { name: string; parameters?: Record<string, unknown> }[];\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 },\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 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"]}
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 };\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 },\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 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"]}
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.1-alpha.20250604.1",
5
+ "version": "1.9.1-alpha.20250609.2",
6
6
  "sdk-type": "client",
7
7
  "keywords": [
8
8
  "node",