UNPKG

configcat-react

Version:

ConfigCat is a configuration as a service that lets you manage your features and configurations without actually deploying new code.

163 lines (162 loc) 6.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.flagOverridesConstructor = exports.QueryParamsOverrideDataSource = void 0; var configcat_common_1 = require("configcat-common"); var DEFAULT_PARAM_PREFIX = "cc-"; var FORCE_STRING_VALUE_SUFFIX = ";str"; var DefaultQueryStringProvider = /** @class */ (function () { function DefaultQueryStringProvider() { } Object.defineProperty(DefaultQueryStringProvider.prototype, "currentValue", { get: function () { return window === null || window === void 0 ? void 0 : window.location.search; }, enumerable: false, configurable: true }); return DefaultQueryStringProvider; }()); var defaultQueryStringProvider; var QueryParamsOverrideDataSource = /** @class */ (function () { function QueryParamsOverrideDataSource(watchChanges, paramPrefix, queryStringProvider) { this.watchChanges = watchChanges; this.paramPrefix = paramPrefix !== null && paramPrefix !== void 0 ? paramPrefix : DEFAULT_PARAM_PREFIX; queryStringProvider !== null && queryStringProvider !== void 0 ? queryStringProvider : (queryStringProvider = defaultQueryStringProvider !== null && defaultQueryStringProvider !== void 0 ? defaultQueryStringProvider : (defaultQueryStringProvider = new DefaultQueryStringProvider())); this.queryStringProvider = queryStringProvider; var currentQueryStringOrParams = queryStringProvider.currentValue; this.settings = extractSettings(currentQueryStringOrParams, this.paramPrefix); this.queryString = getQueryString(currentQueryStringOrParams); } QueryParamsOverrideDataSource.prototype.getOverrides = function () { return Promise.resolve(this.getOverridesSync()); }; QueryParamsOverrideDataSource.prototype.getOverridesSync = function () { if (this.watchChanges) { var currentQueryStringOrParams = this.queryStringProvider.currentValue; var currentQueryString = getQueryString(currentQueryStringOrParams); if (this.queryString !== currentQueryString) { this.settings = extractSettings(currentQueryStringOrParams, this.paramPrefix); this.queryString = currentQueryString; } } return this.settings; }; return QueryParamsOverrideDataSource; }()); exports.QueryParamsOverrideDataSource = QueryParamsOverrideDataSource; function getQueryString(queryStringOrParams) { if (queryStringOrParams == null) { return ""; } if (typeof queryStringOrParams === "string") { return queryStringOrParams; } var queryString = "", separator = "?"; for (var key in queryStringOrParams) { if (!Object.prototype.hasOwnProperty.call(queryStringOrParams, key)) continue; var values = queryStringOrParams[key]; var value = void 0, length_1 = void 0; if (!Array.isArray(values)) value = values, length_1 = 1; else if (values.length) value = values[0], length_1 = values.length; else continue; for (var i = 0;;) { queryString += separator + encodeURIComponent(key) + "=" + encodeURIComponent(value); if (++i >= length_1) break; separator = "&"; value = values[i]; } } return queryString; } function extractSettings(queryStringOrParams, paramPrefix) { var settings = {}; if (typeof queryStringOrParams === "string") { extractSettingFromQueryString(queryStringOrParams, paramPrefix, settings); } else if (queryStringOrParams != null) { extractSettingsFromQueryParams(queryStringOrParams, paramPrefix, settings); } return settings; } function extractSettingsFromQueryParams(queryParams, paramPrefix, settings) { for (var key in queryParams) { if (!Object.prototype.hasOwnProperty.call(queryParams, key)) continue; var values = queryParams[key]; var value = void 0, length_2 = void 0; if (!Array.isArray(values)) value = values, length_2 = 1; else if (values.length) value = values[0], length_2 = values.length; else continue; for (var i = 0;;) { extractSettingFromQueryParam(key, value, paramPrefix, settings); if (++i >= length_2) break; value = values[i]; } } } function extractSettingFromQueryString(queryString, paramPrefix, settings) { if (!queryString || queryString.lastIndexOf("?", 0) < 0) { // identical to `!queryString.startsWith("?")` return; } var parts = queryString.substring(1).split("&"); for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) { var part = parts_1[_i]; part = part.replace(/\+/g, " "); var index = part.indexOf("="); var key = decodeURIComponent(index >= 0 ? part.substring(0, index) : part); var value = index >= 0 ? decodeURIComponent(part.substring(index + 1)) : ""; extractSettingFromQueryParam(key, value, paramPrefix, settings); } } function extractSettingFromQueryParam(key, value, paramPrefix, settings) { if (!key || key.length <= paramPrefix.length || key.lastIndexOf(paramPrefix, 0) < 0) { // identical to `!key.startsWith(paramPrefix)` return; } key = key.substring(paramPrefix.length); var interpretValueAsString = key.length > FORCE_STRING_VALUE_SUFFIX.length && key.indexOf(FORCE_STRING_VALUE_SUFFIX, key.length - FORCE_STRING_VALUE_SUFFIX.length) >= 0; // identical to `key.endsWith(strSuffix)` if (interpretValueAsString) { key = key.substring(0, key.length - FORCE_STRING_VALUE_SUFFIX.length); } else { value = parseSettingValue(value); } settings[key] = settingConstuctor.fromValue(value); } function parseSettingValue(value) { switch (value.toLowerCase()) { case "false": return false; case "true": return true; default: var number = parseFloatStrict(value); return !isNaN(number) ? number : value; } } function parseFloatStrict(value) { // NOTE: JS's float to string conversion is too forgiving, it converts whitespace string to 0 and accepts hex numbers. if (!value.length || /^\s*$|^\s*0[^\d.e]/.test(value)) { return NaN; } return +value; } var _a = (function () { var dummyFlagOverrides = (0, configcat_common_1.createFlagOverridesFromMap)({ "$": 0 }, configcat_common_1.OverrideBehaviour.LocalOnly); var dummySetting = dummyFlagOverrides.dataSource.getOverridesSync()["$"]; return [ dummyFlagOverrides.constructor, dummySetting.constructor ]; })(), flagOverridesConstructor = _a[0], settingConstuctor = _a[1]; exports.flagOverridesConstructor = flagOverridesConstructor;