UNPKG

react-runtime-config

Version:

Provide a typesafe runtime configuration inside a react app

147 lines 11.7 kB
"use strict"; 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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