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
JavaScript
;
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;