@drift-labs/common
Version:
Common functions for Drift
84 lines • 4.12 kB
JavaScript
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
;