@rudderstack/integrations-lib
Version:
A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.
106 lines • 16.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FeatureFlagService = void 0;
const types_1 = require("../types");
const registry_1 = require("../flags/registry");
const factory_1 = require("../providers/factory");
const config_1 = require("./config");
const defaults_1 = require("../flags/defaults");
class FeatureFlagService {
constructor(registry) {
this.provider = null;
this.flagRegistry = registry || new registry_1.FeatureFlagRegistry();
// Load default flags
this.flagRegistry.register(defaults_1.DEFAULT_FLAGS);
}
static async create(config = {}, flagsOrRegistry) {
let registry;
if (flagsOrRegistry) {
// Check if it's a registry (has register method) or flag definitions array
if (Array.isArray(flagsOrRegistry)) {
// It's an array of flag definitions
registry = new registry_1.FeatureFlagRegistry();
registry.register(flagsOrRegistry);
}
else {
// It's a registry instance
registry = flagsOrRegistry;
}
}
const service = new FeatureFlagService(registry);
await service.initialize(config);
return service;
}
// Strategy Pattern: Initialize provider once, use polymorphism
async initialize(config = {}) {
const resolvedConfig = config_1.ConfigResolver.resolveConfig(config);
// Factory creates the appropriate provider - NO CONDITIONALS
const factory = new factory_1.FeatureFlagProviderFactory(this.flagRegistry);
this.provider = factory.create(resolvedConfig);
// Initialize the provider
await this.provider.initialize();
}
async isFeatureEnabled(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
const providerResult = await this.provider.isFeatureEnabled(user, flagName);
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
}
async isFeatureEnabledLatest(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
const providerResult = await this.provider.isFeatureEnabledLatest(user, flagName);
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
}
async getFeatureValue(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
const providerResult = await this.provider.getFeatureValue(user, flagName);
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
}
async getFeatureValueLatest(user, flagName, onErrorBehaviour = types_1.ErrorBehaviour.RETURN_RICH_ERROR) {
const providerResult = await this.provider.getFeatureValueLatest(user, flagName);
return this.processProviderResult(providerResult, flagName, onErrorBehaviour);
}
// Registry methods
registerFlags(flags) {
this.flagRegistry.register(flags);
}
getRegisteredFlag(key) {
return this.flagRegistry.get(key);
}
processProviderResult(providerResult, flagName, onErrorBehaviour) {
if (providerResult.error) {
switch (onErrorBehaviour) {
case types_1.ErrorBehaviour.THROW_ERROR:
throw providerResult.error;
case types_1.ErrorBehaviour.RETURN_RICH_ERROR:
// Return the rich error response as-is with isDefault = false
return {
...providerResult,
isDefault: false,
};
case types_1.ErrorBehaviour.RETURN_DEFAULT:
// Return default value from registry
return this.createDefaultResponse(flagName, providerResult);
default:
// Default to RETURN_RICH_ERROR behavior
return {
...providerResult,
isDefault: false,
};
}
}
// Success case - pass through rich provider data
return {
...providerResult,
isDefault: false,
};
}
createDefaultResponse(flagName, errorResult) {
const defaultValue = this.flagRegistry.getDefaultValue(flagName);
return {
name: flagName,
enabled: typeof defaultValue === 'boolean' ? defaultValue : Boolean(defaultValue),
value: defaultValue,
error: errorResult.error,
isDefault: true,
};
}
}
exports.FeatureFlagService = FeatureFlagService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlLWZsYWdzL2NvcmUvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxvQ0FBMEM7QUFDMUMsZ0RBQXdEO0FBQ3hELGtEQUFrRTtBQUNsRSxxQ0FBMEM7QUFDMUMsZ0RBQWtEO0FBRWxELE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksUUFBK0I7UUFKbkMsYUFBUSxHQUFnQyxJQUFJLENBQUM7UUFLbkQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLElBQUksSUFBSSw4QkFBbUIsRUFBRSxDQUFDO1FBQzFELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3QkFBYSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQVdNLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUN4QixTQUFxQyxFQUFFLEVBQ3ZDLGVBQWdFO1FBRWhFLElBQUksUUFBMEMsQ0FBQztRQUUvQyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLDJFQUEyRTtZQUMzRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsb0NBQW9DO2dCQUNwQyxRQUFRLEdBQUcsSUFBSSw4QkFBbUIsRUFBRSxDQUFDO2dCQUNyQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3JDLENBQUM7aUJBQU0sQ0FBQztnQkFDTiwyQkFBMkI7Z0JBQzNCLFFBQVEsR0FBRyxlQUFlLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsK0RBQStEO0lBQ3hELEtBQUssQ0FBQyxV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QyxDQUFDO2dCQUU5RDtvQkFDRSx3Q0FBd0M7b0JBQ3hDLE9BQU87d0JBQ0wsR0FBRyxjQUFjO3dCQUNqQixTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO1FBRUQsaURBQWlEO1FBQ2pELE9BQU87WUFDTCxHQUFHLGNBQWM7WUFDakIsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQztJQUNKLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxRQUFnQixFQUFFLFdBQXlCO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxPQUFPLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUNqRixLQUFLLEVBQUUsWUFBWTtZQUNuQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7WUFDeEIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5KRCxnREFtSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIEZlYXR1cmVGbGFnQ29uZmlnLFxuICBGZWF0dXJlRmxhZ1VzZXIsXG4gIEZlYXR1cmVGbGFnUmVzcG9uc2UsXG4gIEZlYXR1cmVGbGFnRGVmaW5pdGlvbixcbiAgSUZlYXR1cmVGbGFnU2VydmljZSxcbiAgSUZlYXR1cmVGbGFnUHJvdmlkZXIsXG4gIElGZWF0dXJlRmxhZ1JlZ2lzdHJ5LFxuICBGZWF0dXJlVmFsdWUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEVycm9yQmVoYXZpb3VyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgRmVhdHVyZUZsYWdSZWdpc3RyeSB9IGZyb20gJy4uL2ZsYWdzL3JlZ2lzdHJ5JztcbmltcG9ydCB7IEZlYXR1cmVGbGFnUHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi4vcHJvdmlkZXJzL2ZhY3RvcnknO1xuaW1wb3J0IHsgQ29uZmlnUmVzb2x2ZXIgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBERUZBVUxUX0ZMQUdTIH0gZnJvbSAnLi4vZmxhZ3MvZGVmYXVsdHMnO1xuXG5leHBvcnQgY2xhc3MgRmVhdHVyZUZsYWdTZXJ2aWNlIGltcGxlbWVudHMgSUZlYXR1cmVGbGFnU2VydmljZSB7XG4gIHByaXZhdGUgcHJvdmlkZXI6IElGZWF0dXJlRmxhZ1Byb3ZpZGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBmbGFnUmVnaXN0cnk6IElGZWF0dXJlRmxhZ1JlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5PzogSUZlYXR1cmVGbGFnUmVnaXN0cnkpIHtcbiAgICB0aGlzLmZsYWdSZWdpc3RyeSA9IHJlZ2lzdHJ5IHx8IG5ldyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5KCk7XG4gICAgLy8gTG9hZCBkZWZhdWx0IGZsYWdzXG4gICAgdGhpcy5mbGFnUmVnaXN0cnkucmVnaXN0ZXIoREVGQVVMVF9GTEFHUyk7XG4gIH1cblxuICAvLyBGYWN0b3J5IG1ldGhvZCBvdmVybG9hZHM6IENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBzZXJ2aWNlIGluIG9uZSBzdGVwXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlKFxuICAgIGNvbmZpZz86IFBhcnRpYWw8RmVhdHVyZUZsYWdDb25maWc+LFxuICAgIGZsYWdzPzogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10sXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdTZXJ2aWNlPjtcbiAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGUoXG4gICAgY29uZmlnPzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4sXG4gICAgcmVnaXN0cnk/OiBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1NlcnZpY2U+O1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShcbiAgICBjb25maWc6IFBhcnRpYWw8RmVhdHVyZUZsYWdDb25maWc+ID0ge30sXG4gICAgZmxhZ3NPclJlZ2lzdHJ5PzogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10gfCBJRmVhdHVyZUZsYWdSZWdpc3RyeSxcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1NlcnZpY2U+IHtcbiAgICBsZXQgcmVnaXN0cnk6IElGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGZsYWdzT3JSZWdpc3RyeSkge1xuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIHJlZ2lzdHJ5IChoYXMgcmVnaXN0ZXIgbWV0aG9kKSBvciBmbGFnIGRlZmluaXRpb25zIGFycmF5XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmbGFnc09yUmVnaXN0cnkpKSB7XG4gICAgICAgIC8vIEl0J3MgYW4gYXJyYXkgb2YgZmxhZyBkZWZpbml0aW9uc1xuICAgICAgICByZWdpc3RyeSA9IG5ldyBGZWF0dXJlRmxhZ1JlZ2lzdHJ5KCk7XG4gICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKGZsYWdzT3JSZWdpc3RyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJdCdzIGEgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICAgICAgcmVnaXN0cnkgPSBmbGFnc09yUmVnaXN0cnk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyBGZWF0dXJlRmxhZ1NlcnZpY2UocmVnaXN0cnkpO1xuICAgIGF3YWl0IHNlcnZpY2UuaW5pdGlhbGl6ZShjb25maWcpO1xuICAgIHJldHVybiBzZXJ2aWNlO1xuICB9XG5cbiAgLy8gU3RyYXRlZ3kgUGF0dGVybjogSW5pdGlhbGl6ZSBwcm92aWRlciBvbmNlLCB1c2UgcG9seW1vcnBoaXNtXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKGNvbmZpZzogUGFydGlhbDxGZWF0dXJlRmxhZ0NvbmZpZz4gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gQ29uZmlnUmVzb2x2ZXIucmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gRmFjdG9yeSBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBwcm92aWRlciAtIE5PIENPTkRJVElPTkFMU1xuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgRmVhdHVyZUZsYWdQcm92aWRlckZhY3RvcnkodGhpcy5mbGFnUmVnaXN0cnkpO1xuICAgIHRoaXMucHJvdmlkZXIgPSBmYWN0b3J5LmNyZWF0ZShyZXNvbHZlZENvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBwcm92aWRlclxuICAgIGF3YWl0IHRoaXMucHJvdmlkZXIuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzRmVhdHVyZUVuYWJsZWQoXG4gICAgdXNlcjogRmVhdHVyZUZsYWdVc2VyLFxuICAgIGZsYWdOYW1lOiBzdHJpbmcsXG4gICAgb25FcnJvckJlaGF2aW91cjogRXJyb3JCZWhhdmlvdXIgPSBFcnJvckJlaGF2aW91ci5SRVRVUk5fUklDSF9FUlJPUixcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnByb3ZpZGVyIS5pc0ZlYXR1cmVFbmFibGVkKHVzZXIsIGZsYWdOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUHJvdmlkZXJSZXN1bHQocHJvdmlkZXJSZXN1bHQsIGZsYWdOYW1lLCBvbkVycm9yQmVoYXZpb3VyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc0ZlYXR1cmVFbmFibGVkTGF0ZXN0KFxuICAgIHVzZXI6IEZlYXR1cmVGbGFnVXNlcixcbiAgICBmbGFnTmFtZTogc3RyaW5nLFxuICAgIG9uRXJyb3JCZWhhdmlvdXI6IEVycm9yQmVoYXZpb3VyID0gRXJyb3JCZWhhdmlvdXIuUkVUVVJOX1JJQ0hfRVJST1IsXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm92aWRlciEuaXNGZWF0dXJlRW5hYmxlZExhdGVzdCh1c2VyLCBmbGFnTmFtZSk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Byb3ZpZGVyUmVzdWx0KHByb3ZpZGVyUmVzdWx0LCBmbGFnTmFtZSwgb25FcnJvckJlaGF2aW91cik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RmVhdHVyZVZhbHVlKFxuICAgIHVzZXI6IEZlYXR1cmVGbGFnVXNlcixcbiAgICBmbGFnTmFtZTogc3RyaW5nLFxuICAgIG9uRXJyb3JCZWhhdmlvdXI6IEVycm9yQmVoYXZpb3VyID0gRXJyb3JCZWhhdmlvdXIuUkVUVVJOX1JJQ0hfRVJST1IsXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm92aWRlciEuZ2V0RmVhdHVyZVZhbHVlKHVzZXIsIGZsYWdOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUHJvdmlkZXJSZXN1bHQocHJvdmlkZXJSZXN1bHQsIGZsYWdOYW1lLCBvbkVycm9yQmVoYXZpb3VyKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRGZWF0dXJlVmFsdWVMYXRlc3QoXG4gICAgdXNlcjogRmVhdHVyZUZsYWdVc2VyLFxuICAgIGZsYWdOYW1lOiBzdHJpbmcsXG4gICAgb25FcnJvckJlaGF2aW91cjogRXJyb3JCZWhhdmlvdXIgPSBFcnJvckJlaGF2aW91ci5SRVRVUk5fUklDSF9FUlJPUixcbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvdmlkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLnByb3ZpZGVyIS5nZXRGZWF0dXJlVmFsdWVMYXRlc3QodXNlciwgZmxhZ05hbWUpO1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NQcm92aWRlclJlc3VsdChwcm92aWRlclJlc3VsdCwgZmxhZ05hbWUsIG9uRXJyb3JCZWhhdmlvdXIpO1xuICB9XG5cbiAgLy8gUmVnaXN0cnkgbWV0aG9kc1xuICBwdWJsaWMgcmVnaXN0ZXJGbGFncyhmbGFnczogRmVhdHVyZUZsYWdEZWZpbml0aW9uW10pOiB2b2lkIHtcbiAgICB0aGlzLmZsYWdSZWdpc3RyeS5yZWdpc3RlcihmbGFncyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVnaXN0ZXJlZEZsYWcoa2V5OiBzdHJpbmcpOiBGZWF0dXJlRmxhZ0RlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsYWdSZWdpc3RyeS5nZXQoa2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1Byb3ZpZGVyUmVzdWx0KFxuICAgIHByb3ZpZGVyUmVzdWx0OiBGZWF0dXJlVmFsdWUsXG4gICAgZmxhZ05hbWU6IHN0cmluZyxcbiAgICBvbkVycm9yQmVoYXZpb3VyOiBFcnJvckJlaGF2aW91cixcbiAgKTogRmVhdHVyZUZsYWdSZXNwb25zZSB7XG4gICAgaWYgKHByb3ZpZGVyUmVzdWx0LmVycm9yKSB7XG4gICAgICBzd2l0Y2ggKG9uRXJyb3JCZWhhdmlvdXIpIHtcbiAgICAgICAgY2FzZSBFcnJvckJlaGF2aW91ci5USFJPV19FUlJPUjpcbiAgICAgICAgICB0aHJvdyBwcm92aWRlclJlc3VsdC5lcnJvcjtcblxuICAgICAgICBjYXNlIEVycm9yQmVoYXZpb3VyLlJFVFVSTl9SSUNIX0VSUk9SOlxuICAgICAgICAgIC8vIFJldHVybiB0aGUgcmljaCBlcnJvciByZXNwb25zZSBhcy1pcyB3aXRoIGlzRGVmYXVsdCA9IGZhbHNlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByb3ZpZGVyUmVzdWx0LFxuICAgICAgICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgRXJyb3JCZWhhdmlvdXIuUkVUVVJOX0RFRkFVTFQ6XG4gICAgICAgICAgLy8gUmV0dXJuIGRlZmF1bHQgdmFsdWUgZnJvbSByZWdpc3RyeVxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURlZmF1bHRSZXNwb25zZShmbGFnTmFtZSwgcHJvdmlkZXJSZXN1bHQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gRGVmYXVsdCB0byBSRVRVUk5fUklDSF9FUlJPUiBiZWhhdmlvclxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcm92aWRlclJlc3VsdCxcbiAgICAgICAgICAgIGlzRGVmYXVsdDogZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdWNjZXNzIGNhc2UgLSBwYXNzIHRocm91Z2ggcmljaCBwcm92aWRlciBkYXRhXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3ZpZGVyUmVzdWx0LFxuICAgICAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0UmVzcG9uc2UoZmxhZ05hbWU6IHN0cmluZywgZXJyb3JSZXN1bHQ6IEZlYXR1cmVWYWx1ZSk6IEZlYXR1cmVGbGFnUmVzcG9uc2Uge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZmxhZ1JlZ2lzdHJ5LmdldERlZmF1bHRWYWx1ZShmbGFnTmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGZsYWdOYW1lLFxuICAgICAgZW5hYmxlZDogdHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nID8gZGVmYXVsdFZhbHVlIDogQm9vbGVhbihkZWZhdWx0VmFsdWUpLFxuICAgICAgdmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIGVycm9yOiBlcnJvclJlc3VsdC5lcnJvcixcbiAgICAgIGlzRGVmYXVsdDogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=