UNPKG

@drift-labs/common

Version:

Common functions for Drift

84 lines 4.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VersionedSettingsHandler = exports.VersionedSettingsRuleFactory = exports.SettingHandlerType = void 0; const immer_1 = require("immer"); var SettingHandlerType; (function (SettingHandlerType) { SettingHandlerType["Additive"] = "additive"; SettingHandlerType["Subtractive"] = "subtractive"; SettingHandlerType["Transformative"] = "transformative"; })(SettingHandlerType || (exports.SettingHandlerType = SettingHandlerType = {})); /** * * @param minVersionDiscriminator * @param setting * @param handler * @param type * @param longChangeDescription : This description will be returned if this was the ONLY transformation rule that needed to apply. E.g. : "Priority fee upgrades were recently release, and your priority fee settings were recently reset to defaults." * @param shortChangeDescription : This description will be returned if this was one of many transformation rules that needed to apply, they will be presented in a list. E.g. : "Your priority fee settings were recently reset to defaults." => "The following settings were changed to support new features : 'Your priority fee settings were recently reset to defaults.', '{something else}', etc."" * @returns */ const VersionedSettingsRuleFactory = (minVersionDiscriminator, setting, handler, type, longChangeDescription, shortChangeDescription) => ({ minVersionDiscriminator, setting, handler, type, longChangeDescription, shortChangeDescription, }); exports.VersionedSettingsRuleFactory = VersionedSettingsRuleFactory; /** * The versioned settings handler ensures that old settings can be upgraded into newer versioned settings. It reports back on any changes if they were applied. */ class VersionedSettingsHandler { /** * Applies each of the handlers in order, depending on the version of the incoming settings. * * Returns the new settings, with a list of change descriptions and an updated version number. * @param settings */ apply(settings) { var _a; const sortedRules = this.rules.sort((a, b) => a.minVersionDiscriminator - b.minVersionDiscriminator); const rulesToApply = sortedRules.filter((rule) => { if (!settings[rule.setting] || !settings.version) { return true; } return rule.minVersionDiscriminator > (settings === null || settings === void 0 ? void 0 : settings.version); }); const maxVersion = Math.max(...sortedRules.map((rule) => rule.minVersionDiscriminator), (_a = settings.version) !== null && _a !== void 0 ? _a : -1); const newSettings = { current: settings }; const transformsApplied = []; rulesToApply.forEach((rule) => { newSettings.current = (0, immer_1.produce)(newSettings.current, (draft) => { const { transformationWasApplied: ruleTransformApplied } = rule.handler(draft); if (ruleTransformApplied) { transformsApplied.push(rule); } }); }); const aTransformWasApplied = transformsApplied.length > 0; newSettings.current = (0, immer_1.produce)(newSettings.current, (draft) => { draft.version = maxVersion; }); let transformationDescription = ''; if (transformsApplied.length === 1) { transformationDescription = transformsApplied[0].longChangeDescription; } if (transformsApplied.length > 1) { transformationDescription = `The following settings were changed to support new features : ${transformsApplied .map((rule) => rule.shortChangeDescription) .join(', ')}`; } return { transformationWasApplied: aTransformWasApplied, transformedSettings: newSettings.current, transformationDescription, }; } constructor(rules) { this.rules = rules; } } exports.VersionedSettingsHandler = VersionedSettingsHandler; //# sourceMappingURL=settings.js.map