@azure/app-configuration-importer 1.1.3-preview → 2.0.0-preview
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/index.js +178 -93
- package/dist/index.js.map +1 -1
- package/dist-esm/src/appConfigurationImporter.js +119 -65
- package/dist-esm/src/appConfigurationImporter.js.map +1 -1
- package/dist-esm/src/index.js +1 -0
- package/dist-esm/src/index.js.map +1 -1
- package/dist-esm/src/internal/parsers/configurationSettingsConverter.js.map +1 -1
- package/dist-esm/src/internal/parsers/defaultConfigurationSettingsConverter.js.map +1 -1
- package/dist-esm/src/internal/utils.js.map +1 -1
- package/dist-esm/src/models.js.map +1 -1
- package/dist-esm/src/{importOptions.js → options.js} +1 -1
- package/dist-esm/src/options.js.map +1 -0
- package/dist-esm/src/settingsImport/configurationChangesSource.js +33 -0
- package/dist-esm/src/settingsImport/configurationChangesSource.js.map +1 -0
- package/dist-esm/src/settingsImport/configurationSettingsSource.js.map +1 -1
- package/dist-esm/src/settingsImport/iterableConfigurationSettingsSource.js.map +1 -1
- package/dist-esm/src/settingsImport/readableStreamConfigurationSettingsSource.js.map +1 -1
- package/dist-esm/src/settingsImport/stringConfigurationSettingsSource.js.map +1 -1
- package/package.json +1 -1
- package/types/azure-app-configuration-importer.d.ts +93 -12
- package/types/src/appConfigurationImporter.d.ts +37 -10
- package/types/src/appConfigurationImporter.d.ts.map +1 -1
- package/types/src/index.d.ts +3 -2
- package/types/src/index.d.ts.map +1 -1
- package/types/src/internal/parsers/configurationSettingsConverter.d.ts +1 -1
- package/types/src/internal/parsers/configurationSettingsConverter.d.ts.map +1 -1
- package/types/src/internal/parsers/defaultConfigurationSettingsConverter.d.ts +1 -1
- package/types/src/internal/parsers/defaultConfigurationSettingsConverter.d.ts.map +1 -1
- package/types/src/internal/utils.d.ts +1 -1
- package/types/src/internal/utils.d.ts.map +1 -1
- package/types/src/models.d.ts +7 -0
- package/types/src/models.d.ts.map +1 -1
- package/types/src/{importOptions.d.ts → options.d.ts} +26 -3
- package/types/src/options.d.ts.map +1 -0
- package/types/src/settingsImport/configurationChangesSource.d.ts +27 -0
- package/types/src/settingsImport/configurationChangesSource.d.ts.map +1 -0
- package/types/src/settingsImport/configurationSettingsSource.d.ts +4 -3
- package/types/src/settingsImport/configurationSettingsSource.d.ts.map +1 -1
- package/types/src/settingsImport/iterableConfigurationSettingsSource.d.ts +1 -1
- package/types/src/settingsImport/iterableConfigurationSettingsSource.d.ts.map +1 -1
- package/types/src/settingsImport/readableStreamConfigurationSettingsSource.d.ts +1 -1
- package/types/src/settingsImport/readableStreamConfigurationSettingsSource.d.ts.map +1 -1
- package/types/src/settingsImport/stringConfigurationSettingsSource.d.ts +1 -1
- package/types/src/settingsImport/stringConfigurationSettingsSource.d.ts.map +1 -1
- package/dist-esm/src/importOptions.js.map +0 -1
- package/types/src/importOptions.d.ts.map +0 -1
|
@@ -7,6 +7,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
|
7
7
|
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
8
8
|
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
9
9
|
};
|
|
10
|
+
import { ConfigurationChangesSource } from "./settingsImport/configurationChangesSource";
|
|
10
11
|
import { ImportMode } from "./enums";
|
|
11
12
|
import { OperationTimeoutError, ArgumentError } from "./errors";
|
|
12
13
|
import { AdaptiveTaskManager } from "./internal/adaptiveTaskManager";
|
|
@@ -25,31 +26,84 @@ export class AppConfigurationImporter {
|
|
|
25
26
|
this.configurationClient = configurationClient;
|
|
26
27
|
}
|
|
27
28
|
/**
|
|
28
|
-
* Import
|
|
29
|
+
* Import settings into the Azure App Configuration service.
|
|
29
30
|
*
|
|
30
31
|
* Example usage:
|
|
31
32
|
* ```ts
|
|
32
33
|
* const fileData = fs.readFileSync("mylocalPath").toString();
|
|
33
|
-
* const
|
|
34
|
+
* const source = new StringConfigurationSettingsSource({data:fileData, format: ConfigurationFormat.Json});
|
|
35
|
+
* await importer.Import(source, { timeout: 60 });
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @param configurationSettingsSource - A ConfigurationSettingsSource instance.
|
|
39
|
+
* @param options - Import options including timeout, progress callback, strict mode, and import mode.
|
|
40
|
+
* @returns Promise<void>
|
|
41
|
+
*/
|
|
42
|
+
async Import(configurationSettingsSource, options) {
|
|
43
|
+
if (configurationSettingsSource instanceof ConfigurationChangesSource) {
|
|
44
|
+
// When using ConfigurationChanges, strict and importMode parameters are not applicable
|
|
45
|
+
if ((options === null || options === void 0 ? void 0 : options.strict) || (options === null || options === void 0 ? void 0 : options.importMode)) {
|
|
46
|
+
throw new ArgumentError("Parameters 'strict' and 'importMode' are not applicable when importing pre-calculated changes.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Generate correlationRequestId for operations in the same activity
|
|
50
|
+
const customCorrelationRequestId = uuidv4();
|
|
51
|
+
const customHeadersOption = {
|
|
52
|
+
requestOptions: {
|
|
53
|
+
customHeaders: {
|
|
54
|
+
[Constants.CorrelationRequestIdHeader]: customCorrelationRequestId
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const configurationChanges = await this.GetConfigurationChanges(configurationSettingsSource, options === null || options === void 0 ? void 0 : options.strict, options === null || options === void 0 ? void 0 : options.importMode, customHeadersOption);
|
|
59
|
+
return await this.applyUpdatesToServer([...configurationChanges.ToAdd, ...configurationChanges.ToModify, ...configurationChanges.ToRefresh], configurationChanges.ToDelete, options.timeout, customHeadersOption, options.progressCallback);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get configuration changes between source settings and existing settings in Azure App Configuration service without applying any changes
|
|
63
|
+
*
|
|
64
|
+
* Example usage:
|
|
65
|
+
* ```ts
|
|
66
|
+
* const fileData = fs.readFileSync("mylocalPath").toString();
|
|
67
|
+
* const configurationChanges = await client.GetConfigurationChanges(
|
|
68
|
+
* new StringConfigurationSettingsSource({data:fileData, format: ConfigurationFormat.Json}),
|
|
69
|
+
* false,
|
|
70
|
+
* ImportMode.All,
|
|
71
|
+
* options
|
|
72
|
+
* );
|
|
34
73
|
* ```
|
|
35
74
|
* @param configSettingsSource - A ConfigurationSettingsSource instance.
|
|
36
|
-
* @param strict - Use strict mode
|
|
37
|
-
* @param
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* @param
|
|
75
|
+
* @param strict - Use strict mode to delete settings not in source.
|
|
76
|
+
* @param importMode - Determines the behavior when analyzing key-values.
|
|
77
|
+
* 'All' will include all key-values.
|
|
78
|
+
* 'Ignore-Match' will exclude settings that have matching key-values in App Configuration.
|
|
79
|
+
* @param customHeadersOption - Custom headers for the operation.
|
|
80
|
+
* @returns ConfigurationChanges object containing Added, Modified, and Deleted settings
|
|
41
81
|
*/
|
|
42
|
-
async
|
|
82
|
+
async GetConfigurationChanges(configSettingsSource, strict = false, importMode = ImportMode.IgnoreMatch, customHeadersOption) {
|
|
43
83
|
var _a, e_1, _b, _c;
|
|
44
|
-
|
|
45
|
-
|
|
84
|
+
this.validateImportMode(importMode);
|
|
85
|
+
// Generate correlationRequestId for operations in the same activity
|
|
86
|
+
if (!customHeadersOption) {
|
|
87
|
+
const customCorrelationRequestId = uuidv4();
|
|
88
|
+
customHeadersOption = {
|
|
89
|
+
requestOptions: {
|
|
90
|
+
customHeaders: {
|
|
91
|
+
[Constants.CorrelationRequestIdHeader]: customCorrelationRequestId
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
46
95
|
}
|
|
47
|
-
|
|
48
|
-
|
|
96
|
+
const configSettingsResult = await configSettingsSource.GetConfigurationSettings();
|
|
97
|
+
// If the source returns ConfigurationChanges (e.g., ConfigurationChangesSource),
|
|
98
|
+
// return them directly without further processing since changes are already calculated
|
|
99
|
+
if (this.isConfigurationChanges(configSettingsResult)) {
|
|
100
|
+
return configSettingsResult;
|
|
49
101
|
}
|
|
50
|
-
|
|
51
|
-
const configSettings = await configSettingsSource.GetConfigurationSettings();
|
|
102
|
+
const configSettings = configSettingsResult;
|
|
52
103
|
const configurationSettingToDelete = [];
|
|
104
|
+
const configurationSettingToModify = [];
|
|
105
|
+
const configurationSettingToAdd = [];
|
|
106
|
+
const configurationSettingToRefresh = [];
|
|
53
107
|
const srcKeyLabelLookUp = {};
|
|
54
108
|
configSettings.forEach((config) => {
|
|
55
109
|
if (!srcKeyLabelLookUp[config.key]) {
|
|
@@ -57,72 +111,58 @@ export class AppConfigurationImporter {
|
|
|
57
111
|
}
|
|
58
112
|
srcKeyLabelLookUp[config.key][config.label || ""] = true;
|
|
59
113
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
configurationSettingToDelete.push(existing);
|
|
114
|
+
configurationSettingToAdd.push(...configSettings);
|
|
115
|
+
try {
|
|
116
|
+
for (var _d = true, _e = __asyncValues(this.configurationClient.listConfigurationSettings(Object.assign(Object.assign({}, configSettingsSource.FilterOptions), customHeadersOption))), _f; _f = await _e.next(), _a = _f.done, !_a;) {
|
|
117
|
+
_c = _f.value;
|
|
118
|
+
_d = false;
|
|
119
|
+
try {
|
|
120
|
+
const existing = _c;
|
|
121
|
+
const isKeyLabelPresent = srcKeyLabelLookUp[existing.key] && srcKeyLabelLookUp[existing.key][existing.label || ""];
|
|
122
|
+
if (strict && !isKeyLabelPresent) {
|
|
123
|
+
configurationSettingToDelete.push(existing);
|
|
124
|
+
}
|
|
125
|
+
const incoming = configSettings.find(configSetting => configSetting.key == existing.key && configSetting.label === existing.label);
|
|
126
|
+
if (incoming) {
|
|
127
|
+
// Remove from add list since it already exists
|
|
128
|
+
configurationSettingToAdd.splice(configurationSettingToAdd.indexOf(incoming), 1);
|
|
129
|
+
if (!isConfigSettingEqual(incoming, existing)) {
|
|
130
|
+
// Key-value has changed, add to ToModify
|
|
131
|
+
configurationSettingToModify.push(incoming);
|
|
79
132
|
}
|
|
80
|
-
if (importMode
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (incoming && isConfigSettingEqual(incoming, existing)) {
|
|
84
|
-
configSettings.splice(configSettings.indexOf(incoming), 1);
|
|
85
|
-
}
|
|
133
|
+
else if (importMode === ImportMode.All) {
|
|
134
|
+
// Key-value is unchanged and importMode is All, add to ToRefresh
|
|
135
|
+
configurationSettingToRefresh.push(incoming);
|
|
86
136
|
}
|
|
87
137
|
}
|
|
88
|
-
finally {
|
|
89
|
-
_d = true;
|
|
90
|
-
}
|
|
91
138
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
finally {
|
|
95
|
-
try {
|
|
96
|
-
if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
|
|
139
|
+
finally {
|
|
140
|
+
_d = true;
|
|
97
141
|
}
|
|
98
|
-
finally { if (e_1) throw e_1.error; }
|
|
99
142
|
}
|
|
100
143
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
printUpdatesToConsole(settingsToAdd, settingsToDelete) {
|
|
109
|
-
console.log("The following settings will be removed from App Configuration:");
|
|
110
|
-
for (const setting of settingsToDelete) {
|
|
111
|
-
console.log(JSON.stringify({ key: setting.key, label: setting.label, contentType: setting.contentType, tags: setting.tags }));
|
|
112
|
-
}
|
|
113
|
-
console.log("\nThe following settings will be written to App Configuration:");
|
|
114
|
-
for (const setting of settingsToAdd) {
|
|
115
|
-
console.log(JSON.stringify({ key: setting.key, label: setting.label, contentType: setting.contentType, tags: setting.tags }));
|
|
144
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
145
|
+
finally {
|
|
146
|
+
try {
|
|
147
|
+
if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
|
|
148
|
+
}
|
|
149
|
+
finally { if (e_1) throw e_1.error; }
|
|
116
150
|
}
|
|
151
|
+
return {
|
|
152
|
+
ToAdd: configurationSettingToAdd,
|
|
153
|
+
ToModify: configurationSettingToModify,
|
|
154
|
+
ToDelete: configurationSettingToDelete,
|
|
155
|
+
ToRefresh: configurationSettingToRefresh
|
|
156
|
+
};
|
|
117
157
|
}
|
|
118
|
-
async applyUpdatesToServer(
|
|
158
|
+
async applyUpdatesToServer(settingsToPut, settingsToDelete, timeout, options, progressCallback) {
|
|
119
159
|
const deleteTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.deleteConfigurationSetting(setting, options), settingsToDelete);
|
|
120
160
|
const startTime = Date.now();
|
|
121
161
|
await this.executeTasksWithTimeout(deleteTaskManager, timeout);
|
|
122
162
|
const endTime = Date.now();
|
|
123
163
|
const deleteTimeConsumed = (endTime - startTime) / 1000;
|
|
124
164
|
timeout -= deleteTimeConsumed;
|
|
125
|
-
const importTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.setConfigurationSetting(setting, options),
|
|
165
|
+
const importTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.setConfigurationSetting(setting, options), settingsToPut);
|
|
126
166
|
await this.executeTasksWithTimeout(importTaskManager, timeout, progressCallback);
|
|
127
167
|
}
|
|
128
168
|
newAdaptiveTaskManager(task, configurationSettings) {
|
|
@@ -153,5 +193,19 @@ export class AppConfigurationImporter {
|
|
|
153
193
|
throw new ArgumentError("Only options supported for Import Mode are 'All' and 'Ignore-Match'.");
|
|
154
194
|
}
|
|
155
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Type guard to detect a ConfigurationChanges object.
|
|
198
|
+
* @internal
|
|
199
|
+
*/
|
|
200
|
+
isConfigurationChanges(obj) {
|
|
201
|
+
if (obj === null || typeof obj !== "object") {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
const configChanges = obj;
|
|
205
|
+
return Array.isArray(configChanges.ToAdd) &&
|
|
206
|
+
Array.isArray(configChanges.ToModify) &&
|
|
207
|
+
Array.isArray(configChanges.ToDelete) &&
|
|
208
|
+
Array.isArray(configChanges.ToRefresh);
|
|
209
|
+
}
|
|
156
210
|
}
|
|
157
211
|
//# sourceMappingURL=appConfigurationImporter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appConfigurationImporter.js","sourceRoot":"","sources":["../../src/appConfigurationImporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { \n AppConfigurationClient, \n ConfigurationSetting, \n SetConfigurationSettingParam, \n FeatureFlagValue, \n SecretReferenceValue } from \"@azure/app-configuration\";\nimport { ConfigurationSettingsSource } from \"./settingsImport/configurationSettingsSource\";\nimport { ImportMode } from \"./enums\";\nimport { OperationTimeoutError, ArgumentError } from \"./errors\";\nimport { AdaptiveTaskManager } from \"./internal/adaptiveTaskManager\";\nimport { ImportProgress, KeyLabelLookup } from \"./models\";\nimport { isConfigSettingEqual } from \"./internal/utils\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Constants } from \"./internal/constants\";\nimport { OperationOptions } from \"@azure/core-client\";\n\n/**\n * Entrypoint class for sync configuration\n */\nexport class AppConfigurationImporter {\n private configurationClient: AppConfigurationClient;\n /**\n * Initializes a new instance of the AppConfigurationSync class.\n * @param configurationClient - App configuration client for manipulate the target App Configuration.\n */\n constructor(configurationClient: AppConfigurationClient) {\n this.configurationClient = configurationClient;\n }\n\n /**\n * Import source settings into the Azure App Configuration service\n *\n * Example usage:\n * ```ts\n * const fileData = fs.readFileSync(\"mylocalPath\").toString();\n * const result = await asyncClient.Import(new StringConfigurationSettingsSource({data:fileData, format: ConfigurationFormat.Json}));\n * ```\n * @param configSettingsSource - A ConfigurationSettingsSource instance.\n * @param strict - Use strict mode or not.\n * @param timeout - Seconds of entire import progress timeout\n * @param progressCallback - Callback for report the progress of import\n * @param importMode - Determines the behavior when importing key-values. The default value, 'All' will import all key-values in the input file to App Configuration. 'Ignore-Match' will only import settings that have no matching key-value in App Configuration.\n * @param dryRun - When dry run is enabled, no updates will be performed to App Configuration. Instead, any updates that would have been performed in a normal run will be printed to the console for review\n */\n public async Import(\n configSettingsSource: ConfigurationSettingsSource,\n timeout: number,\n strict = false,\n progressCallback?: (progress: ImportProgress) => unknown,\n importMode?: ImportMode,\n dryRun?: boolean\n ) {\n if (importMode == undefined) {\n importMode = ImportMode.IgnoreMatch;\n }\n if (dryRun == undefined) {\n dryRun = false;\n }\n this.validateImportMode(importMode);\n\n const configSettings = await configSettingsSource.GetConfigurationSettings();\n\n const configurationSettingToDelete: ConfigurationSetting<string>[] = [];\n const srcKeyLabelLookUp: KeyLabelLookup = {};\n \n configSettings.forEach((config: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>) => {\n if (!srcKeyLabelLookUp[config.key]) {\n srcKeyLabelLookUp[config.key] = {};\n }\n srcKeyLabelLookUp[config.key][config.label || \"\"] = true;\n });\n\n // generate correlationRequestId for operations in the same activity\n const customCorrelationRequestId: string = uuidv4();\n const customHeadersOption: OperationOptions = {\n requestOptions: {\n customHeaders: {\n [Constants.CorrelationRequestIdHeader]: customCorrelationRequestId\n }\n }\n };\n\n if (strict || importMode == ImportMode.IgnoreMatch) {\n for await (const existing of this.configurationClient.listConfigurationSettings({...configSettingsSource.FilterOptions, ...customHeadersOption})) {\n\n const isKeyLabelPresent: boolean = srcKeyLabelLookUp[existing.key] && srcKeyLabelLookUp[existing.key][existing.label || \"\"];\n \n if (strict && !isKeyLabelPresent) {\n configurationSettingToDelete.push(existing);\n }\n \n if (importMode == ImportMode.IgnoreMatch) {\n const incoming = configSettings.find(configSetting => configSetting.key == existing.key && \n configSetting.label == existing.label);\n \n if (incoming && isConfigSettingEqual(incoming, existing)) {\n configSettings.splice(configSettings.indexOf(incoming), 1);\n }\n }\n }\n }\n \n if (dryRun) {\n this.printUpdatesToConsole(configSettings, configurationSettingToDelete);\n }\n else {\n await this.applyUpdatesToServer(configSettings, configurationSettingToDelete, timeout, customHeadersOption, progressCallback);\n }\n }\n\n private printUpdatesToConsole(\n settingsToAdd: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[], \n settingsToDelete: ConfigurationSetting<string>[]\n ): void {\n console.log(\"The following settings will be removed from App Configuration:\");\n for (const setting of settingsToDelete) {\n\n console.log(JSON.stringify({key: setting.key, label: setting.label, contentType: setting.contentType, tags: setting.tags}));\n } \n\n console.log(\"\\nThe following settings will be written to App Configuration:\");\n for (const setting of settingsToAdd) {\n\n console.log(JSON.stringify({key: setting.key, label: setting.label, contentType: setting.contentType, tags: setting.tags}));\n }\n }\n\n private async applyUpdatesToServer(\n settingsToAdd: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[], \n settingsToDelete: ConfigurationSetting<string>[],\n timeout: number,\n options: OperationOptions,\n progressCallback?: (progress: ImportProgress) => unknown | undefined\n ): Promise<void> {\n const deleteTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.deleteConfigurationSetting(setting, options), settingsToDelete);\n const startTime = Date.now();\n await this.executeTasksWithTimeout(deleteTaskManager, timeout);\n const endTime = Date.now();\n const deleteTimeConsumed = (endTime - startTime) / 1000;\n timeout -= deleteTimeConsumed;\n\n const importTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.setConfigurationSetting(setting, options), settingsToAdd);\n await this.executeTasksWithTimeout(importTaskManager, timeout, progressCallback);\n }\n\n private newAdaptiveTaskManager<T>(task: (setting: T) => Promise<any>, configurationSettings: Array<T>) {\n let index = 0;\n return new AdaptiveTaskManager(() => {\n if (index == configurationSettings.length) {\n return undefined;\n }\n const configSet = configurationSettings[index++];\n\n return async () => {\n return task(configSet);\n };\n }, configurationSettings.length);\n }\n\n private async executeTasksWithTimeout<T>(taskManager: AdaptiveTaskManager<T>, timeInSeconds: number, callback?: (progress: ImportProgress) => unknown) {\n let timer: NodeJS.Timeout;\n const taskPromise = taskManager.Start(callback);\n const timeoutPromise = new Promise((_, reject) => {\n timer = setTimeout(() => reject(new OperationTimeoutError()), timeInSeconds * 1000);\n });\n await Promise.race([taskPromise, timeoutPromise]).finally(() => {\n clearTimeout(timer); // clear timeout when importPromise successfully resolve or faultily reject.\n });\n }\n\n private validateImportMode(importMode: ImportMode): void {\n if (importMode && !(importMode == ImportMode.IgnoreMatch || \n importMode == ImportMode.All)) {\n throw new ArgumentError(\"Only options supported for Import Mode are 'All' and 'Ignore-Match'.\");\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"appConfigurationImporter.js","sourceRoot":"","sources":["../../src/appConfigurationImporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { \n AppConfigurationClient, \n ConfigurationSetting, \n SetConfigurationSettingParam, \n FeatureFlagValue, \n SecretReferenceValue } from \"@azure/app-configuration\";\nimport { ConfigurationSettingsSource } from \"./settingsImport/configurationSettingsSource\";\nimport { ConfigurationChangesSource } from \"./settingsImport/configurationChangesSource\";\nimport { ImportMode } from \"./enums\";\nimport { OperationTimeoutError, ArgumentError } from \"./errors\";\nimport { AdaptiveTaskManager } from \"./internal/adaptiveTaskManager\";\nimport { ImportProgress, KeyLabelLookup, ConfigurationChanges } from \"./models\";\nimport { isConfigSettingEqual } from \"./internal/utils\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Constants } from \"./internal/constants\";\nimport { OperationOptions } from \"@azure/core-client\";\nimport { ImportOptions } from \"./options\";\n\n/**\n * Entrypoint class for sync configuration\n */\nexport class AppConfigurationImporter {\n private configurationClient: AppConfigurationClient;\n /**\n * Initializes a new instance of the AppConfigurationSync class.\n * @param configurationClient - App configuration client for manipulate the target App Configuration.\n */\n constructor(configurationClient: AppConfigurationClient) {\n this.configurationClient = configurationClient;\n }\n\n /**\n * Import settings into the Azure App Configuration service.\n * \n * Example usage:\n * ```ts\n * const fileData = fs.readFileSync(\"mylocalPath\").toString();\n * const source = new StringConfigurationSettingsSource({data:fileData, format: ConfigurationFormat.Json});\n * await importer.Import(source, { timeout: 60 });\n * ```\n * \n * @param configurationSettingsSource - A ConfigurationSettingsSource instance.\n * @param options - Import options including timeout, progress callback, strict mode, and import mode.\n * @returns Promise<void>\n */\n public async Import(\n configurationSettingsSource: ConfigurationSettingsSource,\n options: ImportOptions\n ): Promise<void> {\n if (configurationSettingsSource instanceof ConfigurationChangesSource) {\n // When using ConfigurationChanges, strict and importMode parameters are not applicable\n if (options?.strict || options?.importMode) {\n throw new ArgumentError(\"Parameters 'strict' and 'importMode' are not applicable when importing pre-calculated changes.\");\n }\n }\n\n // Generate correlationRequestId for operations in the same activity\n const customCorrelationRequestId: string = uuidv4();\n const customHeadersOption: OperationOptions = {\n requestOptions: {\n customHeaders: {\n [Constants.CorrelationRequestIdHeader]: customCorrelationRequestId\n }\n }\n };\n\n const configurationChanges = await this.GetConfigurationChanges(configurationSettingsSource, options?.strict, options?.importMode, customHeadersOption);\n\n return await this.applyUpdatesToServer([...configurationChanges.ToAdd, ...configurationChanges.ToModify, ...configurationChanges.ToRefresh], configurationChanges.ToDelete, options.timeout, customHeadersOption, options.progressCallback);\n }\n\n /**\n * Get configuration changes between source settings and existing settings in Azure App Configuration service without applying any changes\n *\n * Example usage:\n * ```ts\n * const fileData = fs.readFileSync(\"mylocalPath\").toString();\n * const configurationChanges = await client.GetConfigurationChanges(\n * new StringConfigurationSettingsSource({data:fileData, format: ConfigurationFormat.Json}),\n * false,\n * ImportMode.All,\n * options\n * );\n * ```\n * @param configSettingsSource - A ConfigurationSettingsSource instance.\n * @param strict - Use strict mode to delete settings not in source.\n * @param importMode - Determines the behavior when analyzing key-values.\n * 'All' will include all key-values. \n * 'Ignore-Match' will exclude settings that have matching key-values in App Configuration.\n * @param customHeadersOption - Custom headers for the operation.\n * @returns ConfigurationChanges object containing Added, Modified, and Deleted settings\n */\n public async GetConfigurationChanges(\n configSettingsSource: ConfigurationSettingsSource,\n strict = false,\n importMode = ImportMode.IgnoreMatch,\n customHeadersOption?: OperationOptions\n ): Promise<ConfigurationChanges> {\n this.validateImportMode(importMode);\n\n // Generate correlationRequestId for operations in the same activity\n if (!customHeadersOption) {\n const customCorrelationRequestId: string = uuidv4();\n customHeadersOption = {\n requestOptions: {\n customHeaders: {\n [Constants.CorrelationRequestIdHeader]: customCorrelationRequestId\n }\n }\n };\n }\n\n const configSettingsResult = await configSettingsSource.GetConfigurationSettings();\n\n // If the source returns ConfigurationChanges (e.g., ConfigurationChangesSource), \n // return them directly without further processing since changes are already calculated\n if (this.isConfigurationChanges(configSettingsResult)) {\n return configSettingsResult as ConfigurationChanges;\n }\n \n const configSettings = configSettingsResult as Array<SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>>;\n const configurationSettingToDelete: ConfigurationSetting<string>[] = [];\n const configurationSettingToModify: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[] = [];\n const configurationSettingToAdd: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[] = [];\n const configurationSettingToRefresh: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[] = [];\n const srcKeyLabelLookUp: KeyLabelLookup = {};\n \n configSettings.forEach((config: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>) => {\n if (!srcKeyLabelLookUp[config.key]) {\n srcKeyLabelLookUp[config.key] = {};\n }\n srcKeyLabelLookUp[config.key][config.label || \"\"] = true;\n });\n\n configurationSettingToAdd.push(...configSettings);\n\n for await (const existing of this.configurationClient.listConfigurationSettings({...configSettingsSource.FilterOptions, ...customHeadersOption})) {\n const isKeyLabelPresent: boolean = srcKeyLabelLookUp[existing.key] && srcKeyLabelLookUp[existing.key][existing.label || \"\"];\n if (strict && !isKeyLabelPresent) {\n configurationSettingToDelete.push(existing);\n }\n\n const incoming = configSettings.find(configSetting => configSetting.key == existing.key && configSetting.label === existing.label);\n\n if (incoming) {\n // Remove from add list since it already exists\n configurationSettingToAdd.splice(configurationSettingToAdd.indexOf(incoming), 1);\n\n if (!isConfigSettingEqual(incoming, existing)) {\n // Key-value has changed, add to ToModify\n configurationSettingToModify.push(incoming);\n } \n else if (importMode === ImportMode.All) {\n // Key-value is unchanged and importMode is All, add to ToRefresh\n configurationSettingToRefresh.push(incoming);\n }\n }\n }\n\n return {\n ToAdd: configurationSettingToAdd,\n ToModify: configurationSettingToModify,\n ToDelete: configurationSettingToDelete,\n ToRefresh: configurationSettingToRefresh\n };\n }\n\n private async applyUpdatesToServer(\n settingsToPut: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[], \n settingsToDelete: ConfigurationSetting<string>[],\n timeout: number,\n options: OperationOptions,\n progressCallback?: (progress: ImportProgress) => unknown | undefined\n ): Promise<void> {\n const deleteTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.deleteConfigurationSetting(setting, options), settingsToDelete);\n const startTime = Date.now();\n await this.executeTasksWithTimeout(deleteTaskManager, timeout);\n const endTime = Date.now();\n const deleteTimeConsumed = (endTime - startTime) / 1000;\n timeout -= deleteTimeConsumed;\n\n const importTaskManager = this.newAdaptiveTaskManager((setting) => this.configurationClient.setConfigurationSetting(setting, options), settingsToPut);\n await this.executeTasksWithTimeout(importTaskManager, timeout, progressCallback);\n }\n\n private newAdaptiveTaskManager<T>(task: (setting: T) => Promise<any>, configurationSettings: Array<T>) {\n let index = 0;\n return new AdaptiveTaskManager(() => {\n if (index == configurationSettings.length) {\n return undefined;\n }\n const configSet = configurationSettings[index++];\n\n return async () => {\n return task(configSet);\n };\n }, configurationSettings.length);\n }\n\n private async executeTasksWithTimeout<T>(taskManager: AdaptiveTaskManager<T>, timeInSeconds: number, callback?: (progress: ImportProgress) => unknown) {\n let timer: NodeJS.Timeout;\n const taskPromise = taskManager.Start(callback);\n const timeoutPromise = new Promise((_, reject) => {\n timer = setTimeout(() => reject(new OperationTimeoutError()), timeInSeconds * 1000);\n });\n await Promise.race([taskPromise, timeoutPromise]).finally(() => {\n clearTimeout(timer); // clear timeout when importPromise successfully resolve or faultily reject.\n });\n }\n\n private validateImportMode(importMode: ImportMode): void {\n if (importMode && !(importMode == ImportMode.IgnoreMatch || \n importMode == ImportMode.All)) {\n throw new ArgumentError(\"Only options supported for Import Mode are 'All' and 'Ignore-Match'.\");\n }\n }\n\n /**\n * Type guard to detect a ConfigurationChanges object.\n * @internal\n */\n private isConfigurationChanges(obj: unknown): obj is ConfigurationChanges {\n if (obj === null || typeof obj !== \"object\") {\n return false;\n }\n const configChanges = obj as Partial<ConfigurationChanges>;\n return Array.isArray(configChanges.ToAdd) && \n Array.isArray(configChanges.ToModify) && \n Array.isArray(configChanges.ToDelete) && \n Array.isArray(configChanges.ToRefresh);\n }\n}\n"]}
|
package/dist-esm/src/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { AppConfigurationImporter } from "./appConfigurationImporter";
|
|
|
4
4
|
export * from "./enums";
|
|
5
5
|
export * from "./errors";
|
|
6
6
|
export { StringConfigurationSettingsSource } from "./settingsImport/stringConfigurationSettingsSource";
|
|
7
|
+
export { ConfigurationChangesSource } from "./settingsImport/configurationChangesSource";
|
|
7
8
|
export { IterableConfigurationSettingsSource } from "./settingsImport/iterableConfigurationSettingsSource";
|
|
8
9
|
export { ReadableStreamConfigurationSettingsSource } from "./settingsImport/readableStreamConfigurationSettingsSource";
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AAEzB,OAAO,EAAE,iCAAiC,EAAE,MAAM,oDAAoD,CAAC;AAEvG,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,mCAAmC,EAAE,MAAM,sDAAsD,CAAC;AAC3G,OAAO,EAAE,yCAAyC,EAAE,MAAM,4DAA4D,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nexport { AppConfigurationImporter } from \"./appConfigurationImporter\";\nexport {\n StringSourceOptions,\n IterableSourceOptions,\n ReadableStreamSourceOptions,\n ImportOptions\n} from \"./options\";\nexport * from \"./enums\";\nexport * from \"./errors\";\nexport { ImportProgress as ImportResult, ConfigurationChanges } from \"./models\";\nexport { StringConfigurationSettingsSource } from \"./settingsImport/stringConfigurationSettingsSource\";\nexport { ConfigurationSettingsSource } from \"./settingsImport/configurationSettingsSource\";\nexport { ConfigurationChangesSource } from \"./settingsImport/configurationChangesSource\";\nexport { IterableConfigurationSettingsSource } from \"./settingsImport/iterableConfigurationSettingsSource\";\nexport { ReadableStreamConfigurationSettingsSource } from \"./settingsImport/readableStreamConfigurationSettingsSource\";"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configurationSettingsConverter.js","sourceRoot":"","sources":["../../../../src/internal/parsers/configurationSettingsConverter.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n SetConfigurationSettingParam,\n FeatureFlagValue,\n SecretReferenceValue\n} from \"@azure/app-configuration\";\nimport { SourceOptions } from \"../../
|
|
1
|
+
{"version":3,"file":"configurationSettingsConverter.js","sourceRoot":"","sources":["../../../../src/internal/parsers/configurationSettingsConverter.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n SetConfigurationSettingParam,\n FeatureFlagValue,\n SecretReferenceValue\n} from \"@azure/app-configuration\";\nimport { SourceOptions } from \"../../options\";\n\n/**\n * ConfigurationSettings converter for different configuration content.\n *\n * @internal\n * */\nexport interface ConfigurationSettingsConverter {\n Convert(\n rawConfig: object,\n options?: SourceOptions\n ): Array<SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>>;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultConfigurationSettingsConverter.js","sourceRoot":"","sources":["../../../../src/internal/parsers/defaultConfigurationSettingsConverter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n SetConfigurationSettingParam,\n featureFlagPrefix,\n featureFlagContentType,\n SecretReferenceValue\n} from \"@azure/app-configuration\";\nimport { SourceOptions } from \"../../importOptions\";\nimport { ConfigurationSettingsConverter } from \"./configurationSettingsConverter\";\nimport { AjvValidationError, ArgumentError } from \"../../errors\";\nimport { ClientFilter } from \"../../models\";\nimport * as flat from \"flat\";\nimport { ConfigurationFormat } from \"../../enums\";\nimport { isJsonContentType, serializeFeatureFlagValue } from \"../utils\";\nimport { MsFeatureFlagValue, RequirementType } from \"../../featureFlag\";\nimport { Constants } from \"../constants\";\nimport { MsFeatureFlagValueSchema } from \"../../MsFeatureFlagSchema\";\nimport Ajv, { ErrorObject } from \"ajv\";\n\n/**\n * Format Parser for common key-value configuration.\n *\n * @internal\n * */\nexport class DefaultConfigurationSettingsConverter implements ConfigurationSettingsConverter {\n /**\n * Parse the raw configuration object to collection of ConfigurationSettings\n *\n * @param config Raw configuration object\n * @param options Configuration options to dictate how the configuration be parsed.\n * */\n public Convert(\n config: object,\n options: SourceOptions\n ): SetConfigurationSettingParam<string | SecretReferenceValue>[] {\n let configurationSettings = new Array<\n SetConfigurationSettingParam<string>\n >();\n\n let featureFlagsConfigSettings = new Array<SetConfigurationSettingParam<string>>();\n let foundMsFmSchema = false;\n let foundDotnetFmSchema = false;\n let dotnetFmSchemaKeyWord = \"\";\n\n const featureFlagsDict: any = {};\n\n if (options.format == ConfigurationFormat.Properties && !options.skipFeatureFlags) {\n this.checkFeatureManagementExist(config);\n }\n\n for (let i = 0; i < Constants.FeatureManagementKeyWords.length - 1; i++) {\n if (Constants.FeatureManagementKeyWords[i] in config) {\n if (foundDotnetFmSchema) {\n throw new ArgumentError(\n `Unable to proceed because data contains multiple sections corresponding to Feature Management. with the key, ${Constants.FeatureManagementKeyWords[i]}`\n );\n }\n \n foundDotnetFmSchema = true;\n dotnetFmSchemaKeyWord = Constants.FeatureManagementKeyWords[i];\n\n const dotnetFmSchemaKey = dotnetFmSchemaKeyWord as keyof object;\n featureFlagsDict[dotnetFmSchemaKey] = config[dotnetFmSchemaKey];\n delete config[dotnetFmSchemaKey];\n }\n }\n\n const msFeatureManagementKeyWord = Constants.FeatureManagementKeyWords[3];\n if (msFeatureManagementKeyWord in config) {\n if (foundDotnetFmSchema &&\n Object.keys(config[msFeatureManagementKeyWord as keyof object]).some(key => key !== Constants.FeatureFlagsKeyWord)) {\n throw new ArgumentError(\n `Unable to proceed because data contains an already defined dotnet schema section with the key, ${dotnetFmSchemaKeyWord}.`\n );\n }\n\n if (Object.keys(config[msFeatureManagementKeyWord as keyof object]).includes(Constants.FeatureFlagsKeyWord)) {\n foundMsFmSchema = true;\n }\n\n if (Object.keys(config[msFeatureManagementKeyWord as keyof object]).some(key => key !== Constants.FeatureFlagsKeyWord)){\n foundDotnetFmSchema = true;\n dotnetFmSchemaKeyWord = msFeatureManagementKeyWord;\n }\n\n const featureManagementKey = msFeatureManagementKeyWord as keyof object;\n featureFlagsDict[featureManagementKey] = config[featureManagementKey];\n delete config[featureManagementKey];\n }\n\n if ((foundDotnetFmSchema || foundMsFmSchema) && !options.skipFeatureFlags) {\n const featureFlagConverter = new FeatureFlagConfigurationSettingsConverter(\n dotnetFmSchemaKeyWord,\n foundMsFmSchema\n );\n featureFlagsConfigSettings = featureFlagConverter.Convert(featureFlagsDict, options);\n }\n\n const flattenedConfigurationSettings: object = flat.flatten(config, {\n delimiter: options.separator,\n maxDepth: options.depth,\n safe: isJsonContentType(options.contentType) // preserve array for json content type\n });\n configurationSettings = this.toConfigurationSettings(flattenedConfigurationSettings, options);\n configurationSettings = configurationSettings.concat(featureFlagsConfigSettings);\n\n return configurationSettings;\n }\n\n private checkFeatureManagementExist(configurations: object): void {\n const keys: string[] = Object.keys(configurations);\n for (const featureFlagKeyWord of Constants.FeatureManagementKeyWords) {\n if (keys.find(key => key.startsWith(featureFlagKeyWord))) {\n throw new ArgumentError(\"Importing feature flag in Properties format is not supported. Anything in the Properties format being imported will be treated as key value.\");\n }\n }\n }\n\n private toConfigurationSettings(\n flatted: any,\n options: SourceOptions\n ): Array<SetConfigurationSettingParam<string>> {\n const result = new Array<SetConfigurationSettingParam>();\n const isJsonType = isJsonContentType(options.contentType);\n for (const element in flatted) {\n let generateKey: string = element;\n if (options.prefix) {\n generateKey = options.prefix + element;\n }\n\n if (generateKey === \".\" || generateKey === \"..\" || generateKey.indexOf(\"%\") > -1) {\n throw new ArgumentError(\"Key cannot be a '.' or '..', or contain the '%' character.\");\n }\n if (generateKey.startsWith(featureFlagPrefix)) {\n throw new ArgumentError(\"Key cannot start with the reserved prefix for feature flags.\");\n }\n\n // Ignore key-value with empty array/object value when content-type is not json, instead of pushing a kv with an empty array/obj\n // For null value it will be treated as \"null\" string.\n if (!isJsonType && flatted[element] && typeof flatted[element] === \"object\" && Object.keys(flatted[element]).length == 0 ) {\n continue;\n }\n\n const setting: SetConfigurationSettingParam<string> = {\n label: options.label,\n tags: options.tags,\n key: generateKey,\n contentType: options.contentType,\n value:\n typeof flatted[element] === \"object\" || isJsonType\n ? JSON.stringify(flatted[element])\n : flatted[element].toString()\n };\n\n result.push(setting);\n }\n\n return result;\n }\n}\n\n/**\n * ConfigurationSettings converter for feature flag.\n *\n * @internal\n * */\nclass FeatureFlagConfigurationSettingsConverter implements ConfigurationSettingsConverter {\n dotnetFmSchemaKeyWord: string;\n foundMsFeatureManagement: boolean;\n ajv: Ajv;\n\n constructor(dotnetFmSchemaKeyWord: string, foundMsFeatureManagement: boolean) {\n this.dotnetFmSchemaKeyWord = dotnetFmSchemaKeyWord;\n this.foundMsFeatureManagement = foundMsFeatureManagement;\n this.ajv = new Ajv();\n\n if (!this.dotnetFmSchemaKeyWord && !this.foundMsFeatureManagement) {\n throw new ArgumentError(\"No feature management was found\");\n }\n }\n\n /**\n * @inheritdoc\n * */\n Convert(\n config: object,\n options: SourceOptions\n ): SetConfigurationSettingParam<string>[] {\n const settings = new Array<SetConfigurationSettingParam<string>>();\n const featureFlags = new Array<MsFeatureFlagValue>();\n\n if (this.dotnetFmSchemaKeyWord) {\n const dotnetSchemaFeatureFlags = this.getDotnetFmSchemaFeatureFlags(config);\n\n const featureManagementIndex: number = Constants.FeatureManagementKeyWords.indexOf(this.dotnetFmSchemaKeyWord);\n\n for (const featureFlag in dotnetSchemaFeatureFlags) {\n if (!this.validateFeatureName(featureFlag)) {\n throw new ArgumentError(\n `Feature flag ${featureFlag} contains invalid character,'%' and ':' are not allowed in feature name. Please provide valid feature name.`\n );\n }\n\n const featureFlagValue = this.getFeatureFlagValueFromDotnetSchema(\n featureFlag,\n dotnetSchemaFeatureFlags[featureFlag],\n Constants.EnabledForKeyWords[featureManagementIndex],\n Constants.RequirementTypeKeyWords[featureManagementIndex]\n );\n\n featureFlags.push(featureFlagValue);\n }\n }\n\n if (this.foundMsFeatureManagement) {\n const msFmSectionFeatureFlags = this.getMsFmSchemaFeatureFlags(config);\n\n for (const featureFlag of msFmSectionFeatureFlags) {\n if (!featureFlag.id) {\n throw new ArgumentError(\n \"Feature flag without id is found, id is a required property.\"\n );\n }\n\n if (!this.validateFeatureName(featureFlag.id)) {\n throw new ArgumentError(\n `Feature flag id ${featureFlag.id} contains invalid character,'%' and ':' are not allowed.`\n );\n }\n\n const featureFlagValue = this.getFeatureFlagValueFromMsFmSchema(featureFlag);\n\n // Check if the featureFlag with the same id already exists\n // Replace the existing flag with the later one, the later one always wins\n const indexOfExistingFlag = featureFlags.findIndex(existingFeatureFlag => existingFeatureFlag.id === featureFlag.id);\n\n if (indexOfExistingFlag !== -1) {\n featureFlags[indexOfExistingFlag] = featureFlagValue;\n }\n else {\n featureFlags.push(featureFlagValue);\n }\n }\n }\n\n const prefix: string = options.prefix ?? \"\";\n for (const featureFlag of featureFlags) {\n const setting: SetConfigurationSettingParam<string> = {\n key: featureFlagPrefix + prefix + featureFlag.id,\n label: options.label,\n value: serializeFeatureFlagValue(featureFlag),\n contentType: featureFlagContentType,\n tags: options.tags\n };\n\n settings.push(setting);\n }\n\n return settings;\n }\n\n private validateFeatureName(featureName: string): boolean {\n if (featureName) {\n const valid = /^[^:%]*$/;\n return valid.test(featureName);\n }\n else {\n return false;\n }\n }\n\n private getFeatureFlagValueFromDotnetSchema(\n featureFlagName: string,\n featureData: any,\n enabledForKeyWord: string,\n requirementTypeKeyWord: string\n ): MsFeatureFlagValue {\n const defaultFeatureConditions = { clientFilters: [] };\n\n const featureFlagValue: MsFeatureFlagValue = {\n id: featureFlagName,\n description: \"\",\n enabled: false,\n conditions: {\n clientFilters: []\n }\n };\n\n if (typeof featureData == \"object\") {\n const filters = featureData[enabledForKeyWord];\n\n if (!filters) {\n throw new ArgumentError(\n `Data contains feature flags in invalid format. Feature flag '${featureFlagName}' must contain '${enabledForKeyWord}' definition or have a true/false value.`\n );\n }\n\n if (filters.length != 0) {\n featureFlagValue.enabled = true;\n featureFlagValue.conditions.clientFilters = filters;\n\n if (featureFlagValue.conditions && featureFlagValue.conditions.clientFilters) {\n for (let i = 0; i < featureFlagValue.conditions.clientFilters.length; i++) {\n const parameters: Partial<ClientFilter> = {};\n //\n // Converting client_filter keys to lower case\n const lowerCaseFilters = this.getLowerCaseFilters(\n featureFlagValue.conditions.clientFilters[i]\n );\n\n const filtersName = lowerCaseFilters[\"name\"];\n const filtersParameters = lowerCaseFilters[\"parameters\"];\n\n if (filtersName) {\n if (filtersName.toLowerCase() == \"alwayson\") {\n featureFlagValue.conditions = defaultFeatureConditions;\n break;\n }\n parameters.name = filtersName;\n if (filtersParameters) {\n parameters.parameters = filtersParameters;\n }\n\n featureFlagValue.conditions.clientFilters[i] = parameters as ClientFilter;\n }\n else {\n throw new ArgumentError(\n `This feature flag '${featureFlagName}' has a filter without the required 'name' property.`\n );\n }\n }\n }\n }\n\n const requirementType = featureData[requirementTypeKeyWord];\n\n if (requirementType) {\n if (this.validateRequirementType(featureFlagName, requirementType)) {\n featureFlagValue.conditions.requirementType = requirementType;\n }\n }\n }\n else if (typeof featureData == \"boolean\") {\n featureFlagValue.enabled = featureData;\n }\n else {\n throw new ArgumentError(\n `Data contains feature flags in invalid format. The type of ${featureFlagName} should be either boolean or dictionary.`\n );\n }\n\n return featureFlagValue;\n }\n\n private getFeatureFlagValueFromMsFmSchema(featureFlag: any): MsFeatureFlagValue {\n const validate = this.ajv.compile<MsFeatureFlagValue>(MsFeatureFlagValueSchema);\n const featureFlagCopy = JSON.parse(JSON.stringify(featureFlag)); //deep copy\n\n // normalize client filters\n if (featureFlagCopy.conditions && featureFlagCopy.conditions.client_filters) {\n for (let i = 0; i < featureFlagCopy.conditions.client_filters.length; i++) {\n featureFlagCopy.conditions.client_filters[i] = this.getLowerCaseFilters(featureFlagCopy.conditions.client_filters[i]);\n }\n }\n\n const valid = validate(featureFlagCopy);\n if (!valid) {\n const validationError = new AjvValidationError(validate.errors as ErrorObject[]);\n throw new ArgumentError(`Feature flag '${featureFlag.id}' is not in the correct format. ${validationError.getFriendlyMessage()}`);\n }\n\n const parsedFeatureFlag: MsFeatureFlagValue = {\n ...featureFlag,\n conditions: {\n clientFilters: featureFlag.conditions?.client_filters ?? []\n }\n };\n\n if (featureFlag.display_name) {\n parsedFeatureFlag.displayName = featureFlag.display_name;\n }\n\n if (featureFlag.conditions?.requirement_type) {\n parsedFeatureFlag.conditions.requirementType = featureFlag.conditions.requirement_type;\n }\n\n return parsedFeatureFlag;\n }\n\n private getLowerCaseFilters(clientFilter: ClientFilter): { [key: string]: any } {\n const keys: Array<string> = Object.keys(clientFilter);\n const lowerCaseFilters: { [key: string]: any } = {};\n\n for (let i = 0; i < keys.length; i++) {\n lowerCaseFilters[keys[i].toLowerCase()] = clientFilter[keys[i] as keyof object];\n }\n\n return lowerCaseFilters;\n }\n\n private validateRequirementType(requirement_type: any, featureFlagName: string) {\n if(!Object.values(RequirementType).includes(requirement_type)){\n throw new ArgumentError(\n `This feature flag '${featureFlagName}' must have any/all requirement type.`\n );\n }\n\n return true;\n }\n\n private getMsFmSchemaFeatureFlags(config: object): Array<{ [key: string]: any }>{\n const msFeatureManagementKeyWord = Constants.FeatureManagementKeyWords[3];\n const featureManagementKey = msFeatureManagementKeyWord as keyof object;\n const featureManagementSection = config[featureManagementKey];\n\n if (typeof featureManagementSection !== \"object\") {\n throw new ArgumentError(`The ${msFeatureManagementKeyWord} section must be an object.`);\n }\n\n if (!Array.isArray(featureManagementSection[Constants.FeatureFlagsKeyWord])) {\n throw new ArgumentError(`The ${Constants.FeatureFlagsKeyWord} key within ${msFeatureManagementKeyWord} must be an array.`);\n }\n\n return featureManagementSection[Constants.FeatureFlagsKeyWord];\n }\n\n private getDotnetFmSchemaFeatureFlags(config: object): { [key: string]: any } {\n const msFeatureManagementKeyWord = Constants.FeatureManagementKeyWords[3];\n const featureManagementSection: object = config[this.dotnetFmSchemaKeyWord as keyof object];\n\n if (typeof featureManagementSection !== \"object\") {\n throw new ArgumentError(`The ${this.dotnetFmSchemaKeyWord} section must be an object.`);\n }\n\n if (this.dotnetFmSchemaKeyWord === msFeatureManagementKeyWord) { //dotnet schema might be nested within msFmSchema\n const { feature_flags, ...dotnetSchemaFeatureFlags } = featureManagementSection as { [key: string]: any };\n return dotnetSchemaFeatureFlags;\n }\n else {\n return featureManagementSection;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"defaultConfigurationSettingsConverter.js","sourceRoot":"","sources":["../../../../src/internal/parsers/defaultConfigurationSettingsConverter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n SetConfigurationSettingParam,\n featureFlagPrefix,\n featureFlagContentType,\n SecretReferenceValue\n} from \"@azure/app-configuration\";\nimport { SourceOptions } from \"../../options\";\nimport { ConfigurationSettingsConverter } from \"./configurationSettingsConverter\";\nimport { AjvValidationError, ArgumentError } from \"../../errors\";\nimport { ClientFilter } from \"../../models\";\nimport * as flat from \"flat\";\nimport { ConfigurationFormat } from \"../../enums\";\nimport { isJsonContentType, serializeFeatureFlagValue } from \"../utils\";\nimport { MsFeatureFlagValue, RequirementType } from \"../../featureFlag\";\nimport { Constants } from \"../constants\";\nimport { MsFeatureFlagValueSchema } from \"../../MsFeatureFlagSchema\";\nimport Ajv, { ErrorObject } from \"ajv\";\n\n/**\n * Format Parser for common key-value configuration.\n *\n * @internal\n * */\nexport class DefaultConfigurationSettingsConverter implements ConfigurationSettingsConverter {\n /**\n * Parse the raw configuration object to collection of ConfigurationSettings\n *\n * @param config Raw configuration object\n * @param options Configuration options to dictate how the configuration be parsed.\n * */\n public Convert(\n config: object,\n options: SourceOptions\n ): SetConfigurationSettingParam<string | SecretReferenceValue>[] {\n let configurationSettings = new Array<\n SetConfigurationSettingParam<string>\n >();\n\n let featureFlagsConfigSettings = new Array<SetConfigurationSettingParam<string>>();\n let foundMsFmSchema = false;\n let foundDotnetFmSchema = false;\n let dotnetFmSchemaKeyWord = \"\";\n\n const featureFlagsDict: any = {};\n\n if (options.format == ConfigurationFormat.Properties && !options.skipFeatureFlags) {\n this.checkFeatureManagementExist(config);\n }\n\n for (let i = 0; i < Constants.FeatureManagementKeyWords.length - 1; i++) {\n if (Constants.FeatureManagementKeyWords[i] in config) {\n if (foundDotnetFmSchema) {\n throw new ArgumentError(\n `Unable to proceed because data contains multiple sections corresponding to Feature Management. with the key, ${Constants.FeatureManagementKeyWords[i]}`\n );\n }\n \n foundDotnetFmSchema = true;\n dotnetFmSchemaKeyWord = Constants.FeatureManagementKeyWords[i];\n\n const dotnetFmSchemaKey = dotnetFmSchemaKeyWord as keyof object;\n featureFlagsDict[dotnetFmSchemaKey] = config[dotnetFmSchemaKey];\n delete config[dotnetFmSchemaKey];\n }\n }\n\n const msFeatureManagementKeyWord = Constants.FeatureManagementKeyWords[3];\n if (msFeatureManagementKeyWord in config) {\n if (foundDotnetFmSchema &&\n Object.keys(config[msFeatureManagementKeyWord as keyof object]).some(key => key !== Constants.FeatureFlagsKeyWord)) {\n throw new ArgumentError(\n `Unable to proceed because data contains an already defined dotnet schema section with the key, ${dotnetFmSchemaKeyWord}.`\n );\n }\n\n if (Object.keys(config[msFeatureManagementKeyWord as keyof object]).includes(Constants.FeatureFlagsKeyWord)) {\n foundMsFmSchema = true;\n }\n\n if (Object.keys(config[msFeatureManagementKeyWord as keyof object]).some(key => key !== Constants.FeatureFlagsKeyWord)){\n foundDotnetFmSchema = true;\n dotnetFmSchemaKeyWord = msFeatureManagementKeyWord;\n }\n\n const featureManagementKey = msFeatureManagementKeyWord as keyof object;\n featureFlagsDict[featureManagementKey] = config[featureManagementKey];\n delete config[featureManagementKey];\n }\n\n if ((foundDotnetFmSchema || foundMsFmSchema) && !options.skipFeatureFlags) {\n const featureFlagConverter = new FeatureFlagConfigurationSettingsConverter(\n dotnetFmSchemaKeyWord,\n foundMsFmSchema\n );\n featureFlagsConfigSettings = featureFlagConverter.Convert(featureFlagsDict, options);\n }\n\n const flattenedConfigurationSettings: object = flat.flatten(config, {\n delimiter: options.separator,\n maxDepth: options.depth,\n safe: isJsonContentType(options.contentType) // preserve array for json content type\n });\n configurationSettings = this.toConfigurationSettings(flattenedConfigurationSettings, options);\n configurationSettings = configurationSettings.concat(featureFlagsConfigSettings);\n\n return configurationSettings;\n }\n\n private checkFeatureManagementExist(configurations: object): void {\n const keys: string[] = Object.keys(configurations);\n for (const featureFlagKeyWord of Constants.FeatureManagementKeyWords) {\n if (keys.find(key => key.startsWith(featureFlagKeyWord))) {\n throw new ArgumentError(\"Importing feature flag in Properties format is not supported. Anything in the Properties format being imported will be treated as key value.\");\n }\n }\n }\n\n private toConfigurationSettings(\n flatted: any,\n options: SourceOptions\n ): Array<SetConfigurationSettingParam<string>> {\n const result = new Array<SetConfigurationSettingParam>();\n const isJsonType = isJsonContentType(options.contentType);\n for (const element in flatted) {\n let generateKey: string = element;\n if (options.prefix) {\n generateKey = options.prefix + element;\n }\n\n if (generateKey === \".\" || generateKey === \"..\" || generateKey.indexOf(\"%\") > -1) {\n throw new ArgumentError(\"Key cannot be a '.' or '..', or contain the '%' character.\");\n }\n if (generateKey.startsWith(featureFlagPrefix)) {\n throw new ArgumentError(\"Key cannot start with the reserved prefix for feature flags.\");\n }\n\n // Ignore key-value with empty array/object value when content-type is not json, instead of pushing a kv with an empty array/obj\n // For null value it will be treated as \"null\" string.\n if (!isJsonType && flatted[element] && typeof flatted[element] === \"object\" && Object.keys(flatted[element]).length == 0 ) {\n continue;\n }\n\n const setting: SetConfigurationSettingParam<string> = {\n label: options.label,\n tags: options.tags,\n key: generateKey,\n contentType: options.contentType,\n value:\n typeof flatted[element] === \"object\" || isJsonType\n ? JSON.stringify(flatted[element])\n : flatted[element].toString()\n };\n\n result.push(setting);\n }\n\n return result;\n }\n}\n\n/**\n * ConfigurationSettings converter for feature flag.\n *\n * @internal\n * */\nclass FeatureFlagConfigurationSettingsConverter implements ConfigurationSettingsConverter {\n dotnetFmSchemaKeyWord: string;\n foundMsFeatureManagement: boolean;\n ajv: Ajv;\n\n constructor(dotnetFmSchemaKeyWord: string, foundMsFeatureManagement: boolean) {\n this.dotnetFmSchemaKeyWord = dotnetFmSchemaKeyWord;\n this.foundMsFeatureManagement = foundMsFeatureManagement;\n this.ajv = new Ajv();\n\n if (!this.dotnetFmSchemaKeyWord && !this.foundMsFeatureManagement) {\n throw new ArgumentError(\"No feature management was found\");\n }\n }\n\n /**\n * @inheritdoc\n * */\n Convert(\n config: object,\n options: SourceOptions\n ): SetConfigurationSettingParam<string>[] {\n const settings = new Array<SetConfigurationSettingParam<string>>();\n const featureFlags = new Array<MsFeatureFlagValue>();\n\n if (this.dotnetFmSchemaKeyWord) {\n const dotnetSchemaFeatureFlags = this.getDotnetFmSchemaFeatureFlags(config);\n\n const featureManagementIndex: number = Constants.FeatureManagementKeyWords.indexOf(this.dotnetFmSchemaKeyWord);\n\n for (const featureFlag in dotnetSchemaFeatureFlags) {\n if (!this.validateFeatureName(featureFlag)) {\n throw new ArgumentError(\n `Feature flag ${featureFlag} contains invalid character,'%' and ':' are not allowed in feature name. Please provide valid feature name.`\n );\n }\n\n const featureFlagValue = this.getFeatureFlagValueFromDotnetSchema(\n featureFlag,\n dotnetSchemaFeatureFlags[featureFlag],\n Constants.EnabledForKeyWords[featureManagementIndex],\n Constants.RequirementTypeKeyWords[featureManagementIndex]\n );\n\n featureFlags.push(featureFlagValue);\n }\n }\n\n if (this.foundMsFeatureManagement) {\n const msFmSectionFeatureFlags = this.getMsFmSchemaFeatureFlags(config);\n\n for (const featureFlag of msFmSectionFeatureFlags) {\n if (!featureFlag.id) {\n throw new ArgumentError(\n \"Feature flag without id is found, id is a required property.\"\n );\n }\n\n if (!this.validateFeatureName(featureFlag.id)) {\n throw new ArgumentError(\n `Feature flag id ${featureFlag.id} contains invalid character,'%' and ':' are not allowed.`\n );\n }\n\n const featureFlagValue = this.getFeatureFlagValueFromMsFmSchema(featureFlag);\n\n // Check if the featureFlag with the same id already exists\n // Replace the existing flag with the later one, the later one always wins\n const indexOfExistingFlag = featureFlags.findIndex(existingFeatureFlag => existingFeatureFlag.id === featureFlag.id);\n\n if (indexOfExistingFlag !== -1) {\n featureFlags[indexOfExistingFlag] = featureFlagValue;\n }\n else {\n featureFlags.push(featureFlagValue);\n }\n }\n }\n\n const prefix: string = options.prefix ?? \"\";\n for (const featureFlag of featureFlags) {\n const setting: SetConfigurationSettingParam<string> = {\n key: featureFlagPrefix + prefix + featureFlag.id,\n label: options.label,\n value: serializeFeatureFlagValue(featureFlag),\n contentType: featureFlagContentType,\n tags: options.tags\n };\n\n settings.push(setting);\n }\n\n return settings;\n }\n\n private validateFeatureName(featureName: string): boolean {\n if (featureName) {\n const valid = /^[^:%]*$/;\n return valid.test(featureName);\n }\n else {\n return false;\n }\n }\n\n private getFeatureFlagValueFromDotnetSchema(\n featureFlagName: string,\n featureData: any,\n enabledForKeyWord: string,\n requirementTypeKeyWord: string\n ): MsFeatureFlagValue {\n const defaultFeatureConditions = { clientFilters: [] };\n\n const featureFlagValue: MsFeatureFlagValue = {\n id: featureFlagName,\n description: \"\",\n enabled: false,\n conditions: {\n clientFilters: []\n }\n };\n\n if (typeof featureData == \"object\") {\n const filters = featureData[enabledForKeyWord];\n\n if (!filters) {\n throw new ArgumentError(\n `Data contains feature flags in invalid format. Feature flag '${featureFlagName}' must contain '${enabledForKeyWord}' definition or have a true/false value.`\n );\n }\n\n if (filters.length != 0) {\n featureFlagValue.enabled = true;\n featureFlagValue.conditions.clientFilters = filters;\n\n if (featureFlagValue.conditions && featureFlagValue.conditions.clientFilters) {\n for (let i = 0; i < featureFlagValue.conditions.clientFilters.length; i++) {\n const parameters: Partial<ClientFilter> = {};\n //\n // Converting client_filter keys to lower case\n const lowerCaseFilters = this.getLowerCaseFilters(\n featureFlagValue.conditions.clientFilters[i]\n );\n\n const filtersName = lowerCaseFilters[\"name\"];\n const filtersParameters = lowerCaseFilters[\"parameters\"];\n\n if (filtersName) {\n if (filtersName.toLowerCase() == \"alwayson\") {\n featureFlagValue.conditions = defaultFeatureConditions;\n break;\n }\n parameters.name = filtersName;\n if (filtersParameters) {\n parameters.parameters = filtersParameters;\n }\n\n featureFlagValue.conditions.clientFilters[i] = parameters as ClientFilter;\n }\n else {\n throw new ArgumentError(\n `This feature flag '${featureFlagName}' has a filter without the required 'name' property.`\n );\n }\n }\n }\n }\n\n const requirementType = featureData[requirementTypeKeyWord];\n\n if (requirementType) {\n if (this.validateRequirementType(featureFlagName, requirementType)) {\n featureFlagValue.conditions.requirementType = requirementType;\n }\n }\n }\n else if (typeof featureData == \"boolean\") {\n featureFlagValue.enabled = featureData;\n }\n else {\n throw new ArgumentError(\n `Data contains feature flags in invalid format. The type of ${featureFlagName} should be either boolean or dictionary.`\n );\n }\n\n return featureFlagValue;\n }\n\n private getFeatureFlagValueFromMsFmSchema(featureFlag: any): MsFeatureFlagValue {\n const validate = this.ajv.compile<MsFeatureFlagValue>(MsFeatureFlagValueSchema);\n const featureFlagCopy = JSON.parse(JSON.stringify(featureFlag)); //deep copy\n\n // normalize client filters\n if (featureFlagCopy.conditions && featureFlagCopy.conditions.client_filters) {\n for (let i = 0; i < featureFlagCopy.conditions.client_filters.length; i++) {\n featureFlagCopy.conditions.client_filters[i] = this.getLowerCaseFilters(featureFlagCopy.conditions.client_filters[i]);\n }\n }\n\n const valid = validate(featureFlagCopy);\n if (!valid) {\n const validationError = new AjvValidationError(validate.errors as ErrorObject[]);\n throw new ArgumentError(`Feature flag '${featureFlag.id}' is not in the correct format. ${validationError.getFriendlyMessage()}`);\n }\n\n const parsedFeatureFlag: MsFeatureFlagValue = {\n ...featureFlag,\n conditions: {\n clientFilters: featureFlag.conditions?.client_filters ?? []\n }\n };\n\n if (featureFlag.display_name) {\n parsedFeatureFlag.displayName = featureFlag.display_name;\n }\n\n if (featureFlag.conditions?.requirement_type) {\n parsedFeatureFlag.conditions.requirementType = featureFlag.conditions.requirement_type;\n }\n\n return parsedFeatureFlag;\n }\n\n private getLowerCaseFilters(clientFilter: ClientFilter): { [key: string]: any } {\n const keys: Array<string> = Object.keys(clientFilter);\n const lowerCaseFilters: { [key: string]: any } = {};\n\n for (let i = 0; i < keys.length; i++) {\n lowerCaseFilters[keys[i].toLowerCase()] = clientFilter[keys[i] as keyof object];\n }\n\n return lowerCaseFilters;\n }\n\n private validateRequirementType(requirement_type: any, featureFlagName: string) {\n if(!Object.values(RequirementType).includes(requirement_type)){\n throw new ArgumentError(\n `This feature flag '${featureFlagName}' must have any/all requirement type.`\n );\n }\n\n return true;\n }\n\n private getMsFmSchemaFeatureFlags(config: object): Array<{ [key: string]: any }>{\n const msFeatureManagementKeyWord = Constants.FeatureManagementKeyWords[3];\n const featureManagementKey = msFeatureManagementKeyWord as keyof object;\n const featureManagementSection = config[featureManagementKey];\n\n if (typeof featureManagementSection !== \"object\") {\n throw new ArgumentError(`The ${msFeatureManagementKeyWord} section must be an object.`);\n }\n\n if (!Array.isArray(featureManagementSection[Constants.FeatureFlagsKeyWord])) {\n throw new ArgumentError(`The ${Constants.FeatureFlagsKeyWord} key within ${msFeatureManagementKeyWord} must be an array.`);\n }\n\n return featureManagementSection[Constants.FeatureFlagsKeyWord];\n }\n\n private getDotnetFmSchemaFeatureFlags(config: object): { [key: string]: any } {\n const msFeatureManagementKeyWord = Constants.FeatureManagementKeyWords[3];\n const featureManagementSection: object = config[this.dotnetFmSchemaKeyWord as keyof object];\n\n if (typeof featureManagementSection !== \"object\") {\n throw new ArgumentError(`The ${this.dotnetFmSchemaKeyWord} section must be an object.`);\n }\n\n if (this.dotnetFmSchemaKeyWord === msFeatureManagementKeyWord) { //dotnet schema might be nested within msFmSchema\n const { feature_flags, ...dotnetSchemaFeatureFlags } = featureManagementSection as { [key: string]: any };\n return dotnetSchemaFeatureFlags;\n }\n else {\n return featureManagementSection;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/internal/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { \n ConfigurationSetting, \n SetConfigurationSettingParam, \n FeatureFlagValue,\n featureFlagContentType,\n SecretReferenceValue } from \"@azure/app-configuration\";\nimport { isEmpty, isEqual } from \"lodash\";\nimport { Tags, FeatureFlagClientFilters } from \"../models\";\nimport { SourceOptions } from \"../importOptions\";\nimport { ConfigurationFormat, ConfigurationProfile } from \"../enums\";\nimport { ArgumentError, ArgumentNullError } from \"../errors\";\nimport { Constants } from \"../internal/constants\";\nimport { MsFeatureFlagValue, Variant } from \"../featureFlag\";\n\n/** @internal*/\nexport function isJsonContentType(contentType?: string): boolean {\n if (!contentType) {\n return false;\n }\n\n contentType = contentType.trim().toLowerCase();\n const mineType = contentType.split(\";\")[0].trim();\n const typeParts = mineType.split(\"/\");\n if (typeParts.length != 2) {\n return false;\n }\n\n if (typeParts[0] != \"application\") {\n return false;\n }\n\n const subTypes = typeParts[1].split(\"+\");\n if (subTypes[subTypes.length-1] == \"json\") {\n return true;\n }\n\n return false;\n}\n\n/** @internal*/\nexport function isConfigSettingEqual(settingA: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>, settingB: ConfigurationSetting) {\n let valueIsEqual: boolean = settingA.value == settingB.value;\n \n if (settingA.contentType == featureFlagContentType &&\n settingB.contentType == featureFlagContentType && \n settingA.value !== undefined && \n settingB.value !== undefined) {\n valueIsEqual = isFeatureFlagValueEqual(settingA.value as string | FeatureFlagValue, settingB.value);\n }\n\n return valueIsEqual &&\n settingA.contentType == settingB.contentType &&\n areTagsEqual(settingA.tags, settingB.tags);\n}\n\n/** @internal*/\nexport function areTagsEqual(tagA?: Tags, tagB?: Tags): boolean {\n if (isEmpty(tagA) || isEmpty(tagB)) {\n return isEmpty(tagA) && isEmpty(tagB);\n }\n\n if (Object.keys(tagA).length !== Object.keys(tagB).length) {\n return false;\n }\n\n for(const key in tagA) {\n if (tagA[key] !== tagB[key]) {\n return false;\n }\n }\n return true;\n}\n\n/** @internal*/\n/**\n * Validate the ConfigurationSyncOptions argument, throw fatal error if options are not valid.\n *\n * @param options - ConfigurationSyncOptions to be validated.\n */\nexport function validateOptions(options: SourceOptions): void {\n if (!options) {\n throw new ArgumentNullError();\n }\n\n if (options.profile == ConfigurationProfile.KvSet) {\n if (\n options.prefix ||\n options.separator ||\n options.label ||\n options.depth ||\n options.tags ||\n options.contentType\n ) {\n throw new ArgumentError(\n \"The option label, prefix, depth, contentType, tags and separator are not supported when importing using 'appconfig/kvset' profile\"\n );\n }\n\n if (options.format !== ConfigurationFormat.Json) {\n throw new ArgumentError(\n \"Yaml and Properties formats are not supported for appconfig/kvset profile. Supported value is: Json\"\n );\n }\n }\n\n if (options.depth && options.depth > 1 && !options.separator) {\n throw new ArgumentError(\n \"Separator must be specified if Depth is default value or set a value lager than 1\"\n );\n }\n\n if (options.separator && !Constants.Separators.includes(options.separator)) {\n throw new ArgumentError(`${options.separator} is not a supported separator.`);\n }\n\n if (!options.separator && !options.depth) {\n options.depth = 1;\n }\n\n if (options.format !== ConfigurationFormat.Json && isJsonContentType(options.contentType)) {\n throw new ArgumentError(`Failed to import '${ConfigurationFormat[options.format]}' data format with '${options.contentType}' content type. Please provide data in JSON format to match your content type.`);\n }\n}\n\nfunction isFeatureFlagValueEqual(valueA: string | MsFeatureFlagValue, valueB: string): boolean {\n let featureFlagAValue: MsFeatureFlagValue;\n\n if (typeof valueA == \"string\") {\n featureFlagAValue = toMsFeatureFlagValue(valueA);\n }\n else {\n featureFlagAValue = valueA as MsFeatureFlagValue;\n }\n\n const featureFlagBValue: MsFeatureFlagValue = toMsFeatureFlagValue(valueB);\n\n if (Object.keys(featureFlagAValue).length !== Object.keys(featureFlagBValue).length) {\n return false;\n }\n\n return featureFlagAValue.id == featureFlagBValue.id &&\n featureFlagAValue.enabled == featureFlagBValue.enabled &&\n featureFlagAValue.description == featureFlagBValue.description &&\n areArrayEqual<FeatureFlagClientFilters>(featureFlagAValue.conditions.clientFilters, featureFlagBValue.conditions.clientFilters) &&\n isEqual(featureFlagAValue.allocation, featureFlagBValue.allocation) &&\n areArrayEqual<Variant>(featureFlagAValue.variants ?? [], featureFlagBValue.variants ?? []) &&\n isEqual(featureFlagAValue.telemetry, featureFlagBValue.telemetry);\n}\n\nfunction areArrayEqual<T>(arrayA: T[], arrayB: T[]): boolean {\n if (arrayA.length !== arrayB.length) {\n return false;\n }\n\n for (let i = 0; i < arrayA.length; i++) {\n if (!isEqual(arrayA[i], arrayB[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction toMsFeatureFlagValue(value: string): MsFeatureFlagValue {\n const parsedJson: any = JSON.parse(value);\n\n const msFeatureFlagValue: MsFeatureFlagValue = {\n id: parsedJson.id,\n enabled: parsedJson.enabled,\n description:parsedJson.description,\n conditions: isEmpty(parsedJson.conditions) ? {clientFilters: []} : {clientFilters: parsedJson.conditions.client_filters}\n };\n \n if (parsedJson.allocation) {\n msFeatureFlagValue.allocation = parsedJson.allocation;\n }\n\n if (parsedJson.variants) {\n msFeatureFlagValue.variants = parsedJson.variants;\n }\n\n if (parsedJson.telemetry) {\n msFeatureFlagValue.telemetry = parsedJson.telemetry;\n }\n\n return msFeatureFlagValue;\n}\n\nexport function serializeFeatureFlagValue(featureFlagValue: MsFeatureFlagValue): string {\n if (!featureFlagValue) {\n throw new TypeError(\"Invalid feature flag value\");\n }\n\n const jsonFeatureFlagValue: any = {\n id: featureFlagValue.id,\n enabled: featureFlagValue.enabled,\n description: featureFlagValue.description,\n conditions: {\n client_filters: featureFlagValue.conditions?.clientFilters\n },\n display_name: featureFlagValue.displayName\n };\n\n if (featureFlagValue.conditions && featureFlagValue.conditions.requirementType) {\n jsonFeatureFlagValue.conditions.requirement_type = featureFlagValue.conditions.requirementType;\n }\n\n if (featureFlagValue.allocation) {\n jsonFeatureFlagValue.allocation = featureFlagValue.allocation;\n }\n\n if (featureFlagValue.variants) {\n jsonFeatureFlagValue.variants = featureFlagValue.variants;\n }\n\n if (featureFlagValue.telemetry) {\n jsonFeatureFlagValue.telemetry = featureFlagValue.telemetry;\n }\n\n return JSON.stringify(jsonFeatureFlagValue);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAIL,sBAAsB,EACA,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAG1C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,eAAe;AACf,MAAM,UAAU,iBAAiB,CAAC,WAAoB;IACpD,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,KAAK,CAAC;KACd;IAED,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,OAAO,KAAK,CAAC;KACd;IAED,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE;QACjC,OAAO,KAAK,CAAC;KACd;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAC,CAAC,CAAC,IAAI,MAAM,EAAE;QACzC,OAAO,IAAI,CAAC;KACb;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,eAAe;AACf,MAAM,UAAU,oBAAoB,CAAC,QAAwF,EAAE,QAA8B;IAC3J,IAAI,YAAY,GAAY,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;IAE7D,IAAI,QAAQ,CAAC,WAAW,IAAI,sBAAsB;QAChD,QAAQ,CAAC,WAAW,IAAI,sBAAsB;QAC9C,QAAQ,CAAC,KAAK,KAAK,SAAS;QAC5B,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE;QAC9B,YAAY,GAAG,uBAAuB,CAAC,QAAQ,CAAC,KAAkC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;KACrG;IAED,OAAO,YAAY;QACjB,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;QAC5C,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,eAAe;AACf,MAAM,UAAU,YAAY,CAAC,IAAW,EAAE,IAAW;IACnD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;QAClC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;KACvC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;QACzD,OAAO,KAAK,CAAC;KACd;IAED,KAAI,MAAM,GAAG,IAAI,IAAI,EAAE;QACrB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE;YAC3B,OAAO,KAAK,CAAC;SACd;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,eAAe;AACf;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB;IACpD,IAAI,CAAC,OAAO,EAAE;QACZ,MAAM,IAAI,iBAAiB,EAAE,CAAC;KAC/B;IAED,IAAI,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC,KAAK,EAAE;QACjD,IACE,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,SAAS;YACjB,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,IAAI;YACZ,OAAO,CAAC,WAAW,EACnB;YACA,MAAM,IAAI,aAAa,CACrB,mIAAmI,CACpI,CAAC;SACH;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,CAAC,IAAI,EAAE;YAC/C,MAAM,IAAI,aAAa,CACrB,qGAAqG,CACtG,CAAC;SACH;KACF;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;QAC5D,MAAM,IAAI,aAAa,CACrB,mFAAmF,CACpF,CAAC;KACH;IAED,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC1E,MAAM,IAAI,aAAa,CAAC,GAAG,OAAO,CAAC,SAAS,gCAAgC,CAAC,CAAC;KAC/E;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;QACxC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;KACnB;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,CAAC,IAAI,IAAI,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACzF,MAAM,IAAI,aAAa,CAAC,qBAAqB,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,OAAO,CAAC,WAAW,gFAAgF,CAAC,CAAC;KAC7M;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAmC,EAAE,MAAc;;IAClF,IAAI,iBAAqC,CAAC;IAE1C,IAAI,OAAO,MAAM,IAAI,QAAQ,EAAE;QAC7B,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;KAClD;SACI;QACH,iBAAiB,GAAG,MAA4B,CAAC;KAClD;IAED,MAAM,iBAAiB,GAAuB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE3E,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE;QACnF,OAAO,KAAK,CAAC;KACd;IAED,OAAO,iBAAiB,CAAC,EAAE,IAAI,iBAAiB,CAAC,EAAE;QACjD,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,OAAO;QACtD,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,WAAW;QAC9D,aAAa,CAA2B,iBAAiB,CAAC,UAAU,CAAC,aAAa,EAAE,iBAAiB,CAAC,UAAU,CAAC,aAAa,CAAC;QAC/H,OAAO,CAAC,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,CAAC,UAAU,CAAC;QACnE,aAAa,CAAU,MAAA,iBAAiB,CAAC,QAAQ,mCAAI,EAAE,EAAE,MAAA,iBAAiB,CAAC,QAAQ,mCAAI,EAAE,CAAC;QAC1F,OAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CAAI,MAAW,EAAE,MAAW;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;QACnC,OAAO,KAAK,CAAC;KACd;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YAClC,OAAO,KAAK,CAAC;SACd;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,UAAU,GAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,kBAAkB,GAAuB;QAC7C,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,WAAW,EAAC,UAAU,CAAC,WAAW;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAC,aAAa,EAAE,EAAE,EAAC,CAAC,CAAC,CAAC,EAAC,aAAa,EAAE,UAAU,CAAC,UAAU,CAAC,cAAc,EAAC;KACzH,CAAC;IAEF,IAAI,UAAU,CAAC,UAAU,EAAE;QACzB,kBAAkB,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;KACvD;IAED,IAAI,UAAU,CAAC,QAAQ,EAAE;QACvB,kBAAkB,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;KACnD;IAED,IAAI,UAAU,CAAC,SAAS,EAAE;QACxB,kBAAkB,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;KACrD;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,gBAAoC;;IAC5E,IAAI,CAAC,gBAAgB,EAAE;QACrB,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;KACnD;IAED,MAAM,oBAAoB,GAAQ;QAChC,EAAE,EAAE,gBAAgB,CAAC,EAAE;QACvB,OAAO,EAAE,gBAAgB,CAAC,OAAO;QACjC,WAAW,EAAE,gBAAgB,CAAC,WAAW;QACzC,UAAU,EAAE;YACV,cAAc,EAAE,MAAA,gBAAgB,CAAC,UAAU,0CAAE,aAAa;SAC3D;QACD,YAAY,EAAE,gBAAgB,CAAC,WAAW;KAC3C,CAAC;IAEF,IAAI,gBAAgB,CAAC,UAAU,IAAI,gBAAgB,CAAC,UAAU,CAAC,eAAe,EAAE;QAC9E,oBAAoB,CAAC,UAAU,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,UAAU,CAAC,eAAe,CAAC;KAChG;IAED,IAAI,gBAAgB,CAAC,UAAU,EAAE;QAC/B,oBAAoB,CAAC,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAC;KAC/D;IAED,IAAI,gBAAgB,CAAC,QAAQ,EAAE;QAC7B,oBAAoB,CAAC,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC;KAC3D;IAED,IAAI,gBAAgB,CAAC,SAAS,EAAE;QAC9B,oBAAoB,CAAC,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC;KAC7D;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { \n ConfigurationSetting, \n SetConfigurationSettingParam, \n FeatureFlagValue,\n featureFlagContentType,\n SecretReferenceValue } from \"@azure/app-configuration\";\nimport { isEmpty, isEqual } from \"lodash\";\nimport { Tags, FeatureFlagClientFilters } from \"../models\";\nimport { SourceOptions } from \"../options\";\nimport { ConfigurationFormat, ConfigurationProfile } from \"../enums\";\nimport { ArgumentError, ArgumentNullError } from \"../errors\";\nimport { Constants } from \"../internal/constants\";\nimport { MsFeatureFlagValue, Variant } from \"../featureFlag\";\n\n/** @internal*/\nexport function isJsonContentType(contentType?: string): boolean {\n if (!contentType) {\n return false;\n }\n\n contentType = contentType.trim().toLowerCase();\n const mineType = contentType.split(\";\")[0].trim();\n const typeParts = mineType.split(\"/\");\n if (typeParts.length != 2) {\n return false;\n }\n\n if (typeParts[0] != \"application\") {\n return false;\n }\n\n const subTypes = typeParts[1].split(\"+\");\n if (subTypes[subTypes.length-1] == \"json\") {\n return true;\n }\n\n return false;\n}\n\n/** @internal*/\nexport function isConfigSettingEqual(settingA: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>, settingB: ConfigurationSetting) {\n let valueIsEqual: boolean = settingA.value == settingB.value;\n \n if (settingA.contentType == featureFlagContentType &&\n settingB.contentType == featureFlagContentType && \n settingA.value !== undefined && \n settingB.value !== undefined) {\n valueIsEqual = isFeatureFlagValueEqual(settingA.value as string | FeatureFlagValue, settingB.value);\n }\n\n return valueIsEqual &&\n settingA.contentType == settingB.contentType &&\n areTagsEqual(settingA.tags, settingB.tags);\n}\n\n/** @internal*/\nexport function areTagsEqual(tagA?: Tags, tagB?: Tags): boolean {\n if (isEmpty(tagA) || isEmpty(tagB)) {\n return isEmpty(tagA) && isEmpty(tagB);\n }\n\n if (Object.keys(tagA).length !== Object.keys(tagB).length) {\n return false;\n }\n\n for(const key in tagA) {\n if (tagA[key] !== tagB[key]) {\n return false;\n }\n }\n return true;\n}\n\n/** @internal*/\n/**\n * Validate the ConfigurationSyncOptions argument, throw fatal error if options are not valid.\n *\n * @param options - ConfigurationSyncOptions to be validated.\n */\nexport function validateOptions(options: SourceOptions): void {\n if (!options) {\n throw new ArgumentNullError();\n }\n\n if (options.profile == ConfigurationProfile.KvSet) {\n if (\n options.prefix ||\n options.separator ||\n options.label ||\n options.depth ||\n options.tags ||\n options.contentType\n ) {\n throw new ArgumentError(\n \"The option label, prefix, depth, contentType, tags and separator are not supported when importing using 'appconfig/kvset' profile\"\n );\n }\n\n if (options.format !== ConfigurationFormat.Json) {\n throw new ArgumentError(\n \"Yaml and Properties formats are not supported for appconfig/kvset profile. Supported value is: Json\"\n );\n }\n }\n\n if (options.depth && options.depth > 1 && !options.separator) {\n throw new ArgumentError(\n \"Separator must be specified if Depth is default value or set a value lager than 1\"\n );\n }\n\n if (options.separator && !Constants.Separators.includes(options.separator)) {\n throw new ArgumentError(`${options.separator} is not a supported separator.`);\n }\n\n if (!options.separator && !options.depth) {\n options.depth = 1;\n }\n\n if (options.format !== ConfigurationFormat.Json && isJsonContentType(options.contentType)) {\n throw new ArgumentError(`Failed to import '${ConfigurationFormat[options.format]}' data format with '${options.contentType}' content type. Please provide data in JSON format to match your content type.`);\n }\n}\n\nfunction isFeatureFlagValueEqual(valueA: string | MsFeatureFlagValue, valueB: string): boolean {\n let featureFlagAValue: MsFeatureFlagValue;\n\n if (typeof valueA == \"string\") {\n featureFlagAValue = toMsFeatureFlagValue(valueA);\n }\n else {\n featureFlagAValue = valueA as MsFeatureFlagValue;\n }\n\n const featureFlagBValue: MsFeatureFlagValue = toMsFeatureFlagValue(valueB);\n\n if (Object.keys(featureFlagAValue).length !== Object.keys(featureFlagBValue).length) {\n return false;\n }\n\n return featureFlagAValue.id == featureFlagBValue.id &&\n featureFlagAValue.enabled == featureFlagBValue.enabled &&\n featureFlagAValue.description == featureFlagBValue.description &&\n areArrayEqual<FeatureFlagClientFilters>(featureFlagAValue.conditions.clientFilters, featureFlagBValue.conditions.clientFilters) &&\n isEqual(featureFlagAValue.allocation, featureFlagBValue.allocation) &&\n areArrayEqual<Variant>(featureFlagAValue.variants ?? [], featureFlagBValue.variants ?? []) &&\n isEqual(featureFlagAValue.telemetry, featureFlagBValue.telemetry);\n}\n\nfunction areArrayEqual<T>(arrayA: T[], arrayB: T[]): boolean {\n if (arrayA.length !== arrayB.length) {\n return false;\n }\n\n for (let i = 0; i < arrayA.length; i++) {\n if (!isEqual(arrayA[i], arrayB[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction toMsFeatureFlagValue(value: string): MsFeatureFlagValue {\n const parsedJson: any = JSON.parse(value);\n\n const msFeatureFlagValue: MsFeatureFlagValue = {\n id: parsedJson.id,\n enabled: parsedJson.enabled,\n description:parsedJson.description,\n conditions: isEmpty(parsedJson.conditions) ? {clientFilters: []} : {clientFilters: parsedJson.conditions.client_filters}\n };\n \n if (parsedJson.allocation) {\n msFeatureFlagValue.allocation = parsedJson.allocation;\n }\n\n if (parsedJson.variants) {\n msFeatureFlagValue.variants = parsedJson.variants;\n }\n\n if (parsedJson.telemetry) {\n msFeatureFlagValue.telemetry = parsedJson.telemetry;\n }\n\n return msFeatureFlagValue;\n}\n\nexport function serializeFeatureFlagValue(featureFlagValue: MsFeatureFlagValue): string {\n if (!featureFlagValue) {\n throw new TypeError(\"Invalid feature flag value\");\n }\n\n const jsonFeatureFlagValue: any = {\n id: featureFlagValue.id,\n enabled: featureFlagValue.enabled,\n description: featureFlagValue.description,\n conditions: {\n client_filters: featureFlagValue.conditions?.clientFilters\n },\n display_name: featureFlagValue.displayName\n };\n\n if (featureFlagValue.conditions && featureFlagValue.conditions.requirementType) {\n jsonFeatureFlagValue.conditions.requirement_type = featureFlagValue.conditions.requirementType;\n }\n\n if (featureFlagValue.allocation) {\n jsonFeatureFlagValue.allocation = featureFlagValue.allocation;\n }\n\n if (featureFlagValue.variants) {\n jsonFeatureFlagValue.variants = featureFlagValue.variants;\n }\n\n if (featureFlagValue.telemetry) {\n jsonFeatureFlagValue.telemetry = featureFlagValue.telemetry;\n }\n\n return JSON.stringify(jsonFeatureFlagValue);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.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 ClientFilter = { name: string; parameters?: Record<string, unknown> };\n\n/**\n * @internal\n */\nexport interface JsonSecretReferenceValue {\n uri: string;\n}\n\n/**\n * @internal\n */\nexport type KvSetConfigurationItem = {\n key: string;\n value?: string;\n label?: string;\n content_type?: string;\n tags?: { [propertyName: string]: string };\n}\n\nexport interface ImportProgress {\n successCount: number;\n importCount: number;\n}\n\nexport interface Tags {\n [propertyName: string]: string;\n}\n\nexport interface FeatureFlagClientFilters {\n name: string;\n parameters?: Record<string, unknown> | undefined;\n}\n\nexport interface KeyLabelLookup {\n [key: string]: {\n [label: string] : boolean\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { \n SecretReferenceValue,\n ConfigurationSetting,\n SetConfigurationSettingParam,\n FeatureFlagValue\n} from \"@azure/app-configuration\";\n\n/**\n * @internal\n */\nexport type ClientFilter = { name: string; parameters?: Record<string, unknown> };\n\n/**\n * @internal\n */\nexport interface JsonSecretReferenceValue {\n uri: string;\n}\n\n/**\n * @internal\n */\nexport type KvSetConfigurationItem = {\n key: string;\n value?: string;\n label?: string;\n content_type?: string;\n tags?: { [propertyName: string]: string };\n}\n\nexport interface ImportProgress {\n successCount: number;\n importCount: number;\n}\n\nexport interface Tags {\n [propertyName: string]: string;\n}\n\nexport interface FeatureFlagClientFilters {\n name: string;\n parameters?: Record<string, unknown> | undefined;\n}\n\nexport interface KeyLabelLookup {\n [key: string]: {\n [label: string] : boolean\n }\n}\n\nexport interface ConfigurationChanges {\n ToDelete: ConfigurationSetting<string>[];\n ToModify: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[];\n ToAdd: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[];\n ToRefresh: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[];\n}"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { PagedAsyncIterableIterator, PageSettings } from \"@azure/core-paging\";\nimport { ConfigurationFormat, ConfigurationProfile, ImportMode } from \"./enums\";\nimport { Tags, ImportProgress } from \"./models\";\nimport { ConfigurationSetting, ListConfigurationSettingPage } from \"@azure/app-configuration\";\n\ntype Options = {\n label?: string;\n skipFeatureFlags?: boolean;\n prefix?: string;\n contentType?: string;\n tags?: Tags;\n}\n\n/**\n * Base options for configuration import\n *\n * @internal\n */\nexport type SourceOptions = {\n format: ConfigurationFormat;\n separator?: string;\n depth?: number;\n profile?: ConfigurationProfile;\n} & Options;\n\n/**\n * Provides options for importing from string data source\n *\n */\nexport type StringSourceOptions = SourceOptions & {data: string; };\nexport type IterableSourceOptions = Options & { data: PagedAsyncIterableIterator<ConfigurationSetting<string>, ListConfigurationSettingPage, PageSettings>; trimPrefix?: string; };\nexport type ReadableStreamSourceOptions = SourceOptions & { data: ReadableStream<Uint8Array> | NodeJS.ReadableStream };\n\n/**\n * Options for importing configuration settings\n */\nexport interface ImportOptions {\n /**\n * Seconds of entire import progress timeout.\n */\n timeout: number;\n /**\n * Callback to report the progress of import.\n */\n progressCallback?: (progress: ImportProgress) => unknown;\n /**\n * Use strict mode to delete settings not in source.\n */\n strict?: boolean;\n /**\n * Determines the behavior when importing key-values. \n * The default value, 'All' will import all key-values in the input file to App Configuration. \n * 'Ignore-Match' will only import settings that have no matching key-value in App Configuration.\n */\n importMode?: ImportMode;\n}"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT license.
|
|
3
|
+
import { ArgumentError } from "../errors";
|
|
4
|
+
/**
|
|
5
|
+
* A ConfigurationSettingsSource that wraps pre-calculated configuration changes.
|
|
6
|
+
*
|
|
7
|
+
* Use this class to import changes that were previously obtained via GetConfigurationChanges().
|
|
8
|
+
*
|
|
9
|
+
* Example usage:
|
|
10
|
+
* ```ts
|
|
11
|
+
* // First, get the configuration changes
|
|
12
|
+
* const changes = await importer.GetConfigurationChanges(source);
|
|
13
|
+
*
|
|
14
|
+
* // Import the pre-calculated changes
|
|
15
|
+
* const changesSource = new ConfigurationChangesSource(changes);
|
|
16
|
+
* await importer.Import(changesSource, { timeout: 60 });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export class ConfigurationChangesSource {
|
|
20
|
+
constructor(configurationChanges, filterOptions) {
|
|
21
|
+
if (filterOptions && Object.keys(filterOptions).length > 0) {
|
|
22
|
+
throw new ArgumentError("FilterOptions are not supported for ConfigurationChangesSource.");
|
|
23
|
+
}
|
|
24
|
+
this.configurationChanges = configurationChanges;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @inheritdoc
|
|
28
|
+
*/
|
|
29
|
+
async GetConfigurationSettings() {
|
|
30
|
+
return this.configurationChanges;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=configurationChangesSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configurationChangesSource.js","sourceRoot":"","sources":["../../../src/settingsImport/configurationChangesSource.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,0BAA0B;IAGrC,YAAY,oBAA0C,EAAE,aAAgD;QACtG,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1D,MAAM,IAAI,aAAa,CAAC,iEAAiE,CAAC,CAAC;SAC5F;QACD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IAED;;SAEK;IACE,KAAK,CAAC,wBAAwB;QACnC,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACnC,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ConfigurationSettingsSource } from \"./configurationSettingsSource\";\nimport { ConfigurationChanges } from \"../models\";\nimport { ListConfigurationSettingsOptions } from \"@azure/app-configuration\";\nimport { ArgumentError } from \"../errors\";\n\n/**\n * A ConfigurationSettingsSource that wraps pre-calculated configuration changes.\n * \n * Use this class to import changes that were previously obtained via GetConfigurationChanges().\n * \n * Example usage:\n * ```ts\n * // First, get the configuration changes\n * const changes = await importer.GetConfigurationChanges(source);\n * \n * // Import the pre-calculated changes\n * const changesSource = new ConfigurationChangesSource(changes);\n * await importer.Import(changesSource, { timeout: 60 });\n * ```\n */\nexport class ConfigurationChangesSource implements ConfigurationSettingsSource {\n private readonly configurationChanges: ConfigurationChanges;\n\n constructor(configurationChanges: ConfigurationChanges, filterOptions?: ListConfigurationSettingsOptions) {\n if (filterOptions && Object.keys(filterOptions).length > 0) {\n throw new ArgumentError(\"FilterOptions are not supported for ConfigurationChangesSource.\");\n }\n this.configurationChanges = configurationChanges;\n }\n\n /**\n * @inheritdoc\n */\n public async GetConfigurationSettings(): Promise<ConfigurationChanges> {\n return this.configurationChanges;\n }\n}"]}
|