Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@financial-times/ads-config

Package Overview
Dependencies
Maintainers
18
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@financial-times/ads-config - npm Package Compare versions

Comparing version 1.3.0-beta.3 to 1.3.0-beta.4

karma.conf.js

289

dist/index.js

@@ -54,11 +54,2 @@ function _typeof(obj) {

/**
* Test if an object is a String
* @param {object} obj The object to be tested
* @returns {boolean} true if the object is of type String, otherwise false
*/
var isString = function isString(obj) {
return is(obj) === 'String';
};
/**
* Test if an object is a Function

@@ -73,11 +64,2 @@ * @param {object} obj The object to be tested

/**
* Test if an object is a Storage object
* @param {object} obj The object to be tested
* @returns {boolean} true if the object is of type Storage, otherwise false
*/
var isStorage = function isStorage(obj) {
return is(obj) === 'Storage';
};
/**
* Test if an object is an Object

@@ -109,6 +91,5 @@ * @param {object} obj The object to be tested

var isPlainObject = function isPlainObject(obj) {
var hop = Object.prototype.hasOwnProperty; // Must be an Object.
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if (!obj || !isObject(obj) || obj.nodeType || isWindow(obj)) {

@@ -138,14 +119,2 @@ return false;

};
/**
* Test if an object is a string with a length
* @param {object} str The object to be tested
* @returns {boolean} true if the object is a string with a length greater than 0
*/
var isNonEmptyString = function isNonEmptyString(str) {
return isString(str) && Boolean(str.length);
};
var isElement = function isElement(element) {
return element && element.nodeType === 1 && element.tagName || false;
};
function extend() {

@@ -224,262 +193,9 @@ /* jshint forin: false */

}
/**
* Create an object hash from a delimited string
* Beware all properties on the resulting object will have string values.
* @param {string} str The string to transform
* @param {string|regexp} delimiter The character that delimits each name/value pair
* @param {string} pairing The character that separates the name from the value
* @return {object}
*
*/
var hash = function hash(str, delimiter, pairing) {
var pair;
var value;
var hashObj = {};
if (str && str.split) {
str = str.split(delimiter);
for (var idx = 0, l = str.length; idx < l; idx += 1) {
value = str[idx];
pair = value.split(pairing);
if (pair.length > 1) {
hashObj[pair[0].trim()] = pair.slice(1).join(pairing);
}
}
}
return hashObj;
};
/**
* Takes a script URL as a string value, creates a new script element, sets the src and attaches to the page
* The async value of the script can be set by the seccond parameter, which is a boolean
* Note, we should use protocol-relative URL paths to ensure we don't run into http/https issues
* @param {string} scriptUrl The url to the script file to be added
* @param {boolean} async Set the async attribute on the script tag
* @param {function} callback A function to run when the script loads
* @param {function} errorcb A function to run if the script fails to load
* @returns {HTMLElement} the created script tag
*/
var attach = function attach(scriptUrl, async, callback, errorcb, autoRemove) {
var tag = document.createElement('script');
var node = document.getElementsByTagName('script')[0];
var hasRun = false;
function processCallback(callback) {
/* istanbul ignore else */
if (!hasRun) {
callback.call();
hasRun = true;
/* istanbul ignore else */
if (autoRemove) {
tag.parentElement.removeChild(tag);
}
}
}
tag.setAttribute('src', scriptUrl);
tag.setAttribute('o-ads', '');
/* istanbul ignore else */
if (async) {
tag.async = 'true';
}
/* istanbul ignore else */
if (isFunction(callback)) {
/* istanbul ignore if - legacy IE code, won't test */
if (hop.call(tag, 'onreadystatechange')) {
tag.onreadystatechange = function () {
if (tag.readyState === 'loaded') {
processCallback(callback);
}
};
} else {
tag.onload = function () {
processCallback(callback);
};
}
}
/* istanbul ignore else */
if (isFunction(errorcb)) {
tag.onerror = function () {
processCallback(errorcb);
};
} // Use insert before, append child has issues with script tags in some browsers.
node.parentNode.insertBefore(tag, node);
return tag;
};
/**
* return the current documents referrer or an empty string if non exists
* This method enables us to mock the referrer in our tests reliably and doesn't really serve any other purpose
* @returns {string} document.referrer
*/
/* istanbul ignore next - cannot reliably test value of referer */
var getReferrer = function getReferrer() {
return document.referrer || '';
};
/**
* Remove hyphens from a string and upper case the following letter
* @param {string} string the string to parse
* @returns {string}
*/
var dehyphenise = function dehyphenise(string) {
return string.replace(/(-)([a-z])/g, function (match, hyphen, letter) {
return letter.toUpperCase();
});
};
/**
* remove prefixes from o-ads data attributes and dehyphenise the name
* @param {string|} name the name of the attribute to parse
* @returns {string}
*/
var parseAttributeName = function parseAttributeName(attribute) {
var name = isString(attribute) ? attribute : attribute.name;
return dehyphenise(name.replace(/(data-)?o-ads-/, ''));
};
/**
* return the current documents url or an empty string if non exists
* This method enables us to mock the document location string in our tests reliably and doesn't really serve any other purpose
* @returns {string}
*/
/* istanbul ignore next - cannot reliably test value of location */
var getLocation = function getLocation() {
return document.location.href || '';
};
/**
* return the current documents search or an empty string if non exists
* also strips the initial ? from the search string for easier parsing
* This method enables us to mock the search string in our tests reliably and doesn't really serve any other purpose
* @returns {string}
*/
var getQueryString = function getQueryString() {
return document.location.search.substring(1) || '';
};
/**
* Get a query string parameter by name from a url
* @param name
* @param url
* @returns {string | null}
*/
var getQueryParamByName = function getQueryParamByName(name, url) {
url = url || window.location.href;
name = name.replace(/[[\]]/g, '\\$&');
var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');
var results = regex.exec(url);
if (!results) {
return null;
}
if (!results[2]) {
return '';
}
return decodeURIComponent(results[2].replace(/\+/g, ' '));
};
/**
* returns a timestamp of the current date/time in the format YYYYMMDDHHMMSS
* @returns {string}
*/
var getTimestamp = function getTimestamp() {
var now = new Date();
return [now.getFullYear(), "0".concat(now.getMonth() + 1).slice(-2), "0".concat(now.getDate()).slice(-2), "0".concat(now.getHours()).slice(-2), "0".concat(now.getMinutes()).slice(-2), "0".concat(now.getSeconds()).slice(-2)].join('');
};
/**
* Given the window object of an iframe this method returns the o-ads slot name
* that rendered the iframe, if the iframe was not rendered by o-ads this will
* return false
* @param {window} a window object
* @returns {String|Boolean}
*/
var iframeToSlotName = function iframeToSlotName(iframeWindow) {
// capture all iframes in the page in a live node list
var iframes = document.getElementsByTagName('iframe');
var slotName;
var node;
var i = iframes.length; // Figure out which iframe DOM node we have the window for
while (i--) {
/* istanbul ignore else */
if (iframes[i].contentWindow === iframeWindow) {
node = iframes[i];
break;
}
}
/* istanbul ignore else */
if (node) {
// find the closest parent with a data-o-ads-name attribute, that's our slot name
while (node.parentNode) {
slotName = node.getAttribute('data-o-ads-name');
/* istanbul ignore else */
if (slotName) {
return slotName;
}
node = node.parentNode;
}
}
return false;
};
var buildObjectFromArray = function buildObjectFromArray(targetObject) {
return targetObject.reduce(function (prev, data) {
prev[data.key] = data.value;
return prev;
}, {});
};
var cookie = function cookie(name) {
var val = document.cookie.match("(^|;)\\s*".concat(name, "\\s*=\\s*([^;]+)"));
return val ? val.pop() : null;
};
var metricsSampleThreshold = Math.random();
function inSample(sampleSize) {
return typeof sampleSize === 'undefined' || sampleSize > metricsSampleThreshold;
}
var utils = {
isArray: isArray,
isString: isString,
isFunction: isFunction,
isStorage: isStorage,
isObject: isObject,
isWindow: isWindow,
isPlainObject: isPlainObject,
isNonEmptyString: isNonEmptyString,
isElement: isElement,
extend: extend,
hash: hash,
attach: attach,
getReferrer: getReferrer,
dehyphenise: dehyphenise,
parseAttributeName: parseAttributeName,
getLocation: getLocation,
getQueryString: getQueryString,
getQueryParamByName: getQueryParamByName,
getTimestamp: getTimestamp,
iframeToSlotName: iframeToSlotName,
buildObjectFromArray: buildObjectFromArray,
cookie: cookie,
inSample: inSample
extend: extend
};

@@ -626,1 +342,2 @@

export { clear, init };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9pbmRleC5qcyIsIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIGFkdmVydGlzaW5nIGxpYnJhcnkuXG4gKiBAYXV0aG9yIE9yaWdhbWkgQWR2ZXJ0aXNpbmcsIG9yaWdhbWkuYWR2ZXJ0aXNpbmdAZnQuY29tXG4gKiBAbW9kdWxlIHV0aWxzXG4gKi9cbmNvbnN0IGhvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlcyBvYmplY3QgcHJvdG90eXBlIHRvU3RyaW5nIG1ldGhvZCB0byBnZXQgYXQgdGhlIHR5cGUgb2Ygb2JqZWN0IHdlIGFyZSBkZWFsaW5nLFxuICogSUUgcmV0dXJucyBbb2JqZWN0IE9iamVjdF0gZm9yIG51bGwgYW5kIHVuZGVmaW5lZCBzbyB3ZSBuZWVkIHRvIGZpbHRlciB0aG9zZVxuICogaHR0cDovL2VzNS5naXRodWIuY29tLyN4MTUuMi40LjJcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge29iamVjdH0gQW55IGphdmFzY3JpcHQgb2JqZWN0XG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IGUuZyBBcnJheSwgU3RyaW5nLCBPYmplY3RcbiAqL1xuZnVuY3Rpb24gaXMob2JqZWN0KSB7XG5cdGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KS5tYXRjaCgvXlxcW29iamVjdFxccyguKilcXF0kLylbMV07XG5cblx0aWYgKG9iamVjdCA9PT0gbnVsbCkge1xuXHRcdHJldHVybiAnTnVsbCc7XG5cdH0gZWxzZSBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gJ1VuZGVmaW5lZCc7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHR5cGU7XG5cdH1cbn1cblxuLyoqXG4gKiBUZXN0IGlmIGFuIG9iamVjdCBpcyBhbiBBcnJheVxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGJlIHRlc3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBvZiB0eXBlIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXJyYXkgPSBmdW5jdGlvbiAob2JqKSB7XG5cdHJldHVybiBpcyhvYmopID09PSAnQXJyYXknO1xufTtcblxuLyoqXG4gKiBUZXN0IGlmIGFuIG9iamVjdCBpcyBhIEZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gYmUgdGVzdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG9mIHR5cGUgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgY29uc3QgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIChvYmopIHtcblx0cmV0dXJuIGlzKG9iaikgPT09ICdGdW5jdGlvbic7XG59O1xuXG4vKipcbiAqIFRlc3QgaWYgYW4gb2JqZWN0IGlzIGFuIE9iamVjdFxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGJlIHRlc3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBvZiB0eXBlIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcblx0cmV0dXJuIGlzKG9iaikgPT09ICdPYmplY3QnO1xufTtcblxuLyoqXG4gKiBUZXN0IGlmIGFuIG9iamVjdCBpcyB0aGUgZ2xvYmFsIHdpbmRvdyBvYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBiZSB0ZXN0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhlIHdpbmRvdyBvYmosIG90aGVyd2lzZSBmYWxzZVxuICovXG5leHBvcnQgY29uc3QgaXNXaW5kb3cgPSBmdW5jdGlvbiAob2JqKSB7XG5cdHJldHVybiBvYmogJiYgb2JqICE9PSBudWxsICYmIG9iaiA9PT0gd2luZG93O1xufTtcblxuLyoqXG4gKiBUZXN0IGlmIGFuIG9iamVjdCBpbmhlcml0cyBmcm9tIGFueSBvdGhlciBvYmplY3RzLCB1c2VkIGluIGV4dGVuZFxuICogdG8gcHJvdGVjdCBhZ2FpbnN0IGRlZXAgY29waWVzIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSBhbmQgY29uc3RydWN0b3JzXG4gKiBsb3NpbmcgdGhlcmUgcHJvdG90eXBlcyB3aGVuIGNsb25lZFxuICogQHBhcmFtIHtvYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGJlIHRlc3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIG9iamVjdCBpcyBwbGFpbiBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7XG5cdC8vIE11c3QgYmUgYW4gT2JqZWN0LlxuXHQvLyBCZWNhdXNlIG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgRE9NIG5vZGVzIGFuZCB3aW5kb3cgb2JqZWN0cyBkb24ndCBwYXNzIHRocm91Z2gsIGFzIHdlbGxcblx0aWYgKCFvYmogfHwgIWlzT2JqZWN0KG9iaikgfHwgb2JqLm5vZGVUeXBlIHx8IGlzV2luZG93KG9iaikpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHR0cnkge1xuXHRcdC8vIE5vdCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3Rcblx0XHRpZiAob2JqLmNvbnN0cnVjdG9yICYmICFob3AuY2FsbChvYmosICdjb25zdHJ1Y3RvcicpICYmICFob3AuY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCAnaXNQcm90b3R5cGVPZicpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0LyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cdFx0Ly8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG5cdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxuXHRsZXQga2V5O1xuXHRmb3IgKGtleSBpbiBvYmopIHtcblx0XHQvLyBlbXB0eVxuXHR9XG5cblx0cmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkIHx8IGhvcC5jYWxsKG9iaiwga2V5KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQoKSB7XG5cdC8qIGpzaGludCBmb3JpbjogZmFsc2UgKi9cblx0Lyogd2hlbiBkb2luZyBhIGRlZXAgY29weSB3ZSB3YW50IHRvIGNvcHkgcHJvdG90eXBlIHByb3BlcnRpZXMgKi9cblx0bGV0IG9wdGlvbnM7XG5cdGxldCBzcmM7XG5cdGxldCBjb3B5O1xuXHRsZXQgY29weUlzQXJyYXk7XG5cdGxldCBjbG9uZTtcblx0bGV0IHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fTtcblx0Y29uc3QgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcblx0bGV0IGRlZXAgPSBmYWxzZTtcblx0bGV0IGkgPSAxO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdib29sZWFuJykge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuXG5cdFx0Ly8gc2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdGkgPSAyO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICAqL1xuXHRpZiAodHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcgJiYgIWlzRnVuY3Rpb24odGFyZ2V0KSkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gZG8gbm90aGluZyBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgKG9yIDIgZm9yIGEgZGVlcCBjb3B5KVxuXHQvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cblx0aWYgKGxlbmd0aCA9PT0gaSkge1xuXHRcdHJldHVybiB0YXJnZXQ7XG5cdH1cblxuXHRmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICgob3B0aW9ucyA9IGFyZ3VtZW50c1tpXSkgIT09IG51bGwpIHtcblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoY29uc3QgbmFtZSBpbiBvcHRpb25zKSB7XG5cdFx0XHRcdC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdFx0XHRcdGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG5cdFx0XHRcdFx0c3JjID0gdGFyZ2V0W25hbWVdO1xuXHRcdFx0XHRcdGNvcHkgPSBvcHRpb25zW25hbWVdO1xuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRcdGlmICh0YXJnZXQgPT09IGNvcHkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBhcnJheXNcblx0XHRcdFx0XHRpZiAoZGVlcCAmJiBjb3B5ICYmIChpc1BsYWluT2JqZWN0KGNvcHkpIHx8IGlzQXJyYXkoY29weSkpKSB7XG5cdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGlzQXJyYXkoY29weSk7XG5cdFx0XHRcdFx0XHRpZiAoY29weUlzQXJyYXkpIHtcblx0XHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgaXNBcnJheShzcmMpID8gc3JjIDogW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBpc09iamVjdChzcmMpID8gc3JjIDoge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdFx0dGFyZ2V0W25hbWVdID0gZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoY29weSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0YXJnZXRbbmFtZV0gPSBjb3B5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcblx0aXNBcnJheSxcblx0aXNGdW5jdGlvbixcblx0aXNPYmplY3QsXG5cdGlzV2luZG93LFxuXHRpc1BsYWluT2JqZWN0LFxuXHRleHRlbmQsXG59O1xuIiwiLy9UT0RPIHJlbW92ZSBhbGwgZnQuY29tIHNwZWNpZmljIHN0dWZmIHNvIHdlIGNhbiByZW1vdmUgdGhpcyBhcyBhIGdsb2JhbFxuLy8gY3VycmVudGx5IGFsbCBGVCBzcGVjaWZpYyBzdHVmZiBpcyB3cmFwcGVkIGluIGFuIGlmIHdpbmRvdy5GVFxuXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFRoaXJkIHBhcnR5IGxpYnJhcnkgZm9yIHVzZSB3aXRoIGdvb2dsZSBwdWJsaXNoZXIgdGFncy5cbiAqXG4gKiBAYXV0aG9yIFJvYmluIE1hcnIsIHJvYmluLm1hcnJAZnQuY29tXG4gKi9cblxuLyoqXG4gKiBUaGUgRlQuYWRzLmNvbmZpZyBvYmplY3QgaG9sZHMgdGhlIGNvbmZpdXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBhbiBGVC5hZHMuZ3B0IGluc3RhbmNlLlxuICogVGhlcmUgYXJlIGZvdXIgdGllcnMgb2YgY29uZmlndXJhdGlvbjsgY29va2llIGxldmVsIGNvbmZpZywgZGVmYXVsdCBjb25maWcgKHNldCB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yKSwgbWV0YXRhZyBjb25maWcgYW5kIGdsb2JhbCAoZW52KSBjb25maWcuXG4gKiBHbG9iYWwgY29uZmlnLCAoc2V0IGluIHRoZSBwYWdlIEZULmVudiBvamJlY3QpIHRha2VzIHByaW9yaXR5IG92ZXIgbWV0YSBmb2xsb3dlZCBieSBkZWZhdWx0IGNvbmZpZyB3aXRoIGNvb2tpZSBjb25maWcgaGF2aW5nIHRoZSBsZWFzdCBwcmlvcml0eS5cbiAqIFRoZSBGVC5hZHMuY29uZmlnKCkgZnVuY3Rpb24gYWN0cyBhcyBhbiBhY2Nlc3NvciBtZXRob2QgZm9yIHRoZSBjb25maWc7IGFsbG93aW5nIGdldHRpbmcgYW5kIHNldHRpbmcgb2YgY29uZmlndXJhdGlvbiB2YWx1ZXMuXG4gKiBDYWxsaW5nIGNvbmZpZygpIHdpdGggbm8gcGFyYW1ldGVycyByZXR1cm5zIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKiBDYWxsaW5nIGNvbmZpZyBwYXNzaW5nIGEgdmFsaWQgcHJvcGVydHkga2V5IHdpbGwgZW52b2tlIHRoZSAnZ2V0dGVyJyBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhhdCBwcm9wZXJ0eSBrZXkuXG4gKiBDYWxsaW5nIGNvbmZpZyBwYXNzaW5nIGEgdmFsaWQgcHJvcGVydHkga2V5IGFuZCBhIHZhbHVlIHdpbGwgZW52b2tlIHRoZSBzZXR0ZXIgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGtleSB0byB0aGUgbmV3IHZhbHVlLlxuICogQ2FsbGluZyBjb25maWcgcGFzc2luZyBhbiBvYmplY3Qgb2Yga2V5cyBhbmQgdmFsdWVzIHdpbGwgZW52b2tlIGEgc2V0dGVyIHRoYXQgZXh0ZW5kcyB0aGUgc3RvcmUgd2l0aCB0aGUgb2JqZWN0IHByb3ZpZGVkLlxuICogQG5hbWUgY29uZmlnXG4gKiBAbWVtYmVyb2YgRlQuYWRzXG4gKiBAZnVuY3Rpb25cbiovXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscy9pbmRleC5qcyc7XG5cbi8qKlxuKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci5cbiovXG5jb25zdCBkZWZhdWx0cyA9IHtcblx0Zm9ybWF0czoge1xuXHRcdE1lZGl1bVJlY3RhbmdsZTogIHtzaXplczogWzMwMCwgMjUwXX0sXG5cdFx0UmVjdGFuZ2xlOiAge3NpemVzOiBbMTgwLCA1MF19LFxuXHRcdFdpZGVTa3lzY3JhcGVyOiAge3NpemVzOiBbMTYwLCA2MDBdfSxcblx0XHRMZWFkZXJib2FyZDogIHtzaXplczogWzcyOCwgOTBdfSxcblx0XHRTdXBlckxlYWRlcmJvYXJkOiB7c2l6ZXM6IFtbOTcwLCA5MF0sIFs5NzAsIDY2XV19LFxuXHRcdEhhbGZQYWdlOiB7c2l6ZXM6IFszMDAsIDYwMF19LFxuXHRcdEJpbGxib2FyZDogIHtzaXplczogWzk3MCwgMjUwXX0sXG5cdFx0UG9ydHJhaXQ6ICB7c2l6ZXM6IFszMDAsIDEwNTBdfSxcblx0XHRBZGhlc2lvbkJhbm5lcjoge3NpemVzOiBbMzIwLCA1MF19LFxuXHRcdE1pY3JvQmFyOiB7c2l6ZXM6IFs4OCwgMzFdfSxcblx0XHRCdXR0b24yOiB7c2l6ZXM6IFsxMjAsIDYwXX0sXG5cdFx0UmVzcG9uc2l2ZTogeyBzaXplczogWzIsMl0gfVxuXHR9LFxuXHRyZXNwb25zaXZlOiB7XG5cdFx0ZXh0cmE6IFsxMDI1LCAwXSwgLy9SZWFzb25hYmxlIHdpZHRoIHRvIHNob3cgYSBCaWxsYm9hcmQgKGRlc2t0b3ApXG5cdFx0bGFyZ2U6IFsxMDAwLCAwXSwgLy9yZWFzb25hYmxlIHdpZHRoIHRvIHNob3cgU3VwZXJMZWFkZXJib2FyZCAodGFibGV0IGxhbmRzY2FwZSlcblx0XHRtZWRpdW06IFs3NjAsIDBdLCAvL3JlYXNvbmFibGUgd2lkdGggdG8gc2hvdyBhIGxlYWRlcmJvYXJkICh0YWJsZXQgcG9ydHJhaXQpXG5cdFx0c21hbGw6IFswLCAwXSAvL01vYmlsZVxuXHR9LFxuXHRmbGFnczoge1xuXHRcdHJlZnJlc2g6IHRydWUsXG5cdFx0aW52aWV3OiB0cnVlXG5cdH0sXG5cdGRpc3BsYXlMYWJlbFdpdGhCb3JkZXJzOiBmYWxzZSxcbn07XG5cbmZ1bmN0aW9uIGZldGNoRGVjbGFyaXRpdmVDb25maWcoKSB7XG5cdGxldCByZXN1bHRzID0ge307XG5cdGNvbnN0IHNjcmlwdHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtkYXRhLW8tYWRzLWNvbmZpZ10nKSk7XG5cdHNjcmlwdHMuZm9yRWFjaChzY3JpcHQgPT4ge1xuXHRcdHJlc3VsdHMgPSB3aW5kb3cuSlNPTiA/IHV0aWxzLmV4dGVuZChyZXN1bHRzLCBKU09OLnBhcnNlKHNjcmlwdC5pbm5lckhUTUwpKSA6ICdVTlNVUFBPUlRFRCc7XG5cdH0pO1xuXG5cdHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiogQHByaXZhdGVcbiogQGZ1bmN0aW9uXG4qIGZldGNoQ2Fub25pY2FsVVJMIEdyYWJzIHRoZSBjYW5vbmljYWwgVVJMIGZyb20gdGhlIHBhZ2UgbWV0YSBpZiBpdCBleGlzdHMuXG4qL1xuZnVuY3Rpb24gZmV0Y2hDYW5vbmljYWxVUkwoKSB7XG5cdGxldCBjYW5vbmljYWw7XG5cdGNvbnN0IGNhbm9uaWNhbFRhZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiY2Fub25pY2FsXCJdJyk7XG5cdGlmIChjYW5vbmljYWxUYWcpIHtcblx0XHRjYW5vbmljYWwgPSBjYW5vbmljYWxUYWcuaHJlZjtcblx0fVxuXG5cdHJldHVybiB7IGNhbm9uaWNhbDogY2Fub25pY2FsIH07XG59XG5cbi8qKlxuKiBEZWZpbmVzIGEgc3RvcmUgZm9yIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIHJldHVybnMgYSBnZXR0ZXIvc2V0dGVyIG1ldGhvZCBmb3IgYWNjZXNzLlxuKiBAY2xhc3NcbiogQGNvbnN0cnVjdG9yXG4qL1xuZnVuY3Rpb24gQ29uZmlnKCkge1xuXHR0aGlzLnN0b3JlID0ge307XG59XG5cbkNvbmZpZy5wcm90b3R5cGUuYWNjZXNzID0gZnVuY3Rpb24oaywgdikge1xuXHRsZXQgcmVzdWx0O1xuXHRpZiAodXRpbHMuaXNQbGFpbk9iamVjdChrKSkge1xuXHRcdHV0aWxzLmV4dGVuZCh0cnVlLCB0aGlzLnN0b3JlLCBrKTtcblx0XHRyZXN1bHQgPSB0aGlzLnN0b3JlO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJykge1xuXHRcdGlmICh0eXBlb2YgayA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJlc3VsdCA9IHRoaXMuc3RvcmU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCA9IHRoaXMuc3RvcmVba107XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMuc3RvcmVba10gPSB2O1xuXHRcdHJlc3VsdCA9IHY7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxuXG5Db25maWcucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oa2V5KSB7XG5cdGlmIChrZXkpIHtcblx0XHRkZWxldGUgdGhpcy5zdG9yZVtrZXldO1xuXHR9IGVsc2Uge1xuXHRcdHRoaXMuc3RvcmUgPSB7fTtcblx0fVxufTtcblxuQ29uZmlnLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuc3RvcmUgPSB1dGlscy5leHRlbmQodHJ1ZSwge30sIGRlZmF1bHRzLCBmZXRjaENhbm9uaWNhbFVSTCgpLCBmZXRjaERlY2xhcml0aXZlQ29uZmlnKCkpO1xuXHRyZXR1cm4gdGhpcy5zdG9yZTtcbn07XG5cbmNvbnN0IGNvbmZpZyA9IG5ldyBDb25maWcoKTtcbmV4cG9ydCBkZWZhdWx0IGNvbmZpZy5hY2Nlc3MuYmluZChjb25maWcpO1xuZXhwb3J0IGNvbnN0IGluaXQgPSBjb25maWcuaW5pdC5iaW5kKGNvbmZpZyk7XG5leHBvcnQgY29uc3QgY2xlYXIgPSBjb25maWcuY2xlYXIuYmluZChjb25maWcpO1xuIl0sIm5hbWVzIjpbImhvcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiaXMiLCJvYmplY3QiLCJ0eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibWF0Y2giLCJ1bmRlZmluZWQiLCJpc0FycmF5Iiwib2JqIiwiaXNGdW5jdGlvbiIsImlzT2JqZWN0IiwiaXNXaW5kb3ciLCJ3aW5kb3ciLCJpc1BsYWluT2JqZWN0Iiwibm9kZVR5cGUiLCJjb25zdHJ1Y3RvciIsImUiLCJrZXkiLCJleHRlbmQiLCJvcHRpb25zIiwic3JjIiwiY29weSIsImNvcHlJc0FycmF5IiwiY2xvbmUiLCJ0YXJnZXQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJkZWVwIiwiaSIsIm5hbWUiLCJkZWZhdWx0cyIsImZvcm1hdHMiLCJNZWRpdW1SZWN0YW5nbGUiLCJzaXplcyIsIlJlY3RhbmdsZSIsIldpZGVTa3lzY3JhcGVyIiwiTGVhZGVyYm9hcmQiLCJTdXBlckxlYWRlcmJvYXJkIiwiSGFsZlBhZ2UiLCJCaWxsYm9hcmQiLCJQb3J0cmFpdCIsIkFkaGVzaW9uQmFubmVyIiwiTWljcm9CYXIiLCJCdXR0b24yIiwiUmVzcG9uc2l2ZSIsInJlc3BvbnNpdmUiLCJleHRyYSIsImxhcmdlIiwibWVkaXVtIiwic21hbGwiLCJmbGFncyIsInJlZnJlc2giLCJpbnZpZXciLCJkaXNwbGF5TGFiZWxXaXRoQm9yZGVycyIsImZldGNoRGVjbGFyaXRpdmVDb25maWciLCJyZXN1bHRzIiwic2NyaXB0cyIsIkFycmF5IiwiZnJvbSIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJzY3JpcHQiLCJKU09OIiwidXRpbHMiLCJwYXJzZSIsImlubmVySFRNTCIsImZldGNoQ2Fub25pY2FsVVJMIiwiY2Fub25pY2FsIiwiY2Fub25pY2FsVGFnIiwicXVlcnlTZWxlY3RvciIsImhyZWYiLCJDb25maWciLCJzdG9yZSIsImFjY2VzcyIsImsiLCJ2IiwicmVzdWx0IiwiY2xlYXIiLCJpbml0IiwiY29uZmlnIiwiYmluZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQSxHQUFHLEdBQUdDLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBN0I7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFNBQVNDLEVBQVQsQ0FBWUMsTUFBWixFQUFvQjtBQUNuQixNQUFNQyxJQUFJLEdBQUdMLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkssUUFBakIsQ0FBMEJDLElBQTFCLENBQStCSCxNQUEvQixFQUF1Q0ksS0FBdkMsQ0FBNkMsb0JBQTdDLEVBQW1FLENBQW5FLENBQWI7O0FBRUEsTUFBSUosTUFBTSxLQUFLLElBQWYsRUFBcUI7QUFDcEIsV0FBTyxNQUFQO0FBQ0EsR0FGRCxNQUVPLElBQUlBLE1BQU0sS0FBS0ssU0FBZixFQUEwQjtBQUNoQyxXQUFPLFdBQVA7QUFDQSxHQUZNLE1BRUE7QUFDTixXQUFPSixJQUFQO0FBQ0E7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU1LLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQVVDLEdBQVYsRUFBZTtBQUNyQyxTQUFPUixFQUFFLENBQUNRLEdBQUQsQ0FBRixLQUFZLE9BQW5CO0FBQ0EsQ0FGTTtBQUlQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ08sSUFBTUMsVUFBVSxHQUFHLFNBQWJB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
{
"name": "@financial-times/ads-config",
"version": "1.3.0-beta.3",
"version": "1.3.0-beta.4",
"description": "A library for holding the configuration properties for an FT.ads.gpt instance",

@@ -9,3 +9,4 @@ "main": "dist/index.js",

"dev": "NODE_ENV=development rollup -c rollup.config.dev.js --watch",
"build": "npm run clean && rollup -c"
"build": "npm run clean && rollup -c",
"test": "karma start karma.conf.js --single-run"
},

@@ -20,2 +21,7 @@ "keywords": [],

"@rollup/plugin-node-resolve": "^11.0.1",
"karma": "^5.2.3",
"karma-chrome-launcher": "^3.1.0",
"karma-qunit": "^4.1.1",
"karma-rollup": "^1.0.1",
"qunit": "^2.13.0",
"rollup": "^2.36.1",

@@ -22,0 +28,0 @@ "rollup-plugin-babel": "^4.4.0",

@@ -1,9 +0,9 @@

import babel from 'rollup-plugin-babel'
import commonjs from '@rollup/plugin-commonjs'
import nodeResolve from '@rollup/plugin-node-resolve'
import pkg from './package.json'
const babel = require('rollup-plugin-babel');
const commonjs = require('@rollup/plugin-commonjs');
const nodeResolve = require('@rollup/plugin-node-resolve').default;
const pkg = require('./package.json');
//const external = [...Object.keys(pkg.dependencies), ...Object.keys(pkg.peerDependencies)]
export default [
module.exports = [
{

@@ -15,3 +15,4 @@ input: 'src/index.js',

file: pkg.main,
format: 'es'
format: 'es',
sourcemap: 'inline'
},

@@ -18,0 +19,0 @@ plugins: [

@@ -38,11 +38,2 @@ /**

/**
* Test if an object is a String
* @param {object} obj The object to be tested
* @returns {boolean} true if the object is of type String, otherwise false
*/
export const isString = function (obj) {
return is(obj) === 'String';
};
/**
* Test if an object is a Function

@@ -57,11 +48,2 @@ * @param {object} obj The object to be tested

/**
* Test if an object is a Storage object
* @param {object} obj The object to be tested
* @returns {boolean} true if the object is of type Storage, otherwise false
*/
export const isStorage = function (obj) {
return is(obj) === 'Storage';
};
/**
* Test if an object is an Object

@@ -92,4 +74,2 @@ * @param {object} obj The object to be tested

export const isPlainObject = function (obj) {
const hop = Object.prototype.hasOwnProperty;
// Must be an Object.

@@ -123,15 +103,2 @@ // Because of IE, we also have to check the presence of the constructor property.

/**
* Test if an object is a string with a length
* @param {object} str The object to be tested
* @returns {boolean} true if the object is a string with a length greater than 0
*/
export const isNonEmptyString = function (str) {
return isString(str) && Boolean(str.length);
};
export const isElement = function (element) {
return element && element.nodeType === 1 && element.tagName || false;
};
export function extend() {

@@ -212,258 +179,9 @@ /* jshint forin: false */

/**
* Create an object hash from a delimited string
* Beware all properties on the resulting object will have string values.
* @param {string} str The string to transform
* @param {string|regexp} delimiter The character that delimits each name/value pair
* @param {string} pairing The character that separates the name from the value
* @return {object}
*
*/
export const hash = function (str, delimiter, pairing) {
let pair;
let value;
const hashObj = {};
if (str && str.split) {
str = str.split(delimiter);
for (let idx = 0, l = str.length; idx < l; idx += 1) {
value = str[idx];
pair = value.split(pairing);
if (pair.length > 1) {
hashObj[pair[0].trim()] = pair.slice(1).join(pairing);
}
}
}
return hashObj;
};
/**
* Takes a script URL as a string value, creates a new script element, sets the src and attaches to the page
* The async value of the script can be set by the seccond parameter, which is a boolean
* Note, we should use protocol-relative URL paths to ensure we don't run into http/https issues
* @param {string} scriptUrl The url to the script file to be added
* @param {boolean} async Set the async attribute on the script tag
* @param {function} callback A function to run when the script loads
* @param {function} errorcb A function to run if the script fails to load
* @returns {HTMLElement} the created script tag
*/
export const attach = function (scriptUrl, async, callback, errorcb, autoRemove) {
const tag = document.createElement('script');
const node = document.getElementsByTagName('script')[0];
let hasRun = false;
function processCallback(callback) {
/* istanbul ignore else */
if (!hasRun) {
callback.call();
hasRun = true;
/* istanbul ignore else */
if (autoRemove) {
tag.parentElement.removeChild(tag);
}
}
}
tag.setAttribute('src', scriptUrl);
tag.setAttribute('o-ads', '');
/* istanbul ignore else */
if (async) {
tag.async = 'true';
}
/* istanbul ignore else */
if (isFunction(callback)) {
/* istanbul ignore if - legacy IE code, won't test */
if (hop.call(tag, 'onreadystatechange')) {
tag.onreadystatechange = function () {
if (tag.readyState === 'loaded') {
processCallback(callback);
}
};
} else {
tag.onload = function () {
processCallback(callback);
};
}
}
/* istanbul ignore else */
if (isFunction(errorcb)) {
tag.onerror = function () {
processCallback(errorcb);
};
}
// Use insert before, append child has issues with script tags in some browsers.
node.parentNode.insertBefore(tag, node);
return tag;
};
/**
* return the current documents referrer or an empty string if non exists
* This method enables us to mock the referrer in our tests reliably and doesn't really serve any other purpose
* @returns {string} document.referrer
*/
/* istanbul ignore next - cannot reliably test value of referer */
export const getReferrer = function () {
return document.referrer || '';
};
/**
* Remove hyphens from a string and upper case the following letter
* @param {string} string the string to parse
* @returns {string}
*/
export const dehyphenise = function (string) {
return string.replace(/(-)([a-z])/g, function (match, hyphen, letter) {
return letter.toUpperCase();
});
};
/**
* remove prefixes from o-ads data attributes and dehyphenise the name
* @param {string|} name the name of the attribute to parse
* @returns {string}
*/
export const parseAttributeName = function (attribute) {
const name = isString(attribute) ? attribute : attribute.name;
return dehyphenise(name.replace(/(data-)?o-ads-/, ''));
};
/**
* return the current documents url or an empty string if non exists
* This method enables us to mock the document location string in our tests reliably and doesn't really serve any other purpose
* @returns {string}
*/
/* istanbul ignore next - cannot reliably test value of location */
export const getLocation = function () {
return document.location.href || '';
};
/**
* return the current documents search or an empty string if non exists
* also strips the initial ? from the search string for easier parsing
* This method enables us to mock the search string in our tests reliably and doesn't really serve any other purpose
* @returns {string}
*/
export const getQueryString = function () {
return document.location.search.substring(1) || '';
};
/**
* Get a query string parameter by name from a url
* @param name
* @param url
* @returns {string | null}
*/
export const getQueryParamByName = function (name, url) {
url = url || window.location.href;
name = name.replace(/[[\]]/g, '\\$&');
const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');
const results = regex.exec(url);
if (!results) {
return null;
}
if (!results[2]) {
return '';
}
return decodeURIComponent(results[2].replace(/\+/g, ' '));
};
/**
* returns a timestamp of the current date/time in the format YYYYMMDDHHMMSS
* @returns {string}
*/
export const getTimestamp = function () {
const now = new Date();
return [
now.getFullYear(),
`0${now.getMonth() + 1}`.slice(-2),
`0${now.getDate()}`.slice(-2),
`0${now.getHours()}`.slice(-2),
`0${now.getMinutes()}`.slice(-2),
`0${now.getSeconds()}`.slice(-2),
].join('');
};
/**
* Given the window object of an iframe this method returns the o-ads slot name
* that rendered the iframe, if the iframe was not rendered by o-ads this will
* return false
* @param {window} a window object
* @returns {String|Boolean}
*/
export const iframeToSlotName = function (iframeWindow) {
// capture all iframes in the page in a live node list
const iframes = document.getElementsByTagName('iframe');
let slotName;
let node;
let i = iframes.length;
// Figure out which iframe DOM node we have the window for
while (i--) {
/* istanbul ignore else */
if (iframes[i].contentWindow === iframeWindow) {
node = iframes[i];
break;
}
}
/* istanbul ignore else */
if (node) {
// find the closest parent with a data-o-ads-name attribute, that's our slot name
while (node.parentNode) {
slotName = node.getAttribute('data-o-ads-name');
/* istanbul ignore else */
if (slotName) {
return slotName;
}
node = node.parentNode;
}
}
return false;
};
export const buildObjectFromArray = function buildObjectFromArray(targetObject) {
return targetObject.reduce((prev, data) => {
prev[data.key] = data.value;
return prev;
}, {});
};
export const cookie = function (name) {
const val = document.cookie.match(`(^|;)\\s*${name}\\s*=\\s*([^;]+)`);
return val ? val.pop() : null;
};
const metricsSampleThreshold = Math.random();
export function inSample(sampleSize) {
return typeof sampleSize === 'undefined' || sampleSize > metricsSampleThreshold;
}
export default {
isArray,
isString,
isFunction,
isStorage,
isObject,
isWindow,
isPlainObject,
isNonEmptyString,
isElement,
extend,
hash,
attach,
getReferrer,
dehyphenise,
parseAttributeName,
getLocation,
getQueryString,
getQueryParamByName,
getTimestamp,
iframeToSlotName,
buildObjectFromArray,
cookie,
inSample,
};

@@ -1,10 +0,17 @@

/* globals QUnit: false, $: false */
/* globals QUnit: false */
'use strict'; //eslint-disable-line
QUnit.module('config');
import { fixturesContainer } from '../qunit/helpers'
import utils from '../../src/utils'
import config, { init, clear } from '../../src'
QUnit.module('config')
config.init = init
config.clear = clear
QUnit.test('Config get/set', function(assert) {
this.ads.config.init();
this.ads.config.clear();
config.init();
config.clear();
let result;

@@ -17,8 +24,8 @@ const key = 'key';

assert.ok($.isFunction(this.ads.config), 'The set method exists');
assert.ok(utils.isFunction(config), 'The set method exists');
result = this.ads.config(key, value);
result = config(key, value);
assert.deepEqual(result, value, 'passing a key+value returns the value.');
result = this.ads.config();
result = config();
const obj = {};

@@ -28,21 +35,21 @@ obj[key] = value;

result = this.ads.config(key);
result = config(key);
assert.deepEqual(result, value, 'passing a valid key returns the value.');
result = this.ads.config(invalid);
result = config(invalid);
assert.deepEqual(result, undefined, 'passing an invalid key returns undefined.');
result = this.ads.config(key, value2);
result = config(key, value2);
assert.deepEqual(result, value2, 'set an existing key returns the new value.');
result = this.ads.config(key);
result = config(key);
assert.deepEqual(result, value2, 'get returns the new value.');
this.ads.config(key, value2);
this.ads.config(key2, value2);
result = this.ads.config();
config(key, value2);
config(key2, value2);
result = config();
assert.ok(result[key], 'configuration has got first key set');
assert.ok(result[key2], 'configuration has got second key set');
this.ads.config.clear(key);
result = this.ads.config();
config.clear(key);
result = config();
assert.notOk(result[key], 'first key has been removed');

@@ -53,4 +60,4 @@ assert.ok(result[key2], 'second key is still set');

QUnit.test('Config get/set - mulitple', function(assert) {
this.ads.config.init(true);
this.ads.config.clear();
config.init(true);
config.clear();
const obj = {

@@ -62,6 +69,6 @@ 'some': 'config',

let result = this.ads.config(obj);
let result = config(obj);
assert.deepEqual(result, obj, 'set multiple key/values using an object.');
result = this.ads.config();
result = config();
assert.deepEqual(result, obj, 'get returns the new values.');

@@ -71,3 +78,3 @@ });

QUnit.test('Config defaults', function(assert) {
this.ads.init();
init();
const flags = {

@@ -77,5 +84,5 @@ refresh: true,

};
const result = this.ads.config();
const result = config();
assert.ok(result.hasOwnProperty('flags'), 'default properties have been added to config');
assert.deepEqual(this.ads.config('flags'), flags, 'Config returns the correct value');
assert.deepEqual(config('flags'), flags, 'Config returns the correct value');
});

@@ -85,5 +92,5 @@

const save = window.JSON;
this.fixturesContainer.get().insertAdjacentHTML('beforeend', '<script data-o-ads-config type="application/json">{"dfpsite" : "site.site","dfpzone" : "zone.zone"}</script>');
this.ads.init();
let result = this.ads.config();
fixturesContainer.get().insertAdjacentHTML('beforeend', '<script data-o-ads-config type="application/json">{"dfpsite" : "site.site","dfpzone" : "zone.zone"}</script>');
init();
let result = config();
assert.ok(result.dfpzone, 'Config has been fetched from the inline declarative script');

@@ -93,4 +100,4 @@

window['JSON'] = undefined;
this.ads.init();
result = this.ads.config();
init();
result = config();
assert.notOk(result.dfpsite, 'no DFP Site - when JSON not available the declarative config is not parsed');

@@ -102,6 +109,6 @@ assert.notOk(result.dfpzone, 'no DFP zone - when JSON not available the declarative config is not parsed');

QUnit.test('Config fetchDeclaritive, multiple script tags', function(assert) {
this.fixturesContainer.get().insertAdjacentHTML('beforeend', '<script data-o-ads-config type="application/json">{"athing" : "thing", "anotherthing" : "another"}</script>');
this.fixturesContainer.get().insertAdjacentHTML('beforeend', '<script data-o-ads-config type="application/json">{"more" : "evenmore"}</script>');
this.ads.init();
const result = this.ads.config();
fixturesContainer.get().insertAdjacentHTML('beforeend', '<script data-o-ads-config type="application/json">{"athing" : "thing", "anotherthing" : "another"}</script>');
fixturesContainer.get().insertAdjacentHTML('beforeend', '<script data-o-ads-config type="application/json">{"more" : "evenmore"}</script>');
init();
const result = config();
assert.equal(result.athing, 'thing', 'data-o-ads-size attribute');

@@ -112,4 +119,4 @@ assert.equal(result.more, 'evenmore', 'data-o-ads-size attribute');

QUnit.test('Config deep extends so default options like formats aren\'t overwritten', function(assert) {
this.ads.init();
const result = this.ads.config({formats: { someNewFormat: { sizes: [[2, 2]]}}});
init();
const result = config({formats: { someNewFormat: { sizes: [[2, 2]]}}});
assert.ok(result.formats.HalfPage, 'predefined formats still exist');

@@ -122,3 +129,3 @@ assert.ok(result.formats.someNewFormat, 'new format is added');

Array.prototype.customTestFunction = function () {}; // eslint-disable-line no-extend-native
this.ads.init();
init();
const flags = {

@@ -134,6 +141,6 @@ refresh: true,

};
const result = this.ads.config();
const result = config();
assert.ok(result.hasOwnProperty('flags'), 'default properties have been added to config');
assert.deepEqual(this.ads.config('flags'), flags, 'Config returns the correct value');
assert.deepEqual(this.ads.config('responsive'), repsonsiveDefaults, 'Config returns the correct values for responsive slots');
assert.deepEqual(config('flags'), flags, 'Config returns the correct value');
assert.deepEqual(config('responsive'), repsonsiveDefaults, 'Config returns the correct values for responsive slots');

@@ -140,0 +147,0 @@ delete Array.prototype.customTestFunction;

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc