react-runtime-config
Version:
Provide a typesafe runtime configuration inside a react app
147 lines • 11.7 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createConfig = exports.isStringConfig = exports.isBooleanConfig = exports.isCustomConfig = exports.isNumberConfig = exports.isStringEnumConfig = void 0;
var get_1 = __importDefault(require("lodash/get"));
var parsers_1 = require("./parsers");
var types_1 = require("./types");
Object.defineProperty(exports, "isStringEnumConfig", { enumerable: true, get: function () { return types_1.isStringEnumConfig; } });
Object.defineProperty(exports, "isNumberConfig", { enumerable: true, get: function () { return types_1.isNumberConfig; } });
Object.defineProperty(exports, "isCustomConfig", { enumerable: true, get: function () { return types_1.isCustomConfig; } });
Object.defineProperty(exports, "isBooleanConfig", { enumerable: true, get: function () { return types_1.isBooleanConfig; } });
Object.defineProperty(exports, "isStringConfig", { enumerable: true, get: function () { return types_1.isStringConfig; } });
var createUseAdminConfig_1 = require("./createUseAdminConfig");
var createUseConfig_1 = require("./createUseConfig");
function createConfig(options) {
var injected = __assign({ storage: window.localStorage, localOverride: true, configNamespace: "" }, options);
/**
* Get a config value from the storage (localStorage by default)
*/
var getStorageValue = function (path) {
if (injected.storage && injected.localOverride) {
try {
var rawValue = injected.storage.getItem(injected.namespace + "." + path);
try {
rawValue = JSON.parse(rawValue || ""); // Handle objects stored as string
}
catch (_a) { }
return parsers_1.parse(rawValue, options.schema[path]);
}
catch (_b) {
return null;
}
}
else {
return null;
}
};
/**
* Get a config value from window
*
* @throws
*/
var getWindowValue = function (path) {
try {
var rawValue = get_1.default(window, injected.namespace + "." + path, null);
return rawValue === null ? null : parsers_1.parse(rawValue, options.schema[path]);
}
catch (e) {
throw new Error("Config key \"" + path + "\" not valid: " + e.message);
}
};
/**
* Get a config value from storage, window or defaultValues
*
* @throws
*/
function getConfig(path) {
var defaultValue = typeof options.schema[path].default === "function"
? options.schema[path].default()
: options.schema[path].default;
var storageValue = getStorageValue(path);
var windowValue = getWindowValue(path);
if (defaultValue === undefined && windowValue === null) {
throw new Error("Config key \"" + path + "\" need to be defined in \"window." + injected.namespace + "." + path + "!");
}
return storageValue !== null ? storageValue : windowValue !== null ? windowValue : defaultValue;
}
/**
* Set a config value in the storage.
* This will also remove the value if the value is the same as the window one.
*
* @throws
*/
function setConfig(path, value) {
var config = options.schema[path];
try {
parsers_1.parse(value, config); // Runtime validation of the value
}
catch (e) {
if (types_1.isCustomConfig(config)) {
throw e;
}
if (types_1.isStringEnumConfig(config)) {
throw new Error("Expected \"" + path + "=" + value + "\" to be one of: " + config.enum.join(", "));
}
else if (types_1.isNumberConfig(config) && Number.isFinite(value)) {
if (typeof config.min === "number" && value < config.min) {
throw new Error("Expected \"" + path + "=" + value + "\" to be greater than " + config.min);
}
if (typeof config.max === "number" && value > config.max) {
throw new Error("Expected \"" + path + "=" + value + "\" to be lower than " + config.max);
}
}
throw new Error("Expected \"" + path + "=" + value + "\" to be a \"" + config.type + "\"");
}
if (getWindowValue(path) === value || config.default === value) {
injected.storage.removeItem(injected.namespace + "." + path);
}
else {
var encodedValue = typeof value === "string" ? value : JSON.stringify(value);
injected.storage.setItem(injected.namespace + "." + path, encodedValue);
}
window.dispatchEvent(new Event("storage"));
}
/**
* Get all consolidate config values.
*/
function getAllConfig() {
return Object.keys(options.schema).reduce(function (mem, key) {
var _a;
return (__assign(__assign({}, mem), (_a = {}, _a[key] = getConfig(key), _a)));
}, {});
}
// Validate all config from `window.{namespace}`
getAllConfig();
return {
useConfig: createUseConfig_1.createUseConfig(__assign({ getConfig: getConfig,
getAllConfig: getAllConfig,
getStorageValue: getStorageValue,
getWindowValue: getWindowValue,
setConfig: setConfig }, injected)),
useAdminConfig: createUseAdminConfig_1.createUseAdminConfig(__assign({ getConfig: getConfig,
getAllConfig: getAllConfig,
getStorageValue: getStorageValue,
getWindowValue: getWindowValue,
setConfig: setConfig }, injected)),
getConfig: getConfig,
setConfig: setConfig,
getAllConfig: getAllConfig,
};
}
exports.createConfig = createConfig;
exports.default = createConfig;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBNkI7QUFDN0IscUNBQWtDO0FBQ2xDLGlDQW1CaUI7QUFlZixtR0E3QkEsMEJBQWtCLE9BNkJBO0FBQ2xCLCtGQTdCQSxzQkFBYyxPQTZCQTtBQUNkLCtGQTdCQSxzQkFBYyxPQTZCQTtBQUNkLGdHQTdCQSx1QkFBZSxPQTZCQTtBQUNmLCtGQTdCQSxzQkFBYyxPQTZCQTtBQWxCaEIsK0RBQThEO0FBQzlELHFEQUFvRDtBQXdCcEQsU0FBZ0IsWUFBWSxDQUMxQixPQUEyQztJQUUzQyxJQUFNLFFBQVEsY0FDWixPQUFPLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFDNUIsYUFBYSxFQUFFLElBQUksRUFDbkIsZUFBZSxFQUFFLEVBQWdCLElBQzlCLE9BQU8sQ0FDWCxDQUFDO0lBRUY7O09BRUc7SUFDSCxJQUFNLGVBQWUsR0FBRyxVQUFDLElBQW1CO1FBQzFDLElBQUksUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO1lBQzlDLElBQUk7Z0JBQ0YsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUksUUFBUSxDQUFDLFNBQVMsU0FBSSxJQUFNLENBQUMsQ0FBQztnQkFDekUsSUFBSTtvQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxrQ0FBa0M7aUJBQzFFO2dCQUFDLFdBQU0sR0FBRTtnQkFDVixPQUFPLGVBQUssQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzlDO1lBQUMsV0FBTTtnQkFDTixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFD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