@azure/app-configuration-importer 3.0.0-preview → 3.0.1-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.
@@ -87,6 +87,7 @@ export class AppConfigurationImporter {
87
87
  */
88
88
  async GetConfigurationChanges(configSettingsSource, strict = false, importMode = ImportMode.IgnoreMatch, customHeadersOption) {
89
89
  var _a, e_1, _b, _c;
90
+ var _d, _e;
90
91
  this.validateImportMode(importMode);
91
92
  // Generate correlationRequestId for operations in the same activity
92
93
  if (!customHeadersOption) {
@@ -107,33 +108,33 @@ export class AppConfigurationImporter {
107
108
  }
108
109
  const configSettings = configSettingsResult;
109
110
  const configurationChanges = [];
110
- const configurationSettingToAdd = [];
111
- const srcKeyLabelLookUp = {};
112
- configSettings.forEach((config) => {
113
- if (!srcKeyLabelLookUp[config.key]) {
114
- srcKeyLabelLookUp[config.key] = {};
115
- }
116
- srcKeyLabelLookUp[config.key][config.label || ""] = true;
117
- });
118
- configurationSettingToAdd.push(...configSettings);
111
+ // Build O(1) lookup structures keyed by "key\0label" composite.
112
+ const srcMap = new Map();
113
+ const toAddKeys = new Set();
114
+ for (const config of configSettings) {
115
+ const composite = `${config.key}\u0000${(_d = config.label) !== null && _d !== void 0 ? _d : ""}`;
116
+ srcMap.set(composite, config);
117
+ toAddKeys.add(composite);
118
+ }
119
119
  try {
120
- 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;) {
121
- _c = _f.value;
122
- _d = false;
120
+ // Stream target settings so we don't hold the entire remote store in memory.
121
+ for (var _f = true, _g = __asyncValues(this.configurationClient.listConfigurationSettings(Object.assign(Object.assign({}, configSettingsSource.FilterOptions), customHeadersOption))), _h; _h = await _g.next(), _a = _h.done, !_a;) {
122
+ _c = _h.value;
123
+ _f = false;
123
124
  try {
124
125
  const existing = _c;
125
- const isKeyLabelPresent = srcKeyLabelLookUp[existing.key] && srcKeyLabelLookUp[existing.key][existing.label || ""];
126
- if (strict && !isKeyLabelPresent) {
126
+ const composite = `${existing.key}\u0000${(_e = existing.label) !== null && _e !== void 0 ? _e : ""}`;
127
+ const incoming = srcMap.get(composite);
128
+ if (strict && !incoming) {
127
129
  configurationChanges.push({
128
130
  changeType: ChangeType.Delete,
129
131
  currentValue: existing,
130
132
  newValue: null
131
133
  });
132
134
  }
133
- const incoming = configSettings.find(configSetting => configSetting.key == existing.key && configSetting.label === existing.label);
134
135
  if (incoming) {
135
136
  // Remove from add list since it already exists
136
- configurationSettingToAdd.splice(configurationSettingToAdd.indexOf(incoming), 1);
137
+ toAddKeys.delete(composite);
137
138
  if (!isConfigSettingEqual(incoming, existing)) {
138
139
  configurationChanges.push({
139
140
  changeType: ChangeType.Update,
@@ -151,22 +152,22 @@ export class AppConfigurationImporter {
151
152
  }
152
153
  }
153
154
  finally {
154
- _d = true;
155
+ _f = true;
155
156
  }
156
157
  }
157
158
  }
158
159
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
159
160
  finally {
160
161
  try {
161
- if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
162
+ if (!_f && !_a && (_b = _g.return)) await _b.call(_g);
162
163
  }
163
164
  finally { if (e_1) throw e_1.error; }
164
165
  }
165
- for (const setting of configurationSettingToAdd) {
166
+ for (const composite of toAddKeys) {
166
167
  configurationChanges.push({
167
168
  changeType: ChangeType.Create,
168
169
  currentValue: null,
169
- newValue: setting
170
+ newValue: srcMap.get(composite)
170
171
  });
171
172
  }
172
173
  return configurationChanges;
@@ -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 { ConfigurationChangesSource } from \"./settingsImport/configurationChangesSource\";\nimport { ImportMode, ChangeType } from \"./enums\";\nimport { OperationTimeoutError, ArgumentError } from \"./errors\";\nimport { AdaptiveTaskManager } from \"./internal/adaptiveTaskManager\";\nimport { ImportProgress, KeyLabelLookup, ConfigurationSettingChange } 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 const settingsToWrite: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[] = configurationChanges\n .filter(c => (c.changeType === ChangeType.Create || c.changeType === ChangeType.Update || c.changeType === ChangeType.None) && c.newValue)\n .map(c => c.newValue!);\n\n const settingsToDelete: ConfigurationSetting[] = configurationChanges\n .filter(c => c.changeType === ChangeType.Delete && c.currentValue)\n .map(c => c.currentValue!);\n\n return await this.applyUpdatesToServer(settingsToWrite, settingsToDelete, 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 Array of ConfigurationSettingChange objects representing the changes\n */\n public async GetConfigurationChanges(\n configSettingsSource: ConfigurationSettingsSource,\n strict = false,\n importMode = ImportMode.IgnoreMatch,\n customHeadersOption?: OperationOptions\n ): Promise<Array<ConfigurationSettingChange>> {\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 Array<ConfigurationSettingChange>;\n }\n \n const configSettings = configSettingsResult as Array<SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>>;\n const configurationChanges: Array<ConfigurationSettingChange> = [];\n const configurationSettingToAdd: 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 \n if (strict && !isKeyLabelPresent) {\n configurationChanges.push({\n changeType: ChangeType.Delete,\n currentValue: existing,\n newValue: null\n });\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 configurationChanges.push({\n changeType: ChangeType.Update,\n currentValue: existing,\n newValue: incoming\n });\n } \n else if (importMode === ImportMode.All) {\n configurationChanges.push({\n changeType: ChangeType.None,\n currentValue: existing,\n newValue: incoming\n });\n }\n }\n }\n\n for (const setting of configurationSettingToAdd) {\n configurationChanges.push({\n changeType: ChangeType.Create,\n currentValue: null,\n newValue: setting\n });\n }\n\n return configurationChanges;\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 Array<ConfigurationSettingChange> {\n if (!Array.isArray(obj)) {\n return false;\n }\n \n // Validate it's an array of ConfigurationSettingChange objects\n return obj.every(item => \n item && \n typeof item === \"object\" &&\n \"changeType\" in item &&\n \"currentValue\" in item &&\n \"newValue\" in item &&\n Object.values(ChangeType).includes(item.changeType)\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, ChangeType } from \"./enums\";\nimport { OperationTimeoutError, ArgumentError } from \"./errors\";\nimport { AdaptiveTaskManager } from \"./internal/adaptiveTaskManager\";\nimport { ImportProgress, ConfigurationSettingChange } 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 const settingsToWrite: SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>[] = configurationChanges\n .filter(c => (c.changeType === ChangeType.Create || c.changeType === ChangeType.Update || c.changeType === ChangeType.None) && c.newValue)\n .map(c => c.newValue!);\n\n const settingsToDelete: ConfigurationSetting[] = configurationChanges\n .filter(c => c.changeType === ChangeType.Delete && c.currentValue)\n .map(c => c.currentValue!);\n\n return await this.applyUpdatesToServer(settingsToWrite, settingsToDelete, 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 Array of ConfigurationSettingChange objects representing the changes\n */\n public async GetConfigurationChanges(\n configSettingsSource: ConfigurationSettingsSource,\n strict = false,\n importMode = ImportMode.IgnoreMatch,\n customHeadersOption?: OperationOptions\n ): Promise<Array<ConfigurationSettingChange>> {\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 Array<ConfigurationSettingChange>;\n }\n\n const configSettings = configSettingsResult as Array<SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>>;\n const configurationChanges: Array<ConfigurationSettingChange> = [];\n\n // Build O(1) lookup structures keyed by \"key\\0label\" composite.\n const srcMap = new Map<string, SetConfigurationSettingParam<string | FeatureFlagValue | SecretReferenceValue>>();\n const toAddKeys = new Set<string>();\n for (const config of configSettings) {\n const composite = `${config.key}\\u0000${config.label ?? \"\"}`;\n srcMap.set(composite, config);\n toAddKeys.add(composite);\n }\n\n // Stream target settings so we don't hold the entire remote store in memory.\n for await (const existing of this.configurationClient.listConfigurationSettings({\n ...configSettingsSource.FilterOptions,\n ...customHeadersOption\n })) {\n const composite = `${existing.key}\\u0000${existing.label ?? \"\"}`;\n const incoming = srcMap.get(composite);\n\n if (strict && !incoming) {\n configurationChanges.push({\n changeType: ChangeType.Delete,\n currentValue: existing,\n newValue: null\n });\n }\n\n if (incoming) {\n // Remove from add list since it already exists\n toAddKeys.delete(composite);\n\n if (!isConfigSettingEqual(incoming, existing)) {\n configurationChanges.push({\n changeType: ChangeType.Update,\n currentValue: existing,\n newValue: incoming\n });\n }\n else if (importMode === ImportMode.All) {\n configurationChanges.push({\n changeType: ChangeType.None,\n currentValue: existing,\n newValue: incoming\n });\n }\n }\n }\n\n for (const composite of toAddKeys) {\n configurationChanges.push({\n changeType: ChangeType.Create,\n currentValue: null,\n newValue: srcMap.get(composite)!\n });\n }\n\n return configurationChanges;\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 Array<ConfigurationSettingChange> {\n if (!Array.isArray(obj)) {\n return false;\n }\n \n // Validate it's an array of ConfigurationSettingChange objects\n return obj.every(item => \n item && \n typeof item === \"object\" &&\n \"changeType\" in item &&\n \"currentValue\" in item &&\n \"newValue\" in item &&\n Object.values(ChangeType).includes(item.changeType)\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@azure/app-configuration-importer",
3
3
  "author": "Microsoft Corporation",
4
4
  "description": "A client library for importing/exporting key-values between configuration sources and Azure App Configuration service",
5
- "version": "3.0.0-preview",
5
+ "version": "3.0.1-preview",
6
6
  "sdk-type": "client",
7
7
  "keywords": [
8
8
  "node",
@@ -1 +1 @@
1
- {"version":3,"file":"appConfigurationImporter.d.ts","sourceRoot":"","sources":["../../src/appConfigurationImporter.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EAIA,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAE3F,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAkC,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAItF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,mBAAmB,CAAyB;IACpD;;;OAGG;gBACS,mBAAmB,EAAE,sBAAsB;IAIvD;;;;;;;;;;;;;OAaG;IACU,MAAM,CACjB,2BAA2B,EAAE,2BAA2B,EACxD,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC;IA+BhB;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,uBAAuB,CAClC,oBAAoB,EAAE,2BAA2B,EACjD,MAAM,UAAQ,EACd,UAAU,aAAyB,EACnC,mBAAmB,CAAC,EAAE,gBAAgB,GACrC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAkF/B,oBAAoB;IAkBlC,OAAO,CAAC,sBAAsB;YAchB,uBAAuB;IAWrC,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAe/B"}
1
+ {"version":3,"file":"appConfigurationImporter.d.ts","sourceRoot":"","sources":["../../src/appConfigurationImporter.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EAIA,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAE3F,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AAGjD,OAAO,EAAkB,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAItE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C;;GAEG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,mBAAmB,CAAyB;IACpD;;;OAGG;gBACS,mBAAmB,EAAE,sBAAsB;IAIvD;;;;;;;;;;;;;OAaG;IACU,MAAM,CACjB,2BAA2B,EAAE,2BAA2B,EACxD,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC;IA+BhB;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,uBAAuB,CAClC,oBAAoB,EAAE,2BAA2B,EACjD,MAAM,UAAQ,EACd,UAAU,aAAyB,EACnC,mBAAmB,CAAC,EAAE,gBAAgB,GACrC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAmF/B,oBAAoB;IAkBlC,OAAO,CAAC,sBAAsB;YAchB,uBAAuB;IAWrC,OAAO,CAAC,kBAAkB;IAO1B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CAe/B"}