From 2794cd8f203b155ef6d2e7218489a92a1c2f90c5 Mon Sep 17 00:00:00 2001
From: mcamustlr <51314002+mcamustlr@users.noreply.github.com>
Date: Wed, 12 Jun 2019 18:04:40 +0200
Subject: [PATCH 001/285] Add slimCut bid adapter (#3880)
---
modules/slimcutBidAdapter.js | 128 ++++++++++++
modules/slimcutBidAdapter.md | 45 +++++
test/spec/modules/slimcutBidAdapter_spec.js | 212 ++++++++++++++++++++
3 files changed, 385 insertions(+)
create mode 100644 modules/slimcutBidAdapter.js
create mode 100644 modules/slimcutBidAdapter.md
create mode 100644 test/spec/modules/slimcutBidAdapter_spec.js
diff --git a/modules/slimcutBidAdapter.js b/modules/slimcutBidAdapter.js
new file mode 100644
index 00000000000..def490d6ab9
--- /dev/null
+++ b/modules/slimcutBidAdapter.js
@@ -0,0 +1,128 @@
+import * as utils from 'src/utils';
+import { registerBidder } from 'src/adapters/bidderFactory';
+import { ajax } from 'src/ajax';
+
+const BIDDER_CODE = 'slimcut';
+const ENDPOINT_URL = '//sb.freeskreen.com/pbr';
+
+export const spec = {
+ code: BIDDER_CODE,
+ aliases: ['scm'],
+ supportedMediaTypes: ['video', 'banner'],
+
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {BidRequest} bid The bid params to validate.
+ * @return boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid: function(bid) {
+ let isValid = false;
+ if (typeof bid.params !== 'undefined' && !isNaN(parseInt(utils.getValue(bid.params, 'placementId'))) && parseInt(utils.getValue(bid.params, 'placementId')) > 0) {
+ isValid = true;
+ }
+ return isValid;
+ },
+
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {validBidRequests[]} an array of bids
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function(validBidRequests, bidderRequest) {
+ const bids = validBidRequests.map(buildRequestObject);
+ const payload = {
+ referrer: getReferrerInfo(bidderRequest),
+ data: bids,
+ deviceWidth: screen.width
+ };
+
+ let gdpr = bidderRequest.gdprConsent;
+ if (bidderRequest && gdpr) {
+ let isCmp = (typeof gdpr.gdprApplies === 'boolean')
+ let isConsentString = (typeof gdpr.consentString === 'string')
+ payload.gdpr_iab = {
+ consent: isConsentString ? gdpr.consentString : '',
+ status: isCmp ? gdpr.gdprApplies : -1
+ };
+ }
+
+ const payloadString = JSON.stringify(payload);
+ return {
+ method: 'POST',
+ url: ENDPOINT_URL,
+ data: payloadString,
+ };
+ },
+
+ /**
+ * Unpack the response from the server into a list of bids.
+ *
+ * @param {*} serverResponse A successful response from the server.
+ * @return {Bid[]} An array of bids which were nested inside the server.
+ */
+ interpretResponse: function(serverResponse, request) {
+ const bidResponses = [];
+ serverResponse = serverResponse.body;
+
+ if (serverResponse.responses) {
+ serverResponse.responses.forEach(function (bid) {
+ const bidResponse = {
+ cpm: bid.cpm,
+ width: bid.width,
+ height: bid.height,
+ currency: bid.currency,
+ netRevenue: bid.netRevenue,
+ ttl: bid.ttl,
+ ad: bid.ad,
+ requestId: bid.requestId,
+ creativeId: bid.creativeId,
+ transactionId: bid.tranactionId,
+ winUrl: bid.winUrl
+ };
+ bidResponses.push(bidResponse);
+ });
+ }
+ return bidResponses;
+ },
+
+ getUserSyncs: function(syncOptions, serverResponses) {
+ if (syncOptions.iframeEnabled) {
+ return [{
+ type: 'iframe',
+ url: '//sb.freeskreen.com/async_usersync.html'
+ }];
+ }
+ return [];
+ },
+
+ onBidWon: function(bid) {
+ ajax(bid.winUrl + bid.cpm, null);
+ }
+}
+
+function buildRequestObject(bid) {
+ const reqObj = {};
+ let placementId = utils.getValue(bid.params, 'placementId');
+
+ reqObj.sizes = utils.parseSizesInput(bid.sizes);
+ reqObj.bidId = utils.getBidIdParameter('bidId', bid);
+ reqObj.bidderRequestId = utils.getBidIdParameter('bidderRequestId', bid);
+ reqObj.placementId = parseInt(placementId);
+ reqObj.adUnitCode = utils.getBidIdParameter('adUnitCode', bid);
+ reqObj.auctionId = utils.getBidIdParameter('auctionId', bid);
+ reqObj.transactionId = utils.getBidIdParameter('transactionId', bid);
+
+ return reqObj;
+}
+
+function getReferrerInfo(bidderRequest) {
+ let ref = window.location.href;
+ if (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer) {
+ ref = bidderRequest.refererInfo.referer;
+ }
+ return ref;
+}
+
+registerBidder(spec);
diff --git a/modules/slimcutBidAdapter.md b/modules/slimcutBidAdapter.md
new file mode 100644
index 00000000000..1d83c8cae6f
--- /dev/null
+++ b/modules/slimcutBidAdapter.md
@@ -0,0 +1,45 @@
+# Overview
+
+**Module Name**: Slimcut Bidder Adapter
+**Module Type**: Bidder Adapter
+**Maintainer**: support@slimcut.com
+
+# Description
+
+Use `slimcut` as bidder.
+
+`placementId` is required and must be integer.
+
+The Slimcut adapter requires setup and approval from the Slimcut team.
+Please reach out to your account manager for more information.
+
+# Test Parameters
+
+```
+ var adUnits = [
+ {
+ code: 'test-div',
+ sizes: [[640, 480]],
+ bids: [
+ {
+ bidder: "slimcut",
+ params: {
+ placementId: 1234
+ }
+ }
+ ]
+ }
+ ];
+```
+
+## UserSync example
+
+```
+pbjs.setConfig({
+ userSync: {
+ iframeEnabled: true,
+ syncEnabled: true,
+ syncDelay: 1
+ }
+});
+```
diff --git a/test/spec/modules/slimcutBidAdapter_spec.js b/test/spec/modules/slimcutBidAdapter_spec.js
new file mode 100644
index 00000000000..92649bf3556
--- /dev/null
+++ b/test/spec/modules/slimcutBidAdapter_spec.js
@@ -0,0 +1,212 @@
+import {expect} from 'chai';
+import {spec} from 'modules/slimcutBidAdapter';
+import {newBidder} from 'src/adapters/bidderFactory';
+
+const ENDPOINT = '//sb.freeskreen.com/pbr';
+const AD_SCRIPT = '"';
+
+describe('slimcutBidAdapter', function() {
+ const adapter = newBidder(spec);
+
+ describe('inherited functions', function() {
+ it('exists and is a function', function() {
+ expect(adapter.callBids).to.exist.and.to.be.a('function');
+ });
+ });
+
+ describe('isBidRequestValid', function() {
+ let bid = {
+ 'bidder': 'slimcut',
+ 'params': {
+ 'placementId': 83
+ },
+ 'adUnitCode': 'adunit-code',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '3c871ffa8ef14c',
+ 'bidderRequestId': 'b41642f1aee381',
+ 'auctionId': '4e156668c977d7'
+ };
+
+ it('should return true when required params found', function() {
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+
+ it('should return false when placementId is not valid (letters)', function() {
+ let bid = Object.assign({}, bid);
+ delete bid.params;
+ bid.params = {
+ 'placementId': 'ABCD'
+ };
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+
+ it('should return false when placementId < 0', function() {
+ let bid = Object.assign({}, bid);
+ delete bid.params;
+ bid.params = {
+ 'placementId': -1
+ };
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+
+ it('should return false when required params are not passed', function() {
+ let bid = Object.assign({}, bid);
+ delete bid.params;
+
+ bid.params = {};
+
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+ });
+
+ describe('buildRequests', function() {
+ let bidRequests = [
+ {
+ 'bidder': 'teads',
+ 'params': {
+ 'placementId': 10433394
+ },
+ 'adUnitCode': 'adunit-code',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '3c871ffa8ef14c',
+ 'bidderRequestId': 'b41642f1aee381',
+ 'auctionId': '4e156668c977d7',
+ 'deviceWidth': 1680
+ }
+ ];
+
+ let bidderResquestDefault = {
+ 'auctionId': '4e156668c977d7',
+ 'bidderRequestId': 'b41642f1aee381',
+ 'timeout': 3000
+ };
+
+ it('sends bid request to ENDPOINT via POST', function() {
+ const request = spec.buildRequests(bidRequests, bidderResquestDefault);
+
+ expect(request.url).to.equal(ENDPOINT);
+ expect(request.method).to.equal('POST');
+ });
+
+ it('should send GDPR to endpoint', function() {
+ let consentString = 'JRJ8RKfDeBNsERRDCSAAZ+A==';
+ let bidderRequest = {
+ 'auctionId': '4e156668c977d7',
+ 'bidderRequestId': 'b41642f1aee381',
+ 'timeout': 3000,
+ 'gdprConsent': {
+ 'consentString': consentString,
+ 'gdprApplies': true,
+ 'vendorData': {
+ 'hasGlobalConsent': false
+ }
+ }
+ };
+
+ const request = spec.buildRequests(bidRequests, bidderRequest);
+ const payload = JSON.parse(request.data);
+
+ expect(payload.gdpr_iab).to.exist;
+ expect(payload.gdpr_iab.consent).to.equal(consentString);
+ });
+
+ it('should add referer info to payload', function () {
+ const bidRequest = Object.assign({}, bidRequests[0])
+ const bidderRequest = {
+ refererInfo: {
+ referer: 'http://example.com/page.html',
+ reachedTop: true,
+ numIframes: 2
+ }
+ }
+ const request = spec.buildRequests([bidRequest], bidderRequest);
+ const payload = JSON.parse(request.data);
+
+ expect(payload.referrer).to.exist;
+ expect(payload.referrer).to.deep.equal('http://example.com/page.html')
+ });
+ });
+
+ describe('getUserSyncs', () => {
+ let bids = {
+ 'body': {
+ 'responses': [{
+ 'ad': AD_SCRIPT,
+ 'cpm': 0.5,
+ 'currency': 'USD',
+ 'height': 250,
+ 'netRevenue': true,
+ 'requestId': '3ede2a3fa0db94',
+ 'ttl': 360,
+ 'width': 300,
+ 'creativeId': 'er2ee',
+ 'transactionId': 'deadb33f',
+ 'winUrl': 'https://sb.freeskreen.com/win'
+ }]
+ }
+ };
+
+ it('should get the correct number of sync urls', () => {
+ let urls = spec.getUserSyncs({iframeEnabled: true}, bids);
+ expect(urls.length).to.equal(1);
+ expect(urls[0].url).to.equal('//sb.freeskreen.com/async_usersync.html');
+ });
+
+ it('should return no url if not iframe enabled', () => {
+ let urls = spec.getUserSyncs({iframeEnabled: false}, bids);
+ expect(urls.length).to.equal(0);
+ });
+ });
+
+ describe('interpretResponse', function() {
+ let bids = {
+ 'body': {
+ 'responses': [{
+ 'ad': AD_SCRIPT,
+ 'cpm': 0.5,
+ 'currency': 'USD',
+ 'height': 250,
+ 'netRevenue': true,
+ 'requestId': '3ede2a3fa0db94',
+ 'ttl': 360,
+ 'width': 300,
+ 'creativeId': 'er2ee',
+ 'transactionId': 'deadb33f',
+ 'winUrl': 'https://sb.freeskreen.com/win'
+ }]
+ }
+ };
+
+ it('should get correct bid response', function() {
+ let expectedResponse = [{
+ 'cpm': 0.5,
+ 'width': 300,
+ 'height': 250,
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ 'ad': AD_SCRIPT,
+ 'requestId': '3ede2a3fa0db94',
+ 'creativeId': 'er2ee',
+ 'transactionId': 'deadb33f',
+ 'winUrl': 'https://sb.freeskreen.com/win'
+ }];
+
+ let result = spec.interpretResponse(bids);
+ expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
+ });
+
+ it('handles nobid responses', function() {
+ let bids = {
+ 'body': {
+ 'responses': []
+ }
+ };
+
+ let result = spec.interpretResponse(bids);
+ expect(result.length).to.equal(0);
+ });
+ });
+});
From 5715a026eae27e07ab6edc3a2593bfc97ec35204 Mon Sep 17 00:00:00 2001
From: Rafal Pastuszak
Date: Wed, 12 Jun 2019 21:53:37 +0100
Subject: [PATCH 002/285] feat(unruly-bid-adapter): use bidResponse siteId when
configuring the renderer (#3865)
* feat(unruly-bid-adapter): use bidResponse siteId when configuring the renderer
* feat(unruly-bid-adapter): bail if siteId is missing
* feat(unruly-bid-adapter): log (but don't throw) when siteId is no present
---
modules/unrulyBidAdapter.js | 16 ++++-
test/spec/modules/unrulyBidAdapter_spec.js | 81 +++++++++++++++++++---
2 files changed, 85 insertions(+), 12 deletions(-)
diff --git a/modules/unrulyBidAdapter.js b/modules/unrulyBidAdapter.js
index 5647d2cd6a3..580357a1978 100644
--- a/modules/unrulyBidAdapter.js
+++ b/modules/unrulyBidAdapter.js
@@ -4,9 +4,12 @@ import { registerBidder } from '../src/adapters/bidderFactory'
import { VIDEO } from '../src/mediaTypes'
function configureUniversalTag (exchangeRenderer) {
+ if (!exchangeRenderer.config) throw new Error('UnrulyBidAdapter: Missing renderer config.')
+ if (!exchangeRenderer.config.siteId) throw new Error('UnrulyBidAdapter: Missing renderer siteId.')
+
parent.window.unruly = parent.window.unruly || {};
parent.window.unruly['native'] = parent.window.unruly['native'] || {};
- parent.window.unruly['native'].siteId = parent.window.unruly['native'].siteId || exchangeRenderer.siteId;
+ parent.window.unruly['native'].siteId = parent.window.unruly['native'].siteId || exchangeRenderer.config.siteId;
parent.window.unruly['native'].supplyMode = 'prebid';
}
@@ -35,9 +38,18 @@ const serverResponseToBid = (bid, rendererInstance) => ({
const buildPrebidResponseAndInstallRenderer = bids =>
bids
- .filter(serverBid => !!utils.deepAccess(serverBid, 'ext.renderer'))
+ .filter(serverBid => {
+ const hasConfig = !!utils.deepAccess(serverBid, 'ext.renderer.config');
+ const hasSiteId = !!utils.deepAccess(serverBid, 'ext.renderer.config.siteId');
+
+ if (!hasConfig) utils.logError(new Error('UnrulyBidAdapter: Missing renderer config.'));
+ if (!hasSiteId) utils.logError(new Error('UnrulyBidAdapter: Missing renderer siteId.'));
+
+ return hasSiteId
+ })
.map(serverBid => {
const exchangeRenderer = utils.deepAccess(serverBid, 'ext.renderer');
+
configureUniversalTag(exchangeRenderer);
configureRendererQueue();
diff --git a/test/spec/modules/unrulyBidAdapter_spec.js b/test/spec/modules/unrulyBidAdapter_spec.js
index e39f9a8e996..cb30fcf1a9d 100644
--- a/test/spec/modules/unrulyBidAdapter_spec.js
+++ b/test/spec/modules/unrulyBidAdapter_spec.js
@@ -18,7 +18,10 @@ describe('UnrulyAdapter', function () {
'statusCode': statusCode,
'renderer': {
'id': 'unruly_inarticle',
- 'config': {},
+ 'config': {
+ 'siteId': 123456,
+ 'targetingUUID': 'xxx-yyy-zzz'
+ },
'url': 'https://video.unrulymedia.com/native/prebid-loader.js'
},
'adUnitCode': adUnitCode
@@ -125,10 +128,10 @@ describe('UnrulyAdapter', function () {
it('should be a function', function () {
expect(typeof adapter.interpretResponse).to.equal('function');
});
- it('should return empty array when serverResponse is undefined', function () {
+ it('should return [] when serverResponse is undefined', function () {
expect(adapter.interpretResponse()).to.deep.equal([]);
});
- it('should return empty array when serverResponse has no bids', function () {
+ it('should return [] when serverResponse has no bids', function () {
const mockServerResponse = { body: { bids: [] } };
expect(adapter.interpretResponse(mockServerResponse)).to.deep.equal([])
});
@@ -157,7 +160,13 @@ describe('UnrulyAdapter', function () {
expect(fakeRenderer.setRender.called).to.be.false;
const mockReturnedBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'});
- const mockRenderer = { url: 'value: mockRendererURL' };
+ const mockRenderer = {
+ url: 'value: mockRendererURL',
+ config: {
+ siteId: 123456,
+ targetingUUID: 'xxx-yyy-zzz'
+ }
+ };
mockReturnedBid.ext.renderer = mockRenderer;
const mockServerResponse = createExchangeResponse(mockReturnedBid);
@@ -173,6 +182,58 @@ describe('UnrulyAdapter', function () {
sinon.assert.calledWithExactly(fakeRenderer.setRender, sinon.match.func)
});
+ it('should return [] and log if bidResponse renderer config is not available', function () {
+ sinon.assert.notCalled(utils.logError)
+
+ expect(Renderer.install.called).to.be.false;
+ expect(fakeRenderer.setRender.called).to.be.false;
+
+ const mockReturnedBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'});
+ const mockRenderer = {
+ url: 'value: mockRendererURL'
+ };
+ mockReturnedBid.ext.renderer = mockRenderer;
+ const mockServerResponse = createExchangeResponse(mockReturnedBid);
+
+ expect(adapter.interpretResponse(mockServerResponse)).to.deep.equal([]);
+
+ const logErrorCalls = utils.logError.getCalls();
+ expect(logErrorCalls.length).to.equal(2);
+
+ const [ configErrorCall, siteIdErrorCall ] = logErrorCalls;
+
+ expect(configErrorCall.args.length).to.equal(1);
+ expect(configErrorCall.args[0].message).to.equal('UnrulyBidAdapter: Missing renderer config.');
+
+ expect(siteIdErrorCall.args.length).to.equal(1);
+ expect(siteIdErrorCall.args[0].message).to.equal('UnrulyBidAdapter: Missing renderer siteId.');
+ });
+
+ it('should return [] and log if siteId is not available', function () {
+ sinon.assert.notCalled(utils.logError)
+
+ expect(Renderer.install.called).to.be.false;
+ expect(fakeRenderer.setRender.called).to.be.false;
+
+ const mockReturnedBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'});
+ const mockRenderer = {
+ url: 'value: mockRendererURL',
+ config: {}
+ };
+ mockReturnedBid.ext.renderer = mockRenderer;
+ const mockServerResponse = createExchangeResponse(mockReturnedBid);
+
+ expect(adapter.interpretResponse(mockServerResponse)).to.deep.equal([]);
+
+ const logErrorCalls = utils.logError.getCalls();
+ expect(logErrorCalls.length).to.equal(1);
+
+ const [ siteIdErrorCall ] = logErrorCalls;
+
+ expect(siteIdErrorCall.args.length).to.equal(1);
+ expect(siteIdErrorCall.args[0].message).to.equal('UnrulyBidAdapter: Missing renderer siteId.');
+ });
+
it('bid is placed on the bid queue when render is called', function () {
const exchangeBid = createOutStreamExchangeBid({ adUnitCode: 'video', vastUrl: 'value: vastUrl' });
const exchangeResponse = createExchangeResponse(exchangeBid);
@@ -191,7 +252,7 @@ describe('UnrulyAdapter', function () {
expect(sentRendererConfig.vastUrl).to.equal('value: vastUrl');
expect(sentRendererConfig.renderer).to.equal(fakeRenderer);
expect(sentRendererConfig.adUnitCode).to.equal('video')
- })
+ });
it('should ensure that renderer is placed in Prebid supply mode', function () {
const mockExchangeBid = createOutStreamExchangeBid({adUnitCode: 'video1', bidId: 'mockBidId'});
@@ -237,13 +298,13 @@ describe('UnrulyAdapter', function () {
type: 'iframe',
url: 'https://video.unrulymedia.com/iframes/third-party-iframes.html'
})
- })
+ });
it('should append consent params if gdpr does apply and consent is given', () => {
const mockConsent = {
gdprApplies: true,
consentString: 'hello'
- }
+ };
const response = {}
const syncOptions = { iframeEnabled: true }
const syncs = adapter.getUserSyncs(syncOptions, response, mockConsent)
@@ -251,14 +312,14 @@ describe('UnrulyAdapter', function () {
type: 'iframe',
url: 'https://video.unrulymedia.com/iframes/third-party-iframes.html?gdpr=1&gdpr_consent=hello'
})
- })
+ });
it('should append consent param if gdpr applies and no consent is given', () => {
const mockConsent = {
gdprApplies: true,
consentString: {}
- }
- const response = {}
+ };
+ const response = {};
const syncOptions = { iframeEnabled: true }
const syncs = adapter.getUserSyncs(syncOptions, response, mockConsent)
expect(syncs[0]).to.deep.equal({
From 9598148f3f6dfb129b3193718e3cd5c2767afe5b Mon Sep 17 00:00:00 2001
From: Joshua Casingal
Date: Wed, 12 Jun 2019 17:04:28 -0400
Subject: [PATCH 003/285] [BID-3479] - Add BidResponse.meta.dspid for OpenX
(#3895)
* [BID-3479] - Add BidResponse.meta.dspid for OpenX
* Update version number to 2.1.7
---
modules/openxBidAdapter.js | 6 +++++-
test/spec/modules/openxBidAdapter_spec.js | 4 ++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/modules/openxBidAdapter.js b/modules/openxBidAdapter.js
index 9719fbb635a..8236be8c2e5 100644
--- a/modules/openxBidAdapter.js
+++ b/modules/openxBidAdapter.js
@@ -8,7 +8,7 @@ import {parse} from '../src/url';
const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
const BIDDER_CODE = 'openx';
const BIDDER_CONFIG = 'hb_pb';
-const BIDDER_VERSION = '2.1.6';
+const BIDDER_VERSION = '2.1.7';
let shouldSendBoPixel = true;
@@ -121,6 +121,10 @@ function createBannerBidResponses(oxResponseObj, {bids, startTime}) {
bidResponse.meta.brandId = adUnit.brand_id;
}
+ if (adUnit.adv_id) {
+ bidResponse.meta.dspid = adUnit.adv_id;
+ }
+
bidResponses.push(bidResponse);
registerBeacon(BANNER, adUnit, startTime);
diff --git a/test/spec/modules/openxBidAdapter_spec.js b/test/spec/modules/openxBidAdapter_spec.js
index ee8e452f707..0fda846faa1 100644
--- a/test/spec/modules/openxBidAdapter_spec.js
+++ b/test/spec/modules/openxBidAdapter_spec.js
@@ -1218,6 +1218,10 @@ describe('OpenxAdapter', function () {
expect(bid.meta.brandId).to.equal(DEFAULT_TEST_ARJ_AD_UNIT.brand_id);
});
+ it('should return a brand ID', function () {
+ expect(bid.meta.dspid).to.equal(DEFAULT_TEST_ARJ_AD_UNIT.adv_id);
+ });
+
it('should register a beacon', function () {
resetBoPixel();
spec.interpretResponse({body: bidResponse}, bidRequest);
From 96d46b159887a0f0a1f4d43e760e571ba5f9bfe7 Mon Sep 17 00:00:00 2001
From: Samuel Horwitz
Date: Wed, 12 Jun 2019 17:12:08 -0400
Subject: [PATCH 004/285] kargo session id (#3897)
---
modules/kargoBidAdapter.js | 8 ++++++++
test/spec/modules/kargoBidAdapter_spec.js | 16 +++++++++++++++-
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/modules/kargoBidAdapter.js b/modules/kargoBidAdapter.js
index 2c602186547..5c3d59bd241 100644
--- a/modules/kargoBidAdapter.js
+++ b/modules/kargoBidAdapter.js
@@ -23,6 +23,7 @@ export const spec = {
bidSizes[bid.bidId] = bid.sizes;
});
const transformedParams = Object.assign({}, {
+ sessionId: spec._getSessionId(),
timeout: bidderRequest.timeout,
currency: currency,
cpmGranularity: 1,
@@ -183,6 +184,13 @@ export const spec = {
};
},
+ _getSessionId() {
+ if (!spec._sessionId) {
+ spec._sessionId = spec._generateRandomUuid();
+ }
+ return spec._sessionId;
+ },
+
_generateRandomUuid() {
try {
// crypto.getRandomValues is supported everywhere but Opera Mini for years
diff --git a/test/spec/modules/kargoBidAdapter_spec.js b/test/spec/modules/kargoBidAdapter_spec.js
index 5d53a4e9c95..a6779f518a0 100644
--- a/test/spec/modules/kargoBidAdapter_spec.js
+++ b/test/spec/modules/kargoBidAdapter_spec.js
@@ -34,7 +34,7 @@ describe('kargo adapter tests', function () {
});
describe('build request', function() {
- var bids, undefinedCurrency, noAdServerCurrency, cookies = [], localStorageItems = [];
+ var bids, undefinedCurrency, noAdServerCurrency, cookies = [], localStorageItems = [], sessionIds = [];
beforeEach(function () {
undefinedCurrency = false;
@@ -212,6 +212,10 @@ describe('kargo adapter tests', function () {
setCookie('krg_crb', getEmptyKrgCrbOldStyle());
}
+ function getSessionId() {
+ return spec._sessionId;
+ }
+
function getExpectedKrakenParams(excludeUserIds, excludeKrux, expectedRawCRB, expectedRawCRBCookie) {
var base = {
timeout: 200,
@@ -302,6 +306,8 @@ describe('kargo adapter tests', function () {
function testBuildRequests(expected) {
var request = spec.buildRequests(bids, {timeout: 200, foo: 'bar'});
+ expected.sessionId = getSessionId();
+ sessionIds.push(expected.sessionId);
var krakenParams = JSON.parse(decodeURIComponent(request.data.slice(5)));
expect(request.data.slice(0, 5)).to.equal('json=');
expect(request.url).to.equal('https://krk.kargo.com/api/v2/bid');
@@ -310,6 +316,14 @@ describe('kargo adapter tests', function () {
expect(request.timeout).to.equal(200);
expect(request.foo).to.equal('bar');
expect(krakenParams).to.deep.equal(expected);
+ // Make sure session ID stays the same across requests simulating multiple auctions on one page load
+ for (let i in sessionIds) {
+ if (i == 0) {
+ continue;
+ }
+ let sessionId = sessionIds[i];
+ expect(sessionIds[0]).to.equal(sessionId);
+ }
}
it('works when all params and localstorage and cookies are correctly set', function() {
From 98db99cf7a7e4db2ad6fcd122bee1ddc0cc4eca7 Mon Sep 17 00:00:00 2001
From: Rich Snapp
Date: Wed, 12 Jun 2019 15:35:26 -0600
Subject: [PATCH 005/285] allow endpoint configuration for rdn adapter (#3902)
---
modules/rdnBidAdapter.js | 3 ++-
test/spec/modules/rdnBidAdapter_spec.js | 20 ++++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/modules/rdnBidAdapter.js b/modules/rdnBidAdapter.js
index f93145b5377..d85b307263d 100644
--- a/modules/rdnBidAdapter.js
+++ b/modules/rdnBidAdapter.js
@@ -1,6 +1,7 @@
import { registerBidder } from '../src/adapters/bidderFactory'
import * as utils from '../src/utils'
import { BANNER } from '../src/mediaTypes'
+import { config } from '../src/config'
const BIDDER_CODE = 'rdn'
const ENDPOINT = 'https://s-bid.rmp.rakuten.co.jp/h'
@@ -14,7 +15,7 @@ export const spec = {
const params = bid.params
bidRequests.push({
method: 'GET',
- url: ENDPOINT,
+ url: config.getConfig('rdn.endpoint') || ENDPOINT,
data: {
bi: bid.bidId,
t: params.adSpotId,
diff --git a/test/spec/modules/rdnBidAdapter_spec.js b/test/spec/modules/rdnBidAdapter_spec.js
index 1c5958c8065..1fef1c7bf3d 100644
--- a/test/spec/modules/rdnBidAdapter_spec.js
+++ b/test/spec/modules/rdnBidAdapter_spec.js
@@ -2,10 +2,20 @@ import { expect } from 'chai'
import * as utils from 'src/utils'
import { spec } from 'modules/rdnBidAdapter'
import { newBidder } from 'src/adapters/bidderFactory'
+import {config} from '../../../src/config';
describe('rdnBidAdapter', function() {
const adapter = newBidder(spec);
const ENDPOINT = 'https://s-bid.rmp.rakuten.co.jp/h';
+ let sandbox;
+
+ beforeEach(function() {
+ config.resetConfig();
+ });
+
+ afterEach(function () {
+ config.resetConfig();
+ });
describe('inherited functions', () => {
it('exists and is a function', () => {
@@ -53,6 +63,16 @@ describe('rdnBidAdapter', function() {
expect(request.url).to.equal(ENDPOINT);
expect(request.method).to.equal('GET')
})
+
+ it('allows url override', () => {
+ config.setConfig({
+ rdn: {
+ endpoint: '//test.rakuten.com'
+ }
+ });
+ const request = spec.buildRequests(bidRequests)[0];
+ expect(request.url).to.equal('//test.rakuten.com');
+ })
});
describe('interpretResponse', () => {
From 83aa229ea2a2747a329ca831d1ab74547d8a2eb6 Mon Sep 17 00:00:00 2001
From: Aleksa Trajkovic
Date: Thu, 13 Jun 2019 18:08:45 +0200
Subject: [PATCH 006/285] aardvark adapter, add width & height params (#3892)
---
modules/aardvarkBidAdapter.js | 13 +++-
test/spec/modules/aardvarkBidAdapter_spec.js | 76 ++++++++++++++++++++
2 files changed, 86 insertions(+), 3 deletions(-)
diff --git a/modules/aardvarkBidAdapter.js b/modules/aardvarkBidAdapter.js
index 81d393a3859..9caaaaa747c 100644
--- a/modules/aardvarkBidAdapter.js
+++ b/modules/aardvarkBidAdapter.js
@@ -29,12 +29,17 @@ export const spec = {
var referer = bidderRequest.refererInfo.referer;
var pageCategories = [];
var tdId = '';
+ var width = window.innerWidth;
+ var height = window.innerHeight;
// This reference to window.top can cause issues when loaded in an iframe if not protected with a try/catch.
try {
- if (window.top.rtkcategories && Array.isArray(window.top.rtkcategories)) {
- pageCategories = window.top.rtkcategories;
+ var topWin = utils.getWindowTop();
+ if (topWin.rtkcategories && Array.isArray(topWin.rtkcategories)) {
+ pageCategories = topWin.rtkcategories;
}
+ width = topWin.innerWidth;
+ height = topWin.innerHeight;
} catch (e) {}
if (utils.isStr(utils.deepAccess(validBidRequests, '0.userId.tdid'))) {
@@ -49,7 +54,9 @@ export const spec = {
payload: {
version: 1,
jsonp: false,
- rtkreferer: referer
+ rtkreferer: referer,
+ w: width,
+ h: height
},
endpoint: DEFAULT_ENDPOINT
};
diff --git a/test/spec/modules/aardvarkBidAdapter_spec.js b/test/spec/modules/aardvarkBidAdapter_spec.js
index 727527acf29..b532fa4264a 100644
--- a/test/spec/modules/aardvarkBidAdapter_spec.js
+++ b/test/spec/modules/aardvarkBidAdapter_spec.js
@@ -1,4 +1,5 @@
import { expect } from 'chai';
+import * as utils from 'src/utils';
import { spec, resetUserSync } from 'modules/aardvarkBidAdapter';
describe('aardvarkAdapterTest', function () {
@@ -343,4 +344,79 @@ describe('aardvarkAdapterTest', function () {
expect(syncs[0].url).to.equal('//sync.rtk.io/cs?g=1&c=BOEFEAyOEFEAyAHABDENAI4AAAB9vABAASA');
});
});
+
+ describe('reading window.top properties', function () {
+ const bidCategories = ['bcat1', 'bcat2', 'bcat3'];
+ const bidRequests = [{
+ bidder: 'aardvark',
+ params: {
+ ai: 'xiby',
+ sc: 'TdAx',
+ host: 'adzone.pub.com',
+ categories: bidCategories
+ },
+ adUnitCode: 'RTK_aaaa',
+ transactionId: '1b8389fe-615c-482d-9f1a-177fb8f7d5b0',
+ sizes: [300, 250],
+ bidId: '1abgs362e0x48a8',
+ bidderRequestId: '70deaff71c281d',
+ auctionId: '5c66da22-426a-4bac-b153-77360bef5337',
+ userId: { tdid: 'eff98622-b5fd-44fa-9a49-6e846922d532' }
+ }];
+
+ const bidderRequest = {
+ refererInfo: {
+ referer: 'http://example.com'
+ }
+ };
+
+ const topWin = {
+ innerWidth: 1366,
+ innerHeight: 768,
+ rtkcategories: ['cat1', 'cat2', 'cat3']
+ };
+
+ let sandbox;
+ beforeEach(function () {
+ sandbox = sinon.createSandbox();
+ });
+
+ afterEach(function () {
+ sandbox.restore();
+ });
+
+ it('should have window.top dimensions', function () {
+ sandbox.stub(utils, 'getWindowTop').returns(topWin);
+
+ const requests = spec.buildRequests(bidRequests, bidderRequest);
+ requests.forEach(function (requestItem) {
+ expect(requestItem.data.w).to.equal(topWin.innerWidth);
+ expect(requestItem.data.h).to.equal(topWin.innerHeight);
+ });
+ });
+
+ it('should have window dimensions, as backup', function () {
+ sandbox.stub(utils, 'getWindowTop').returns(undefined);
+
+ const requests = spec.buildRequests(bidRequests, bidderRequest);
+ requests.forEach(function (requestItem) {
+ expect(requestItem.data.w).to.equal(window.innerWidth);
+ expect(requestItem.data.h).to.equal(window.innerHeight);
+ });
+ });
+
+ it('should have window.top & bid categories', function () {
+ sandbox.stub(utils, 'getWindowTop').returns(topWin);
+
+ const requests = spec.buildRequests(bidRequests, bidderRequest);
+ requests.forEach(function (requestItem) {
+ utils._each(topWin.categories, function (cat) {
+ expect(requestItem.data.categories).to.contain(cat);
+ });
+ utils._each(bidCategories, function (cat) {
+ expect(requestItem.data.categories).to.contain(cat);
+ });
+ });
+ });
+ });
});
From a9dc89691993bbd91be3062d7ce47fca2d8fb9e7 Mon Sep 17 00:00:00 2001
From: nwlosinski
Date: Thu, 13 Jun 2019 19:12:14 +0200
Subject: [PATCH 007/285] cache buster for user sync (#3838)
---
modules/justpremiumBidAdapter.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/justpremiumBidAdapter.js b/modules/justpremiumBidAdapter.js
index 6fbf5454b91..f8419f06faf 100644
--- a/modules/justpremiumBidAdapter.js
+++ b/modules/justpremiumBidAdapter.js
@@ -97,9 +97,9 @@ export const spec = {
},
getUserSyncs: function getUserSyncs(syncOptions, responses, gdprConsent) {
- let url = '//pre.ads.justpremium.com/v/1.0/t/sync'
+ let url = '//pre.ads.justpremium.com/v/1.0/t/sync' + '?_c=' + 'a' + Math.random().toString(36).substring(7) + Date.now();
if (gdprConsent && (typeof gdprConsent.gdprApplies === 'boolean')) {
- url = url + '?consentString=' + encodeURIComponent(gdprConsent.consentString)
+ url = url + '&consentString=' + encodeURIComponent(gdprConsent.consentString)
}
if (syncOptions.iframeEnabled) {
pixels.push({
From efe74f8a0a90d3e929d68bcc87169f6583cba676 Mon Sep 17 00:00:00 2001
From: HolzAndrew
Date: Thu, 13 Jun 2019 13:14:41 -0400
Subject: [PATCH 008/285] Add bidFloor to Yieldmo Adapter (#3886)
* change userid to pubcid
* removes consolelogs
* removes .txt file
* fixes test
* make the if statement useful
* fix indentation
* move return back to the correct place
* fix indent
---
modules/yieldmoBidAdapter.js | 28 +++++++++++++--------
modules/yieldmoBidAdapter.md | 3 ++-
test/spec/modules/yieldmoBidAdapter_spec.js | 21 ++++++++++------
3 files changed, 32 insertions(+), 20 deletions(-)
diff --git a/modules/yieldmoBidAdapter.js b/modules/yieldmoBidAdapter.js
index b2d13e88c80..299baf49042 100644
--- a/modules/yieldmoBidAdapter.js
+++ b/modules/yieldmoBidAdapter.js
@@ -43,12 +43,13 @@ export const spec = {
bidRequests.forEach((request) => {
serverRequest.p.push(addPlacement(request));
- const userId = getUserId(request)
- if (userId) {
- const pubcid = userId.pubcid;
+ const pubcid = getPubcId(request)
+ if (pubcid) {
serverRequest.pubcid = pubcid;
} else if (request.crumbs) {
- serverRequest.pubcid = request.crumbs.pubcid;
+ if (request.crumbs.pubcid) {
+ serverRequest.pubcid = request.crumbs.pubcid;
+ }
}
});
serverRequest.p = '[' + serverRequest.p.toString() + ']';
@@ -103,8 +104,13 @@ function addPlacement(request) {
callback_id: request.bidId,
sizes: request.sizes
}
- if (request.params && request.params.placementId) {
- placementInfo.ym_placement_id = request.params.placementId
+ if (request.params) {
+ if (request.params.placementId) {
+ placementInfo.ym_placement_id = request.params.placementId;
+ }
+ if (request.params.bidFloor) {
+ placementInfo.bidFloor = request.params.bidFloor;
+ }
}
return JSON.stringify(placementInfo);
}
@@ -311,10 +317,10 @@ function isMraid() {
return !!(window.mraid);
}
-function getUserId(request) {
- let userId;
- if (request && request.userId && typeof request.userId === 'object') {
- userId = request.userId;
+function getPubcId(request) {
+ let pubcid;
+ if (request && request.userId && request.userId.pubcid && typeof request.userId === 'object') {
+ pubcid = request.userId.pubcid;
}
- return userId;
+ return pubcid;
}
diff --git a/modules/yieldmoBidAdapter.md b/modules/yieldmoBidAdapter.md
index 8c60202d7ea..7221f2ebdd0 100644
--- a/modules/yieldmoBidAdapter.md
+++ b/modules/yieldmoBidAdapter.md
@@ -23,7 +23,8 @@ var adUnits = [
bids: [{
bidder: 'yieldmo',
params: {
- placementId: '1779781193098233305' // string with at most 19 characters (may include numbers only)
+ placementId: '1779781193098233305', // string with at most 19 characters (may include numbers only)
+ bidFloor: .28 // optional param
}
}]
}
diff --git a/test/spec/modules/yieldmoBidAdapter_spec.js b/test/spec/modules/yieldmoBidAdapter_spec.js
index 12dd87e1517..2a94dc7e5c9 100644
--- a/test/spec/modules/yieldmoBidAdapter_spec.js
+++ b/test/spec/modules/yieldmoBidAdapter_spec.js
@@ -9,7 +9,9 @@ describe('YieldmoAdapter', function () {
let bid = {
bidder: 'yieldmo',
- params: {},
+ params: {
+ bidFloor: 0.1
+ },
adUnitCode: 'adunit-code',
sizes: [[300, 250], [300, 600]],
bidId: '30b31c1838de1e',
@@ -59,11 +61,13 @@ describe('YieldmoAdapter', function () {
it('should place bid information into the p parameter of data', function () {
let placementInfo = spec.buildRequests(bidArray).data.p;
- expect(placementInfo).to.equal('[{"placement_id":"adunit-code","callback_id":"30b31c1838de1e","sizes":[[300,250],[300,600]]}]');
+ expect(placementInfo).to.equal('[{"placement_id":"adunit-code","callback_id":"30b31c1838de1e","sizes":[[300,250],[300,600]],"bidFloor":0.1}]');
bidArray.push({
bidder: 'yieldmo',
- params: {},
+ params: {
+ bidFloor: 0.2
+ },
adUnitCode: 'adunit-code-1',
sizes: [[300, 250], [300, 600]],
bidId: '123456789',
@@ -77,19 +81,19 @@ describe('YieldmoAdapter', function () {
// multiple placements
placementInfo = spec.buildRequests(bidArray).data.p;
- expect(placementInfo).to.equal('[{"placement_id":"adunit-code","callback_id":"30b31c1838de1e","sizes":[[300,250],[300,600]]},{"placement_id":"adunit-code-1","callback_id":"123456789","sizes":[[300,250],[300,600]]}]');
+ expect(placementInfo).to.equal('[{"placement_id":"adunit-code","callback_id":"30b31c1838de1e","sizes":[[300,250],[300,600]],"bidFloor":0.1},{"placement_id":"adunit-code-1","callback_id":"123456789","sizes":[[300,250],[300,600]],"bidFloor":0.2}]');
});
it('should add placement id if given', function () {
bidArray[0].params.placementId = 'ym_1293871298';
let placementInfo = spec.buildRequests(bidArray).data.p;
- expect(placementInfo).to.include('"ym_placement_id":"ym_1293871298"}');
- expect(placementInfo).not.to.include('"ym_placement_id":"ym_0987654321"}');
+ expect(placementInfo).to.include('"ym_placement_id":"ym_1293871298"');
+ expect(placementInfo).not.to.include('"ym_placement_id":"ym_0987654321"');
bidArray[1].params.placementId = 'ym_0987654321';
placementInfo = spec.buildRequests(bidArray).data.p;
- expect(placementInfo).to.include('"ym_placement_id":"ym_1293871298"}');
- expect(placementInfo).to.include('"ym_placement_id":"ym_0987654321"}');
+ expect(placementInfo).to.include('"ym_placement_id":"ym_1293871298"');
+ expect(placementInfo).to.include('"ym_placement_id":"ym_0987654321"');
});
it('should add additional information to data parameter of request', function () {
@@ -104,6 +108,7 @@ describe('YieldmoAdapter', function () {
expect(data.hasOwnProperty('title')).to.be.true;
expect(data.hasOwnProperty('h')).to.be.true;
expect(data.hasOwnProperty('w')).to.be.true;
+ expect(data.hasOwnProperty('pubcid')).to.be.true;
})
it('should add pubcid as parameter of request', function () {
From 40f032cc3aa4944126417c3bfbb459a28eefbaa1 Mon Sep 17 00:00:00 2001
From: John Salis
Date: Thu, 13 Jun 2019 13:33:32 -0400
Subject: [PATCH 009/285] Add beachfront bidder params to set outstream player
settings (#3868)
* Add beachfront bidder params to set outstream player settings
* Add example for outstream player params
* Run ci again
---
modules/beachfrontBidAdapter.js | 32 +++++-----
modules/beachfrontBidAdapter.md | 32 ++++++++++
.../spec/modules/beachfrontBidAdapter_spec.js | 58 +++++++++++++++++++
3 files changed, 108 insertions(+), 14 deletions(-)
diff --git a/modules/beachfrontBidAdapter.js b/modules/beachfrontBidAdapter.js
index 552413f4878..efc7dfeda8d 100644
--- a/modules/beachfrontBidAdapter.js
+++ b/modules/beachfrontBidAdapter.js
@@ -7,7 +7,7 @@ import { VIDEO, BANNER } from '../src/mediaTypes';
import find from 'core-js/library/fn/array/find';
import includes from 'core-js/library/fn/array/includes';
-const ADAPTER_VERSION = '1.4';
+const ADAPTER_VERSION = '1.5';
const ADAPTER_NAME = 'BFIO_PREBID';
const OUTSTREAM = 'outstream';
@@ -143,21 +143,20 @@ function createRenderer(bidRequest) {
loaded: false
});
- renderer.setRender(outstreamRender);
-
- return renderer;
-}
-
-function outstreamRender(bid) {
- bid.renderer.push(() => {
- window.Beachfront.Player(bid.adUnitCode, {
- ad_tag_url: bid.vastUrl,
- width: bid.width,
- height: bid.height,
- expand_in_view: false,
- collapse_on_complete: true
+ renderer.setRender(bid => {
+ bid.renderer.push(() => {
+ window.Beachfront.Player(bid.adUnitCode, {
+ adTagUrl: bid.vastUrl,
+ width: bid.width,
+ height: bid.height,
+ expandInView: getPlayerBidParam(bidRequest, 'expandInView', false),
+ collapseOnComplete: getPlayerBidParam(bidRequest, 'collapseOnComplete', true),
+ progressColor: getPlayerBidParam(bidRequest, 'progressColor')
+ });
});
});
+
+ return renderer;
}
function getFirstSize(sizes) {
@@ -231,6 +230,11 @@ function getBannerBidParam(bid, key) {
return utils.deepAccess(bid, 'params.banner.' + key) || utils.deepAccess(bid, 'params.' + key);
}
+function getPlayerBidParam(bid, key, defaultValue) {
+ let param = utils.deepAccess(bid, 'params.player.' + key);
+ return param === undefined ? defaultValue : param;
+}
+
function isVideoBidValid(bid) {
return isVideoBid(bid) && getVideoBidParam(bid, 'appId') && getVideoBidParam(bid, 'bidfloor');
}
diff --git a/modules/beachfrontBidAdapter.md b/modules/beachfrontBidAdapter.md
index fb14db59710..3f827fe9241 100644
--- a/modules/beachfrontBidAdapter.md
+++ b/modules/beachfrontBidAdapter.md
@@ -86,3 +86,35 @@ Module that connects to Beachfront's demand sources
}
];
```
+
+# Outstream Player Params Example
+```javascript
+ var adUnits = [
+ {
+ code: 'test-video-outstream',
+ mediaTypes: {
+ video: {
+ context: 'outstream',
+ playerSize: [ 640, 360 ]
+ }
+ },
+ bids: [
+ {
+ bidder: 'beachfront',
+ params: {
+ video: {
+ bidfloor: 0.01,
+ appId: '11bc5dd5-7421-4dd8-c926-40fa653bec76',
+ mimes: [ 'video/mp4', 'application/javascript' ]
+ },
+ player: {
+ progressColor: '#50A8FA',
+ expandInView: false,
+ collapseOnComplete: true
+ }
+ }
+ }
+ ]
+ }
+ ];
+```
diff --git a/test/spec/modules/beachfrontBidAdapter_spec.js b/test/spec/modules/beachfrontBidAdapter_spec.js
index 652dae4a74a..f5890cb6475 100644
--- a/test/spec/modules/beachfrontBidAdapter_spec.js
+++ b/test/spec/modules/beachfrontBidAdapter_spec.js
@@ -1,4 +1,5 @@
import { expect } from 'chai';
+import sinon from 'sinon';
import { spec, VIDEO_ENDPOINT, BANNER_ENDPOINT, OUTSTREAM_SRC, DEFAULT_MIMES } from 'modules/beachfrontBidAdapter';
import { parse as parseUrl } from 'src/url';
@@ -531,6 +532,63 @@ describe('BeachfrontAdapter', function () {
url: OUTSTREAM_SRC
});
});
+
+ it('should initialize a player for outstream bids', () => {
+ const width = 640;
+ const height = 480;
+ const bidRequest = bidRequests[0];
+ bidRequest.mediaTypes = {
+ video: {
+ context: 'outstream',
+ playerSize: [ width, height ]
+ }
+ };
+ const serverResponse = {
+ bidPrice: 5.00,
+ url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
+ cmpId: '123abc'
+ };
+ const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
+ window.Beachfront = { Player: sinon.spy() };
+ bidResponse.adUnitCode = bidRequest.adUnitCode;
+ bidResponse.renderer.render(bidResponse);
+ sinon.assert.calledWith(window.Beachfront.Player, bidResponse.adUnitCode, sinon.match({
+ adTagUrl: bidResponse.vastUrl,
+ width: bidResponse.width,
+ height: bidResponse.height,
+ expandInView: false,
+ collapseOnComplete: true
+ }));
+ delete window.Beachfront;
+ });
+
+ it('should configure outstream player settings from the bidder params', () => {
+ const width = 640;
+ const height = 480;
+ const bidRequest = bidRequests[0];
+ bidRequest.mediaTypes = {
+ video: {
+ context: 'outstream',
+ playerSize: [ width, height ]
+ }
+ };
+ bidRequest.params.player = {
+ expandInView: true,
+ collapseOnComplete: false,
+ progressColor: 'green'
+ };
+ const serverResponse = {
+ bidPrice: 5.00,
+ url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
+ cmpId: '123abc'
+ };
+ const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
+ window.Beachfront = { Player: sinon.spy() };
+ bidResponse.adUnitCode = bidRequest.adUnitCode;
+ bidResponse.renderer.render(bidResponse);
+ sinon.assert.calledWith(window.Beachfront.Player, bidResponse.adUnitCode, sinon.match(bidRequest.params.player));
+ delete window.Beachfront;
+ });
});
describe('for banner bids', function () {
From b617aa3e4153c0bd1c9d8db80987cd3972501560 Mon Sep 17 00:00:00 2001
From: Chris Connors
Date: Thu, 13 Jun 2019 14:00:16 -0400
Subject: [PATCH 010/285] Adding Scaleable Analytics Adapter (#3846)
* Adding Scaleable Analytics Adapter
* Removed commented out code
---
modules/scaleableAnalyticsAdapter.js | 153 ++++++++++++++++++
modules/scaleableAnalyticsAdapter.md | 20 +++
.../modules/scaleableAnalyticsAdapter_spec.js | 136 ++++++++++++++++
3 files changed, 309 insertions(+)
create mode 100644 modules/scaleableAnalyticsAdapter.js
create mode 100644 modules/scaleableAnalyticsAdapter.md
create mode 100644 test/spec/modules/scaleableAnalyticsAdapter_spec.js
diff --git a/modules/scaleableAnalyticsAdapter.js b/modules/scaleableAnalyticsAdapter.js
new file mode 100644
index 00000000000..c875dab7e18
--- /dev/null
+++ b/modules/scaleableAnalyticsAdapter.js
@@ -0,0 +1,153 @@
+/* COPYRIGHT SCALEABLE LLC 2019 */
+
+import { ajax } from '../src/ajax';
+import CONSTANTS from '../src/constants.json';
+import adapter from '../src/AnalyticsAdapter';
+import adapterManager from '../src/adapterManager';
+import * as utils from '../src/utils';
+
+const BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT;
+const AUCTION_INIT = CONSTANTS.EVENTS.AUCTION_INIT;
+const BID_RESPONSE = CONSTANTS.EVENTS.BID_RESPONSE;
+const BID_WON = CONSTANTS.EVENTS.BID_WON;
+const AUCTION_END = CONSTANTS.EVENTS.AUCTION_END;
+
+const URL = 'https://auction.scaleable.ai/';
+const ANALYTICS_TYPE = 'endpoint';
+
+let auctionData = {};
+
+let scaleableAnalytics = Object.assign({},
+ adapter({
+ URL,
+ ANALYTICS_TYPE
+ }),
+ {
+ // Override AnalyticsAdapter functions by supplying custom methods
+ track({ eventType, args }) {
+ switch (eventType) {
+ case AUCTION_INIT:
+ onAuctionInit(args);
+ break;
+ case AUCTION_END:
+ onAuctionEnd(args);
+ break;
+ case BID_WON:
+ onBidWon(args);
+ break;
+ case BID_RESPONSE:
+ onBidResponse(args);
+ break;
+ case BID_TIMEOUT:
+ onBidTimeout(args);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+);
+
+scaleableAnalytics.config = {};
+scaleableAnalytics.originEnableAnalytics = scaleableAnalytics.enableAnalytics;
+scaleableAnalytics.enableAnalytics = config => {
+ scaleableAnalytics.config = config;
+
+ scaleableAnalytics.originEnableAnalytics(config);
+
+ scaleableAnalytics.enableAnalytics = function _enable() {
+ return utils.logMessage(`Analytics adapter for "${global}" already enabled, unnecessary call to \`enableAnalytics\`.`);
+ };
+}
+
+scaleableAnalytics.getAuctionData = () => {
+ return auctionData;
+};
+
+const sendDataToServer = data => ajax(URL, () => {}, JSON.stringify(data));
+
+// Track auction initiated
+const onAuctionInit = args => {
+ const config = scaleableAnalytics.config || {options: {}};
+
+ for (let idx = args.adUnitCodes.length; idx--;) {
+ const data = {
+ event: 'request',
+ site: config.options.site,
+ adunit: args.adUnitCodes[idx]
+ };
+
+ sendDataToServer(data);
+ }
+}
+
+// Handle all events besides requests and wins
+const onAuctionEnd = args => {
+ for (let adunit in auctionData) {
+ sendDataToServer(auctionData[adunit]);
+ }
+}
+
+// Bid Win Events occur after auction end
+const onBidWon = args => {
+ const config = scaleableAnalytics.config || {options: {}};
+
+ const data = {
+ event: 'win',
+ site: config.options.site,
+ adunit: args.adUnitCode,
+ code: args.bidderCode,
+ cpm: args.cpm,
+ ttr: args.timeToRespond
+ };
+
+ sendDataToServer(data);
+}
+
+const onBidResponse = args => {
+ const config = scaleableAnalytics.config || {options: {}};
+
+ if (!auctionData[args.adUnitCode]) {
+ auctionData[args.adUnitCode] = {
+ event: 'bids',
+ bids: [],
+ adunit: args.adUnitCode,
+ site: config.options.site
+ };
+ }
+
+ const currBidData = {
+ code: args.bidderCode,
+ cpm: args.cpm,
+ ttr: args.timeToRespond
+ };
+
+ auctionData[args.adUnitCode].bids.push(currBidData);
+}
+
+const onBidTimeout = args => {
+ const config = scaleableAnalytics.config || {options: {}};
+
+ for (let i = args.length; i--;) {
+ let currObj = args[i];
+
+ if (!auctionData[currObj.adUnitCode]) {
+ auctionData[currObj.adUnitCode] = {
+ event: 'bids',
+ bids: [],
+ timeouts: [],
+ adunit: currObj.adUnitCode,
+ site: config.options.site
+ };
+ }
+
+ auctionData[currObj.adUnitCode].timeouts.push(currObj.bidder);
+ }
+}
+
+adapterManager.registerAnalyticsAdapter({
+ adapter: scaleableAnalytics,
+ code: 'scaleable'
+})
+
+export default scaleableAnalytics;
diff --git a/modules/scaleableAnalyticsAdapter.md b/modules/scaleableAnalyticsAdapter.md
new file mode 100644
index 00000000000..0f6fbada55a
--- /dev/null
+++ b/modules/scaleableAnalyticsAdapter.md
@@ -0,0 +1,20 @@
+# Overview
+
+Module Name: Scaleable Analytics Adapter
+Module Type: Analytics Adapter
+Maintainer: chris@scaleable.ai
+
+# Description
+
+Analytics adapter for scaleable.ai. Contact team@scaleable.ai for more information or to sign up for analytics.
+
+# Implementation Code
+
+```
+pbjs.enableAnalytics({
+ provider: 'scaleable',
+ options: {
+ site: '' // Contact Scaleable to receive your unique site id
+ }
+});
+```
diff --git a/test/spec/modules/scaleableAnalyticsAdapter_spec.js b/test/spec/modules/scaleableAnalyticsAdapter_spec.js
new file mode 100644
index 00000000000..300f72751a4
--- /dev/null
+++ b/test/spec/modules/scaleableAnalyticsAdapter_spec.js
@@ -0,0 +1,136 @@
+import scaleableAnalytics from 'modules/scaleableAnalyticsAdapter';
+import { expect } from 'chai';
+import events from 'src/events';
+import CONSTANTS from 'src/constants.json';
+import adapterManager from 'src/adapterManager';
+
+const BID_TIMEOUT = CONSTANTS.EVENTS.BID_TIMEOUT;
+const AUCTION_INIT = CONSTANTS.EVENTS.AUCTION_INIT;
+const BID_RESPONSE = CONSTANTS.EVENTS.BID_RESPONSE;
+const BID_WON = CONSTANTS.EVENTS.BID_WON;
+const AUCTION_END = CONSTANTS.EVENTS.AUCTION_END;
+
+describe('Scaleable Analytics Adapter', function() {
+ const MOCK_DATA = {
+ adUnitCode: '12345',
+ site: '5c4fab7a829e955d6c265e72',
+ bidResponse: {
+ adUnitCode: '12345',
+ bidderCode: 'test-code',
+ cpm: 3.14,
+ timeToRespond: 285
+ },
+ bidTimeout: [
+ {
+ adUnitCode: '67890',
+ bidder: 'test-code'
+ }
+ ]
+ };
+
+ MOCK_DATA.expectedBidResponse = {
+ event: 'bids',
+ bids: [{
+ code: MOCK_DATA.bidResponse.bidderCode,
+ cpm: MOCK_DATA.bidResponse.cpm,
+ ttr: MOCK_DATA.bidResponse.timeToRespond
+ }],
+ adunit: MOCK_DATA.adUnitCode,
+ site: MOCK_DATA.site
+ };
+
+ MOCK_DATA.expectedBidTimeout = {
+ event: 'bids',
+ bids: [],
+ timeouts: [MOCK_DATA.bidTimeout[0].bidder],
+ adunit: MOCK_DATA.bidTimeout[0].adUnitCode,
+ site: MOCK_DATA.site
+ };
+
+ let xhr;
+ let requests;
+
+ before(function() {
+ xhr = sinon.useFakeXMLHttpRequest();
+ xhr.onCreate = request => requests.push(request);
+ });
+
+ after(function() {
+ xhr.restore();
+ });
+
+ describe('Event Handling', function() {
+ beforeEach(function() {
+ requests = [];
+ sinon.stub(events, 'getEvents').returns([]);
+
+ scaleableAnalytics.enableAnalytics({
+ provider: 'scaleable',
+ options: {
+ site: MOCK_DATA.site
+ }
+ });
+ });
+
+ afterEach(function() {
+ events.getEvents.restore();
+ scaleableAnalytics.disableAnalytics();
+ });
+
+ it('should handle the auction init event', function(done) {
+ events.emit(AUCTION_INIT, {
+ adUnitCodes: [MOCK_DATA.adUnitCode]
+ });
+
+ const result = JSON.parse(requests[0].requestBody);
+ expect(result).to.deep.equal({
+ event: 'request',
+ site: MOCK_DATA.site,
+ adunit: MOCK_DATA.adUnitCode
+ });
+
+ done();
+ });
+
+ it('should handle the bid response event', function() {
+ events.emit(BID_RESPONSE, MOCK_DATA.bidResponse);
+
+ const actual = scaleableAnalytics.getAuctionData();
+
+ expect(actual[MOCK_DATA.adUnitCode]).to.deep.equal(MOCK_DATA.expectedBidResponse);
+ });
+
+ it('should handle the bid timeout event', function() {
+ events.emit(BID_TIMEOUT, MOCK_DATA.bidTimeout);
+
+ const actual = scaleableAnalytics.getAuctionData();
+
+ expect(actual[MOCK_DATA.bidTimeout[0].adUnitCode]).to.deep.equal(MOCK_DATA.expectedBidTimeout);
+ });
+
+ it('should handle the bid won event', function(done) {
+ events.emit(BID_WON, MOCK_DATA.bidResponse);
+
+ const result = JSON.parse(requests[0].requestBody);
+ expect(result).to.deep.equal({
+ adunit: MOCK_DATA.adUnitCode,
+ code: MOCK_DATA.bidResponse.bidderCode,
+ cpm: MOCK_DATA.bidResponse.cpm,
+ ttr: MOCK_DATA.bidResponse.timeToRespond,
+ event: 'win',
+ site: MOCK_DATA.site
+ });
+
+ done();
+ });
+
+ it('should handle the auction end event', function(done) {
+ events.emit(AUCTION_END, {});
+
+ const result = JSON.parse(requests[0].requestBody);
+ expect(result).to.deep.equal(MOCK_DATA.expectedBidResponse);
+
+ done();
+ });
+ });
+});
From 1dc47c8c5fd0c8854d2070178ec463ecb69f3e4e Mon Sep 17 00:00:00 2001
From: Luis
Date: Thu, 13 Jun 2019 14:04:44 -0400
Subject: [PATCH 011/285] Fix filepath reference (#3905)
---
modules/optimeraBidAdapter.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/optimeraBidAdapter.js b/modules/optimeraBidAdapter.js
index ab4c75c1c1f..7025045c7de 100644
--- a/modules/optimeraBidAdapter.js
+++ b/modules/optimeraBidAdapter.js
@@ -1,4 +1,4 @@
-import { registerBidder } from 'src/adapters/bidderFactory';
+import { registerBidder } from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'optimera';
const SCORES_BASE_URL = 'https://dyv1bugovvq1g.cloudfront.net/';
From 81e87186164f0a427e2aaefd189b23d65434340e Mon Sep 17 00:00:00 2001
From: Bret Gorsline
Date: Thu, 13 Jun 2019 15:14:21 -0400
Subject: [PATCH 012/285] Prebid 2.19.0 Release
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 468b16c0ebb..5125a45ef16 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.19.0-pre",
+ "version": "2.19.0",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 20d8c8b2cbfaf080f8eb39e55ae27b8eabc3cdb4 Mon Sep 17 00:00:00 2001
From: Bret Gorsline
Date: Thu, 13 Jun 2019 15:38:03 -0400
Subject: [PATCH 013/285] Increment pre version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 5125a45ef16..4a3d8b2c959 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.19.0",
+ "version": "2.20.0-pre",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 842cc19f712c644db84aae10d7d3567514d481e8 Mon Sep 17 00:00:00 2001
From: Chris Cole
Date: Mon, 17 Jun 2019 10:19:09 -0700
Subject: [PATCH 014/285] digiTrustIdSystem.js add the synchronous behavior to
facade call of DigiTrust.getId. Fix spelling error of facade in code. (#3913)
---
modules/digiTrustIdSystem.js | 56 ++++++++++++++++++++++++++++--------
1 file changed, 44 insertions(+), 12 deletions(-)
diff --git a/modules/digiTrustIdSystem.js b/modules/digiTrustIdSystem.js
index b587913e1ed..07792cc49d3 100644
--- a/modules/digiTrustIdSystem.js
+++ b/modules/digiTrustIdSystem.js
@@ -85,12 +85,12 @@ function writeDigiId(id) {
}
/**
- * Set up a DigiTrust fascade object to mimic the API
+ * Set up a DigiTrust facade object to mimic the API
*
*/
-function initDigitrustFascade(config) {
+function initDigitrustFacade(config) {
var _savedId = null; // closure variable for storing Id to avoid additional requests
- var fascade = {
+ var facade = {
isClient: true,
isMock: true,
_internals: {
@@ -98,8 +98,10 @@ function initDigitrustFascade(config) {
initCallback: null
},
getUser: function (obj, callback) {
- var cb = callback || noop;
- var inter = fascade._internals;
+ var isAsync = !!isFunc(callback);
+ var cb = isAsync ? callback : noop;
+ var errResp = { success: false };
+ var inter = facade._internals;
inter.callCount++;
// wrap the initializer callback, if present
@@ -113,10 +115,23 @@ function initDigitrustFascade(config) {
}
}
+ if (!isMemberIdValid) {
+ if (!isAsync) {
+ return errResp
+ } else {
+ cb(errResp);
+ return;
+ }
+ }
+
if (_savedId != null) {
checkCallInitializeCb(_savedId);
- cb(_savedId);
- return;
+ if (isAsync) {
+ cb(_savedId);
+ return;
+ } else {
+ return _savedId;
+ }
}
var opts = {
@@ -140,14 +155,31 @@ function initDigitrustFascade(config) {
}
callApi(opts);
+
+ if (!isAsync) {
+ return errResp; // even if it will be successful later, without a callback we report a "failure in this moment"
+ }
}
}
if (window && window.DigiTrust == null) {
- window.DigiTrust = fascade;
+ window.DigiTrust = facade;
}
}
+/**
+ * Tests to see if a member ID is valid within facade
+ * @param {any} memberId
+ */
+var isMemberIdValid = function (memberId) {
+ if (memberId && memberId.length > 0) {
+ return true;
+ } else {
+ utils.logError('[DigiTrust Prebid Client Error] Missing member ID, add the member ID to the function call options');
+ return false;
+ }
+};
+
/**
* Encapsulation of needed info for the callback return.
*
@@ -237,9 +269,9 @@ function getDigiTrustId(configParams) {
getDigiTrustId(configParams);
}, 100 * (1 + resultHandler.retries++));
return resultHandler.userIdCallback;
- } else if (!isInitialized()) { // Second see if we should build a fascade object
+ } else if (!isInitialized()) { // Second see if we should build a facade object
if (resultHandler.retries >= MAX_RETRIES) {
- initDigitrustFascade(configParams); // initialize a fascade object that relies on the AJAX call
+ initDigitrustFacade(configParams); // initialize a facade object that relies on the AJAX call
resultHandler.executeIdRequest(configParams);
} else {
// use expanding envelope
@@ -264,7 +296,7 @@ function initializeDigiTrust(config) {
dt.initialize(config.init, config.callback);
} else if (dt == null) {
// Assume we are already on a delay and DigiTrust is not on page
- initDigitrustFascade(config);
+ initDigitrustFacade(config);
}
}
@@ -278,7 +310,7 @@ function surfaceTestHook() {
digitrustIdModule['_testHook'] = testHook;
}
-testHook.initDigitrustFascade = initDigitrustFascade;
+testHook.initDigitrustFacade = initDigitrustFacade;
/** @type {Submodule} */
export const digiTrustIdSubmodule = {
From 1c1035aa1995f9d098c55b0aa1c22df7560eecfa Mon Sep 17 00:00:00 2001
From: ujuettner
Date: Tue, 18 Jun 2019 16:42:36 +0200
Subject: [PATCH 015/285] Feature/remove on set targeting (#3919)
* initial orbidder version in personal github repo
* use adUnits from orbidder_example.html
* replace obsolete functions
* forgot to commit the test
* check if bidderRequest object is available
* try to fix weird safari/ie issue
* ebayK: add more params
* update orbidderBidAdapter.md
* use spec. instead of this. for consistency reasons
* add bidfloor parameter to params object
* fix gdpr object handling
* default to consentRequired: false when not explicitly given
* wip - use onSetTargeting callback
* add tests for onSetTargeting callback
* fix params and respective tests
* Remove onSetTargeting
---
modules/orbidderBidAdapter.js | 4 ----
test/spec/modules/orbidderBidAdapter_spec.js | 6 ------
2 files changed, 10 deletions(-)
diff --git a/modules/orbidderBidAdapter.js b/modules/orbidderBidAdapter.js
index e085a14c6b8..fc6eac6e479 100644
--- a/modules/orbidderBidAdapter.js
+++ b/modules/orbidderBidAdapter.js
@@ -74,10 +74,6 @@ export const spec = {
this.onHandler(bid, '/win');
},
- onSetTargeting (bid) {
- this.onHandler(bid, '/targeting');
- },
-
onHandler (bid, route) {
const getRefererInfo = detectReferer(window);
diff --git a/test/spec/modules/orbidderBidAdapter_spec.js b/test/spec/modules/orbidderBidAdapter_spec.js
index 55f5e2cae4c..4a972c42d30 100644
--- a/test/spec/modules/orbidderBidAdapter_spec.js
+++ b/test/spec/modules/orbidderBidAdapter_spec.js
@@ -178,12 +178,6 @@ describe('orbidderBidAdapter', () => {
expect(ajaxStub.firstCall.args[0].indexOf('https://')).to.equal(0);
expect(ajaxStub.firstCall.args[0]).to.equal(`${spec.orbidderHost}/win`);
expect(ajaxStub.firstCall.args[1]).to.equal(JSON.stringify(bidObjClone));
-
- spec.onSetTargeting(bidObj);
- expect(ajaxStub.calledTwice).to.equal(true);
- expect(ajaxStub.secondCall.args[0].indexOf('https://')).to.equal(0);
- expect(ajaxStub.secondCall.args[0]).to.equal(`${spec.orbidderHost}/targeting`);
- expect(ajaxStub.secondCall.args[1]).to.equal(JSON.stringify(bidObjClone));
});
});
From 4b84beb1a326adb2b918e81d281af2433f310831 Mon Sep 17 00:00:00 2001
From: couchcrew-thomas
Date: Tue, 18 Jun 2019 16:59:36 +0200
Subject: [PATCH 016/285] FeedAd bidder adapter (#3891)
* added file scaffold
* added isBidRequestValid implementation
* added local prototype of ad integration
* added implementation for placement ID validation
* fixed video context filter
* applied lint to feedad bid adapter
* added unit test for bid request validation
* added buildRequest unit test
* added unit tests for timeout and bid won callbacks
* updated bid request to FeedAd API
* added parsing of feedad api bid response
* added transmisison of tracking events to FeedAd Api
* code cleanup
* updated feedad unit tests for buildRequest method
* added unit tests for event tracking implementation
* added unit test for interpretResponse method
* added adapter documentation
* added dedicated feedad example page
* updated feedad adapter to use live system
* updated FeedAd adapter placement ID regex
* removed groups from FeedAd adapter placement ID regex
* removed dedicated feedad example page
* updated imports in FeedAd adapter file to use relative paths
* updated FeedAd adapter unit test to use sinon.useFakeXMLHttpRequest()
---
modules/feedadBidAdapter.js | 290 ++++++++++++++
modules/feedadBidAdapter.md | 44 +++
test/spec/modules/feedadBidAdapter_spec.js | 433 +++++++++++++++++++++
3 files changed, 767 insertions(+)
create mode 100644 modules/feedadBidAdapter.js
create mode 100644 modules/feedadBidAdapter.md
create mode 100644 test/spec/modules/feedadBidAdapter_spec.js
diff --git a/modules/feedadBidAdapter.js b/modules/feedadBidAdapter.js
new file mode 100644
index 00000000000..1e995ee8914
--- /dev/null
+++ b/modules/feedadBidAdapter.js
@@ -0,0 +1,290 @@
+import * as utils from '../src/utils';
+import {registerBidder} from '../src/adapters/bidderFactory';
+import {BANNER, VIDEO} from '../src/mediaTypes';
+import {ajax} from '../src/ajax';
+
+/**
+ * Version of the FeedAd bid adapter
+ * @type {string}
+ */
+const VERSION = '1.0.0';
+
+/**
+ * @typedef {object} FeedAdApiBidRequest
+ * @inner
+ *
+ * @property {number} ad_type
+ * @property {string} client_token
+ * @property {string} placement_id
+ * @property {string} sdk_version
+ * @property {boolean} app_hybrid
+ *
+ * @property {string} [app_bundle_id]
+ * @property {string} [app_name]
+ * @property {object} [custom_params]
+ * @property {number} [connectivity]
+ * @property {string} [device_adid]
+ * @property {string} [device_platform]
+ */
+
+/**
+ * @typedef {object} FeedAdApiBidResponse
+ * @inner
+ *
+ * @property {string} ad - Ad HTML payload
+ * @property {number} cpm - number / float
+ * @property {string} creativeId - ID of creative for tracking
+ * @property {string} currency - 3-letter ISO 4217 currency-code
+ * @property {number} height - Height of creative returned in [].ad
+ * @property {boolean} netRevenue - Is the CPM net (true) or gross (false)?
+ * @property {string} requestId - bids[].bidId
+ * @property {number} ttl - Time to live for this ad
+ * @property {number} width - Width of creative returned in [].ad
+ */
+
+/**
+ * @typedef {object} FeedAdApiTrackingParams
+ * @inner
+ *
+ * @property app_hybrid {boolean}
+ * @property client_token {string}
+ * @property klass {'prebid_bidWon'|'prebid_bidTimeout'}
+ * @property placement_id {string}
+ * @property prebid_auction_id {string}
+ * @property prebid_bid_id {string}
+ * @property prebid_transaction_id {string}
+ * @property referer {string}
+ * @property sdk_version {string}
+ * @property [app_bundle_id] {string}
+ * @property [app_name] {string}
+ * @property [device_adid] {string}
+ * @property [device_platform] {1|2|3} 1 - Android | 2 - iOS | 3 - Windows
+ */
+
+/**
+ * Bidder network identity code
+ * @type {string}
+ */
+const BIDDER_CODE = 'feedad';
+
+/**
+ * The media types supported by FeedAd
+ * @type {MediaType[]}
+ */
+const MEDIA_TYPES = [VIDEO, BANNER];
+
+/**
+ * Tag for logging
+ * @type {string}
+ */
+const TAG = '[FeedAd]';
+
+/**
+ * Pattern for valid placement IDs
+ * @type {RegExp}
+ */
+const PLACEMENT_ID_PATTERN = /^[a-z0-9][a-z0-9_-]+[a-z0-9]$/;
+
+const API_ENDPOINT = 'https://api.feedad.com';
+const API_PATH_BID_REQUEST = '/1/prebid/web/bids';
+const API_PATH_TRACK_REQUEST = '/1/prebid/web/events';
+
+/**
+ * Stores temporary auction metadata
+ * @type {Object.}
+ */
+const BID_METADATA = {};
+
+/**
+ * Checks if the bid is compatible with FeedAd.
+ *
+ * @param {BidRequest} bid - the bid to check
+ * @return {boolean} true if the bid is valid
+ */
+function isBidRequestValid(bid) {
+ const clientToken = utils.deepAccess(bid, 'params.clientToken');
+ if (!clientToken || !isValidClientToken(clientToken)) {
+ utils.logWarn(TAG, "missing or invalid parameter 'clientToken'. found value:", clientToken);
+ return false;
+ }
+
+ const placementId = utils.deepAccess(bid, 'params.placementId');
+ if (!placementId || !isValidPlacementId(placementId)) {
+ utils.logWarn(TAG, "missing or invalid parameter 'placementId'. found value:", placementId);
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Checks if a client token is valid
+ * @param {string} clientToken - the client token
+ * @return {boolean} true if the token is valid
+ */
+function isValidClientToken(clientToken) {
+ return typeof clientToken === 'string' && clientToken.length > 0;
+}
+
+/**
+ * Checks if the given placement id is of a correct format.
+ * Valid IDs are words of lowercase letters from a to z and numbers from 0 to 9.
+ * The words can be separated by hyphens or underscores.
+ * Multiple separators must not follow each other.
+ * The whole placement ID must not be larger than 256 characters.
+ *
+ * @param placementId - the placement id to verify
+ * @returns if the placement ID is valid.
+ */
+function isValidPlacementId(placementId) {
+ return typeof placementId === 'string' &&
+ placementId.length > 0 &&
+ placementId.length <= 256 &&
+ PLACEMENT_ID_PATTERN.test(placementId);
+}
+
+/**
+ * Checks if the given media types contain unsupported settings
+ * @param {MediaTypes} mediaTypes - the media types to check
+ * @return {MediaTypes} the unsupported settings, empty when all types are supported
+ */
+function filterSupportedMediaTypes(mediaTypes) {
+ return {
+ banner: mediaTypes.banner,
+ video: mediaTypes.video && mediaTypes.video.context === 'outstream' ? mediaTypes.video : undefined,
+ native: undefined
+ };
+}
+
+/**
+ * Checks if the given media types are empty
+ * @param {MediaTypes} mediaTypes - the types to check
+ * @return {boolean} true if the types are empty
+ */
+function isMediaTypesEmpty(mediaTypes) {
+ return Object.keys(mediaTypes).every(type => mediaTypes[type] === undefined);
+}
+
+/**
+ * Creates the bid request params the api expects from the prebid bid request
+ * @param {BidRequest} request - the validated prebid bid request
+ * @return {FeedAdApiBidRequest}
+ */
+function createApiBidRParams(request) {
+ return {
+ ad_type: 0,
+ client_token: request.params.clientToken,
+ placement_id: request.params.placementId,
+ sdk_version: `prebid_${VERSION}`,
+ app_hybrid: false,
+ };
+}
+
+/**
+ * Builds the bid request to the FeedAd Server
+ * @param {BidRequest[]} validBidRequests - all validated bid requests
+ * @param {object} bidderRequest - meta information
+ * @return {ServerRequest|ServerRequest[]}
+ */
+function buildRequests(validBidRequests, bidderRequest) {
+ if (!bidderRequest) {
+ return [];
+ }
+ let acceptableRequests = validBidRequests.filter(request => !isMediaTypesEmpty(filterSupportedMediaTypes(request.mediaTypes)));
+ if (acceptableRequests.length === 0) {
+ return [];
+ }
+ let data = Object.assign({}, bidderRequest, {
+ bids: acceptableRequests.map(req => {
+ req.params = createApiBidRParams(req);
+ return req;
+ })
+ });
+ data.bids.forEach(bid => BID_METADATA[bid.bidId] = {
+ referer: data.refererInfo.referer,
+ transactionId: bid.transactionId
+ });
+ return {
+ method: 'POST',
+ url: `${API_ENDPOINT}${API_PATH_BID_REQUEST}`,
+ data,
+ options: {
+ contentType: 'application/json'
+ }
+ };
+}
+
+/**
+ * Adapts the FeedAd server response to Prebid format
+ * @param {ServerResponse} serverResponse - the FeedAd server response
+ * @param {BidRequest} request - the initial bid request
+ * @returns {Bid[]} the FeedAd bids
+ */
+function interpretResponse(serverResponse, request) {
+ /**
+ * @type FeedAdApiBidResponse[]
+ */
+ return typeof serverResponse.body === 'string' ? JSON.parse(serverResponse.body) : serverResponse.body;
+}
+
+/**
+ * Creates the parameters for the FeedAd tracking call
+ * @param {object} data - prebid data
+ * @param {'prebid_bidWon'|'prebid_bidTimeout'} klass - type of tracking call
+ * @return {FeedAdApiTrackingParams|null}
+ */
+function createTrackingParams(data, klass) {
+ const bidId = data.bidId || data.requestId;
+ if (!BID_METADATA.hasOwnProperty(bidId)) {
+ return null;
+ }
+ const {referer, transactionId} = BID_METADATA[bidId];
+ delete BID_METADATA[bidId];
+ return {
+ app_hybrid: false,
+ client_token: data.params[0].clientToken,
+ placement_id: data.params[0].placementId,
+ klass,
+ prebid_auction_id: data.auctionId,
+ prebid_bid_id: bidId,
+ prebid_transaction_id: transactionId,
+ referer,
+ sdk_version: VERSION
+ };
+}
+
+/**
+ * Creates a tracking handler for the given event type
+ * @param klass - the event type
+ * @return {Function} the tracking handler function
+ */
+function trackingHandlerFactory(klass) {
+ return (data) => {
+ if (!data) {
+ return;
+ }
+ let params = createTrackingParams(data, klass);
+ if (params) {
+ ajax(`${API_ENDPOINT}${API_PATH_TRACK_REQUEST}`, null, JSON.stringify(params), {
+ withCredentials: true,
+ method: 'POST',
+ contentType: 'application/json'
+ });
+ }
+ }
+}
+
+/**
+ * @type {BidderSpec}
+ */
+export const spec = {
+ code: BIDDER_CODE,
+ supportedMediaTypes: MEDIA_TYPES,
+ isBidRequestValid,
+ buildRequests,
+ interpretResponse,
+ onTimeout: trackingHandlerFactory('prebid_bidTimeout'),
+ onBidWon: trackingHandlerFactory('prebid_bidWon')
+};
+
+registerBidder(spec);
diff --git a/modules/feedadBidAdapter.md b/modules/feedadBidAdapter.md
new file mode 100644
index 00000000000..fd57025c29e
--- /dev/null
+++ b/modules/feedadBidAdapter.md
@@ -0,0 +1,44 @@
+# Overview
+
+```
+Module Name: FeedAd Adapter
+Module Type: Bidder Adapter
+Maintainer: mail@feedad.com
+```
+
+# Description
+
+Prebid.JS adapter that connects to the FeedAd demand sources.
+
+# Test Parameters
+```
+ var adUnits = [
+ {
+ code: 'test-div',
+ mediaTypes: {
+ banner: { // supports all banner sizes
+ sizes: [[300, 250]],
+ },
+ video: { // supports only outstream video
+ context: 'outstream'
+ }
+ },
+ bids: [
+ {
+ bidder: "feedad",
+ params: {
+ clientToken: 'your-client-token' // see below for more info
+ placementId: 'your-placement-id' // see below for more info
+ }
+ }
+ ]
+ }
+ ];
+```
+
+# Required Parameters
+
+| Parameter | Description |
+| --------- | ----------- |
+| `clientToken` | Your FeedAd web client token. You can view your client token inside the FeedAd admin panel. |
+| `placementId` | You can choose placement IDs yourself. A placement ID should be named after the ad position inside your product. For example, if you want to display an ad inside a list of news articles, you could name it "ad-news-overview".
A placement ID may consist of lowercase `a-z`, `0-9`, `-` and `_`. You do not have to manually create the placement IDs before using them. Just specify them within the code, and they will appear in the FeedAd admin panel after the first request.
[Learn more](/concept/feed_ad/index.html) about Placement IDs and how they are grouped to play the same Creative. |
diff --git a/test/spec/modules/feedadBidAdapter_spec.js b/test/spec/modules/feedadBidAdapter_spec.js
new file mode 100644
index 00000000000..3432a40eca4
--- /dev/null
+++ b/test/spec/modules/feedadBidAdapter_spec.js
@@ -0,0 +1,433 @@
+import {expect} from 'chai';
+import {spec} from 'modules/feedadBidAdapter';
+import {BANNER, NATIVE, VIDEO} from '../../../src/mediaTypes';
+import * as sinon from 'sinon';
+
+const CODE = 'feedad';
+
+describe('FeedAdAdapter', function () {
+ describe('Public API', function () {
+ it('should have the FeedAd bidder code', function () {
+ expect(spec.code).to.equal(CODE);
+ });
+ it('should only support video and banner ads', function () {
+ expect(spec.supportedMediaTypes).to.be.a('array');
+ expect(spec.supportedMediaTypes).to.include(BANNER);
+ expect(spec.supportedMediaTypes).to.include(VIDEO);
+ expect(spec.supportedMediaTypes).not.to.include(NATIVE);
+ });
+ it('should export the BidderSpec functions', function () {
+ expect(spec.isBidRequestValid).to.be.a('function');
+ expect(spec.buildRequests).to.be.a('function');
+ expect(spec.interpretResponse).to.be.a('function');
+ expect(spec.onTimeout).to.be.a('function');
+ expect(spec.onBidWon).to.be.a('function');
+ });
+ });
+
+ describe('isBidRequestValid', function () {
+ it('should detect missing params', function () {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: []
+ });
+ expect(result).to.equal(false);
+ });
+ it('should detect missing client token', function () {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {placementId: 'placement'}
+ });
+ expect(result).to.equal(false);
+ });
+ it('should detect zero length client token', function () {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {clientToken: '', placementId: 'placement'}
+ });
+ expect(result).to.equal(false);
+ });
+ it('should detect missing placement id', function () {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {clientToken: 'clientToken'}
+ });
+ expect(result).to.equal(false);
+ });
+ it('should detect zero length placement id', function () {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {clientToken: 'clientToken', placementId: ''}
+ });
+ expect(result).to.equal(false);
+ });
+ it('should detect too long placement id', function () {
+ var placementId = '';
+ for (var i = 0; i < 300; i++) {
+ placementId += 'a';
+ }
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {clientToken: 'clientToken', placementId}
+ });
+ expect(result).to.equal(false);
+ });
+ it('should detect invalid placement id', function () {
+ [
+ 'placement id with spaces',
+ 'some|id',
+ 'PLACEMENTID',
+ 'placeme:ntId'
+ ].forEach(id => {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {clientToken: 'clientToken', placementId: id}
+ });
+ expect(result).to.equal(false);
+ });
+ });
+ it('should accept valid parameters', function () {
+ let result = spec.isBidRequestValid({
+ bidder: 'feedad',
+ sizes: [],
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ });
+ expect(result).to.equal(true);
+ });
+ });
+
+ describe('buildRequests', function () {
+ const bidderRequest = {
+ refererInfo: {
+ referer: 'the referer'
+ },
+ some: 'thing'
+ };
+
+ it('should accept empty lists', function () {
+ let result = spec.buildRequests([], bidderRequest);
+ expect(result).to.be.empty;
+ });
+ it('should filter native media types', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ native: {
+ sizes: [[300, 250], [300, 600]],
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result).to.be.empty;
+ });
+ it('should filter video media types without outstream context', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ video: {
+ context: 'instream'
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result).to.be.empty;
+ });
+ it('should pass through outstream video media', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ video: {
+ context: 'outstream'
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result.data.bids).to.be.lengthOf(1);
+ expect(result.data.bids[0]).to.deep.equal(bid);
+ });
+ it('should pass through banner media', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 250]]
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result.data.bids).to.be.lengthOf(1);
+ expect(result.data.bids[0]).to.deep.equal(bid);
+ });
+ it('should detect empty media types', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: undefined,
+ video: undefined,
+ native: undefined
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result).to.be.empty;
+ });
+ it('should use POST', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 250]]
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result.method).to.equal('POST');
+ });
+ it('should use the correct URL', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 250]]
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result.url).to.equal('https://api.feedad.com/1/prebid/web/bids');
+ });
+ it('should specify the content type explicitly', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 250]]
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid], bidderRequest);
+ expect(result.options).to.deep.equal({
+ contentType: 'application/json'
+ })
+ });
+ it('should include the bidder request', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 250]]
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid, bid, bid], bidderRequest);
+ expect(result.data).to.deep.include(bidderRequest);
+ });
+ it('should detect missing bidder request parameter', function () {
+ let bid = {
+ code: 'feedad',
+ mediaTypes: {
+ banner: {
+ sizes: [[320, 250]]
+ }
+ },
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
+ };
+ let result = spec.buildRequests([bid, bid, bid]);
+ expect(result).to.be.empty;
+ });
+ });
+
+ describe('interpretResponse', function () {
+ const body = [{
+ foo: 'bar',
+ sub: {
+ obj: 5
+ }
+ }, {
+ bar: 'foo'
+ }];
+
+ it('should convert string bodies to JSON', function () {
+ let result = spec.interpretResponse({body: JSON.stringify(body)});
+ expect(result).to.deep.equal(body);
+ });
+
+ it('should pass through body objects', function () {
+ let result = spec.interpretResponse({body});
+ expect(result).to.deep.equal(body);
+ });
+ });
+
+ describe('event tracking calls', function () {
+ const clientToken = 'clientToken';
+ const placementId = 'placement id';
+ const auctionId = 'the auction id';
+ const bidId = 'the bid id';
+ const transactionId = 'the transaction id';
+ const referer = 'the referer';
+ const bidderRequest = {
+ refererInfo: {
+ referer: referer
+ },
+ some: 'thing'
+ };
+ const bid = {
+ 'bidder': 'feedad',
+ 'params': {
+ 'clientToken': 'fupp',
+ 'placementId': 'prebid-test'
+ },
+ 'crumbs': {
+ 'pubcid': '6254a85f-bded-489a-9736-83c45d45ef1d'
+ },
+ 'mediaTypes': {
+ 'banner': {
+ 'sizes': [
+ [
+ 300,
+ 250
+ ]
+ ]
+ }
+ },
+ 'adUnitCode': 'div-gpt-ad-1460505748561-0',
+ 'transactionId': transactionId,
+ 'sizes': [
+ [
+ 300,
+ 250
+ ]
+ ],
+ 'bidId': bidId,
+ 'bidderRequestId': '10739fe6fe2127',
+ 'auctionId': '5ac67dff-d971-4b56-84a3-345a87a1f786',
+ 'src': 'client',
+ 'bidRequestsCount': 1
+ };
+ const timeoutData = {
+ 'bidId': bidId,
+ 'bidder': 'feedad',
+ 'adUnitCode': 'div-gpt-ad-1460505748561-0',
+ 'auctionId': auctionId,
+ 'params': [
+ {
+ 'clientToken': clientToken,
+ 'placementId': placementId
+ }
+ ],
+ 'timeout': 3000
+ };
+ const bidWonData = {
+ 'bidderCode': 'feedad',
+ 'width': 300,
+ 'height': 250,
+ 'statusMessage': 'Bid available',
+ 'adId': '3a4529aa05114d',
+ 'requestId': bidId,
+ 'mediaType': 'banner',
+ 'source': 'client',
+ 'cpm': 0.5,
+ 'ad': 'ad content',
+ 'ttl': 60,
+ 'creativeId': 'feedad-21-0',
+ 'netRevenue': true,
+ 'currency': 'EUR',
+ 'auctionId': auctionId,
+ 'responseTimestamp': 1558365914596,
+ 'requestTimestamp': 1558365914506,
+ 'bidder': 'feedad',
+ 'adUnitCode': 'div-gpt-ad-1460505748561-0',
+ 'timeToRespond': 90,
+ 'pbLg': '0.50',
+ 'pbMg': '0.50',
+ 'pbHg': '0.50',
+ 'pbAg': '0.50',
+ 'pbDg': '0.50',
+ 'pbCg': '',
+ 'size': '300x250',
+ 'adserverTargeting': {
+ 'hb_bidder': 'feedad',
+ 'hb_adid': '3a4529aa05114d',
+ 'hb_pb': '0.50',
+ 'hb_size': '300x250',
+ 'hb_source': 'client',
+ 'hb_format': 'banner'
+ },
+ 'status': 'rendered',
+ 'params': [
+ {
+ 'clientToken': clientToken,
+ 'placementId': placementId
+ }
+ ]
+ };
+ const cases = [
+ ['onTimeout', timeoutData, 'prebid_bidTimeout'],
+ ['onBidWon', bidWonData, 'prebid_bidWon'],
+ ];
+
+ cases.forEach(([name, data, eventKlass]) => {
+ let subject = spec[name];
+ describe(name + ' handler', function () {
+ let xhr;
+ let requests;
+
+ beforeEach(function () {
+ xhr = sinon.useFakeXMLHttpRequest();
+ requests = [];
+ xhr.onCreate = xhr => requests.push(xhr);
+ });
+
+ afterEach(function () {
+ xhr.restore();
+ });
+
+ it('should do nothing on empty data', function () {
+ subject(undefined);
+ subject(null);
+ expect(requests.length).to.equal(0);
+ });
+
+ it('should do nothing when bid metadata is not set', function () {
+ subject(data);
+ expect(requests.length).to.equal(0);
+ });
+
+ it('should send tracking params when correct metadata was set', function () {
+ spec.buildRequests([bid], bidderRequest);
+ let expectedData = {
+ app_hybrid: false,
+ client_token: clientToken,
+ placement_id: placementId,
+ klass: eventKlass,
+ prebid_auction_id: auctionId,
+ prebid_bid_id: bidId,
+ prebid_transaction_id: transactionId,
+ referer,
+ sdk_version: '1.0.0'
+ };
+ subject(data);
+ expect(requests.length).to.equal(1);
+ let call = requests[0];
+ expect(call.url).to.equal('https://api.feedad.com/1/prebid/web/events');
+ expect(JSON.parse(call.requestBody)).to.deep.equal(expectedData);
+ expect(call.method).to.equal('POST');
+ expect(call.requestHeaders).to.include({'Content-Type': 'application/json;charset=utf-8'});
+ })
+ });
+ });
+ });
+});
From 6e7eb3b81a2acf60e8c0171e10a520e5b2c11d7d Mon Sep 17 00:00:00 2001
From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com>
Date: Tue, 18 Jun 2019 12:04:44 -0400
Subject: [PATCH 017/285] Fix #3813 move auctionEnd events so it always
executes when auction completes (#3841)
* move auctionEnd events so it always executes
* remove some commented code
---
src/auction.js | 25 +++++++++++++------------
test/spec/auctionmanager_spec.js | 11 +++++++++--
2 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/src/auction.js b/src/auction.js
index 1d758997035..a1e8c33adfb 100644
--- a/src/auction.js
+++ b/src/auction.js
@@ -140,7 +140,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
clearTimeout(_timer);
}
- if (_callback != null) {
+ if (_auctionEnd === undefined) {
let timedOutBidders = [];
if (timedOut) {
utils.logMessage(`Auction ${_auctionId} timedOut`);
@@ -150,17 +150,19 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
}
}
- try {
- _auctionStatus = AUCTION_COMPLETED;
- _auctionEnd = Date.now();
-
- events.emit(CONSTANTS.EVENTS.AUCTION_END, getProperties());
+ _auctionStatus = AUCTION_COMPLETED;
+ _auctionEnd = Date.now();
- const adUnitCodes = _adUnitCodes;
- const bids = _bidsReceived
- .filter(utils.bind.call(adUnitsFilter, this, adUnitCodes))
- .reduce(groupByPlacement, {});
- _callback.apply($$PREBID_GLOBAL$$, [bids, timedOut]);
+ events.emit(CONSTANTS.EVENTS.AUCTION_END, getProperties());
+ try {
+ if (_callback != null) {
+ const adUnitCodes = _adUnitCodes;
+ const bids = _bidsReceived
+ .filter(utils.bind.call(adUnitsFilter, this, adUnitCodes))
+ .reduce(groupByPlacement, {});
+ _callback.apply($$PREBID_GLOBAL$$, [bids, timedOut]);
+ _callback = null;
+ }
} catch (e) {
utils.logError('Error executing bidsBackHandler', null, e);
} finally {
@@ -175,7 +177,6 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
syncUsers(userSyncConfig.syncDelay);
}
}
- _callback = null;
}
}
diff --git a/test/spec/auctionmanager_spec.js b/test/spec/auctionmanager_spec.js
index 2d8ee562ce4..577b1bec333 100644
--- a/test/spec/auctionmanager_spec.js
+++ b/test/spec/auctionmanager_spec.js
@@ -1,4 +1,4 @@
-import { getKeyValueTargetingPairs, auctionCallbacks } from 'src/auction';
+import { getKeyValueTargetingPairs, auctionCallbacks, AUCTION_COMPLETED } from 'src/auction';
import CONSTANTS from 'src/constants.json';
import { adjustBids } from 'src/auction';
import * as auctionModule from 'src/auction';
@@ -783,7 +783,8 @@ describe('auctionmanager.js', function () {
server.restore();
events.emit.restore();
});
- it('should emit BID_TIMEOUT for timed out bids', function (done) {
+
+ it('should emit BID_TIMEOUT and AUCTION_END for timed out bids', function (done) {
const spec1 = mockBidder(BIDDER_CODE, [bids[0]]);
registerBidder(spec1);
const spec2 = mockBidder(BIDDER_CODE1, [bids[1]]);
@@ -797,6 +798,12 @@ describe('auctionmanager.js', function () {
const timedOutBids = bidTimeoutCall.args[1];
assert.equal(timedOutBids.length, 1);
assert.equal(timedOutBids[0].bidder, BIDDER_CODE1);
+
+ const auctionEndCall = eventsEmitSpy.withArgs(CONSTANTS.EVENTS.AUCTION_END).getCalls()[0];
+ const auctionProps = auctionEndCall.args[1];
+ assert.equal(auctionProps.adUnits, adUnits);
+ assert.equal(auctionProps.timeout, 20);
+ assert.equal(auctionProps.auctionStatus, AUCTION_COMPLETED)
done();
}
auction = auctionModule.newAuction({adUnits, adUnitCodes, callback: auctionCallback, cbTimeout: 20});
From bd5f2a0f18990e21e29309f4dcbad3591b0b666b Mon Sep 17 00:00:00 2001
From: jsnellbaker <31102355+jsnellbaker@users.noreply.github.com>
Date: Tue, 18 Jun 2019 12:14:39 -0400
Subject: [PATCH 018/285] fix import paths for various adapters (#3921)
---
modules/advenueBidAdapter.js | 6 +++---
modules/bidphysicsBidAdapter.js | 2 +-
modules/cedatoBidAdapter.js | 6 +++---
modules/digiTrustIdSystem.js | 2 +-
modules/emx_digitalBidAdapter.js | 10 +++++-----
modules/imonomyBidAdapter.js | 4 ++--
modules/loopmeBidAdapter.js | 6 +++---
modules/mgidBidAdapter.js | 4 ++--
modules/microadBidAdapter.js | 4 ++--
modules/open8BidAdapter.js | 6 +++---
modules/otmBidAdapter.js | 4 ++--
modules/prebidmanagerAnalyticsAdapter.js | 4 ++--
modules/reklamstoreBidAdapter.js | 6 +++---
modules/slimcutBidAdapter.js | 6 +++---
modules/smartrtbBidAdapter.js | 4 ++--
modules/sortableAnalyticsAdapter.js | 14 +++++++-------
modules/timBidAdapter.js | 6 +++---
modules/yieldoneBidAdapter.js | 2 +-
18 files changed, 48 insertions(+), 48 deletions(-)
diff --git a/modules/advenueBidAdapter.js b/modules/advenueBidAdapter.js
index 3e7711cca0d..6dc5856eacb 100644
--- a/modules/advenueBidAdapter.js
+++ b/modules/advenueBidAdapter.js
@@ -1,6 +1,6 @@
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER, NATIVE, VIDEO } from 'src/mediaTypes';
-import * as utils from 'src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes';
+import * as utils from '../src/utils';
const BIDDER_CODE = 'advenue';
const URL_MULTI = '//ssp.advenuemedia.co.uk/?c=o&m=multi';
diff --git a/modules/bidphysicsBidAdapter.js b/modules/bidphysicsBidAdapter.js
index 260a473c631..9f1dc83d427 100644
--- a/modules/bidphysicsBidAdapter.js
+++ b/modules/bidphysicsBidAdapter.js
@@ -1,4 +1,4 @@
-import {registerBidder} from 'src/adapters/bidderFactory';
+import {registerBidder} from '../src/adapters/bidderFactory';
import * as utils from '../src/utils';
import {BANNER} from '../src/mediaTypes';
diff --git a/modules/cedatoBidAdapter.js b/modules/cedatoBidAdapter.js
index 78bb7b45c7b..c367c57fc25 100644
--- a/modules/cedatoBidAdapter.js
+++ b/modules/cedatoBidAdapter.js
@@ -1,6 +1,6 @@
-import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER } from 'src/mediaTypes';
+import * as utils from '../src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER } from '../src/mediaTypes';
const BIDDER_CODE = 'cedato';
const BID_URL = '//h.cedatoplayer.com/hb';
diff --git a/modules/digiTrustIdSystem.js b/modules/digiTrustIdSystem.js
index 07792cc49d3..454e6864846 100644
--- a/modules/digiTrustIdSystem.js
+++ b/modules/digiTrustIdSystem.js
@@ -11,7 +11,7 @@
// import { config } from 'src/config';
import * as utils from '../src/utils'
-import { ajax } from 'src/ajax';
+import { ajax } from '../src/ajax';
import { attachIdSystem } from '../modules/userId';
// import { getGlobal } from 'src/prebidGlobal';
diff --git a/modules/emx_digitalBidAdapter.js b/modules/emx_digitalBidAdapter.js
index 75ce47aae0a..69e02d5c860 100644
--- a/modules/emx_digitalBidAdapter.js
+++ b/modules/emx_digitalBidAdapter.js
@@ -1,8 +1,8 @@
-import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER, VIDEO } from 'src/mediaTypes';
-import { config } from 'src/config';
-import { Renderer } from 'src/Renderer';
+import * as utils from '../src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER, VIDEO } from '../src/mediaTypes';
+import { config } from '../src/config';
+import { Renderer } from '../src/Renderer';
import includes from 'core-js/library/fn/array/includes';
const BIDDER_CODE = 'emx_digital';
diff --git a/modules/imonomyBidAdapter.js b/modules/imonomyBidAdapter.js
index fa3ad0cfea2..9a0d29a1374 100644
--- a/modules/imonomyBidAdapter.js
+++ b/modules/imonomyBidAdapter.js
@@ -1,5 +1,5 @@
-import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
+import * as utils from '../src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'imonomy';
const ENDPOINT = '//b.imonomy.com/openrtb/hb/00000';
diff --git a/modules/loopmeBidAdapter.js b/modules/loopmeBidAdapter.js
index fb2f891d3b0..fcfe1fd0687 100644
--- a/modules/loopmeBidAdapter.js
+++ b/modules/loopmeBidAdapter.js
@@ -1,6 +1,6 @@
-import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER } from 'src/mediaTypes';
+import * as utils from '../src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER } from '../src/mediaTypes';
const LOOPME_ENDPOINT = 'https://loopme.me/api/hb';
diff --git a/modules/mgidBidAdapter.js b/modules/mgidBidAdapter.js
index e1b15ef4b51..c6744d28f45 100644
--- a/modules/mgidBidAdapter.js
+++ b/modules/mgidBidAdapter.js
@@ -1,7 +1,7 @@
-import {registerBidder} from 'src/adapters/bidderFactory';
+import {registerBidder} from '../src/adapters/bidderFactory';
import * as utils from '../src/utils';
import * as urlUtils from '../src/url';
-import {BANNER, NATIVE} from 'src/mediaTypes';
+import {BANNER, NATIVE} from '../src/mediaTypes';
import {config} from '../src/config';
const DEFAULT_CUR = 'USD';
const BIDDER_CODE = 'mgid';
diff --git a/modules/microadBidAdapter.js b/modules/microadBidAdapter.js
index d42e4053fda..391be2c465b 100644
--- a/modules/microadBidAdapter.js
+++ b/modules/microadBidAdapter.js
@@ -1,5 +1,5 @@
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER } from 'src/mediaTypes';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER } from '../src/mediaTypes';
const BIDDER_CODE = 'microad';
diff --git a/modules/open8BidAdapter.js b/modules/open8BidAdapter.js
index be616d0ec30..3c2b94a528a 100644
--- a/modules/open8BidAdapter.js
+++ b/modules/open8BidAdapter.js
@@ -1,8 +1,8 @@
-import { Renderer } from 'src/Renderer';
+import { Renderer } from '../src/Renderer';
import {ajax} from '../src/ajax';
import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { VIDEO, BANNER } from 'src/mediaTypes';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { VIDEO, BANNER } from '../src/mediaTypes';
const BIDDER_CODE = 'open8';
const URL = '//as.vt.open8.com/v1/control/prebid';
diff --git a/modules/otmBidAdapter.js b/modules/otmBidAdapter.js
index 57ac414c7b6..ddb4d356f5c 100644
--- a/modules/otmBidAdapter.js
+++ b/modules/otmBidAdapter.js
@@ -1,5 +1,5 @@
-import {BANNER} from 'src/mediaTypes';
-import {registerBidder} from 'src/adapters/bidderFactory';
+import {BANNER} from '../src/mediaTypes';
+import {registerBidder} from '../src/adapters/bidderFactory';
export const spec = {
code: 'otm',
diff --git a/modules/prebidmanagerAnalyticsAdapter.js b/modules/prebidmanagerAnalyticsAdapter.js
index eb9ad344253..f3474abe95a 100644
--- a/modules/prebidmanagerAnalyticsAdapter.js
+++ b/modules/prebidmanagerAnalyticsAdapter.js
@@ -9,8 +9,8 @@ const DEFAULT_EVENT_URL = 'https://endpoint.prebidmanager.com/endpoint'
const analyticsType = 'endpoint';
const analyticsName = 'Prebid Manager Analytics: ';
-var utils = require('src/utils');
-var CONSTANTS = require('src/constants.json');
+var utils = require('../src/utils');
+var CONSTANTS = require('../src/constants.json');
let ajax = ajaxBuilder(0);
var _VERSION = 1;
diff --git a/modules/reklamstoreBidAdapter.js b/modules/reklamstoreBidAdapter.js
index 49f08ab0473..2a659ec0f07 100644
--- a/modules/reklamstoreBidAdapter.js
+++ b/modules/reklamstoreBidAdapter.js
@@ -1,6 +1,6 @@
-import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER } from 'src/mediaTypes';
+import * as utils from '../src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER } from '../src/mediaTypes';
const BIDDER_CODE = 'reklamstore';
const ENDPOINT_URL = '//ads.rekmob.com/m/prebid';
diff --git a/modules/slimcutBidAdapter.js b/modules/slimcutBidAdapter.js
index def490d6ab9..1f52e2cbc30 100644
--- a/modules/slimcutBidAdapter.js
+++ b/modules/slimcutBidAdapter.js
@@ -1,6 +1,6 @@
-import * as utils from 'src/utils';
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { ajax } from 'src/ajax';
+import * as utils from '../src/utils';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { ajax } from '../src/ajax';
const BIDDER_CODE = 'slimcut';
const ENDPOINT_URL = '//sb.freeskreen.com/pbr';
diff --git a/modules/smartrtbBidAdapter.js b/modules/smartrtbBidAdapter.js
index 561ce58e016..1cdef1c474b 100644
--- a/modules/smartrtbBidAdapter.js
+++ b/modules/smartrtbBidAdapter.js
@@ -1,5 +1,5 @@
-import * as utils from 'src/utils';
-import {registerBidder} from 'src/adapters/bidderFactory';
+import * as utils from '../src/utils';
+import {registerBidder} from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'smartrtb';
function getDomain () {
diff --git a/modules/sortableAnalyticsAdapter.js b/modules/sortableAnalyticsAdapter.js
index 4682dc09b49..17458065f9a 100644
--- a/modules/sortableAnalyticsAdapter.js
+++ b/modules/sortableAnalyticsAdapter.js
@@ -1,10 +1,10 @@
-import adapter from 'src/AnalyticsAdapter';
-import CONSTANTS from 'src/constants.json';
-import adapterManager from 'src/adapterManager';
-import * as utils from 'src/utils';
-import {ajax} from 'src/ajax';
-import {getGlobal} from 'src/prebidGlobal';
-import { config } from 'src/config';
+import adapter from '../src/AnalyticsAdapter';
+import CONSTANTS from '../src/constants.json';
+import adapterManager from '../src/adapterManager';
+import * as utils from '../src/utils';
+import {ajax} from '../src/ajax';
+import {getGlobal} from '../src/prebidGlobal';
+import { config } from '../src/config';
const DEFAULT_PROTOCOL = 'https';
const DEFAULT_HOST = 'pa.deployads.com';
diff --git a/modules/timBidAdapter.js b/modules/timBidAdapter.js
index 0539f37deef..449254671f4 100644
--- a/modules/timBidAdapter.js
+++ b/modules/timBidAdapter.js
@@ -1,7 +1,7 @@
-import * as utils from 'src/utils';
-import {registerBidder} from 'src/adapters/bidderFactory';
+import * as utils from '../src/utils';
+import {registerBidder} from '../src/adapters/bidderFactory';
import * as bidfactory from '../src/bidfactory';
-var CONSTANTS = require('src/constants.json');
+var CONSTANTS = require('../src/constants.json');
const BIDDER_CODE = 'tim';
function parseBidRequest(bidRequest) {
diff --git a/modules/yieldoneBidAdapter.js b/modules/yieldoneBidAdapter.js
index 1e6abf22838..1caf44e790f 100644
--- a/modules/yieldoneBidAdapter.js
+++ b/modules/yieldoneBidAdapter.js
@@ -1,7 +1,7 @@
import * as utils from '../src/utils';
import {config} from '../src/config';
import {registerBidder} from '../src/adapters/bidderFactory';
-import { Renderer } from 'src/Renderer';
+import { Renderer } from '../src/Renderer';
import { BANNER, VIDEO } from '../src/mediaTypes';
const BIDDER_CODE = 'yieldone';
From e53dad0fedbcca91dffc31279551955e8bdc9595 Mon Sep 17 00:00:00 2001
From: Rich Snapp
Date: Tue, 18 Jun 2019 10:49:40 -0600
Subject: [PATCH 019/285] add --analyze arg for webpack bundle analyzing
(#3914)
---
package-lock.json | 517 ++++++++++++++++++++++++++++++++++++++++------
package.json | 1 +
webpack.conf.js | 35 ++--
3 files changed, 482 insertions(+), 71 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d313ff22ea0..199aff8c33b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.16.0-pre",
+ "version": "2.20.0-pre",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -922,6 +922,12 @@
}
}
},
+ "acorn-walk": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
+ "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
+ "dev": true
+ },
"after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
@@ -1194,6 +1200,12 @@
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
"dev": true
},
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
"array-from": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
@@ -2670,6 +2682,18 @@
"callsite": "1.0.0"
}
},
+ "bfj": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz",
+ "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.1",
+ "check-types": "^7.3.0",
+ "hoopy": "^0.1.2",
+ "tryer": "^1.0.0"
+ }
+ },
"big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
@@ -3108,7 +3132,7 @@
},
"query-string": {
"version": "5.1.1",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+ "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
"integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
"dev": true,
"requires": {
@@ -3262,6 +3286,12 @@
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
"dev": true
},
+ "check-types": {
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz",
+ "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==",
+ "dev": true
+ },
"chokidar": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz",
@@ -3480,7 +3510,7 @@
},
"commander": {
"version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
},
@@ -3622,6 +3652,15 @@
"integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
"dev": true
},
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
@@ -3649,6 +3688,12 @@
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
"dev": true
},
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
"copy-descriptor": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
@@ -4534,6 +4579,12 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true
},
+ "ejs": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+ "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+ "dev": true
+ },
"electron-to-chromium": {
"version": "1.3.124",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz",
@@ -4585,7 +4636,7 @@
"engine.io": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
- "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==",
+ "integrity": "sha1-tgKBw1SEpw7gNR6g6/+D7IyVIqI=",
"dev": true,
"requires": {
"accepts": "~1.3.4",
@@ -4599,7 +4650,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -4615,7 +4666,7 @@
},
"engine.io-client": {
"version": "3.2.1",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
+ "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
"integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
"dev": true,
"requires": {
@@ -4635,7 +4686,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -5326,7 +5377,7 @@
},
"event-stream": {
"version": "3.3.4",
- "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+ "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
"dev": true,
"requires": {
@@ -5535,6 +5586,249 @@
"homedir-polyfill": "^1.0.1"
}
},
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ }
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ }
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.40.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ }
+ }
+ },
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -5733,6 +6027,12 @@
"minimatch": "^3.0.3"
}
},
+ "filesize": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+ "dev": true
+ },
"fill-range": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@@ -5865,7 +6165,7 @@
"flatted": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
- "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
+ "integrity": "sha1-VRIrZTbqSWtLRIk+4mCBQdENmRY=",
"dev": true
},
"flush-write-stream": {
@@ -5951,6 +6251,12 @@
"samsam": "~1.1"
}
},
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -6074,8 +6380,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true,
- "optional": true
+ "dev": true
},
"aproba": {
"version": "1.2.0",
@@ -6099,15 +6404,13 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true,
- "optional": true
+ "dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -6124,22 +6427,19 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true,
- "optional": true
+ "dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true,
- "optional": true
+ "dev": true
},
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "dev": true,
- "optional": true
+ "dev": true
},
"core-util-is": {
"version": "1.0.2",
@@ -6270,8 +6570,7 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true,
- "optional": true
+ "dev": true
},
"ini": {
"version": "1.3.5",
@@ -6285,7 +6584,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
- "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -6302,7 +6600,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
- "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -6311,15 +6608,13 @@
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true,
- "optional": true
+ "dev": true
},
"minipass": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
"integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
"dev": true,
- "optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -6340,7 +6635,6 @@
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
- "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -6429,8 +6723,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true,
- "optional": true
+ "dev": true
},
"object-assign": {
"version": "4.1.1",
@@ -6444,7 +6737,6 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
- "optional": true,
"requires": {
"wrappy": "1"
}
@@ -6540,8 +6832,7 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "optional": true
+ "dev": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -6583,7 +6874,6 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
- "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -6605,7 +6895,6 @@
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
- "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -6654,15 +6943,13 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true,
- "optional": true
+ "dev": true
},
"yallist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
"integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
- "dev": true,
- "optional": true
+ "dev": true
}
}
},
@@ -7337,7 +7624,7 @@
"gulp-connect": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.7.0.tgz",
- "integrity": "sha512-8tRcC6wgXMLakpPw9M7GRJIhxkYdgZsXwn7n56BA2bQYGLR9NOPhMzx7js+qYDy6vhNkbApGKURjAw1FjY4pNA==",
+ "integrity": "sha1-fpJfXkw06/7fnzGFdpZuj+iEDVo=",
"dev": true,
"requires": {
"ansi-colors": "^2.0.5",
@@ -7354,7 +7641,7 @@
"ansi-colors": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-2.0.5.tgz",
- "integrity": "sha512-yAdfUZ+c2wetVNIFsNRn44THW+Lty6S5TwMpUfLA/UaGhiXbBv/F8E60/1hMLd0cnF/CDoWH8vzVaI5bAcHCjw==",
+ "integrity": "sha1-XaN4Jf7z51872kf3YNZL/RDhXhA=",
"dev": true
}
}
@@ -7764,6 +8051,16 @@
"glogg": "^1.0.0"
}
},
+ "gzip-size": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+ "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+ "dev": true,
+ "requires": {
+ "duplexer": "^0.1.1",
+ "pify": "^4.0.1"
+ }
+ },
"handlebars": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz",
@@ -8037,6 +8334,12 @@
"parse-passwd": "^1.0.0"
}
},
+ "hoopy": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+ "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+ "dev": true
+ },
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
@@ -8057,7 +8360,7 @@
},
"http-errors": {
"version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"dev": true,
"requires": {
@@ -8286,6 +8589,12 @@
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
"dev": true
},
+ "ipaddr.js": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+ "dev": true
+ },
"is-absolute": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
@@ -9053,7 +9362,7 @@
"karma": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz",
- "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==",
+ "integrity": "sha1-OJDKlyKxDR0UtybhM1kxRVeISZ4=",
"dev": true,
"requires": {
"bluebird": "^3.3.0",
@@ -9678,7 +9987,7 @@
"log4js": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz",
- "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==",
+ "integrity": "sha1-5srO2Uln7uuc45n5+GgqSysoyP8=",
"dev": true,
"requires": {
"circular-json": "^0.5.5",
@@ -9691,7 +10000,7 @@
"circular-json": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
- "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==",
+ "integrity": "sha1-kydjroj0996teg0JyKUaR0OlOx0=",
"dev": true
},
"debug": {
@@ -10132,6 +10441,12 @@
}
}
},
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
"merge-stream": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
@@ -10141,6 +10456,12 @@
"readable-stream": "^2.0.1"
}
},
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
"micromatch": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -10228,7 +10549,7 @@
},
"minimist": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
@@ -10264,7 +10585,7 @@
"dependencies": {
"minimist": {
"version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
}
@@ -10851,6 +11172,12 @@
"mimic-fn": "^1.0.0"
}
},
+ "opener": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
+ "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
+ "dev": true
+ },
"opn": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
@@ -10872,7 +11199,7 @@
"dependencies": {
"minimist": {
"version": "0.0.10",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
"dev": true
},
@@ -11433,6 +11760,16 @@
"integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==",
"dev": true
},
+ "proxy-addr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+ "dev": true,
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.0"
+ }
+ },
"prr": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -12145,7 +12482,7 @@
"rfdc": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
- "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==",
+ "integrity": "sha1-5uctdPXcOd6PU49l4Aw2wYAY40k=",
"dev": true
},
"rgb2hex": {
@@ -12614,7 +12951,7 @@
"socket.io": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
- "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==",
+ "integrity": "sha1-oGnF/qvuPmshSnW0DOBlLhz7mYA=",
"dev": true,
"requires": {
"debug": "~3.1.0",
@@ -12628,7 +12965,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -12651,7 +12988,7 @@
"socket.io-client": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
- "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
+ "integrity": "sha1-3LOBA0NqtFeN2wJmOK4vIbYjZx8=",
"dev": true,
"requires": {
"backo2": "1.0.2",
@@ -12673,7 +13010,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -12689,7 +13026,7 @@
},
"socket.io-parser": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
+ "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
"integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
"dev": true,
"requires": {
@@ -12701,7 +13038,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -12819,7 +13156,7 @@
},
"split": {
"version": "0.3.3",
- "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+ "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz",
"integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
"dev": true,
"requires": {
@@ -12953,7 +13290,7 @@
},
"stream-combiner": {
"version": "0.0.4",
- "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+ "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
"integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
"dev": true,
"requires": {
@@ -13420,6 +13757,12 @@
"through2": "^2.0.3"
}
},
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "dev": true
+ },
"tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
@@ -13474,6 +13817,12 @@
"integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==",
"dev": true
},
+ "tryer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+ "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+ "dev": true
+ },
"tty-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
@@ -13954,7 +14303,7 @@
"useragent": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
- "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
+ "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=",
"dev": true,
"requires": {
"lru-cache": "4.1.x",
@@ -14023,6 +14372,12 @@
"integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
"dev": true
},
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -14565,6 +14920,50 @@
}
}
},
+ "webpack-bundle-analyzer": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz",
+ "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^6.0.7",
+ "acorn-walk": "^6.1.1",
+ "bfj": "^6.1.1",
+ "chalk": "^2.4.1",
+ "commander": "^2.18.0",
+ "ejs": "^2.6.1",
+ "express": "^4.16.3",
+ "filesize": "^3.6.1",
+ "gzip-size": "^5.0.0",
+ "lodash": "^4.17.10",
+ "mkdirp": "^0.5.1",
+ "opener": "^1.5.1",
+ "ws": "^6.0.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
+ "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "dev": true
+ },
+ "ws": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "~1.0.0"
+ }
+ }
+ }
+ },
"webpack-core": {
"version": "0.6.9",
"resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz",
@@ -14594,7 +14993,7 @@
},
"webpack-dev-middleware": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz",
+ "resolved": "http://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz",
"integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==",
"dev": true,
"requires": {
diff --git a/package.json b/package.json
index 4a3d8b2c959..11d5ee5901f 100755
--- a/package.json
+++ b/package.json
@@ -88,6 +88,7 @@
"wdio-spec-reporter": "^0.1.5",
"webdriverio": "^4.13.2",
"webpack": "^3.0.0",
+ "webpack-bundle-analyzer": "^3.3.2",
"webpack-stream": "^3.2.0",
"yargs": "^1.3.1"
},
diff --git a/webpack.conf.js b/webpack.conf.js
index 9518b972b1b..61cdf82df32 100644
--- a/webpack.conf.js
+++ b/webpack.conf.js
@@ -3,12 +3,34 @@ var path = require('path');
var webpack = require('webpack');
var helpers = require('./gulpHelpers');
var RequireEnsureWithoutJsonp = require('./plugins/RequireEnsureWithoutJsonp.js');
+var { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
+var argv = require('yargs').argv;
// list of module names to never include in the common bundle chunk
var neverBundle = [
'AnalyticsAdapter.js'
];
+var plugins = [
+ new RequireEnsureWithoutJsonp()
+];
+
+if (argv.analyze) {
+ plugins.push(
+ new BundleAnalyzerPlugin()
+ )
+}
+
+plugins.push( // this plugin must be last so it can be easily removed for karma unit tests
+ new webpack.optimize.CommonsChunkPlugin({
+ name: 'prebid',
+ filename: 'prebid-core.js',
+ minChunks: function(module, count) {
+ return !(count < 2 || neverBundle.indexOf(path.basename(module.resource)) !== -1)
+ }
+ })
+);
+
module.exports = {
devtool: 'source-map',
resolve: {
@@ -43,16 +65,5 @@ module.exports = {
}
]
},
- plugins: [
- new RequireEnsureWithoutJsonp(),
-
- // this plugin must be last so it can be easily removed for karma unit tests
- new webpack.optimize.CommonsChunkPlugin({
- name: 'prebid',
- filename: 'prebid-core.js',
- minChunks: function(module, count) {
- return !(count < 2 || neverBundle.indexOf(path.basename(module.resource)) !== -1)
- }
- })
- ]
+ plugins
};
From f6239dea8941c957169e31ea62d1723645a0a741 Mon Sep 17 00:00:00 2001
From: Michael Rooke
Date: Tue, 18 Jun 2019 12:50:17 -0400
Subject: [PATCH 020/285] Standardize permission bits (#3872)
* Standardize the perimssion bits used for modules
- Most adapters use 664 (i.e. read/write, but are not executable), but some use 775. Make all adapters use 664.
* Update link in documentation
---
CONTRIBUTING.md | 2 +-
modules/advangelistsBidAdapter.js | 0
modules/advangelistsBidAdapter.md | 0
modules/cpmstarBidAdapter.js | 0
modules/cpmstarBidAdapter.md | 0
modules/criteoBidAdapter.js | 0
modules/criteoBidAdapter.md | 0
modules/danmarketBidAdapter.md | 0
modules/fairtradeBidAdapter.md | 0
modules/gridBidAdapter.md | 0
modules/gxoneBidAdapter.md | 0
modules/oneVideoBidAdapter.md | 0
modules/saraBidAdapter.md | 0
modules/sekindoUMBidAdapter.md | 0
modules/supply2BidAdapter.md | 0
modules/trustxBidAdapter.md | 0
modules/visxBidAdapter.js | 0
modules/visxBidAdapter.md | 0
18 files changed, 1 insertion(+), 1 deletion(-)
mode change 100755 => 100644 modules/advangelistsBidAdapter.js
mode change 100755 => 100644 modules/advangelistsBidAdapter.md
mode change 100755 => 100644 modules/cpmstarBidAdapter.js
mode change 100755 => 100644 modules/cpmstarBidAdapter.md
mode change 100755 => 100644 modules/criteoBidAdapter.js
mode change 100755 => 100644 modules/criteoBidAdapter.md
mode change 100755 => 100644 modules/danmarketBidAdapter.md
mode change 100755 => 100644 modules/fairtradeBidAdapter.md
mode change 100755 => 100644 modules/gridBidAdapter.md
mode change 100755 => 100644 modules/gxoneBidAdapter.md
mode change 100755 => 100644 modules/oneVideoBidAdapter.md
mode change 100755 => 100644 modules/saraBidAdapter.md
mode change 100755 => 100644 modules/sekindoUMBidAdapter.md
mode change 100755 => 100644 modules/supply2BidAdapter.md
mode change 100755 => 100644 modules/trustxBidAdapter.md
mode change 100755 => 100644 modules/visxBidAdapter.js
mode change 100755 => 100644 modules/visxBidAdapter.md
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b82b249fa36..9c00a2bf51a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,7 +4,7 @@ commit your changes, and [open a pull request](https://help.github.com/articles/
master branch.
Pull requests must have 80% code coverage before beign considered for merge.
-Additional details about the process can be found [here](./pr_review.md).
+Additional details about the process can be found [here](./PR_REVIEW.md).
## Issues
[prebid.org](http://prebid.org/) contains documentation that may help answer questions you have about using Prebid.js.
diff --git a/modules/advangelistsBidAdapter.js b/modules/advangelistsBidAdapter.js
old mode 100755
new mode 100644
diff --git a/modules/advangelistsBidAdapter.md b/modules/advangelistsBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/cpmstarBidAdapter.js b/modules/cpmstarBidAdapter.js
old mode 100755
new mode 100644
diff --git a/modules/cpmstarBidAdapter.md b/modules/cpmstarBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/criteoBidAdapter.js b/modules/criteoBidAdapter.js
old mode 100755
new mode 100644
diff --git a/modules/criteoBidAdapter.md b/modules/criteoBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/danmarketBidAdapter.md b/modules/danmarketBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/fairtradeBidAdapter.md b/modules/fairtradeBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/gridBidAdapter.md b/modules/gridBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/gxoneBidAdapter.md b/modules/gxoneBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/oneVideoBidAdapter.md b/modules/oneVideoBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/saraBidAdapter.md b/modules/saraBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/sekindoUMBidAdapter.md b/modules/sekindoUMBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/supply2BidAdapter.md b/modules/supply2BidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/trustxBidAdapter.md b/modules/trustxBidAdapter.md
old mode 100755
new mode 100644
diff --git a/modules/visxBidAdapter.js b/modules/visxBidAdapter.js
old mode 100755
new mode 100644
diff --git a/modules/visxBidAdapter.md b/modules/visxBidAdapter.md
old mode 100755
new mode 100644
From 6baa819e85a92a907b641b10b9e8f17ae04d68ad Mon Sep 17 00:00:00 2001
From: Jason Snellbaker
Date: Tue, 18 Jun 2019 15:45:48 -0400
Subject: [PATCH 021/285] Prebid 2.20.0 release
---
package-lock.json | 2933 +++++++++++++++++++++++++++------------------
package.json | 2 +-
2 files changed, 1758 insertions(+), 1177 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 199aff8c33b..4c03303a050 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.20.0-pre",
+ "version": "2.20.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -14,18 +14,18 @@
}
},
"@babel/core": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz",
- "integrity": "sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz",
+ "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.4.0",
- "@babel/helpers": "^7.4.3",
- "@babel/parser": "^7.4.3",
- "@babel/template": "^7.4.0",
- "@babel/traverse": "^7.4.3",
- "@babel/types": "^7.4.0",
+ "@babel/generator": "^7.4.4",
+ "@babel/helpers": "^7.4.4",
+ "@babel/parser": "^7.4.5",
+ "@babel/template": "^7.4.4",
+ "@babel/traverse": "^7.4.5",
+ "@babel/types": "^7.4.4",
"convert-source-map": "^1.1.0",
"debug": "^4.1.0",
"json5": "^2.1.0",
@@ -36,12 +36,12 @@
}
},
"@babel/generator": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz",
- "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz",
+ "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.4.0",
+ "@babel/types": "^7.4.4",
"jsesc": "^2.5.1",
"lodash": "^4.17.11",
"source-map": "^0.5.0",
@@ -68,24 +68,24 @@
}
},
"@babel/helper-call-delegate": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz",
- "integrity": "sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
+ "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.4.0",
- "@babel/traverse": "^7.4.0",
- "@babel/types": "^7.4.0"
+ "@babel/helper-hoist-variables": "^7.4.4",
+ "@babel/traverse": "^7.4.4",
+ "@babel/types": "^7.4.4"
}
},
"@babel/helper-define-map": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz",
- "integrity": "sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz",
+ "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==",
"dev": true,
"requires": {
"@babel/helper-function-name": "^7.1.0",
- "@babel/types": "^7.4.0",
+ "@babel/types": "^7.4.4",
"lodash": "^4.17.11"
}
},
@@ -120,12 +120,12 @@
}
},
"@babel/helper-hoist-variables": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz",
- "integrity": "sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
+ "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
"dev": true,
"requires": {
- "@babel/types": "^7.4.0"
+ "@babel/types": "^7.4.4"
}
},
"@babel/helper-member-expression-to-functions": {
@@ -147,16 +147,16 @@
}
},
"@babel/helper-module-transforms": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.3.tgz",
- "integrity": "sha512-H88T9IySZW25anu5uqyaC1DaQre7ofM+joZtAaO2F8NBdFfupH0SZ4gKjgSFVcvtx/aAirqA9L9Clio2heYbZA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz",
+ "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/helper-simple-access": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.0.0",
- "@babel/template": "^7.2.2",
- "@babel/types": "^7.2.2",
+ "@babel/helper-split-export-declaration": "^7.4.4",
+ "@babel/template": "^7.4.4",
+ "@babel/types": "^7.4.4",
"lodash": "^4.17.11"
}
},
@@ -176,9 +176,9 @@
"dev": true
},
"@babel/helper-regex": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.3.tgz",
- "integrity": "sha512-hnoq5u96pLCfgjXuj8ZLX3QQ+6nAulS+zSgi6HulUwFbEruRAKwbGLU5OvXkE14L8XW6XsQEKsIDfgthKLRAyA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz",
+ "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==",
"dev": true,
"requires": {
"lodash": "^4.17.11"
@@ -198,15 +198,15 @@
}
},
"@babel/helper-replace-supers": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz",
- "integrity": "sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz",
+ "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==",
"dev": true,
"requires": {
"@babel/helper-member-expression-to-functions": "^7.0.0",
"@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/traverse": "^7.4.0",
- "@babel/types": "^7.4.0"
+ "@babel/traverse": "^7.4.4",
+ "@babel/types": "^7.4.4"
}
},
"@babel/helper-simple-access": {
@@ -220,12 +220,12 @@
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz",
- "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
+ "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
"dev": true,
"requires": {
- "@babel/types": "^7.4.0"
+ "@babel/types": "^7.4.4"
}
},
"@babel/helper-wrap-function": {
@@ -241,14 +241,14 @@
}
},
"@babel/helpers": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.3.tgz",
- "integrity": "sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz",
+ "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==",
"dev": true,
"requires": {
- "@babel/template": "^7.4.0",
- "@babel/traverse": "^7.4.3",
- "@babel/types": "^7.4.0"
+ "@babel/template": "^7.4.4",
+ "@babel/traverse": "^7.4.4",
+ "@babel/types": "^7.4.4"
}
},
"@babel/highlight": {
@@ -263,9 +263,9 @@
}
},
"@babel/parser": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz",
- "integrity": "sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz",
+ "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==",
"dev": true
},
"@babel/plugin-proposal-async-generator-functions": {
@@ -290,9 +290,9 @@
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz",
- "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz",
+ "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
@@ -310,13 +310,13 @@
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz",
- "integrity": "sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz",
+ "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.0.0",
+ "@babel/helper-regex": "^7.4.4",
"regexpu-core": "^4.5.4"
}
},
@@ -366,9 +366,9 @@
}
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz",
- "integrity": "sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz",
+ "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
@@ -386,9 +386,9 @@
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz",
- "integrity": "sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz",
+ "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
@@ -396,18 +396,18 @@
}
},
"@babel/plugin-transform-classes": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz",
- "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz",
+ "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==",
"dev": true,
"requires": {
"@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-define-map": "^7.4.0",
+ "@babel/helper-define-map": "^7.4.4",
"@babel/helper-function-name": "^7.1.0",
"@babel/helper-optimise-call-expression": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.4.0",
- "@babel/helper-split-export-declaration": "^7.4.0",
+ "@babel/helper-replace-supers": "^7.4.4",
+ "@babel/helper-split-export-declaration": "^7.4.4",
"globals": "^11.1.0"
}
},
@@ -421,22 +421,22 @@
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz",
- "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz",
+ "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-dotall-regex": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.3.tgz",
- "integrity": "sha512-9Arc2I0AGynzXRR/oPdSALv3k0rM38IMFyto7kOCwb5F9sLUt2Ykdo3V9yUPR+Bgr4kb6bVEyLkPEiBhzcTeoA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz",
+ "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.3",
+ "@babel/helper-regex": "^7.4.4",
"regexpu-core": "^4.5.4"
}
},
@@ -460,18 +460,18 @@
}
},
"@babel/plugin-transform-for-of": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.3.tgz",
- "integrity": "sha512-UselcZPwVWNSURnqcfpnxtMehrb8wjXYOimlYQPBnup/Zld426YzIhNEvuRsEWVHfESIECGrxoI6L5QqzuLH5Q==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
+ "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-function-name": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.3.tgz",
- "integrity": "sha512-uT5J/3qI/8vACBR9I1GlAuU/JqBtWdfCrynuOkrWG6nCDieZd5przB1vfP59FRHBZQ9DC2IUfqr/xKqzOD5x0A==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
+ "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
"dev": true,
"requires": {
"@babel/helper-function-name": "^7.1.0",
@@ -507,23 +507,23 @@
}
},
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.3.tgz",
- "integrity": "sha512-sMP4JqOTbMJMimqsSZwYWsMjppD+KRyDIUVW91pd7td0dZKAvPmhCaxhOzkzLParKwgQc7bdL9UNv+rpJB0HfA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz",
+ "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.4.3",
+ "@babel/helper-module-transforms": "^7.4.4",
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/helper-simple-access": "^7.1.0"
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz",
- "integrity": "sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz",
+ "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.4.0",
+ "@babel/helper-hoist-variables": "^7.4.4",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
@@ -538,18 +538,18 @@
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz",
- "integrity": "sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz",
+ "integrity": "sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==",
"dev": true,
"requires": {
- "regexp-tree": "^0.1.0"
+ "regexp-tree": "^0.1.6"
}
},
"@babel/plugin-transform-new-target": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz",
- "integrity": "sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
+ "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
@@ -566,12 +566,12 @@
}
},
"@babel/plugin-transform-parameters": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.3.tgz",
- "integrity": "sha512-ULJYC2Vnw96/zdotCZkMGr2QVfKpIT/4/K+xWWY0MbOJyMZuk660BGkr3bEKWQrrciwz6xpmft39nA4BF7hJuA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
+ "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
"dev": true,
"requires": {
- "@babel/helper-call-delegate": "^7.4.0",
+ "@babel/helper-call-delegate": "^7.4.4",
"@babel/helper-get-function-arity": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0"
}
@@ -586,12 +586,12 @@
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.3.tgz",
- "integrity": "sha512-kEzotPuOpv6/iSlHroCDydPkKYw7tiJGKlmYp6iJn4a6C/+b2FdttlJsLKYxolYHgotTJ5G5UY5h0qey5ka3+A==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
+ "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
"dev": true,
"requires": {
- "regenerator-transform": "^0.13.4"
+ "regenerator-transform": "^0.14.0"
}
},
"@babel/plugin-transform-reserved-words": {
@@ -632,9 +632,9 @@
}
},
"@babel/plugin-transform-template-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz",
- "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
+ "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
"dev": true,
"requires": {
"@babel/helper-annotate-as-pure": "^7.0.0",
@@ -651,104 +651,104 @@
}
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.3.tgz",
- "integrity": "sha512-lnSNgkVjL8EMtnE8eSS7t2ku8qvKH3eqNf/IwIfnSPUqzgqYmRwzdsQWv4mNQAN9Nuo6Gz1Y0a4CSmdpu1Pp6g==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz",
+ "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.4.3",
+ "@babel/helper-regex": "^7.4.4",
"regexpu-core": "^4.5.4"
}
},
"@babel/preset-env": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz",
- "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz",
+ "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/plugin-proposal-async-generator-functions": "^7.2.0",
"@babel/plugin-proposal-json-strings": "^7.2.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.4.3",
+ "@babel/plugin-proposal-object-rest-spread": "^7.4.4",
"@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
"@babel/plugin-syntax-async-generators": "^7.2.0",
"@babel/plugin-syntax-json-strings": "^7.2.0",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0",
"@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
"@babel/plugin-transform-arrow-functions": "^7.2.0",
- "@babel/plugin-transform-async-to-generator": "^7.4.0",
+ "@babel/plugin-transform-async-to-generator": "^7.4.4",
"@babel/plugin-transform-block-scoped-functions": "^7.2.0",
- "@babel/plugin-transform-block-scoping": "^7.4.0",
- "@babel/plugin-transform-classes": "^7.4.3",
+ "@babel/plugin-transform-block-scoping": "^7.4.4",
+ "@babel/plugin-transform-classes": "^7.4.4",
"@babel/plugin-transform-computed-properties": "^7.2.0",
- "@babel/plugin-transform-destructuring": "^7.4.3",
- "@babel/plugin-transform-dotall-regex": "^7.4.3",
+ "@babel/plugin-transform-destructuring": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
"@babel/plugin-transform-duplicate-keys": "^7.2.0",
"@babel/plugin-transform-exponentiation-operator": "^7.2.0",
- "@babel/plugin-transform-for-of": "^7.4.3",
- "@babel/plugin-transform-function-name": "^7.4.3",
+ "@babel/plugin-transform-for-of": "^7.4.4",
+ "@babel/plugin-transform-function-name": "^7.4.4",
"@babel/plugin-transform-literals": "^7.2.0",
"@babel/plugin-transform-member-expression-literals": "^7.2.0",
"@babel/plugin-transform-modules-amd": "^7.2.0",
- "@babel/plugin-transform-modules-commonjs": "^7.4.3",
- "@babel/plugin-transform-modules-systemjs": "^7.4.0",
+ "@babel/plugin-transform-modules-commonjs": "^7.4.4",
+ "@babel/plugin-transform-modules-systemjs": "^7.4.4",
"@babel/plugin-transform-modules-umd": "^7.2.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2",
- "@babel/plugin-transform-new-target": "^7.4.0",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5",
+ "@babel/plugin-transform-new-target": "^7.4.4",
"@babel/plugin-transform-object-super": "^7.2.0",
- "@babel/plugin-transform-parameters": "^7.4.3",
+ "@babel/plugin-transform-parameters": "^7.4.4",
"@babel/plugin-transform-property-literals": "^7.2.0",
- "@babel/plugin-transform-regenerator": "^7.4.3",
+ "@babel/plugin-transform-regenerator": "^7.4.5",
"@babel/plugin-transform-reserved-words": "^7.2.0",
"@babel/plugin-transform-shorthand-properties": "^7.2.0",
"@babel/plugin-transform-spread": "^7.2.0",
"@babel/plugin-transform-sticky-regex": "^7.2.0",
- "@babel/plugin-transform-template-literals": "^7.2.0",
+ "@babel/plugin-transform-template-literals": "^7.4.4",
"@babel/plugin-transform-typeof-symbol": "^7.2.0",
- "@babel/plugin-transform-unicode-regex": "^7.4.3",
- "@babel/types": "^7.4.0",
- "browserslist": "^4.5.2",
- "core-js-compat": "^3.0.0",
+ "@babel/plugin-transform-unicode-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "browserslist": "^4.6.0",
+ "core-js-compat": "^3.1.1",
"invariant": "^2.2.2",
"js-levenshtein": "^1.1.3",
"semver": "^5.5.0"
}
},
"@babel/template": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz",
- "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
+ "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.4.0",
- "@babel/types": "^7.4.0"
+ "@babel/parser": "^7.4.4",
+ "@babel/types": "^7.4.4"
}
},
"@babel/traverse": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.3.tgz",
- "integrity": "sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ==",
+ "version": "7.4.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz",
+ "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.4.0",
+ "@babel/generator": "^7.4.4",
"@babel/helper-function-name": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.4.0",
- "@babel/parser": "^7.4.3",
- "@babel/types": "^7.4.0",
+ "@babel/helper-split-export-declaration": "^7.4.4",
+ "@babel/parser": "^7.4.5",
+ "@babel/types": "^7.4.4",
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.11"
}
},
"@babel/types": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz",
- "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
+ "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
"dev": true,
"requires": {
"esutils": "^2.0.2",
@@ -840,9 +840,9 @@
}
},
"@sinonjs/samsam": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.1.tgz",
- "integrity": "sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.2.tgz",
+ "integrity": "sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA==",
"dev": true,
"requires": {
"@sinonjs/commons": "^1.0.2",
@@ -873,13 +873,13 @@
"dev": true
},
"accepts": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
- "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dev": true,
"requires": {
- "mime-types": "~2.1.18",
- "negotiator": "0.6.1"
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
}
},
"acorn": {
@@ -935,9 +935,9 @@
"dev": true
},
"agent-base": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
- "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
"dev": true,
"requires": {
"es6-promisify": "^5.0.0"
@@ -990,13 +990,10 @@
"dev": true
},
"ansi-colors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
- "dev": true,
- "requires": {
- "ansi-wrap": "^0.1.0"
- }
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+ "dev": true
},
"ansi-escapes": {
"version": "3.2.0",
@@ -1194,6 +1191,12 @@
"integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
"dev": true
},
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+ "dev": true
+ },
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
@@ -1212,6 +1215,16 @@
"integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
"dev": true
},
+ "array-includes": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.7.0"
+ }
+ },
"array-initial": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
@@ -1247,6 +1260,18 @@
}
}
},
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "dev": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "dev": true
+ },
"array-slice": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
@@ -1311,11 +1336,12 @@
}
},
"assert": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
- "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
"dev": true,
"requires": {
+ "object-assign": "^4.1.1",
"util": "0.10.3"
},
"dependencies": {
@@ -1361,29 +1387,21 @@
"dev": true
},
"async-done": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz",
- "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
+ "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.2",
- "process-nextick-args": "^1.0.7",
+ "process-nextick-args": "^2.0.0",
"stream-exhaust": "^1.0.1"
- },
- "dependencies": {
- "process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
- "dev": true
- }
}
},
"async-each": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.2.tgz",
- "integrity": "sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
"dev": true
},
"async-limiter": {
@@ -1715,15 +1733,15 @@
}
},
"babel-loader": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz",
- "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==",
+ "version": "8.0.6",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
+ "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
"dev": true,
"requires": {
"find-cache-dir": "^2.0.0",
"loader-utils": "^1.0.2",
"mkdirp": "^0.5.1",
- "util.promisify": "^1.0.0"
+ "pify": "^4.0.1"
}
},
"babel-messages": {
@@ -2568,9 +2586,9 @@
"dev": true
},
"bail": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz",
- "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.4.tgz",
+ "integrity": "sha512-S8vuDB4w6YpRhICUDET3guPlQpaJl7od94tpZ0Fvnyp+MKW/HyDTcRDck+29C9g+d/qQHnddRH3+94kZdrW0Ww==",
"dev": true
},
"balanced-match": {
@@ -2729,9 +2747,9 @@
"dev": true
},
"bluebird": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz",
- "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==",
+ "version": "3.5.5",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
+ "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
"dev": true
},
"bn.js": {
@@ -2753,27 +2771,27 @@
}
},
"body-parser": {
- "version": "1.18.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
- "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"dev": true,
"requires": {
- "bytes": "3.0.0",
+ "bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
- "http-errors": "~1.6.3",
- "iconv-lite": "0.4.23",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
- "qs": "6.5.2",
- "raw-body": "2.3.3",
- "type-is": "~1.6.16"
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
},
"dependencies": {
"bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"dev": true
},
"debug": {
@@ -2785,13 +2803,17 @@
"ms": "2.0.0"
}
},
- "iconv-lite": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
- "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"dev": true,
"requires": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
}
},
"ms": {
@@ -2800,17 +2822,29 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true
+ },
"raw-body": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
- "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"dev": true,
"requires": {
- "bytes": "3.0.0",
- "http-errors": "1.6.3",
- "iconv-lite": "0.4.23",
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
}
}
},
@@ -2954,14 +2988,14 @@
}
},
"browserslist": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz",
- "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==",
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz",
+ "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30000955",
- "electron-to-chromium": "^1.3.122",
- "node-releases": "^1.1.13"
+ "caniuse-lite": "^1.0.30000975",
+ "electron-to-chromium": "^1.3.164",
+ "node-releases": "^1.1.23"
}
},
"browserstack": {
@@ -2974,9 +3008,9 @@
}
},
"browserstack-local": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.3.7.tgz",
- "integrity": "sha512-ilZlmiy7XYJxsztYan7XueHVr3Ix9EVh/mCiYN1G53wRPEW/hg1KMsseM6UExzVbexEqFEfwjkBLeFlSqxh+bQ==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.0.tgz",
+ "integrity": "sha512-BUJWxIsJkJxqfTPJIvGWTsf+IYSqSFUeFNW9tnuyTG7va/0LkXLhIi/ErFGDle1urQkol48HlQUXj4QrliXFpg==",
"dev": true,
"requires": {
"https-proxy-agent": "^2.2.1",
@@ -3001,14 +3035,13 @@
}
},
"buffer": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
- "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
+ "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
"dev": true,
"requires": {
"base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
+ "ieee754": "^1.1.4"
}
},
"buffer-alloc": {
@@ -3132,7 +3165,7 @@
},
"query-string": {
"version": "5.1.1",
- "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
"integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
"dev": true,
"requires": {
@@ -3174,9 +3207,9 @@
"dev": true
},
"camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"camelcase-keys": {
@@ -3198,9 +3231,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30000957",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000957.tgz",
- "integrity": "sha512-8wxNrjAzyiHcLXN/iunskqQnJquQQ6VX8JHfW5kLgAPRSiSuKZiNfmIkP5j7jgyXqAQBSoXyJxfnbCFS0ThSiQ==",
+ "version": "1.0.30000975",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000975.tgz",
+ "integrity": "sha512-ZsXA9YWQX6ATu5MNg+Vx/cMQ+hM6vBBSqDeJs8ruk9z0ky4yIHML15MoxcFt088ST2uyjgqyUGRJButkptWf0w==",
"dev": true
},
"caseless": {
@@ -3210,9 +3243,9 @@
"dev": true
},
"ccount": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz",
- "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.4.tgz",
+ "integrity": "sha512-fpZ81yYfzentuieinmGnphk0pLkOTMm6MZdVqwd77ROvhko6iujLNGrHH5E7utq3ygWklwfmwuG+A7P+NpqT6w==",
"dev": true
},
"center-align": {
@@ -3251,27 +3284,27 @@
}
},
"character-entities": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz",
- "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz",
+ "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==",
"dev": true
},
"character-entities-html4": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz",
- "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.3.tgz",
+ "integrity": "sha512-SwnyZ7jQBCRHELk9zf2CN5AnGEc2nA+uKMZLHvcqhpPprjkYhiLn0DywMHgN5ttFZuITMATbh68M6VIVKwJbcg==",
"dev": true
},
"character-entities-legacy": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz",
- "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz",
+ "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==",
"dev": true
},
"character-reference-invalid": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz",
- "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz",
+ "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==",
"dev": true
},
"chardet": {
@@ -3293,9 +3326,9 @@
"dev": true
},
"chokidar": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz",
- "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==",
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
+ "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
"dev": true,
"requires": {
"anymatch": "^2.0.0",
@@ -3367,14 +3400,31 @@
"dev": true
},
"cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
"dev": true,
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
+ "string-width": "^2.1.1",
+ "strip-ansi": "^4.0.0",
"wrap-ansi": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
}
},
"clone": {
@@ -3405,9 +3455,9 @@
"dev": true
},
"cloneable-readable": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
- "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+ "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -3428,9 +3478,9 @@
"dev": true
},
"collapse-white-space": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz",
- "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.5.tgz",
+ "integrity": "sha512-703bOOmytCYAX9cXYqoikYIx6twmFCXsnzRQheBcTG3nzKYBR4P/+wkYeH+Mvj7qUz8zZDtdyzbxfnEi/kYzRQ==",
"dev": true
},
"collection-map": {
@@ -3491,27 +3541,24 @@
}
},
"combined-stream": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
- "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"comma-separated-tokens": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz",
- "integrity": "sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA==",
- "dev": true,
- "requires": {
- "trim": "0.0.1"
- }
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz",
+ "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==",
+ "dev": true
},
"commander": {
- "version": "2.15.1",
- "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "version": "2.20.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
"dev": true
},
"commondir": {
@@ -3527,9 +3574,9 @@
"dev": true
},
"component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"dev": true
},
"component-inherit": {
@@ -3597,14 +3644,14 @@
}
},
"connect": {
- "version": "3.6.6",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
- "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
- "finalhandler": "1.1.0",
- "parseurl": "~1.3.2",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
"utils-merge": "1.0.1"
},
"dependencies": {
@@ -3711,40 +3758,33 @@
}
},
"core-js": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
- "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A=="
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
+ "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A=="
},
"core-js-compat": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz",
- "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz",
+ "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==",
"dev": true,
"requires": {
- "browserslist": "^4.5.4",
- "core-js": "3.0.1",
- "core-js-pure": "3.0.1",
- "semver": "^6.0.0"
+ "browserslist": "^4.6.2",
+ "core-js-pure": "3.1.4",
+ "semver": "^6.1.1"
},
"dependencies": {
- "core-js": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz",
- "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==",
- "dev": true
- },
"semver": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz",
- "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz",
+ "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==",
"dev": true
}
}
},
"core-js-pure": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz",
- "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz",
+ "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==",
"dev": true
},
"core-util-is": {
@@ -3754,9 +3794,9 @@
"dev": true
},
"coveralls": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz",
- "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.4.tgz",
+ "integrity": "sha512-eyqUWA/7RT0JagiL0tThVhjbIjoiEUyWCjtUJoOPcWoeofP5WK/jb2OJYoBFrR6DvplR+AxOyuBqk4JHkk5ykA==",
"dev": true,
"requires": {
"growl": "~> 1.10.0",
@@ -3774,18 +3814,6 @@
"dev": true,
"requires": {
"buffer": "^5.1.0"
- },
- "dependencies": {
- "buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
- "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
- "dev": true,
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- }
}
},
"crc32-stream": {
@@ -3836,12 +3864,14 @@
}
},
"cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
- "lru-cache": "^4.0.1",
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
@@ -3921,12 +3951,13 @@
"dev": true
},
"d": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
- "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
+ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"dev": true,
"requires": {
- "es5-ext": "^0.10.9"
+ "es5-ext": "^0.10.50",
+ "type": "^1.0.1"
}
},
"dashdash": {
@@ -4161,9 +4192,9 @@
"dev": true
},
"detab": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.1.tgz",
- "integrity": "sha512-/hhdqdQc5thGrqzjyO/pz76lDZ5GSuAs6goxOaKTsvPk7HNnzAyFN5lyHgqpX4/s1i66K8qMGj+VhA9504x7DQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.2.tgz",
+ "integrity": "sha512-Q57yPrxScy816TTE1P/uLRXLDKjXhvYTbfxS/e6lPD+YrqghbsMlGB9nQzj/zVtSPaF0DFPSdO916EWO4sQUyQ==",
"dev": true,
"requires": {
"repeat-string": "^1.5.4"
@@ -4324,12 +4355,62 @@
"yargs": "^9.0.1"
},
"dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
"dev": true
},
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@@ -4339,12 +4420,36 @@
"locate-path": "^2.0.0"
}
},
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
"load-json-file": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
@@ -4375,6 +4480,32 @@
"path-exists": "^3.0.0"
}
},
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0",
+ "lcid": "^1.0.0",
+ "mem": "^1.1.0"
+ }
+ },
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -4442,24 +4573,17 @@
"path-type": "^2.0.0"
}
},
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
},
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
},
"yargs": {
"version": "9.0.1",
@@ -4493,6 +4617,15 @@
}
}
}
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
}
}
},
@@ -4580,15 +4713,15 @@
"dev": true
},
"ejs": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
- "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+ "version": "2.5.9",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz",
+ "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==",
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.124",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz",
- "integrity": "sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w==",
+ "version": "1.3.164",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.164.tgz",
+ "integrity": "sha512-VLlalqUeduN4+fayVtRZvGP2Hl1WrRxlwzh2XVVMJym3IFrQUS29BFQ1GP/BxOJXJI1OFCrJ5BnFEsAe8NHtOg==",
"dev": true
},
"elliptic": {
@@ -4607,9 +4740,9 @@
}
},
"emoji-regex": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
- "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
"dev": true
},
"emojis-list": {
@@ -4636,7 +4769,7 @@
"engine.io": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz",
- "integrity": "sha1-tgKBw1SEpw7gNR6g6/+D7IyVIqI=",
+ "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==",
"dev": true,
"requires": {
"accepts": "~1.3.4",
@@ -4650,7 +4783,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -4666,7 +4799,7 @@
},
"engine.io-client": {
"version": "3.2.1",
- "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
"integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
"dev": true,
"requires": {
@@ -4683,10 +4816,16 @@
"yeast": "0.1.2"
},
"dependencies": {
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -4785,9 +4924,9 @@
}
},
"es5-ext": {
- "version": "0.10.49",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
- "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
+ "version": "0.10.50",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
+ "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
"dev": true,
"requires": {
"es6-iterator": "~2.0.3",
@@ -4827,9 +4966,9 @@
}
},
"es6-promise": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
- "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==",
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
"dev": true
},
"es6-promisify": {
@@ -4865,14 +5004,14 @@
}
},
"es6-weak-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
- "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
"dev": true,
"requires": {
"d": "1",
- "es5-ext": "^0.10.14",
- "es6-iterator": "^2.0.1",
+ "es5-ext": "^0.10.46",
+ "es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.1"
}
},
@@ -4989,6 +5128,17 @@
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
"debug": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
@@ -5052,9 +5202,9 @@
}
},
"eslint-module-utils": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz",
- "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz",
+ "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==",
"dev": true,
"requires": {
"debug": "^2.6.8",
@@ -5131,21 +5281,22 @@
}
},
"eslint-plugin-import": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz",
- "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==",
+ "version": "2.17.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz",
+ "integrity": "sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==",
"dev": true,
"requires": {
+ "array-includes": "^3.0.3",
"contains-path": "^0.1.0",
"debug": "^2.6.9",
"doctrine": "1.5.0",
"eslint-import-resolver-node": "^0.3.2",
- "eslint-module-utils": "^2.3.0",
+ "eslint-module-utils": "^2.4.0",
"has": "^1.0.3",
"lodash": "^4.17.11",
"minimatch": "^3.0.4",
"read-pkg-up": "^2.0.0",
- "resolve": "^1.9.0"
+ "resolve": "^1.11.0"
},
"dependencies": {
"debug": {
@@ -5377,7 +5528,7 @@
},
"event-stream": {
"version": "3.3.4",
- "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
"integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
"dev": true,
"requires": {
@@ -5399,9 +5550,9 @@
}
},
"eventemitter3": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
- "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+ "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
"dev": true
},
"events": {
@@ -5435,19 +5586,6 @@
"strip-eof": "^1.0.0"
},
"dependencies": {
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@@ -5456,16 +5594,6 @@
"requires": {
"pump": "^3.0.0"
}
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
}
}
},
@@ -5624,40 +5752,6 @@
"vary": "~1.1.2"
},
"dependencies": {
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "dev": true,
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
- "dev": true,
- "requires": {
- "bytes": "3.1.0",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
- }
- },
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
- "dev": true
- },
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
@@ -5673,21 +5767,6 @@
"ms": "2.0.0"
}
},
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- }
- },
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
@@ -5701,39 +5780,12 @@
"toidentifier": "1.0.0"
}
},
- "mime-db": {
- "version": "1.40.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
- "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.24",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
- "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
- "dev": true,
- "requires": {
- "mime-db": "1.40.0"
- }
- },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
- "dev": true
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true
- },
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -5746,24 +5798,6 @@
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
"dev": true
},
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true
- },
- "raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
- "dev": true,
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -5793,39 +5827,11 @@
}
}
},
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "dev": true,
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
"dev": true
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dev": true,
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
}
}
},
@@ -6057,17 +6063,17 @@
}
},
"finalhandler": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
- "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dev": true,
"requires": {
"debug": "2.6.9",
- "encodeurl": "~1.0.1",
+ "encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
- "parseurl": "~1.3.2",
- "statuses": "~1.3.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
@@ -6121,9 +6127,9 @@
}
},
"fined": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz",
- "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
+ "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
"dev": true,
"requires": {
"expand-tilde": "^2.0.2",
@@ -6139,6 +6145,23 @@
"integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
"dev": true
},
+ "flat": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
+ "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "~2.0.3"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
+ "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==",
+ "dev": true
+ }
+ }
+ },
"flat-cache": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
@@ -6165,7 +6188,7 @@
"flatted": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
- "integrity": "sha1-VRIrZTbqSWtLRIk+4mCBQdENmRY=",
+ "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
"dev": true
},
"flush-write-stream": {
@@ -6359,40 +6382,36 @@
"dev": true
},
"fsevents": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz",
- "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
+ "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
"dev": true,
"optional": true,
"requires": {
- "nan": "^2.9.2",
- "node-pre-gyp": "^0.10.0"
+ "nan": "^2.12.1",
+ "node-pre-gyp": "^0.12.0"
},
"dependencies": {
"abbrev": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "bundled": true,
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "bundled": true,
"dev": true
},
"aproba": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "bundled": true,
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6402,14 +6421,12 @@
},
"balanced-match": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "bundled": true,
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "bundled": true,
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
@@ -6418,71 +6435,61 @@
},
"chownr": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
- "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==",
+ "bundled": true,
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "bundled": true,
"dev": true
},
"concat-map": {
"version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "bundled": true,
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "bundled": true,
"dev": true
},
"core-util-is": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "bundled": true,
"dev": true,
"optional": true
},
"debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "version": "4.1.1",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
},
"deep-extend": {
"version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "bundled": true,
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "bundled": true,
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
- "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
+ "bundled": true,
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
- "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6491,15 +6498,13 @@
},
"fs.realpath": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "bundled": true,
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6515,8 +6520,7 @@
},
"glob": {
"version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6530,15 +6534,13 @@
},
"has-unicode": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "bundled": true,
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6547,8 +6549,7 @@
},
"ignore-walk": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
- "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6557,8 +6558,7 @@
},
"inflight": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6568,21 +6568,18 @@
},
"inherits": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "bundled": true,
"dev": true
},
"ini": {
"version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "bundled": true,
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "bundled": true,
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
@@ -6590,15 +6587,13 @@
},
"isarray": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "bundled": true,
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "bundled": true,
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -6606,14 +6601,12 @@
},
"minimist": {
"version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "bundled": true,
"dev": true
},
"minipass": {
"version": "2.3.5",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
- "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
+ "bundled": true,
"dev": true,
"requires": {
"safe-buffer": "^5.1.2",
@@ -6622,8 +6615,7 @@
},
"minizlib": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
- "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6632,36 +6624,32 @@
},
"mkdirp": {
"version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "bundled": true,
"dev": true,
"requires": {
"minimist": "0.0.8"
}
},
"ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "version": "2.1.1",
+ "bundled": true,
"dev": true,
"optional": true
},
"needle": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz",
- "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==",
+ "version": "2.3.0",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
- "debug": "^2.1.2",
+ "debug": "^4.1.0",
"iconv-lite": "^0.4.4",
"sax": "^1.2.4"
}
},
"node-pre-gyp": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz",
- "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==",
+ "version": "0.12.0",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6679,8 +6667,7 @@
},
"nopt": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
- "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6689,16 +6676,14 @@
}
},
"npm-bundled": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz",
- "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==",
+ "version": "1.0.6",
+ "bundled": true,
"dev": true,
"optional": true
},
"npm-packlist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz",
- "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==",
+ "version": "1.4.1",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6708,8 +6693,7 @@
},
"npmlog": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6721,21 +6705,18 @@
},
"number-is-nan": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "bundled": true,
"dev": true
},
"object-assign": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "bundled": true,
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "bundled": true,
"dev": true,
"requires": {
"wrappy": "1"
@@ -6743,22 +6724,19 @@
},
"os-homedir": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "bundled": true,
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "bundled": true,
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6768,22 +6746,19 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "bundled": true,
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "bundled": true,
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6795,8 +6770,7 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "bundled": true,
"dev": true,
"optional": true
}
@@ -6804,8 +6778,7 @@
},
"readable-stream": {
"version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6820,8 +6793,7 @@
},
"rimraf": {
"version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6830,49 +6802,42 @@
},
"safe-buffer": {
"version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "bundled": true,
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "bundled": true,
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "bundled": true,
"dev": true,
"optional": true
},
"semver": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "version": "5.7.0",
+ "bundled": true,
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "bundled": true,
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "bundled": true,
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "bundled": true,
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
@@ -6882,8 +6847,7 @@
},
"string_decoder": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6892,8 +6856,7 @@
},
"strip-ansi": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
@@ -6901,15 +6864,13 @@
},
"strip-json-comments": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "bundled": true,
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.8",
- "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
- "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6924,15 +6885,13 @@
},
"util-deprecate": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "bundled": true,
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "bundled": true,
"dev": true,
"optional": true,
"requires": {
@@ -6941,22 +6900,20 @@
},
"wrappy": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "bundled": true,
"dev": true
},
"yallist": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
- "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==",
+ "bundled": true,
"dev": true
}
}
},
"fun-hooks": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/fun-hooks/-/fun-hooks-0.9.2.tgz",
- "integrity": "sha512-Bbhqg3zj/joiHsmU9z/DBPofMN8yN4P7m2cE4sqZqaL+C6YcAXKjwa7Cu8rUs3roBiAhgWwQOAALZZodpmBglw=="
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/fun-hooks/-/fun-hooks-0.9.3.tgz",
+ "integrity": "sha512-MC/zsGf+duq8lI6xym+H8HuL6DE1fLyE90FRzU/j2lTDmjDJ//+KC7M8vLzG9y/mhkLOH5u9wK4QEf3lBqIo4w=="
},
"function-bind": {
"version": "1.1.1",
@@ -6980,9 +6937,9 @@
}
},
"get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
"get-func-name": {
@@ -7051,12 +7008,20 @@
"dev": true,
"requires": {
"emoji-regex": ">=6.0.0 <=6.1.1"
+ },
+ "dependencies": {
+ "emoji-regex": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
+ "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=",
+ "dev": true
+ }
}
},
"glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -7181,9 +7146,9 @@
}
},
"globals": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
- "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
"globals-docs": {
@@ -7264,23 +7229,43 @@
"dev": true
},
"gulp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz",
- "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
+ "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
"dev": true,
"requires": {
- "glob-watcher": "^5.0.0",
- "gulp-cli": "^2.0.0",
- "undertaker": "^1.0.0",
+ "glob-watcher": "^5.0.3",
+ "gulp-cli": "^2.2.0",
+ "undertaker": "^1.2.1",
"vinyl-fs": "^3.0.0"
},
"dependencies": {
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "^0.1.0"
+ }
+ },
"camelcase": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
"dev": true
},
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
"find-up": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
@@ -7291,10 +7276,16 @@
"pinkie-promise": "^2.0.0"
}
},
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
"gulp-cli": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.1.0.tgz",
- "integrity": "sha512-txzgdFVlEPShBZus6JJyGyKJoBVDq6Do0ZQgIgx5RAsmhNVTDjymmOxpQvo3c20m66FldilS68ZXj2Q9w5dKbA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
+ "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
"dev": true,
"requires": {
"ansi-colors": "^1.0.1",
@@ -7317,6 +7308,30 @@
"yargs": "^7.1.0"
}
},
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
"load-json-file": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
@@ -7395,6 +7410,23 @@
"read-pkg": "^1.0.0"
}
},
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
"strip-bom": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
@@ -7410,6 +7442,12 @@
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
"dev": true
},
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
"yargs": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
@@ -7624,7 +7662,7 @@
"gulp-connect": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.7.0.tgz",
- "integrity": "sha1-fpJfXkw06/7fnzGFdpZuj+iEDVo=",
+ "integrity": "sha512-8tRcC6wgXMLakpPw9M7GRJIhxkYdgZsXwn7n56BA2bQYGLR9NOPhMzx7js+qYDy6vhNkbApGKURjAw1FjY4pNA==",
"dev": true,
"requires": {
"ansi-colors": "^2.0.5",
@@ -7641,7 +7679,7 @@
"ansi-colors": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-2.0.5.tgz",
- "integrity": "sha1-XaN4Jf7z51872kf3YNZL/RDhXhA=",
+ "integrity": "sha512-yAdfUZ+c2wetVNIFsNRn44THW+Lty6S5TwMpUfLA/UaGhiXbBv/F8E60/1hMLd0cnF/CDoWH8vzVaI5bAcHCjw==",
"dev": true
}
}
@@ -8062,9 +8100,9 @@
}
},
"handlebars": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz",
- "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
+ "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
"dev": true,
"requires": {
"neo-async": "^2.6.0",
@@ -8253,15 +8291,15 @@
}
},
"hast-util-is-element": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.2.tgz",
- "integrity": "sha512-4MEtyofNi3ZunPFrp9NpTQdNPN24xvLX3M+Lr/RGgPX6TLi+wR4/DqeoyQ7lwWcfUp4aevdt4RR0r7ZQPFbHxw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.3.tgz",
+ "integrity": "sha512-C62CVn7jbjp89yOhhy7vrkSaB7Vk906Gtcw/Ihd+Iufnq+2pwOZjdPmpzpKLWJXPJBMDX3wXg4FqmdOayPcewA==",
"dev": true
},
"hast-util-sanitize": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.3.0.tgz",
- "integrity": "sha512-rQeetoD08jHmDOUYN6h9vTuE0hQN4wymhtkQZ6whHtcjaLpjw5RYAbcdxx9cMgMWERDsSs79UpqHuBLlUHKeOw==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.3.1.tgz",
+ "integrity": "sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw==",
"dev": true,
"requires": {
"xtend": "^4.0.1"
@@ -8284,24 +8322,32 @@
"stringify-entities": "^1.0.1",
"unist-util-is": "^2.0.0",
"xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "unist-util-is": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
+ "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==",
+ "dev": true
+ }
}
},
"hast-util-whitespace": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.2.tgz",
- "integrity": "sha512-4JT8B0HKPHBMFZdDQzexjxwhKx9TrpV/+uelvmqlPu8RqqDrnNIEHDtDZCmgE+4YmcFAtKVPLmnY3dQGRaN53A==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.3.tgz",
+ "integrity": "sha512-AlkYiLTTwPOyxZ8axq2/bCwRUPjIPBfrHkXuCR92B38b3lSdU22R5F/Z4DL6a2kxWpekWq1w6Nj48tWat6GeRA==",
"dev": true
},
"he": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
- "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true
},
"highlight.js": {
- "version": "9.15.6",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz",
- "integrity": "sha512-zozTAWM1D6sozHo8kqhfYgsac+B+q0PmsjXeyDrYIHHcBN0zTVT66+s2GW1GZv7DbyaROdLXKdabwS/WqPyIdQ==",
+ "version": "9.15.8",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.8.tgz",
+ "integrity": "sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA==",
"dev": true
},
"hmac-drbg": {
@@ -8347,9 +8393,9 @@
"dev": true
},
"html-void-elements": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.3.tgz",
- "integrity": "sha512-SaGhCDPXJVNrQyKMtKy24q6IMdXg5FCPN3z+xizxw9l+oXQw5fOoaj/ERU5KqWhSYhXtW5bWthlDbTDLBhJQrA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.4.tgz",
+ "integrity": "sha512-yMk3naGPLrfvUV9TdDbuYXngh/TpHbA6TrOw3HL9kS8yhwx7i309BReNg7CbAJXGE+UMJ6je5OqJ7lC63o6YuQ==",
"dev": true
},
"http-cache-semantics": {
@@ -8360,7 +8406,7 @@
},
"http-errors": {
"version": "1.6.3",
- "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"dev": true,
"requires": {
@@ -8368,20 +8414,12 @@
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
"statuses": ">= 1.4.0 < 2"
- },
- "dependencies": {
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
- }
}
},
"http-parser-js": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
- "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
+ "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
"dev": true
},
"http-proxy": {
@@ -8531,22 +8569,6 @@
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
@@ -8584,9 +8606,9 @@
}
},
"invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
"dev": true
},
"ipaddr.js": {
@@ -8626,9 +8648,9 @@
}
},
"is-alphabetical": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz",
- "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz",
+ "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==",
"dev": true
},
"is-alphanumeric": {
@@ -8638,15 +8660,21 @@
"dev": true
},
"is-alphanumerical": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz",
- "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz",
+ "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==",
"dev": true,
"requires": {
"is-alphabetical": "^1.0.0",
"is-decimal": "^1.0.0"
}
},
+ "is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "dev": true
+ },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -8701,9 +8729,9 @@
"dev": true
},
"is-decimal": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz",
- "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz",
+ "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==",
"dev": true
},
"is-descriptor": {
@@ -8768,13 +8796,16 @@
}
},
"is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-generator-function": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz",
+ "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==",
+ "dev": true
},
"is-glob": {
"version": "4.0.1",
@@ -8786,9 +8817,9 @@
}
},
"is-hexadecimal": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz",
- "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz",
+ "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==",
"dev": true
},
"is-negated-glob": {
@@ -8944,9 +8975,9 @@
"dev": true
},
"is-whitespace-character": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz",
- "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.3.tgz",
+ "integrity": "sha512-SNPgMLz9JzPccD3nPctcj8sZlX9DAMJSKH8bP7Z6bohCwuNgX8xbWr1eTAYXX9Vpi/aSn8Y1akL9WgM3t43YNQ==",
"dev": true
},
"is-windows": {
@@ -8956,9 +8987,9 @@
"dev": true
},
"is-word-character": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz",
- "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.3.tgz",
+ "integrity": "sha512-0wfcrFgOOOBdgRNT9H33xe6Zi6yhX/uoc4U8NBZGeQQB0ctU1dnlNTyL9JM2646bHDTpsDm1Brb3VPoCIMrd/A==",
"dev": true
},
"is-wsl": {
@@ -9324,6 +9355,12 @@
"integrity": "sha1-6l7+QLg2kLmGZ2FKc5L8YOhCwN0=",
"dev": true
},
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
"jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
@@ -9362,7 +9399,7 @@
"karma": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz",
- "integrity": "sha1-OJDKlyKxDR0UtybhM1kxRVeISZ4=",
+ "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==",
"dev": true,
"requires": {
"bluebird": "^3.3.0",
@@ -9396,9 +9433,9 @@
},
"dependencies": {
"mime": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz",
- "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==",
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
"dev": true
},
"rimraf": {
@@ -9639,12 +9676,12 @@
}
},
"lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
"dev": true,
"requires": {
- "invert-kv": "^1.0.0"
+ "invert-kv": "^2.0.0"
}
},
"lcov-parse": {
@@ -9864,6 +9901,12 @@
"lodash._objecttypes": "~2.4.1"
}
},
+ "lodash.clone": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
+ "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=",
+ "dev": true
+ },
"lodash.defaults": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz",
@@ -9987,7 +10030,7 @@
"log4js": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz",
- "integrity": "sha1-5srO2Uln7uuc45n5+GgqSysoyP8=",
+ "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==",
"dev": true,
"requires": {
"circular-json": "^0.5.5",
@@ -10000,7 +10043,7 @@
"circular-json": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz",
- "integrity": "sha1-kydjroj0996teg0JyKUaR0OlOx0=",
+ "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==",
"dev": true
},
"debug": {
@@ -10037,9 +10080,9 @@
"dev": true
},
"longest-streak": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz",
- "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz",
+ "integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw==",
"dev": true
},
"loose-envify": {
@@ -10120,6 +10163,15 @@
"kind-of": "^6.0.2"
}
},
+ "map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "requires": {
+ "p-defer": "^1.0.0"
+ }
+ },
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
@@ -10148,15 +10200,15 @@
}
},
"markdown-escapes": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz",
- "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.3.tgz",
+ "integrity": "sha512-XUi5HJhhV5R74k8/0H2oCbCiYf/u4cO/rX8tnGkRvrqhsr5BRNU6Mg0yt/8UIx1iIS8220BNJsDb7XnILhLepw==",
"dev": true
},
"markdown-table": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz",
- "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
+ "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
"dev": true
},
"matchdep": {
@@ -10212,18 +10264,18 @@
}
},
"mdast-util-compact": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz",
- "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.3.tgz",
+ "integrity": "sha512-nRiU5GpNy62rZppDKbLwhhtw5DXoFMqw9UNZFmlPsNaQCZ//WLjGKUwWMdJrUH+Se7UvtO2gXtAMe0g/N+eI5w==",
"dev": true,
"requires": {
"unist-util-visit": "^1.1.0"
}
},
"mdast-util-definitions": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.3.tgz",
- "integrity": "sha512-P6wpRO8YVQ1iv30maMc93NLh7COvufglBE8/ldcOyYmk5EbfF0YeqlLgtqP/FOBU501Kqar1x5wYWwB3Nga74g==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.4.tgz",
+ "integrity": "sha512-HfUArPog1j4Z78Xlzy9Q4aHLnrF/7fb57cooTHypyGoe2XFNbcx/kWZDoOz+ra8CkUzvg3+VHV434yqEd1DRmA==",
"dev": true,
"requires": {
"unist-util-visit": "^1.0.0"
@@ -10258,9 +10310,9 @@
}
},
"mdast-util-to-string": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.5.tgz",
- "integrity": "sha512-2qLt/DEOo5F6nc2VFScQiHPzQ0XXcabquRJxKMhKte8nt42o08HUxNDPk7tt0YPxnWjAT11I1SYi0X0iPnfI5A==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.0.6.tgz",
+ "integrity": "sha512-868pp48gUPmZIhfKrLbaDneuzGiw3OTDjHc5M1kAepR2CWBJ+HpEsm252K4aXdiP5coVZaJPOqGtVU6Po8xnXg==",
"dev": true
},
"mdast-util-toc": {
@@ -10275,6 +10327,12 @@
"unist-util-visit": "^1.1.0"
},
"dependencies": {
+ "emoji-regex": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
+ "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=",
+ "dev": true
+ },
"github-slugger": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz",
@@ -10283,6 +10341,12 @@
"requires": {
"emoji-regex": ">=6.0.0 <=6.1.1"
}
+ },
+ "unist-util-is": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
+ "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA==",
+ "dev": true
}
}
},
@@ -10299,12 +10363,22 @@
"dev": true
},
"mem": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
+ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
"dev": true,
"requires": {
- "mimic-fn": "^1.0.0"
+ "map-age-cleaner": "^0.1.1",
+ "mimic-fn": "^2.0.0",
+ "p-is-promise": "^2.0.0"
+ },
+ "dependencies": {
+ "p-is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+ "dev": true
+ }
}
},
"memoizee": {
@@ -10333,6 +10407,12 @@
"readable-stream": "^2.0.1"
}
},
+ "memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+ "dev": true
+ },
"meow": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
@@ -10500,24 +10580,24 @@
"dev": true
},
"mime-db": {
- "version": "1.38.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
- "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==",
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
"dev": true
},
"mime-types": {
- "version": "2.1.22",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
- "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"dev": true,
"requires": {
- "mime-db": "~1.38.0"
+ "mime-db": "1.40.0"
}
},
"mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true
},
"mimic-response": {
@@ -10549,7 +10629,7 @@
},
"minimist": {
"version": "1.2.0",
- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
@@ -10585,7 +10665,7 @@
"dependencies": {
"minimist": {
"version": "0.0.8",
- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
}
@@ -10610,6 +10690,12 @@
"supports-color": "5.4.0"
},
"dependencies": {
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
@@ -10639,6 +10725,12 @@
"path-is-absolute": "^1.0.0"
}
},
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -10720,9 +10812,9 @@
}
},
"ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"multipipe": {
@@ -10782,9 +10874,9 @@
"dev": true
},
"nan": {
- "version": "2.13.2",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
- "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==",
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
"dev": true,
"optional": true
},
@@ -10820,15 +10912,15 @@
"dev": true
},
"negotiator": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
- "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"dev": true
},
"neo-async": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
- "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
+ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
"dev": true
},
"next-tick": {
@@ -10844,15 +10936,15 @@
"dev": true
},
"nise": {
- "version": "1.4.10",
- "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz",
- "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.0.tgz",
+ "integrity": "sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww==",
"dev": true,
"requires": {
"@sinonjs/formatio": "^3.1.0",
"@sinonjs/text-encoding": "^0.7.1",
"just-extend": "^4.0.2",
- "lolex": "^2.3.2",
+ "lolex": "^4.1.0",
"path-to-regexp": "^1.7.0"
},
"dependencies": {
@@ -10867,17 +10959,27 @@
}
},
"lolex": {
- "version": "2.7.5",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz",
- "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.1.0.tgz",
+ "integrity": "sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw==",
"dev": true
}
}
},
+ "node-environment-flags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
+ "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
+ "dev": true,
+ "requires": {
+ "object.getownpropertydescriptors": "^2.0.3",
+ "semver": "^5.7.0"
+ }
+ },
"node-libs-browser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz",
- "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
"dev": true,
"requires": {
"assert": "^1.1.1",
@@ -10890,7 +10992,7 @@
"events": "^3.0.0",
"https-browserify": "^1.0.0",
"os-browserify": "^0.3.0",
- "path-browserify": "0.0.0",
+ "path-browserify": "0.0.1",
"process": "^0.11.10",
"punycode": "^1.2.4",
"querystring-es3": "^0.2.0",
@@ -10902,21 +11004,41 @@
"tty-browserify": "0.0.0",
"url": "^0.11.0",
"util": "^0.11.0",
- "vm-browserify": "0.0.4"
+ "vm-browserify": "^1.0.1"
},
"dependencies": {
+ "buffer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
+ },
+ "util": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
}
}
},
"node-releases": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.14.tgz",
- "integrity": "sha512-d58EpVZRhQE60kWiWUaaPlK9dyC4zg3ZoMcHcky2d4hDksyQj0rUozwInOl0C66mBsqo01Tuns8AvxnL5S7PKg==",
+ "version": "1.1.23",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz",
+ "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==",
"dev": true,
"requires": {
"semver": "^5.3.0"
@@ -10976,6 +11098,23 @@
"integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=",
"dev": true
},
+ "npm-run-all": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "memorystream": "^0.3.1",
+ "minimatch": "^3.0.4",
+ "pidtree": "^0.3.0",
+ "read-pkg": "^3.0.0",
+ "shell-quote": "^1.6.1",
+ "string.prototype.padend": "^3.0.0"
+ }
+ },
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -11085,6 +11224,18 @@
"isobject": "^3.0.0"
}
},
+ "object.entries": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz",
+ "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.12.0",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"object.getownpropertydescriptors": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
@@ -11170,6 +11321,14 @@
"dev": true,
"requires": {
"mimic-fn": "^1.0.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ }
}
},
"opener": {
@@ -11199,7 +11358,7 @@
"dependencies": {
"minimist": {
"version": "0.0.10",
- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
"dev": true
},
@@ -11247,31 +11406,14 @@
"dev": true
},
"os-locale": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
+ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
"dev": true,
"requires": {
- "execa": "^0.7.0",
- "lcid": "^1.0.0",
- "mem": "^1.1.0"
- },
- "dependencies": {
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "dev": true,
- "requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- }
+ "execa": "^1.0.0",
+ "lcid": "^2.0.0",
+ "mem": "^4.0.0"
}
},
"os-tmpdir": {
@@ -11286,6 +11428,12 @@
"integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
"dev": true
},
+ "p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "dev": true
+ },
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
@@ -11361,21 +11509,144 @@
}
},
"parse-domain": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-2.1.7.tgz",
- "integrity": "sha512-yb0VWRwDCe96ML49b3xg+4wScbocpIrFSAdkml8eKq/deH3FiFPBpsC6RTC9ZUtnDhInmXPfNIHsN/v62+TAMA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/parse-domain/-/parse-domain-2.3.1.tgz",
+ "integrity": "sha512-k/tkc7tfcoGfaUOCG5DuPNX+dt6UBqRWU9EtR0rA9esi5GpOY0OGEgprfylmYx8pykQbdBTYHLaM/UwFHXuZKA==",
"dev": true,
"requires": {
"chai": "^4.2.0",
"got": "^8.3.2",
"mkdirp": "^0.5.1",
- "mocha": "^5.2.0"
+ "mocha": "^6.1.4",
+ "npm-run-all": "^4.1.5"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "mocha": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz",
+ "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "3.2.3",
+ "browser-stdout": "1.3.1",
+ "debug": "3.2.6",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "find-up": "3.0.0",
+ "glob": "7.1.3",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.13.1",
+ "log-symbols": "2.2.0",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "ms": "2.1.1",
+ "node-environment-flags": "1.0.5",
+ "object.assign": "4.1.0",
+ "strip-json-comments": "2.0.1",
+ "supports-color": "6.0.0",
+ "which": "1.3.1",
+ "wide-align": "1.1.3",
+ "yargs": "13.2.2",
+ "yargs-parser": "13.0.0",
+ "yargs-unparser": "1.5.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "yargs": {
+ "version": "13.2.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz",
+ "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "os-locale": "^3.1.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.0.0"
+ }
+ }
}
},
"parse-entities": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.1.tgz",
- "integrity": "sha512-NBWYLQm1KSoDKk7GAHyioLTvCZ5QjdH/ASBBQTD3iLiAWJXS5bg1jEWI8nIJ+vgVvsceBVBcDGRWSo0KVQBvvg==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
+ "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
"dev": true,
"requires": {
"character-entities": "^1.0.0",
@@ -11498,9 +11769,9 @@
}
},
"parseurl": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
- "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true
},
"pascalcase": {
@@ -11510,9 +11781,9 @@
"dev": true
},
"path-browserify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
- "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
"dev": true
},
"path-dirname": {
@@ -11646,6 +11917,12 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
+ "pidtree": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
+ "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==",
+ "dev": true
+ },
"pify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
@@ -11686,6 +11963,17 @@
"arr-diff": "^4.0.0",
"arr-union": "^3.1.0",
"extend-shallow": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "^0.1.0"
+ }
+ }
}
},
"pluralize": {
@@ -11792,9 +12080,9 @@
"dev": true
},
"psl": {
- "version": "1.1.31",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
- "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+ "version": "1.1.32",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz",
+ "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==",
"dev": true
},
"public-encrypt": {
@@ -11812,9 +12100,9 @@
}
},
"pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"dev": true,
"requires": {
"end-of-stream": "^1.1.0",
@@ -11830,6 +12118,18 @@
"duplexify": "^3.6.0",
"inherits": "^2.0.3",
"pump": "^2.0.0"
+ },
+ "dependencies": {
+ "pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ }
}
},
"punycode": {
@@ -11923,9 +12223,9 @@
}
},
"range-parser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
- "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true
},
"raw-body": {
@@ -12064,9 +12364,9 @@
"dev": true
},
"regenerate-unicode-properties": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz",
- "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
+ "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
"dev": true,
"requires": {
"regenerate": "^1.4.0"
@@ -12078,9 +12378,9 @@
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
},
"regenerator-transform": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz",
- "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz",
+ "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==",
"dev": true,
"requires": {
"private": "^0.1.6"
@@ -12106,9 +12406,9 @@
}
},
"regexp-tree": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.5.tgz",
- "integrity": "sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==",
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.10.tgz",
+ "integrity": "sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==",
"dev": true
},
"regexpp": {
@@ -12201,18 +12501,18 @@
}
},
"remark-reference-links": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-4.0.3.tgz",
- "integrity": "sha512-Q9d7JaK5r0JDBo3TInfrodBuI3xulI8htCr8jlX+0oXosF3GaebJbo5y228VYFoV6xJ+syDukkUGMKNlwSJWjQ==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/remark-reference-links/-/remark-reference-links-4.0.4.tgz",
+ "integrity": "sha512-+2X8hwSQqxG4tvjYZNrTcEC+bXp8shQvwRGG6J/rnFTvBoU4G0BBviZoqKGZizLh/DG+0gSYhiDDWCqyxXW1iQ==",
"dev": true,
"requires": {
"unist-util-visit": "^1.0.0"
}
},
"remark-slug": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-5.1.1.tgz",
- "integrity": "sha512-r591rdoDPJkSSAVvEaTVUkqbMp7c7AyZfif14V0Dp66GQkOHzaPAS6wyhawSbqpS0ZdTnfJS+TltFoxzi6bdIA==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-5.1.2.tgz",
+ "integrity": "sha512-DWX+Kd9iKycqyD+/B+gEFO3jjnt7Yg1O05lygYSNTe5i5PIxxxPjp5qPBDxPIzp5wreF7+1ROCwRgjEcqmzr3A==",
"dev": true,
"requires": {
"github-slugger": "^1.0.0",
@@ -12393,9 +12693,9 @@
"dev": true
},
"require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"require-uncached": {
@@ -12415,9 +12715,9 @@
"dev": true
},
"resolve": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
- "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
+ "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
@@ -12480,9 +12780,9 @@
"dev": true
},
"rfdc": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
- "integrity": "sha1-5uctdPXcOd6PU49l4Aw2wYAY40k=",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
+ "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==",
"dev": true
},
"rgb2hex": {
@@ -12680,16 +12980,81 @@
}
},
"serve-static": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
- "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"dev": true,
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
- "parseurl": "~1.3.2",
- "send": "0.16.2"
- }
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ }
+ }
},
"set-blocking": {
"version": "2.0.0",
@@ -12757,6 +13122,18 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "dev": true,
+ "requires": {
+ "array-filter": "~0.0.0",
+ "array-map": "~0.0.0",
+ "array-reduce": "~0.0.0",
+ "jsonify": "~0.0.0"
+ }
+ },
"shelljs": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
@@ -12816,14 +13193,6 @@
"dev": true,
"requires": {
"is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- }
}
},
"snapdragon": {
@@ -12951,7 +13320,7 @@
"socket.io": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz",
- "integrity": "sha1-oGnF/qvuPmshSnW0DOBlLhz7mYA=",
+ "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==",
"dev": true,
"requires": {
"debug": "~3.1.0",
@@ -12965,7 +13334,7 @@
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -12988,7 +13357,7 @@
"socket.io-client": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
- "integrity": "sha1-3LOBA0NqtFeN2wJmOK4vIbYjZx8=",
+ "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
"dev": true,
"requires": {
"backo2": "1.0.2",
@@ -13007,10 +13376,16 @@
"to-array": "0.1.4"
},
"dependencies": {
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -13026,7 +13401,7 @@
},
"socket.io-parser": {
"version": "3.2.0",
- "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
"integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
"dev": true,
"requires": {
@@ -13035,10 +13410,16 @@
"isarray": "2.0.1"
},
"dependencies": {
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -13108,13 +13489,10 @@
"dev": true
},
"space-separated-tokens": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz",
- "integrity": "sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA==",
- "dev": true,
- "requires": {
- "trim": "0.0.1"
- }
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz",
+ "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==",
+ "dev": true
},
"sparkles": {
"version": "1.0.1",
@@ -13156,7 +13534,7 @@
},
"split": {
"version": "0.3.3",
- "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
"integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
"dev": true,
"requires": {
@@ -13202,9 +13580,9 @@
"dev": true
},
"state-toggle": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz",
- "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.2.tgz",
+ "integrity": "sha512-8LpelPGR0qQM4PnfLiplOQNJcIN1/r2Gy0xKB2zKnIW2YzPMt2sR4I/+gtPjhN7Svh9kw+zqEg2SFwpBO9iNiw==",
"dev": true
},
"static-extend": {
@@ -13229,9 +13607,9 @@
}
},
"statuses": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
- "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"dev": true
},
"stealthy-require": {
@@ -13290,7 +13668,7 @@
},
"stream-combiner": {
"version": "0.0.4",
- "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
"integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
"dev": true,
"requires": {
@@ -13368,14 +13746,41 @@
"dev": true
},
"string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "string.prototype.padend": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz",
+ "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
"dev": true,
"requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.4.3",
+ "function-bind": "^1.0.2"
}
},
"string_decoder": {
@@ -13481,39 +13886,6 @@
"lodash": "^4.17.4",
"slice-ansi": "1.0.0",
"string-width": "^2.1.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
}
},
"tapable": {
@@ -13788,9 +14160,9 @@
"dev": true
},
"trim-lines": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.1.tgz",
- "integrity": "sha512-X+eloHbgJGxczUk1WSjIvn7aC9oN3jVE3rQfRVKcgpavi3jxtCn0VVKtjOBj64Yop96UYn/ujJRpTbCdAF1vyg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.2.tgz",
+ "integrity": "sha512-3GOuyNeTqk3FAqc3jOJtw7FTjYl94XBR5aD9QnDbK/T4CA9sW/J0l9RoaRPE9wyPP7NF331qnHnvJFBJ+IDkmQ==",
"dev": true
},
"trim-newlines": {
@@ -13806,15 +14178,15 @@
"dev": true
},
"trim-trailing-lines": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz",
- "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.2.tgz",
+ "integrity": "sha512-MUjYItdrqqj2zpcHFTkMa9WAv4JHTI6gnRQGPFLrt5L9a6tRMiDnIqYl8JBvu2d2Tc3lWJKQwlGCp0K8AvCM+Q==",
"dev": true
},
"trough": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz",
- "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.4.tgz",
+ "integrity": "sha512-tdzBRDGWcI1OpPVmChbdSKhvSVurznZ8X36AYURAcl+0o2ldlCY2XPzyXNNxwJwwyIU+rIglTCG4kxtNKBQH7Q==",
"dev": true
},
"tryer": {
@@ -13844,6 +14216,12 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
+ "type": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz",
+ "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==",
+ "dev": true
+ },
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -13860,13 +14238,13 @@
"dev": true
},
"type-is": {
- "version": "1.6.16",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
- "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"requires": {
"media-typer": "0.3.0",
- "mime-types": "~2.1.18"
+ "mime-types": "~2.1.24"
}
},
"typedarray": {
@@ -13876,21 +14254,15 @@
"dev": true
},
"uglify-js": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.4.tgz",
- "integrity": "sha512-GpKo28q/7Bm5BcX9vOu4S46FwisbPbAmkkqPnGIpKvKTM96I85N6XHQV+k4I6FA2wxgLhcsSyHoNhzucwCflvA==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
+ "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
"dev": true,
"requires": {
"commander": "~2.20.0",
"source-map": "~0.6.1"
},
"dependencies": {
- "commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "dev": true
- },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -13944,12 +14316,6 @@
"yargs": "~3.10.0"
}
},
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true
- },
"wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
@@ -14006,9 +14372,9 @@
"dev": true
},
"unherit": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz",
- "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.2.tgz",
+ "integrity": "sha512-W3tMnpaMG7ZY6xe/moK04U9fBhi6wEiCYHUW5Mop/wQHf12+79EQGwxYejNdhEz2mkqkBlGwm7pxmgBKMVUj0w==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -14103,36 +14469,36 @@
}
},
"unist-builder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.3.tgz",
- "integrity": "sha512-/KB8GEaoeHRyIqClL+Kam+Y5NWJ6yEiPsAfv1M+O1p+aKGgjR89WwoEHKTyOj17L6kAlqtKpAgv2nWvdbQDEig==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz",
+ "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==",
"dev": true,
"requires": {
"object-assign": "^4.1.0"
}
},
"unist-util-generated": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.3.tgz",
- "integrity": "sha512-qlPeDqnQnd84KIqwphzOR+l02cxjDzvEYEBl84EjmKRrX4eUmjyAo8xJv1SCDhJqNjyHRnBMZWNKAiBtXE6hBg==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.4.tgz",
+ "integrity": "sha512-SA7Sys3h3X4AlVnxHdvN/qYdr4R38HzihoEVY2Q2BZu8NHWDnw5OGcC/tXWjQfd4iG+M6qRFNIRGqJmp2ez4Ww==",
"dev": true
},
"unist-util-is": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz",
- "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
+ "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
"dev": true
},
"unist-util-position": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.0.2.tgz",
- "integrity": "sha512-npmFu92l/+b1Ao6uGP4I1WFz9hsKv7qleZ4aliw6x0RVu6A9A3tAf57NMpFfzQ02jxRtJZuRn+C8xWT7GWnH0g==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.0.3.tgz",
+ "integrity": "sha512-28EpCBYFvnMeq9y/4w6pbnFmCUfzlsc41NJui5c51hOFjBA1fejcwc+5W4z2+0ECVbScG3dURS3JTVqwenzqZw==",
"dev": true
},
"unist-util-remove-position": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz",
- "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.3.tgz",
+ "integrity": "sha512-CtszTlOjP2sBGYc2zcKA/CvNdTdEs3ozbiJ63IPBxh8iZg42SCCb8m04f8z2+V1aSk5a7BxbZKEdoDjadmBkWA==",
"dev": true,
"requires": {
"unist-util-visit": "^1.1.0"
@@ -14145,21 +14511,21 @@
"dev": true
},
"unist-util-visit": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz",
- "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
+ "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
"dev": true,
"requires": {
"unist-util-visit-parents": "^2.0.0"
}
},
"unist-util-visit-parents": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz",
- "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
+ "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
"dev": true,
"requires": {
- "unist-util-is": "^2.1.2"
+ "unist-util-is": "^3.0.0"
}
},
"unpipe": {
@@ -14254,12 +14620,12 @@
"dev": true
},
"url-parse": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz",
- "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==",
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+ "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
"dev": true,
"requires": {
- "querystringify": "^2.0.0",
+ "querystringify": "^2.1.1",
"requires-port": "^1.0.0"
},
"dependencies": {
@@ -14303,7 +14669,7 @@
"useragent": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
- "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=",
+ "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
"dev": true,
"requires": {
"lru-cache": "4.1.x",
@@ -14311,12 +14677,16 @@
}
},
"util": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
- "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.0.tgz",
+ "integrity": "sha512-pPSOFl7VLhZ7LO/SFABPraZEEurkJUWSMn3MuA/r3WQZc+Z1fqou2JqLSOZbCLl73EUIxuUVX8X4jkX2vfJeAA==",
"dev": true,
"requires": {
- "inherits": "2.0.3"
+ "inherits": "2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "object.entries": "^1.1.0",
+ "safe-buffer": "^5.1.2"
}
},
"util-deprecate": {
@@ -14325,16 +14695,6 @@
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
- "util.promisify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
- "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "object.getownpropertydescriptors": "^2.0.3"
- }
- },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -14348,9 +14708,9 @@
"dev": true
},
"v8flags": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz",
- "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
+ "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
"dev": true,
"requires": {
"homedir-polyfill": "^1.0.1"
@@ -14402,9 +14762,9 @@
}
},
"vfile-location": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.4.tgz",
- "integrity": "sha512-KRL5uXQPoUKu+NGvQVL4XLORw45W62v4U4gxJ3vRlDfI9QsT4ZN1PNXn/zQpKUulqGDpYuT0XDfp5q9O87/y/w==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.5.tgz",
+ "integrity": "sha512-Pa1ey0OzYBkLPxPZI3d9E+S4BmvfVwNAAXrrqGbwTVXWaX2p9kM1zZ+n35UtVM06shmWKH4RPRN8KI80qE3wNQ==",
"dev": true
},
"vfile-message": {
@@ -14435,6 +14795,26 @@
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
"supports-color": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
@@ -14447,15 +14827,15 @@
}
},
"vfile-sort": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.0.tgz",
- "integrity": "sha512-RgxLXVWrJBWb2GuP8FsSkqK7HmbjXjnI8qx3nD6NTWhsWaelaKvJuxfh1F1d1lkCPD7imo4zzi8cf6IOMgaTnQ==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.1.tgz",
+ "integrity": "sha512-5dt7xEhC44h0uRQKhbM2JAe0z/naHphIZlMOygtMBM9Nn0pZdaX5fshhwWit9wvsuP8t/wp43nTDRRErO1WK8g==",
"dev": true
},
"vfile-statistics": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.2.tgz",
- "integrity": "sha512-16wAC9eEGXdsD35LX9m/iXCRIZyX5LIrDgDtAF92rbATSqsBRbC4n05e0Rj5vt3XRpcKu0UJeWnTxWsSyvNZ+w==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.3.tgz",
+ "integrity": "sha512-CstaK/ebTz1W3Qp41Bt9Lj/2DmumFsCwC2sKahDNSPh0mPh7/UyMLCoU8ZBX34CRU0d61B4W41yIFsV0NKMZeA==",
"dev": true
},
"vinyl": {
@@ -14533,13 +14913,10 @@
}
},
"vm-browserify": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
- "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
- "dev": true,
- "requires": {
- "indexof": "0.0.1"
- }
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
+ "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
+ "dev": true
},
"void-elements": {
"version": "2.0.1",
@@ -14653,12 +15030,6 @@
"wgxpath": "~1.0.0"
},
"dependencies": {
- "ejs": {
- "version": "2.5.9",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz",
- "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==",
- "dev": true
- },
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
@@ -14724,12 +15095,6 @@
"integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==",
"dev": true
},
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
"async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
@@ -14739,6 +15104,62 @@
"lodash": "^4.17.11"
}
},
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^5.0.1",
+ "get-stream": "^3.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
"fast-deep-equal": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
@@ -14754,18 +15175,33 @@
"locate-path": "^2.0.0"
}
},
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -14778,6 +15214,15 @@
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
"load-json-file": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
@@ -14800,6 +15245,32 @@
"path-exists": "^3.0.0"
}
},
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+ "dev": true,
+ "requires": {
+ "execa": "^0.7.0",
+ "lcid": "^1.0.0",
+ "mem": "^1.1.0"
+ }
+ },
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -14869,24 +15340,11 @@
"read-pkg": "^2.0.0"
}
},
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
},
"supports-color": {
"version": "4.5.0",
@@ -14897,6 +15355,12 @@
"has-flag": "^2.0.0"
}
},
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
"yargs": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
@@ -14917,6 +15381,15 @@
"y18n": "^3.2.1",
"yargs-parser": "^7.0.0"
}
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^4.1.0"
+ }
}
}
},
@@ -14947,10 +15420,10 @@
"integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==",
"dev": true
},
- "commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+ "ejs": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz",
+ "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==",
"dev": true
},
"ws": {
@@ -14993,7 +15466,7 @@
},
"webpack-dev-middleware": {
"version": "2.0.6",
- "resolved": "http://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz",
"integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==",
"dev": true,
"requires": {
@@ -15007,9 +15480,9 @@
},
"dependencies": {
"mime": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.2.tgz",
- "integrity": "sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==",
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
"dev": true
}
}
@@ -15125,6 +15598,17 @@
"pako": "~0.2.0"
}
},
+ "buffer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
"camelcase": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
@@ -15335,12 +15819,6 @@
"object-assign": "^4.0.1"
}
},
- "lodash.clone": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
- "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=",
- "dev": true
- },
"memory-fs": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz",
@@ -15424,6 +15902,12 @@
"integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
"dev": true
},
+ "path-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "dev": true
+ },
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
@@ -15509,6 +15993,15 @@
"replace-ext": "0.0.1"
}
},
+ "vm-browserify": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+ "dev": true,
+ "requires": {
+ "indexof": "0.0.1"
+ }
+ },
"watchpack": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz",
@@ -15551,12 +16044,6 @@
"webpack-core": "~0.6.9"
}
},
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true
- },
"wordwrap": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
@@ -15578,12 +16065,13 @@
}
},
"websocket-driver": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
- "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
+ "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
"dev": true,
"requires": {
- "http-parser-js": ">=0.4.0",
+ "http-parser-js": ">=0.4.0 <0.4.11",
+ "safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1"
}
},
@@ -15614,6 +16102,21 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true
+ },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -15628,6 +16131,28 @@
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
}
},
"wrappy": {
@@ -15675,9 +16200,9 @@
"dev": true
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yallist": {
@@ -15693,12 +16218,68 @@
"dev": true
},
"yargs-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
- "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz",
+ "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "yargs-unparser": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz",
+ "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==",
"dev": true,
"requires": {
- "camelcase": "^4.1.0"
+ "flat": "^4.1.0",
+ "lodash": "^4.17.11",
+ "yargs": "^12.0.5"
+ },
+ "dependencies": {
+ "get-caller-file": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "12.0.5",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^4.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^3.0.0",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^2.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^3.2.1 || ^4.0.0",
+ "yargs-parser": "^11.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
}
},
"yeast": {
diff --git a/package.json b/package.json
index 11d5ee5901f..0a68cb6d5d9 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.20.0-pre",
+ "version": "2.20.0",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 7e5bda28964b461d4b539478637b0d8a8df57664 Mon Sep 17 00:00:00 2001
From: Jason Snellbaker
Date: Tue, 18 Jun 2019 15:58:57 -0400
Subject: [PATCH 022/285] increment pre version
---
package-lock.json | 2 +-
package.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 4c03303a050..1d224cebc76 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.20.0",
+ "version": "2.21.0-pre",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/package.json b/package.json
index 0a68cb6d5d9..a4e2985e1bd 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.20.0",
+ "version": "2.21.0-pre",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 92fb453b1962f2ccf057d9cf965dc74e7306ac17 Mon Sep 17 00:00:00 2001
From: Harshad Mane
Date: Tue, 18 Jun 2019 13:12:06 -0700
Subject: [PATCH 023/285] always secure (#3922)
changed serevr end-point to HTTPS
changed user-sync end-point to HTTPS
changed imp.secure to 1 hard-coded
Also corrected test case
---
modules/pubmaticBidAdapter.js | 6 +++---
test/spec/modules/pubmaticBidAdapter_spec.js | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/modules/pubmaticBidAdapter.js b/modules/pubmaticBidAdapter.js
index 1f9ea06cad2..245ca3e60c9 100644
--- a/modules/pubmaticBidAdapter.js
+++ b/modules/pubmaticBidAdapter.js
@@ -5,8 +5,8 @@ import {config} from '../src/config';
const BIDDER_CODE = 'pubmatic';
const LOG_WARN_PREFIX = 'PubMatic: ';
-const ENDPOINT = '//hbopenbid.pubmatic.com/translator?source=prebid-client';
-const USYNCURL = '//ads.pubmatic.com/AdServer/js/showad.js#PIX&kdntuid=1&p=';
+const ENDPOINT = 'https://hbopenbid.pubmatic.com/translator?source=prebid-client';
+const USYNCURL = 'https://ads.pubmatic.com/AdServer/js/showad.js#PIX&kdntuid=1&p=';
const DEFAULT_CURRENCY = 'USD';
const AUCTION_TYPE = 1;
const PUBMATIC_DIGITRUST_KEY = 'nFIn8aLzbd';
@@ -513,7 +513,7 @@ function _createImpressionObject(bid, conf) {
id: bid.bidId,
tagid: bid.params.adUnit || undefined,
bidfloor: _parseSlotParam('kadfloor', bid.params.kadfloor),
- secure: window.location.protocol === 'https:' ? 1 : 0,
+ secure: 1,
ext: {
pmZoneId: _parseSlotParam('pmzoneid', bid.params.pmzoneid)
},
diff --git a/test/spec/modules/pubmaticBidAdapter_spec.js b/test/spec/modules/pubmaticBidAdapter_spec.js
index 6126c0f9fd8..289e0f461ec 100644
--- a/test/spec/modules/pubmaticBidAdapter_spec.js
+++ b/test/spec/modules/pubmaticBidAdapter_spec.js
@@ -695,7 +695,7 @@ describe('PubMatic adapter', function () {
it('Endpoint checking', function () {
let request = spec.buildRequests(bidRequests);
- expect(request.url).to.equal('//hbopenbid.pubmatic.com/translator?source=prebid-client');
+ expect(request.url).to.equal('https://hbopenbid.pubmatic.com/translator?source=prebid-client');
expect(request.method).to.equal('POST');
});
From ce095e02e90ca58be59d9bcd5daa435ee65d1faf Mon Sep 17 00:00:00 2001
From: susyt
Date: Thu, 20 Jun 2019 08:15:40 -0700
Subject: [PATCH 024/285] GumGum: adds tradedesk id param (#3896)
* adds tradedesk id param
* adds more tests
* removes only from test spec
* linting fix
* updates one of the unit tests
---
modules/gumgumBidAdapter.js | 10 +++-
test/spec/modules/gumgumBidAdapter_spec.js | 54 ++++++++++++++++++++++
2 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/modules/gumgumBidAdapter.js b/modules/gumgumBidAdapter.js
index 8c2b6415505..496941e3c1f 100644
--- a/modules/gumgumBidAdapter.js
+++ b/modules/gumgumBidAdapter.js
@@ -75,6 +75,14 @@ function getWrapperCode(wrapper, data) {
return wrapper.replace('AD_JSON', window.btoa(JSON.stringify(data)))
}
+function _getTradeDeskIDParam(bidRequest) {
+ const unifiedIdObj = {};
+ if (bidRequest.userId && bidRequest.userId.tdid) {
+ unifiedIdObj.tdid = bidRequest.userId.tdid;
+ }
+ return unifiedIdObj;
+}
+
// TODO: use getConfig()
function _getDigiTrustQueryParams() {
function getDigiTrustId () {
@@ -170,7 +178,7 @@ function buildRequests (validBidRequests, bidderRequest) {
sizes: bidRequest.sizes,
url: BID_ENDPOINT,
method: 'GET',
- data: Object.assign(data, _getBrowserParams(), _getDigiTrustQueryParams())
+ data: Object.assign(data, _getBrowserParams(), _getDigiTrustQueryParams(), _getTradeDeskIDParam(bidRequest))
})
});
return bids;
diff --git a/test/spec/modules/gumgumBidAdapter_spec.js b/test/spec/modules/gumgumBidAdapter_spec.js
index c067f50fa56..a7a588afd13 100644
--- a/test/spec/modules/gumgumBidAdapter_spec.js
+++ b/test/spec/modules/gumgumBidAdapter_spec.js
@@ -80,6 +80,35 @@ describe('gumgumAdapter', function () {
expect(request.method).to.equal('GET');
expect(request.id).to.equal('30b31c1838de1e');
});
+ it('should correctly set the request paramters depending on params field', function () {
+ const request = Object.assign({}, bidRequests[0]);
+ delete request.params;
+ request.params = {
+ 'inScreen': '10433394',
+ 'bidfloor': 0.05
+ };
+ const bidRequest = spec.buildRequests([request])[0];
+ expect(bidRequest.data.pi).to.equal(2);
+ expect(bidRequest.data).to.include.any.keys('t');
+ expect(bidRequest.data).to.include.any.keys('fp');
+ });
+ it('should correctly set the request paramters depending on params field', function () {
+ const request = Object.assign({}, bidRequests[0]);
+ delete request.params;
+ request.params = {
+ 'ICV': '10433395'
+ };
+ const bidRequest = spec.buildRequests([request])[0];
+ expect(bidRequest.data.pi).to.equal(5);
+ expect(bidRequest.data).to.include.any.keys('ni');
+ });
+ it('should not add additional parameters depending on params field', function () {
+ const request = spec.buildRequests(bidRequests)[0];
+ expect(request.data).to.not.include.any.keys('ni');
+ expect(request.data).to.not.include.any.keys('t');
+ expect(request.data).to.not.include.any.keys('eAdBuyId');
+ expect(request.data).to.not.include.any.keys('adBuyId');
+ });
it('should add consent parameters if gdprConsent is present', function () {
const gdprConsent = { consentString: 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==', gdprApplies: true };
const fakeBidRequest = { gdprConsent: gdprConsent };
@@ -93,6 +122,31 @@ describe('gumgumAdapter', function () {
const bidRequest = spec.buildRequests(bidRequests, fakeBidRequest)[0];
expect(bidRequest.data).to.not.include.any.keys('gdprConsent')
});
+ it('should add a tdid parameter if request contains unified id from TradeDesk', function () {
+ const unifiedId = {
+ 'userId': {
+ 'tdid': 'tradedesk-id'
+ }
+ }
+ const request = Object.assign(unifiedId, bidRequests[0]);
+ const bidRequest = spec.buildRequests([request])[0];
+ expect(bidRequest.data.tdid).to.eq(unifiedId.userId.tdid);
+ });
+ it('should not add a tdid parameter if unified id is not found', function () {
+ const request = spec.buildRequests(bidRequests)[0];
+ expect(request.data).to.not.include.any.keys('tdid');
+ });
+ it('should send ns parameter if browser contains navigator.connection property', function () {
+ const bidRequest = spec.buildRequests(bidRequests)[0];
+ const connection = window.navigator && window.navigator.connection;
+ if (connection) {
+ const downlink = connection.downlink || connection.bandwidth;
+ expect(bidRequest.data).to.include.any.keys('ns');
+ expect(bidRequest.data.ns).to.eq(Math.round(downlink * 1024));
+ } else {
+ expect(bidRequest.data).to.not.include.any.keys('ns');
+ }
+ });
})
describe('interpretResponse', function () {
From bbd73ce0689949877a0c37c4279a55e944aa92f9 Mon Sep 17 00:00:00 2001
From: msm0504 <51493331+msm0504@users.noreply.github.com>
Date: Fri, 21 Jun 2019 17:23:57 -0400
Subject: [PATCH 025/285] Digitrust support in PBS bid adapter and Rubicon bid
adapter (#3935)
* Add microadBidAdapter
* Remove unnecessary encodeURIComponent from microadBidAdapter
* Submit Advangelists Prebid Adapter
* Submit Advangelists Prebid Adapter 1.1
* Correct procudtion endpoint for prebid
* - Get digitrust data from bid request
- Send UnifiedID and PubCommon data to OpenRTB
* - Replace lodash with Prebid util functions
- Updated pubcommon id location when sending to OpenRTB
* Remove pref property when sending DigiTrust to OpenRTB
* Updated tests to check new user external id locations in request
* Remove use of array find from unit test
---
modules/prebidServerBidAdapter/index.js | 64 ++++++-----
modules/rubiconBidAdapter.js | 107 +++++++++++-------
src/utils.js | 17 +++
.../modules/prebidServerBidAdapter_spec.js | 58 +++++-----
4 files changed, 146 insertions(+), 100 deletions(-)
diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js
index 586d78ed2ca..028f02d9662 100644
--- a/modules/prebidServerBidAdapter/index.js
+++ b/modules/prebidServerBidAdapter/index.js
@@ -232,20 +232,24 @@ function doClientSideSyncs(bidders) {
});
}
-function _getDigiTrustQueryParams() {
- function getDigiTrustId() {
- let digiTrustUser = window.DigiTrust && (config.getConfig('digiTrustId') || window.DigiTrust.getUser({member: 'T9QSFKPDN9'}));
+function _getDigiTrustQueryParams(bidRequest = {}) {
+ function getDigiTrustId(bidRequest) {
+ const bidRequestDigitrust = utils.deepAccess(bidRequest, 'bids.0.userId.digitrustid.data');
+ if (bidRequestDigitrust) {
+ return bidRequestDigitrust;
+ }
+
+ const digiTrustUser = config.getConfig('digiTrustId');
return (digiTrustUser && digiTrustUser.success && digiTrustUser.identity) || null;
}
- let digiTrustId = getDigiTrustId();
+ let digiTrustId = getDigiTrustId(bidRequest);
// Verify there is an ID and this user has not opted out
if (!digiTrustId || (digiTrustId.privacy && digiTrustId.privacy.optout)) {
return null;
}
return {
id: digiTrustId.id,
- keyv: digiTrustId.keyv,
- pref: 0
+ keyv: digiTrustId.keyv
};
}
@@ -334,7 +338,7 @@ const LEGACY_PROTOCOL = {
_appendSiteAppDevice(request);
- let digiTrust = _getDigiTrustQueryParams();
+ let digiTrust = _getDigiTrustQueryParams(bidRequests && bidRequests[0]);
if (digiTrust) {
request.digiTrust = digiTrust;
}
@@ -521,26 +525,39 @@ const OPEN_RTB_PROTOCOL = {
_appendSiteAppDevice(request);
- const digiTrust = _getDigiTrustQueryParams();
+ const digiTrust = _getDigiTrustQueryParams(bidRequests && bidRequests[0]);
if (digiTrust) {
- request.user = { ext: { digitrust: digiTrust } };
+ utils.deepSetValue(request, 'user.ext.digitrust', digiTrust);
}
if (!utils.isEmpty(aliases)) {
request.ext.prebid.aliases = aliases;
}
- if (bidRequests && bidRequests[0].userId && typeof bidRequests[0].userId === 'object') {
- if (!request.user) {
- request.user = {};
- }
- if (!request.user.ext) {
- request.user.ext = {}
+ const bidUserId = utils.deepAccess(bidRequests, '0.bids.0.userId');
+ if (bidUserId && typeof bidUserId === 'object' && (bidUserId.tdid || bidUserId.pubcid)) {
+ utils.deepSetValue(request, 'user.ext.eids', []);
+
+ if (bidUserId.tdid) {
+ request.user.ext.eids.push({
+ source: 'adserver.org',
+ uids: [{
+ id: bidUserId.tdid,
+ ext: {
+ rtiPartner: 'TDID'
+ }
+ }]
+ });
}
- if (!request.user.ext.tpid) {
- request.user.ext.tpid = {}
+
+ if (bidUserId.pubcid) {
+ request.user.ext.eids.push({
+ source: 'pubcommon',
+ uids: [{
+ id: bidUserId.pubcid,
+ }]
+ });
}
- Object.assign(request.user.ext.tpid, bidRequests[0].userId);
}
if (bidRequests && bidRequests[0].gdprConsent) {
@@ -560,16 +577,7 @@ const OPEN_RTB_PROTOCOL = {
request.regs = { ext: { gdpr: gdprApplies } };
}
- let consentString = bidRequests[0].gdprConsent.consentString;
- if (request.user) {
- if (request.user.ext) {
- request.user.ext.consent = consentString;
- } else {
- request.user.ext = { consent: consentString };
- }
- } else {
- request.user = { ext: { consent: consentString } };
- }
+ utils.deepSetValue(request, 'user.ext.consent', bidRequests[0].gdprConsent.consentString);
}
return request;
diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js
index a0e9c89a221..abeebd2e1b2 100644
--- a/modules/rubiconBidAdapter.js
+++ b/modules/rubiconBidAdapter.js
@@ -14,6 +14,18 @@ export const FASTLANE_ENDPOINT = '//fastlane.rubiconproject.com/a/api/fastlane.j
export const VIDEO_ENDPOINT = '//prebid-server.rubiconproject.com/openrtb2/auction';
export const SYNC_ENDPOINT = 'https://eus.rubiconproject.com/usync.html';
+const DIGITRUST_PROP_NAMES = {
+ FASTLANE: {
+ id: 'dt.id',
+ keyv: 'dt.keyv',
+ pref: 'dt.pref'
+ },
+ PREBID_SERVER: {
+ id: 'id',
+ keyv: 'keyv'
+ }
+};
+
var sizeMap = {
1: '468x60',
2: '728x90',
@@ -170,13 +182,9 @@ export const spec = {
addVideoParameters(data, bidRequest);
- const digiTrust = getDigiTrustQueryParams();
+ const digiTrust = _getDigiTrustQueryParams(bidRequest, 'PREBID_SERVER');
if (digiTrust) {
- data.user = {
- ext: {
- digitrust: digiTrust
- }
- };
+ utils.deepSetValue(data, 'user.ext.digitrust', digiTrust);
}
if (bidderRequest.gdprConsent) {
@@ -196,15 +204,32 @@ export const spec = {
data.regs = {ext: {gdpr: gdprApplies}};
}
- const consentString = bidderRequest.gdprConsent.consentString;
- if (data.user) {
- if (data.user.ext) {
- data.user.ext.consent = consentString;
- } else {
- data.user.ext = {consent: consentString};
- }
- } else {
- data.user = {ext: {consent: consentString}};
+ utils.deepSetValue(data, 'user.ext.consent', bidderRequest.gdprConsent.consentString);
+ }
+
+ if (bidRequest.userId && typeof bidRequest.userId === 'object' &&
+ (bidRequest.userId.tdid || bidRequest.userId.pubcid)) {
+ utils.deepSetValue(data, 'user.ext.eids', []);
+
+ if (bidRequest.userId.tdid) {
+ data.user.ext.eids.push({
+ source: 'adserver.org',
+ uids: [{
+ id: bidRequest.userId.tdid,
+ ext: {
+ rtiPartner: 'TDID'
+ }
+ }]
+ });
+ }
+
+ if (bidRequest.userId.pubcid) {
+ data.user.ext.eids.push({
+ source: 'pubcommon',
+ uids: [{
+ id: bidRequest.userId.pubcid,
+ }]
+ });
}
}
@@ -406,10 +431,8 @@ export const spec = {
}
// digitrust properties
- const digitrustParams = _getDigiTrustQueryParams();
- Object.keys(digitrustParams).forEach(paramKey => {
- data[paramKey] = digitrustParams[paramKey];
- });
+ const digitrustParams = _getDigiTrustQueryParams(bidRequest, 'FASTLANE');
+ Object.assign(data, digitrustParams);
return data;
},
@@ -600,22 +623,36 @@ function _getScreenResolution() {
return [window.screen.width, window.screen.height].join('x');
}
-function _getDigiTrustQueryParams() {
+function _getDigiTrustQueryParams(bidRequest = {}, endpointName) {
+ if (!endpointName || !DIGITRUST_PROP_NAMES[endpointName]) {
+ return null;
+ }
+ const propNames = DIGITRUST_PROP_NAMES[endpointName];
+
function getDigiTrustId() {
- let digiTrustUser = window.DigiTrust && (config.getConfig('digiTrustId') || window.DigiTrust.getUser({member: 'T9QSFKPDN9'}));
+ const bidRequestDigitrust = utils.deepAccess(bidRequest, 'userId.digitrustid.data');
+ if (bidRequestDigitrust) {
+ return bidRequestDigitrust;
+ }
+
+ let digiTrustUser = (window.DigiTrust && (config.getConfig('digiTrustId') || window.DigiTrust.getUser({member: 'T9QSFKPDN9'})));
return (digiTrustUser && digiTrustUser.success && digiTrustUser.identity) || null;
}
let digiTrustId = getDigiTrustId();
// Verify there is an ID and this user has not opted out
if (!digiTrustId || (digiTrustId.privacy && digiTrustId.privacy.optout)) {
- return [];
+ return null;
}
- return {
- 'dt.id': digiTrustId.id,
- 'dt.keyv': digiTrustId.keyv,
- 'dt.pref': 0
+
+ const digiTrustQueryParams = {
+ [propNames.id]: digiTrustId.id,
+ [propNames.keyv]: digiTrustId.keyv
};
+ if (propNames.pref) {
+ digiTrustQueryParams[propNames.pref] = 0;
+ }
+ return digiTrustQueryParams;
}
/**
@@ -677,24 +714,6 @@ function parseSizes(bid, mediaType) {
return masSizeOrdering(sizes);
}
-function getDigiTrustQueryParams() {
- function getDigiTrustId() {
- let digiTrustUser = window.DigiTrust && (config.getConfig('digiTrustId') || window.DigiTrust.getUser({member: 'T9QSFKPDN9'}));
- return (digiTrustUser && digiTrustUser.success && digiTrustUser.identity) || null;
- }
-
- let digiTrustId = getDigiTrustId();
- // Verify there is an ID and this user has not opted out
- if (!digiTrustId || (digiTrustId.privacy && digiTrustId.privacy.optout)) {
- return null;
- }
- return {
- id: digiTrustId.id,
- keyv: digiTrustId.keyv,
- pref: 0
- };
-}
-
/**
* @param {Object} data
* @param bidRequest
diff --git a/src/utils.js b/src/utils.js
index ea80e970786..b5a46d174f4 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -986,6 +986,23 @@ export function deepAccess(obj, path) {
return obj;
}
+/**
+ * @param {Object} obj The object to set a deep property value in
+ * @param {(string|Array.)} path Object path to the value you would like ot set.
+ * @param {*} value The value you would like to set
+ */
+export function deepSetValue(obj, path, value) {
+ let i;
+ path = path.split('.');
+ for (i = 0; i < path.length - 1; i++) {
+ if (i !== path.length - 1 && typeof obj[path[i]] === 'undefined') {
+ obj[path[i]] = {};
+ }
+ obj = obj[path[i]];
+ }
+ obj[path[i]] = value;
+}
+
/**
* Returns content for a friendly iframe to execute a URL in script tag
* @param {string} url URL to be executed in a script tag in a friendly iframe
diff --git a/test/spec/modules/prebidServerBidAdapter_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js
index 47d0084d86a..e2a3a5b111a 100644
--- a/test/spec/modules/prebidServerBidAdapter_spec.js
+++ b/test/spec/modules/prebidServerBidAdapter_spec.js
@@ -513,38 +513,37 @@ describe('S2S Adapter', function () {
});
it('adds digitrust id is present and user is not optout', function () {
+ let ortb2Config = utils.deepClone(CONFIG);
+ ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction';
+
+ let consentConfig = { s2sConfig: ortb2Config };
+ config.setConfig(consentConfig);
+
let digiTrustObj = {
- success: true,
- identity: {
- privacy: {
- optout: false
- },
- id: 'testId',
- keyv: 'testKeyV'
- }
+ privacy: {
+ optout: false
+ },
+ id: 'testId',
+ keyv: 'testKeyV'
};
- window.DigiTrust = {
- getUser: () => digiTrustObj
- };
+ let digiTrustBidRequest = utils.deepClone(BID_REQUESTS);
+ digiTrustBidRequest[0].bids[0].userId = { digitrustid: { data: digiTrustObj } };
- adapter.callBids(REQUEST, BID_REQUESTS, addBidResponse, done, ajax);
+ adapter.callBids(REQUEST, digiTrustBidRequest, addBidResponse, done, ajax);
let requestBid = JSON.parse(requests[0].requestBody);
- expect(requestBid.digiTrust).to.deep.equal({
- id: digiTrustObj.identity.id,
- keyv: digiTrustObj.identity.keyv,
- pref: 0
+ expect(requestBid.user.ext.digitrust).to.deep.equal({
+ id: digiTrustObj.id,
+ keyv: digiTrustObj.keyv
});
- digiTrustObj.identity.privacy.optout = true;
+ digiTrustObj.privacy.optout = true;
- adapter.callBids(REQUEST, BID_REQUESTS, addBidResponse, done, ajax);
+ adapter.callBids(REQUEST, digiTrustBidRequest, addBidResponse, done, ajax);
requestBid = JSON.parse(requests[1].requestBody);
- expect(requestBid.digiTrust).to.not.exist;
-
- delete window.DigiTrust;
+ expect(requestBid.user && request.user.ext && requestBid.user.ext.digitrust).to.not.exist;
});
it('adds device and app objects to request', function () {
@@ -813,22 +812,25 @@ describe('S2S Adapter', function () {
it('when userId is defined on bids, it\'s properties should be copied to user.ext.tpid properties', function () {
let ortb2Config = utils.deepClone(CONFIG);
- ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction'
+ ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction';
let consentConfig = { s2sConfig: ortb2Config };
config.setConfig(consentConfig);
let userIdBidRequest = utils.deepClone(BID_REQUESTS);
- userIdBidRequest[0].userId = {
- foo: 'abc123',
- unifiedid: '1234'
+ userIdBidRequest[0].bids[0].userId = {
+ tdid: 'abc123',
+ pubcid: '1234'
};
adapter.callBids(REQUEST, userIdBidRequest, addBidResponse, done, ajax);
let requestBid = JSON.parse(requests[0].requestBody);
- expect(typeof requestBid.user.ext.tpid).is.equal('object');
- expect(requestBid.user.ext.tpid.foo).is.equal('abc123');
- expect(requestBid.user.ext.tpid.unifiedid).is.equal('1234');
+ expect(typeof requestBid.user.ext.eids).is.equal('object');
+ expect(Array.isArray(requestBid.user.ext.eids)).to.be.true;
+ expect(requestBid.user.ext.eids.filter(eid => eid.source === 'adserver.org')).is.not.empty;
+ expect(requestBid.user.ext.eids.filter(eid => eid.source === 'adserver.org')[0].uids[0].id).is.equal('abc123');
+ expect(requestBid.user.ext.eids.filter(eid => eid.source === 'pubcommon')).is.not.empty; ;
+ expect(requestBid.user.ext.eids.filter(eid => eid.source === 'pubcommon')[0].uids[0].id).is.equal('1234');
})
it('always add ext.prebid.targeting.includebidderkeys: false for ORTB', function () {
From de8381f3552bee10c2eec80564dec3a26b433e65 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Durgeat
Date: Mon, 24 Jun 2019 19:05:50 +0200
Subject: [PATCH 026/285] ID5 userId submodule (#3798)
* Extract GDPRApplies in userId.js to make it available to cookie-sync requiring it
* Adding id5 userId submodule, tests and documentation
* Fixed typo in test name for unifiedid
* Adding test to userId for ID5
* Follow correct naming convention for GDPRApplies: renamed to isGDPRApplicable
* Refactoring of id5 module following refactoring of userId module.
* Moved init of id5 user module at the end of the id5 module itself
* regroup import to avoid a CircleCI Bug
---
integrationExamples/gpt/userId_example.html | 12 ++-
modules/id5IdSystem.js | 60 +++++++++++++
modules/userId.js | 13 ++-
modules/userId.md | 24 +++++-
test/spec/modules/userId_spec.js | 95 +++++++++++++++------
5 files changed, 175 insertions(+), 29 deletions(-)
create mode 100644 modules/id5IdSystem.js
diff --git a/integrationExamples/gpt/userId_example.html b/integrationExamples/gpt/userId_example.html
index d64e22e44c7..febe61628fe 100644
--- a/integrationExamples/gpt/userId_example.html
+++ b/integrationExamples/gpt/userId_example.html
@@ -140,7 +140,17 @@
name: "unifiedid",
expires: 30
},
-
+ }, {
+ name: "id5Id",
+ params: {
+ partner: 173 // @TODO: Set your real ID5 partner ID here for production, please ask for one contact@id5.io
+ },
+ storage: {
+ type: "cookie",
+ name: "id5id",
+ expires: 90
+ },
+
}, {
name: "pubCommonId",
storage: {
diff --git a/modules/id5IdSystem.js b/modules/id5IdSystem.js
new file mode 100644
index 00000000000..39ab256a81e
--- /dev/null
+++ b/modules/id5IdSystem.js
@@ -0,0 +1,60 @@
+/**
+ * This module adds ID5 to the User ID module
+ * The {@link module:modules/userId} module is required
+ * @module modules/unifiedIdSystem
+ * @requires module:modules/userId
+ */
+
+import * as utils from '../src/utils.js'
+import {ajax} from '../src/ajax.js';
+import {isGDPRApplicable, attachIdSystem} from './userId.js';
+
+/** @type {Submodule} */
+export const id5IdSubmodule = {
+ /**
+ * used to link submodule with config
+ * @type {string}
+ */
+ name: 'id5Id',
+ /**
+ * decode the stored id value for passing to bid requests
+ * @function
+ * @param {{ID5ID:Object}} value
+ * @returns {{id5id:String}}
+ */
+ decode(value) {
+ return (value && typeof value['ID5ID'] === 'string') ? { 'id5id': value['ID5ID'] } : undefined;
+ },
+ /**
+ * performs action to obtain id and return a value in the callback's response argument
+ * @function
+ * @param {SubmoduleParams} [configParams]
+ * @param {ConsentData} [consentData]
+ * @returns {function(callback:function)}
+ */
+ getId(configParams, consentData) {
+ if (!configParams || typeof configParams.partner !== 'number') {
+ utils.logError(`User ID - ID5 submodule requires partner to be defined as a number`);
+ return;
+ }
+ const hasGdpr = isGDPRApplicable(consentData) ? 1 : 0;
+ const gdprConsentString = hasGdpr ? consentData.consentString : '';
+ const url = `https://id5-sync.com/g/v1/${configParams.partner}.json?gdpr=${hasGdpr}&gdpr_consent=${gdprConsentString}`;
+
+ return function (callback) {
+ ajax(url, response => {
+ let responseObj;
+ if (response) {
+ try {
+ responseObj = JSON.parse(response);
+ } catch (error) {
+ utils.logError(error);
+ }
+ }
+ callback(responseObj);
+ }, undefined, { method: 'GET' });
+ }
+ }
+};
+
+attachIdSystem(id5IdSubmodule);
diff --git a/modules/userId.js b/modules/userId.js
index ae06dfc4027..c80ea21a0a0 100644
--- a/modules/userId.js
+++ b/modules/userId.js
@@ -158,13 +158,22 @@ function getStoredValue(storage) {
return storedValue;
}
+/**
+ * test if consent module is present, and if GDPR applies
+ * @param {ConsentData} consentData
+ * @returns {boolean}
+ */
+export function isGDPRApplicable(consentData) {
+ return consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies;
+}
+
/**
* test if consent module is present, applies, and is valid for local storage or cookies (purpose 1)
* @param {ConsentData} consentData
* @returns {boolean}
*/
-function hasGDPRConsent(consentData) {
- if (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) {
+export function hasGDPRConsent(consentData) {
+ if (isGDPRApplicable(consentData)) {
if (!consentData.consentString) {
return false;
}
diff --git a/modules/userId.md b/modules/userId.md
index 782e7782554..b36b9b1007c 100644
--- a/modules/userId.md
+++ b/modules/userId.md
@@ -3,12 +3,12 @@
Example showing `cookie` storage for user id data for both submodules
```
pbjs.setConfig({
- userSync: {
+ usersync: {
userIds: [{
name: "unifiedId",
params: {
partner: "prebid",
- url: "//match.adsrvr.org/track/rid?ttd_pid=prebid&fmt=json"
+ url: "http://match.adsrvr.org/track/rid?ttd_pid=prebid&fmt=json"
},
storage: {
type: "cookie",
@@ -28,6 +28,26 @@ pbjs.setConfig({
});
```
+Example showing `cookie` storage for user id data for id5 submodule
+```
+pbjs.setConfig({
+ usersync: {
+ userIds: [{
+ name: "id5Id",
+ params: {
+ partner: 173 // @TODO: Set your real ID5 partner ID here for production, please ask for one contact@id5.io
+ },
+ storage: {
+ type: "cookie",
+ name: "id5id",
+ expires: 90
+ }
+ }],
+ syncDelay: 5000
+ }
+});
+```
+
Example showing `localStorage` for user id data for both submodules
```
pbjs.setConfig({
diff --git a/test/spec/modules/userId_spec.js b/test/spec/modules/userId_spec.js
index d0f5e06cdad..60df468a903 100644
--- a/test/spec/modules/userId_spec.js
+++ b/test/spec/modules/userId_spec.js
@@ -9,18 +9,20 @@ import {config} from 'src/config';
import * as utils from 'src/utils';
import {unifiedIdSubmodule} from 'modules/unifiedIdSystem';
import {pubCommonIdSubmodule} from 'modules/pubCommonIdSystem';
+import {id5IdSubmodule} from 'modules/id5IdSystem';
let assert = require('chai').assert;
let expect = require('chai').expect;
const EXPIRED_COOKIE_DATE = 'Thu, 01 Jan 1970 00:00:01 GMT';
describe('User ID', function() {
- function getConfigMock(configArr1, configArr2) {
+ function getConfigMock(configArr1, configArr2, configArr3) {
return {
userSync: {
syncDelay: 0,
userIds: [
(configArr1 && configArr1.length === 3) ? getStorageMock.apply(null, configArr1) : null,
- (configArr2 && configArr2.length === 3) ? getStorageMock.apply(null, configArr2) : null
+ (configArr2 && configArr2.length === 3) ? getStorageMock.apply(null, configArr2) : null,
+ (configArr3 && configArr3.length === 3) ? getStorageMock.apply(null, configArr3) : null
].filter(i => i)}
}
}
@@ -68,7 +70,7 @@ describe('User ID', function() {
let pubcid = utils.getCookie('pubcid');
expect(pubcid).to.be.null; // there should be no cookie initially
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie']));
@@ -94,7 +96,7 @@ describe('User ID', function() {
let pubcid1;
let pubcid2;
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie']));
requestBidsHook((config) => { innerAdUnits1 = config.adUnits }, {adUnits: adUnits1});
@@ -108,7 +110,7 @@ describe('User ID', function() {
});
});
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie']));
requestBidsHook((config) => { innerAdUnits2 = config.adUnits }, {adUnits: adUnits2});
@@ -129,7 +131,7 @@ describe('User ID', function() {
let adUnits = [getAdUnitMock()];
let innerAdUnits;
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['pubCommonId', 'pubcid_alt', 'cookie']));
requestBidsHook((config) => { innerAdUnits = config.adUnits }, {adUnits});
@@ -164,14 +166,14 @@ describe('User ID', function() {
});
it('fails initialization if opt out cookie exists', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie']));
expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - opt-out cookie found, exit module');
});
it('initializes if no opt out cookie exists', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie']));
expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 1 submodules');
@@ -190,7 +192,7 @@ describe('User ID', function() {
});
it('handles config with no usersync object', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({});
// usersync is undefined, and no logInfo message for 'User ID - usersync config updated'
@@ -198,14 +200,14 @@ describe('User ID', function() {
});
it('handles config with empty usersync object', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({ usersync: {} });
expect(typeof utils.logInfo.args[0]).to.equal('undefined');
});
it('handles config with usersync and userIds that are empty objs', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({
usersync: {
@@ -216,7 +218,7 @@ describe('User ID', function() {
});
it('handles config with usersync and userIds with empty names or that dont match a submodule.name', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({
usersync: {
@@ -233,15 +235,15 @@ describe('User ID', function() {
});
it('config with 1 configurations should create 1 submodules', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig(getConfigMock(['unifiedId', 'unifiedid', 'cookie']));
expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 1 submodules');
});
- it('config with 2 configurations should result in 2 submodules add', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ it('config with 3 configurations should result in 3 submodules add', function () {
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({
usersync: {
@@ -251,14 +253,17 @@ describe('User ID', function() {
}, {
name: 'unifiedId',
storage: { name: 'unifiedid', type: 'cookie' }
+ }, {
+ name: 'id5Id',
+ storage: { name: 'id5id', type: 'cookie' }
}]
}
});
- expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 2 submodules');
+ expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 3 submodules');
});
it('config syncDelay updates module correctly', function () {
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({
usersync: {
@@ -322,7 +327,7 @@ describe('User ID', function() {
}, {adUnits});
});
- it('test hook from pubcommonid html5', function(done) {
+ it('test hook from unifiedid html5', function(done) {
// simulate existing browser local storage values
localStorage.setItem('unifiedid_alt', JSON.stringify({'TDID': 'testunifiedid_alt'}));
localStorage.setItem('unifiedid_alt_exp', '');
@@ -344,13 +349,36 @@ describe('User ID', function() {
}, {adUnits});
});
- it('test hook when both pubCommonId and unifiedId have data to pass', function(done) {
+ it('test hook from id5id cookies', function(done) {
+ // simulate existing browser local storage values
+ utils.setCookie('id5id', JSON.stringify({'ID5ID': 'testid5id'}), (new Date(Date.now() + 5000).toUTCString()));
+
+ setSubmoduleRegistry([id5IdSubmodule]);
+ init(config);
+ config.setConfig(getConfigMock(['id5Id', 'id5id', 'cookie']));
+
+ requestBidsHook(function() {
+ adUnits.forEach(unit => {
+ unit.bids.forEach(bid => {
+ expect(bid).to.have.deep.nested.property('userId.id5id');
+ expect(bid.userId.id5id).to.equal('testid5id');
+ });
+ });
+ utils.setCookie('id5id', '', EXPIRED_COOKIE_DATE);
+ done();
+ }, {adUnits});
+ });
+
+ it('test hook when pubCommonId, unifiedId and id5Id have data to pass', function(done) {
utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString()));
utils.setCookie('unifiedid', JSON.stringify({'TDID': 'testunifiedid'}), (new Date(Date.now() + 5000).toUTCString()));
+ utils.setCookie('id5id', JSON.stringify({'ID5ID': 'testid5id'}), (new Date(Date.now() + 5000).toUTCString()));
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
- config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'], ['unifiedId', 'unifiedid', 'cookie']));
+ config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'],
+ ['unifiedId', 'unifiedid', 'cookie'],
+ ['id5Id', 'id5id', 'cookie']));
requestBidsHook(function() {
adUnits.forEach(unit => {
@@ -361,17 +389,22 @@ describe('User ID', function() {
// also check that UnifiedId id data was copied to bid
expect(bid).to.have.deep.nested.property('userId.tdid');
expect(bid.userId.tdid).to.equal('testunifiedid');
+ // also check that Id5Id id data was copied to bid
+ expect(bid).to.have.deep.nested.property('userId.id5id');
+ expect(bid.userId.id5id).to.equal('testid5id');
});
});
utils.setCookie('pubcid', '', EXPIRED_COOKIE_DATE);
utils.setCookie('unifiedid', '', EXPIRED_COOKIE_DATE);
+ utils.setCookie('id5id', '', EXPIRED_COOKIE_DATE);
done();
}, {adUnits});
});
- it('test hook when pubCommonId and unifiedId have their modules added before and after init', function(done) {
+ it('test hook when pubCommonId, unifiedId and id5Id have their modules added before and after init', function(done) {
utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString()));
utils.setCookie('unifiedid', JSON.stringify({'TDID': 'cookie-value-add-module-variations'}), new Date(Date.now() + 5000).toUTCString());
+ utils.setCookie('id5id', JSON.stringify({'ID5ID': 'testid5id'}), (new Date(Date.now() + 5000).toUTCString()));
setSubmoduleRegistry([]);
@@ -382,8 +415,11 @@ describe('User ID', function() {
// attaching after init
attachIdSystem(unifiedIdSubmodule);
+ attachIdSystem(id5IdSubmodule);
- config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'], ['unifiedId', 'unifiedid', 'cookie']));
+ config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'],
+ ['unifiedId', 'unifiedid', 'cookie'],
+ ['id5Id', 'id5id', 'cookie']));
requestBidsHook(function() {
adUnits.forEach(unit => {
@@ -394,10 +430,14 @@ describe('User ID', function() {
// also check that UnifiedId id data was copied to bid
expect(bid).to.have.deep.nested.property('userId.tdid');
expect(bid.userId.tdid).to.equal('cookie-value-add-module-variations');
+ // also check that Id5Id id data was copied to bid
+ expect(bid).to.have.deep.nested.property('userId.id5id');
+ expect(bid.userId.id5id).to.equal('testid5id');
});
});
utils.setCookie('pubcid', '', EXPIRED_COOKIE_DATE);
utils.setCookie('unifiedid', '', EXPIRED_COOKIE_DATE);
+ utils.setCookie('id5id', '', EXPIRED_COOKIE_DATE);
done();
}, {adUnits});
});
@@ -405,9 +445,10 @@ describe('User ID', function() {
it('should add new id system ', function(done) {
utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString()));
utils.setCookie('unifiedid', JSON.stringify({'TDID': 'cookie-value-add-module-variations'}), new Date(Date.now() + 5000).toUTCString());
+ utils.setCookie('id5id', JSON.stringify({'ID5ID': 'testid5id'}), (new Date(Date.now() + 5000).toUTCString()));
utils.setCookie('MOCKID', JSON.stringify({'MOCKID': '123456778'}), new Date(Date.now() + 5000).toUTCString());
- setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]);
+ setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]);
init(config);
config.setConfig({
@@ -417,6 +458,8 @@ describe('User ID', function() {
name: 'pubCommonId', storage: { name: 'pubcid', type: 'cookie' }
}, {
name: 'unifiedId', storage: { name: 'unifiedid', type: 'cookie' }
+ }, {
+ name: 'id5Id', storage: { name: 'id5id', type: 'cookie' }
}, {
name: 'mockId', storage: { name: 'MOCKID', type: 'cookie' }
}]
@@ -445,6 +488,9 @@ describe('User ID', function() {
// check UnifiedId id data was copied to bid
expect(bid).to.have.deep.nested.property('userId.tdid');
expect(bid.userId.tdid).to.equal('cookie-value-add-module-variations');
+ // also check that Id5Id id data was copied to bid
+ expect(bid).to.have.deep.nested.property('userId.id5id');
+ expect(bid.userId.id5id).to.equal('testid5id');
// check MockId data was copied to bid
expect(bid).to.have.deep.nested.property('userId.mid');
expect(bid.userId.mid).to.equal('123456778');
@@ -452,6 +498,7 @@ describe('User ID', function() {
});
utils.setCookie('pubcid', '', EXPIRED_COOKIE_DATE);
utils.setCookie('unifiedid', '', EXPIRED_COOKIE_DATE);
+ utils.setCookie('id5id', '', EXPIRED_COOKIE_DATE);
utils.setCookie('MOCKID', '', EXPIRED_COOKIE_DATE);
done();
}, {adUnits});
From 37232c79d9e606324b673bb65d51e9a4a3c93311 Mon Sep 17 00:00:00 2001
From: Dan Bogdan <43830380+EMXDigital@users.noreply.github.com>
Date: Mon, 24 Jun 2019 15:39:48 -0400
Subject: [PATCH 027/285] EMX Digital: Device info and Video parameter updates
(#3929)
* EMX Digital - device info and video parameter updates
* update timeout value to grab from bidderRequest arg
* removing unused import
* removing object spread use. quote fix for lint
* remove space
---
modules/emx_digitalBidAdapter.js | 85 +++++++++++++------
.../modules/emx_digitalBidAdapter_spec.js | 7 +-
2 files changed, 59 insertions(+), 33 deletions(-)
diff --git a/modules/emx_digitalBidAdapter.js b/modules/emx_digitalBidAdapter.js
index 69e02d5c860..2ca595151f9 100644
--- a/modules/emx_digitalBidAdapter.js
+++ b/modules/emx_digitalBidAdapter.js
@@ -1,13 +1,14 @@
import * as utils from '../src/utils';
import { registerBidder } from '../src/adapters/bidderFactory';
import { BANNER, VIDEO } from '../src/mediaTypes';
-import { config } from '../src/config';
import { Renderer } from '../src/Renderer';
import includes from 'core-js/library/fn/array/includes';
const BIDDER_CODE = 'emx_digital';
const ENDPOINT = 'hb.emxdgt.com';
const RENDERER_URL = '//js.brealtime.com/outstream/1.30.0/bundle.js';
+const ADAPTER_VERSION = '1.40.2';
+const DEFAULT_CUR = 'USD';
export const emxAdapter = {
validateSizes: (sizes) => {
@@ -48,6 +49,23 @@ export const emxAdapter = {
}
return bidResponse;
},
+ isMobile: () => {
+ return (/(ios|ipod|ipad|iphone|android)/i).test(navigator.userAgent);
+ },
+ isConnectedTV: () => {
+ return (/(smart[-]?tv|hbbtv|appletv|googletv|hdmi|netcast\.tv|viera|nettv|roku|\bdtv\b|sonydtv|inettvbrowser|\btv\b)/i).test(navigator.userAgent);
+ },
+ getDevice: () => {
+ return {
+ ua: navigator.userAgent,
+ js: 1,
+ dnt: (navigator.doNotTrack === 'yes' || navigator.doNotTrack === '1' || navigator.msDoNotTrack === '1') ? 1 : 0,
+ h: screen.height,
+ w: screen.width,
+ devicetype: emxAdapter.isMobile() ? 1 : emxAdapter.isConnectedTV() ? 3 : 2,
+ language: (navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage),
+ };
+ },
cleanProtocols: (video) => {
if (video.protocols && includes(video.protocols, 7)) {
// not supporting VAST protocol 7 (VAST 4.0);
@@ -85,10 +103,22 @@ export const emxAdapter = {
return renderer;
},
buildVideo: (bid) => {
- bid.params.video = bid.params.video || {};
- bid.params.video.h = bid.mediaTypes.video.playerSize[0][0];
- bid.params.video.w = bid.mediaTypes.video.playerSize[0][1];
- return emxAdapter.cleanProtocols(bid.params.video);
+ let videoObj = Object.assign(bid.mediaTypes.video, bid.params.video)
+ return emxAdapter.cleanProtocols(videoObj);
+ },
+ parseResponse: (bidResponseAdm) => {
+ try {
+ return decodeURIComponent(bidResponseAdm);
+ } catch (err) {
+ utils.logError('emx_digitalBidAdapter', 'error', err);
+ }
+ },
+ getReferrer: () => {
+ try {
+ return window.top.document.referrer;
+ } catch (err) {
+ return document.referrer;
+ }
},
getGdpr: (bidRequests, emxData) => {
if (bidRequests.gdprConsent) {
@@ -151,40 +181,44 @@ export const spec = {
return true;
},
buildRequests: function (validBidRequests, bidderRequest) {
- const page = bidderRequest.refererInfo.referer;
- let emxImps = [];
- const timeout = config.getConfig('bidderTimeout');
+ const emxImps = [];
+ const timeout = bidderRequest.timeout || '';
const timestamp = Date.now();
- const url = location.protocol + '//' + ENDPOINT + ('?t=' + timeout + '&ts=' + timestamp);
- const networkProtocol = location.protocol.indexOf('https') > -1 ? 1 : 0;
+ const url = location.protocol + '//' + ENDPOINT + ('?t=' + timeout + '&ts=' + timestamp + '&src=pbjs');
+ const secure = location.protocol.indexOf('https') > -1 ? 1 : 0;
+ const domain = utils.getTopWindowLocation().hostname;
+ const page = bidderRequest.refererInfo.referer;
+ const device = emxAdapter.getDevice();
+ const ref = emxAdapter.getReferrer();
utils._each(validBidRequests, function (bid) {
- let tagId = utils.getBidIdParameter('tagid', bid.params);
- let bidFloor = parseFloat(utils.getBidIdParameter('bidfloor', bid.params)) || 0;
+ let tagid = utils.getBidIdParameter('tagid', bid.params);
+ let bidfloor = parseFloat(utils.getBidIdParameter('bidfloor', bid.params)) || 0;
let isVideo = !!bid.mediaTypes.video;
let data = {
id: bid.bidId,
tid: bid.transactionId,
- tagid: tagId,
- secure: networkProtocol
+ tagid,
+ secure
};
let typeSpecifics = isVideo ? { video: emxAdapter.buildVideo(bid) } : { banner: emxAdapter.buildBanner(bid) };
- let emxBid = Object.assign(data, typeSpecifics);
+ let bidfloorObj = bidfloor > 0 ? { bidfloor, bidfloorcur: DEFAULT_CUR } : {};
+ let emxBid = Object.assign(data, typeSpecifics, bidfloorObj);
- if (bidFloor > 0) {
- emxBid.bidfloor = bidFloor
- }
emxImps.push(emxBid);
});
let emxData = {
id: bidderRequest.auctionId,
imp: emxImps,
+ device,
site: {
- domain: window.top.document.location.host,
- page: page
+ domain,
+ page,
+ ref
},
- version: '1.30.0'
+ cur: DEFAULT_CUR,
+ version: ADAPTER_VERSION
};
emxData = emxAdapter.getGdpr(bidderRequest, Object.assign({}, emxData));
@@ -204,6 +238,7 @@ export const spec = {
response.seatbid.forEach(function (emxBid) {
emxBid = emxBid.bid[0];
let isVideo = false;
+ let adm = emxAdapter.parseResponse(emxBid.adm) || '';
let bidResponse = {
requestId: emxBid.id,
cpm: emxBid.price,
@@ -214,7 +249,7 @@ export const spec = {
currency: 'USD',
netRevenue: true,
ttl: emxBid.ttl,
- ad: decodeURIComponent(emxBid.adm)
+ ad: adm
};
if (emxBid.adm && emxBid.adm.indexOf(' -1) {
isVideo = true;
@@ -234,12 +269,6 @@ export const spec = {
url: '//biddr.brealtime.com/check.html'
});
}
- if (syncOptions.pixelEnabled) {
- syncs.push({
- type: 'image',
- url: '//edba.brealtime.com/'
- });
- }
return syncs;
}
};
diff --git a/test/spec/modules/emx_digitalBidAdapter_spec.js b/test/spec/modules/emx_digitalBidAdapter_spec.js
index 170e5676f43..10d0d74c49c 100644
--- a/test/spec/modules/emx_digitalBidAdapter_spec.js
+++ b/test/spec/modules/emx_digitalBidAdapter_spec.js
@@ -276,8 +276,9 @@ describe('emx_digital Adapter', function () {
it('properly sends site information and protocol', function () {
request = spec.buildRequests(bidderRequest.bids, bidderRequest);
request = JSON.parse(request.data);
- expect(request.site.domain).to.equal(window.top.document.location.host);
+ expect(request.site.domain).to.equal(utils.getTopWindowLocation().hostname);
expect(decodeURIComponent(request.site.page)).to.equal(bidderRequest.refererInfo.referer);
+ expect(request.site.ref).to.equal(window.top.document.referrer);
});
it('builds correctly formatted request banner object', function () {
@@ -511,10 +512,6 @@ describe('emx_digital Adapter', function () {
let iframeSync = spec.getUserSyncs(syncOptionsIframe);
expect(iframeSync.length).to.equal(1);
expect(iframeSync[0].type).to.equal('iframe');
-
- let pixelSync = spec.getUserSyncs(syncOptionsPixel);
- expect(pixelSync.length).to.equal(1);
- expect(pixelSync[0].type).to.equal('image');
});
});
});
From 75aca43bc2c9f05db2483bcd4661c32682fa0dcc Mon Sep 17 00:00:00 2001
From: Rich Snapp
Date: Mon, 24 Jun 2019 13:40:40 -0600
Subject: [PATCH 028/285] update placementId to be number instead of string
(#3941)
---
integrationExamples/gpt/prebidServer_example.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/integrationExamples/gpt/prebidServer_example.html b/integrationExamples/gpt/prebidServer_example.html
index f13c93963c6..db61a6a46d6 100644
--- a/integrationExamples/gpt/prebidServer_example.html
+++ b/integrationExamples/gpt/prebidServer_example.html
@@ -41,7 +41,7 @@
{
bidder: 'appnexus',
params: {
- placementId: '13144370'
+ placementId: 13144370
}
}
]
From b6aaf644b2239da3f85b73737a5a06c6fa327d01 Mon Sep 17 00:00:00 2001
From: Gleb Glushtsov
Date: Mon, 24 Jun 2019 20:21:30 -0400
Subject: [PATCH 029/285] [33Across adapter] Map ad unit path to element id
(#3920)
* fix return of _mapAdUnitPathToElementId()
* improve logging of _mapAdUnitPathToElementId()
* do not use Array.find()
* return id once element is found
* return id once element is found
* let -> const
---
modules/33acrossBidAdapter.js | 48 ++++++++++++++------
modules/33acrossBidAdapter.md | 2 +-
test/spec/modules/33acrossBidAdapter_spec.js | 4 +-
3 files changed, 38 insertions(+), 16 deletions(-)
diff --git a/modules/33acrossBidAdapter.js b/modules/33acrossBidAdapter.js
index 1cf885ed6e4..801a5d564a3 100644
--- a/modules/33acrossBidAdapter.js
+++ b/modules/33acrossBidAdapter.js
@@ -1,8 +1,7 @@
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { config } from '../src/config';
import * as utils from '../src/utils';
-const { registerBidder } = require('../src/adapters/bidderFactory');
-const { config } = require('../src/config');
-
const BIDDER_CODE = '33across';
const END_POINT = 'https://ssc.33across.com/api/v1/hb';
const SYNC_ENDPOINT = 'https://de.tynt.com/deb/v2?m=xch&rt=html';
@@ -32,17 +31,43 @@ function _isViewabilityMeasurable(element) {
}
function _getViewability(element, topWin, { w, h } = {}) {
- return utils.getWindowTop().document.visibilityState === 'visible'
+ return topWin.document.visibilityState === 'visible'
? _getPercentInView(element, topWin, { w, h })
: 0;
}
+function _mapAdUnitPathToElementId(adUnitCode) {
+ if (utils.isGptPubadsDefined()) {
+ const adSlots = googletag.pubads().getSlots();
+ const isMatchingAdSlot = utils.isSlotMatchingAdUnitCode(adUnitCode);
+
+ for (let i = 0; i < adSlots.length; i++) {
+ if (isMatchingAdSlot(adSlots[i])) {
+ const id = adSlots[i].getSlotElementId();
+
+ utils.logInfo(`[33Across Adapter] Map ad unit path to HTML element id: '${adUnitCode}' -> ${id}`);
+
+ return id;
+ }
+ }
+ }
+
+ utils.logWarn(`[33Across Adapter] Unable to locate element for ad unit code: '${adUnitCode}'`);
+
+ return null;
+}
+
+function _getAdSlotHTMLElement(adUnitCode) {
+ return document.getElementById(adUnitCode) ||
+ document.getElementById(_mapAdUnitPathToElementId(adUnitCode));
+}
+
// Infer the necessary data from valid bid for a minimal ttxRequest and create HTTP request
// NOTE: At this point, TTX only accepts request for a single impression
function _createServerRequest(bidRequest, gdprConsent) {
const ttxRequest = {};
const params = bidRequest.params;
- const element = document.getElementById(bidRequest.adUnitCode);
+ const element = _getAdSlotHTMLElement(bidRequest.adUnitCode);
const sizes = _transformSizes(bidRequest.sizes);
const minSize = _getMinSize(sizes);
@@ -52,10 +77,6 @@ function _createServerRequest(bidRequest, gdprConsent) {
const contributeViewability = ViewabilityContributor(viewabilityAmount);
- if (element === null) {
- utils.logWarn(`Unable to locate element with id: '${bidRequest.adUnitCode}'`);
- }
-
/*
* Infer data for the request payload
*/
@@ -264,13 +285,14 @@ function isBidRequestValid(bid) {
// - the server, at this point, also doesn't need the consent string to handle gdpr compliance. So passing
// value whether set or not, for the sake of future dev.
function buildRequests(bidRequests, bidderRequest) {
- const gdprConsent = Object.assign({ consentString: undefined, gdprApplies: false }, bidderRequest && bidderRequest.gdprConsent);
+ const gdprConsent = Object.assign({
+ consentString: undefined,
+ gdprApplies: false
+ }, bidderRequest && bidderRequest.gdprConsent);
adapterState.uniqueSiteIds = bidRequests.map(req => req.params.siteId).filter(utils.uniques);
- return bidRequests.map((req) => {
- return _createServerRequest(req, gdprConsent);
- });
+ return bidRequests.map(req => _createServerRequest(req, gdprConsent));
}
// NOTE: At this point, the response from 33exchange will only ever contain one bid i.e. the highest bid
diff --git a/modules/33acrossBidAdapter.md b/modules/33acrossBidAdapter.md
index bdb2b944861..58e3b2b273a 100644
--- a/modules/33acrossBidAdapter.md
+++ b/modules/33acrossBidAdapter.md
@@ -16,7 +16,7 @@ Connects to 33Across's exchange for bids.
```
var adUnits = [
{
- code: '33across-hb-ad-123456-1',
+ code: '33across-hb-ad-123456-1', // ad slot HTML element ID
sizes: [
[300, 250],
[728, 90]
diff --git a/test/spec/modules/33acrossBidAdapter_spec.js b/test/spec/modules/33acrossBidAdapter_spec.js
index 1fc77a7e14d..7e1a8619c63 100644
--- a/test/spec/modules/33acrossBidAdapter_spec.js
+++ b/test/spec/modules/33acrossBidAdapter_spec.js
@@ -337,8 +337,8 @@ describe('33acrossBidAdapter:', function () {
utils.getWindowTop.restore();
utils.getWindowSelf.restore();
- sandbox.stub(utils, 'getWindowTop').returns(win);
- sandbox.stub(utils, 'getWindowSelf').returns({});
+ sandbox.stub(utils, 'getWindowTop').returns({});
+ sandbox.stub(utils, 'getWindowSelf').returns(win);
expect(spec.buildRequests(bidRequests)).to.deep.equal([ serverRequest ]);
});
From 9d2f06c79e0a84207fb72e36329a894ee221c5b1 Mon Sep 17 00:00:00 2001
From: Daniel Liebner
Date: Tue, 25 Jun 2019 13:36:02 -0400
Subject: [PATCH 030/285] New Adapter: bidglass (#3861)
* Added bidglass adapter + test
* PR Review Updates:
- Added formal params to getUserSyncs function definition
- getUserSyncs now always returns an array
- Improved unit test coverage
* PR Review Updates:
- Removed unused methods: getUserSyncs, onTimeout, onBidWon,
onSetTargeting
- Removed getUserSyncs unit test
- Removed "dead code"
- Removed some unnecessary comments
- Fixed usage of parseInt
---
modules/bidglassBidAdapter.js | 134 ++++++++++++++++++++++
modules/bidglassBidAdapter.md | 34 ++++++
test/spec/modules/bidglassAdapter_spec.js | 103 +++++++++++++++++
3 files changed, 271 insertions(+)
create mode 100644 modules/bidglassBidAdapter.js
create mode 100644 modules/bidglassBidAdapter.md
create mode 100644 test/spec/modules/bidglassAdapter_spec.js
diff --git a/modules/bidglassBidAdapter.js b/modules/bidglassBidAdapter.js
new file mode 100644
index 00000000000..1898d1220fa
--- /dev/null
+++ b/modules/bidglassBidAdapter.js
@@ -0,0 +1,134 @@
+import * as utils from 'src/utils';
+// import {config} from 'src/config';
+import {registerBidder} from 'src/adapters/bidderFactory';
+
+const BIDDER_CODE = 'bidglass';
+
+export const spec = {
+ code: BIDDER_CODE,
+ aliases: ['bg'], // short code
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {BidRequest} bid The bid params to validate.
+ * @return boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid: function(bid) {
+ return !!(bid.params.adUnitId && !isNaN(parseFloat(bid.params.adUnitId)) && isFinite(bid.params.adUnitId));
+ },
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {validBidRequests[]} - an array of bids
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function(validBidRequests, bidderRequest) {
+ /*
+ Sample array entry for validBidRequests[]:
+ [{
+ "bidder": "bidglass",
+ "bidId": "51ef8751f9aead",
+ "params": {
+ "adUnitId": 11,
+ ...
+ },
+ "adUnitCode": "div-gpt-ad-1460505748561-0",
+ "transactionId": "d7b773de-ceaa-484d-89ca-d9f51b8d61ec",
+ "sizes": [[320,50],[300,250],[300,600]],
+ "bidderRequestId": "418b37f85e772c",
+ "auctionId": "18fd8b8b0bd757",
+ "bidRequestsCount": 1
+ }]
+ */
+
+ let imps = [];
+ let getReferer = function() {
+ return window === window.top ? window.location.href : window.parent === window.top ? document.referrer : null;
+ };
+ let getOrigins = function() {
+ var ori = [window.location.protocol + '//' + window.location.hostname];
+
+ if (window.location.ancestorOrigins) {
+ for (var i = 0; i < window.location.ancestorOrigins.length; i++) {
+ ori.push(window.location.ancestorOrigins[i]);
+ }
+ } else if (window !== window.top) {
+ // Derive the parent origin
+ var parts = document.referrer.split('/');
+
+ ori.push(parts[0] + '//' + parts[2]);
+
+ if (window.parent !== window.top) {
+ // Additional unknown origins exist
+ ori.push('null');
+ }
+ }
+
+ return ori;
+ };
+
+ utils._each(validBidRequests, function(bid) {
+ bid.sizes = ((utils.isArray(bid.sizes) && utils.isArray(bid.sizes[0])) ? bid.sizes : [bid.sizes]);
+ bid.sizes = bid.sizes.filter(size => utils.isArray(size));
+
+ // Stuff to send: [bid id, sizes, adUnitId]
+ imps.push({
+ bidId: bid.bidId,
+ sizes: bid.sizes,
+ adUnitId: utils.getBidIdParameter('adUnitId', bid.params)
+ });
+ });
+
+ // Stuff to send: page URL
+ const bidReq = {
+ reqId: utils.getUniqueIdentifierStr(),
+ imps: imps,
+ ref: getReferer(),
+ ori: getOrigins()
+ };
+
+ let url = 'https://bid.glass/ad/hb.php?' +
+ `src=$$REPO_AND_VERSION$$`;
+
+ return {
+ method: 'POST',
+ url: url,
+ data: JSON.stringify(bidReq),
+ options: {
+ contentType: 'text/plain',
+ withCredentials: false
+ }
+ }
+ },
+
+ /**
+ * Unpack the response from the server into a list of bids.
+ *
+ * @param {ServerResponse} serverResponse A successful response from the server.
+ * @return {Bid[]} An array of bids which were nested inside the server.
+ */
+ interpretResponse: function(serverResponse) {
+ const bidResponses = [];
+
+ utils._each(serverResponse.body.bidResponses, function(bid) {
+ bidResponses.push({
+ requestId: bid.requestId,
+ cpm: parseFloat(bid.cpm),
+ width: parseInt(bid.width, 10),
+ height: parseInt(bid.height, 10),
+ creativeId: bid.creativeId,
+ dealId: bid.dealId || null,
+ currency: bid.currency || 'USD',
+ mediaType: bid.mediaType || 'banner',
+ netRevenue: true,
+ ttl: bid.ttl || 10,
+ ad: bid.ad
+ });
+ });
+
+ return bidResponses;
+ }
+
+}
+
+registerBidder(spec);
diff --git a/modules/bidglassBidAdapter.md b/modules/bidglassBidAdapter.md
new file mode 100644
index 00000000000..5384a095314
--- /dev/null
+++ b/modules/bidglassBidAdapter.md
@@ -0,0 +1,34 @@
+# Overview
+
+```
+Module Name: Bid Glass Bid Adapter
+Module Type: Bidder Adapter
+Maintainer: dliebner@gmail.com
+```
+
+# Description
+
+Connects to Bid Glass and allows bids on ad units to compete within prebid.
+
+# Sample Ad Unit: For Publishers
+```
+var adUnits = [{
+ code: 'bg-test-rectangle',
+ sizes: [[300, 250]],
+ bids: [{
+ bidder: 'bidglass',
+ params: {
+ adUnitId: '-1'
+ }
+ }]
+},{
+ code: 'bg-test-leaderboard',
+ sizes: [[728, 90]],
+ bids: [{
+ bidder: 'bidglass',
+ params: {
+ adUnitId: '-1'
+ }
+ }]
+}]
+```
\ No newline at end of file
diff --git a/test/spec/modules/bidglassAdapter_spec.js b/test/spec/modules/bidglassAdapter_spec.js
new file mode 100644
index 00000000000..00a47fc997a
--- /dev/null
+++ b/test/spec/modules/bidglassAdapter_spec.js
@@ -0,0 +1,103 @@
+import { expect } from 'chai';
+import { spec } from 'modules/bidglassBidAdapter';
+import { newBidder } from 'src/adapters/bidderFactory';
+
+describe('Bid Glass Adapter', function () {
+ const adapter = newBidder(spec);
+
+ describe('isBidRequestValid', function () {
+ let bid = {
+ 'bidder': 'bidglass',
+ 'params': {
+ 'adUnitId': '3'
+ },
+ 'adUnitCode': 'bidglass-testunit',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '30b31c1838de1e',
+ 'bidderRequestId': '22edbae2733bf6',
+ 'auctionId': '1d1a030790a475',
+ };
+
+ it('should return true when required params found', function () {
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+
+ it('should return false when required params are not passed', function () {
+ let bid = Object.assign({}, bid);
+ delete bid.params;
+ bid.params = {};
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+ });
+
+ describe('buildRequests', function () {
+ const bidRequests = [{
+ 'bidder': 'bidglass',
+ 'params': {
+ 'adUnitId': '3'
+ },
+ 'adUnitCode': 'bidglass-testunit',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '30b31c1838de1e',
+ 'bidderRequestId': '22edbae2733bf6',
+ 'auctionId': '1d1a030790a475',
+ }];
+
+ const request = spec.buildRequests(bidRequests);
+
+ it('sends bid request to our endpoint via POST', function () {
+ expect(request.method).to.equal('POST');
+ });
+
+ it('sets withCredentials to false', function () {
+ expect(request.options.withCredentials).to.equal(false);
+ });
+ });
+
+ describe('interpretResponse', function () {
+ let response;
+ beforeEach(function () {
+ response = {
+ body: {
+ 'bidResponses': [{
+ 'ad': '',
+ 'cpm': '0.01',
+ 'creativeId': '-1',
+ 'width': '300',
+ 'height': '250',
+ 'requestId': '30b31c1838de1e'
+ }]
+ }
+ };
+ });
+
+ it('should get the correct bid response', function () {
+ let expectedResponse = [{
+ 'requestId': '30b31c1838de1e',
+ 'cpm': 0.01,
+ 'width': 300,
+ 'height': 250,
+ 'creativeId': '-1',
+ 'dealId': null,
+ 'currency': 'USD',
+ 'mediaType': 'banner',
+ 'netRevenue': true,
+ 'ttl': 10,
+ 'ad': ''
+ }];
+
+ let result = spec.interpretResponse(response);
+ expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
+ });
+
+ it('handles empty bid response', function () {
+ let response = {
+ body: {
+ 'bidResponses': []
+ }
+ };
+ let result = spec.interpretResponse(response);
+ expect(result.length).to.equal(0);
+ });
+ });
+});
From e64360ccdd3613dbffebd29212367ffc6b72c3e6 Mon Sep 17 00:00:00 2001
From: Index Exchange 3 Prebid Team
Date: Tue, 25 Jun 2019 13:37:06 -0400
Subject: [PATCH 031/285] Prebid.js Video (#3901)
* Implemented changes required to provide support for video in the IX bidding adapter for Instream and Outstream contexts.
* Implemented changes required to provide support for video in the IX bidding adapter for Instream and Outstream contexts.
* fix find module
---
modules/ixBidAdapter.js | 366 ++++++++++++++++---------
modules/ixBidAdapter.md | 128 ++++++++-
test/spec/modules/ixBidAdapter_spec.js | 344 ++++++++++++++++++-----
3 files changed, 628 insertions(+), 210 deletions(-)
diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js
index c63b920dc93..f26c5e413c5 100644
--- a/modules/ixBidAdapter.js
+++ b/modules/ixBidAdapter.js
@@ -1,38 +1,75 @@
import * as utils from '../src/utils';
-import { BANNER } from '../src/mediaTypes';
+import { BANNER, VIDEO } from '../src/mediaTypes';
+import find from 'core-js/library/fn/array/find';
import { config } from '../src/config';
import isArray from 'core-js/library/fn/array/is-array';
import isInteger from 'core-js/library/fn/number/is-integer';
import { registerBidder } from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'ix';
-const BANNER_SECURE_BID_URL = 'https://as-sec.casalemedia.com/cygnus';
-const BANNER_INSECURE_BID_URL = 'http://as.casalemedia.com/cygnus';
-const SUPPORTED_AD_TYPES = [BANNER];
-const ENDPOINT_VERSION = 7.2;
+const SECURE_BID_URL = 'https://as-sec.casalemedia.com/cygnus';
+const INSECURE_BID_URL = 'http://as.casalemedia.com/cygnus';
+const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
+const BANNER_ENDPOINT_VERSION = 7.2;
+const VIDEO_ENDPOINT_VERSION = 8.1;
+
const CENT_TO_DOLLAR_FACTOR = 100;
-const TIME_TO_LIVE = 35;
+const BANNER_TIME_TO_LIVE = 35;
+const VIDEO_TIME_TO_LIVE = 3600; // 1hr
const NET_REVENUE = true;
const PRICE_TO_DOLLAR_FACTOR = {
JPY: 1
};
/**
- * Transform valid bid request config object to impression object that will be sent to ad server.
+ * Transform valid bid request config object to banner impression object that will be sent to ad server.
*
* @param {object} bid A valid bid request config object.
* @return {object} A impression object that will be sent to ad server.
*/
function bidToBannerImp(bid) {
- const imp = {};
-
- imp.id = bid.bidId;
+ const imp = bidToImp(bid);
imp.banner = {};
imp.banner.w = bid.params.size[0];
imp.banner.h = bid.params.size[1];
imp.banner.topframe = utils.inIframe() ? 0 : 1;
+ return imp;
+}
+
+/**
+ * Transform valid bid request config object to video impression object that will be sent to ad server.
+ *
+ * @param {object} bid A valid bid request config object.
+ * @return {object} A impression object that will be sent to ad server.
+ */
+function bidToVideoImp(bid) {
+ const imp = bidToImp(bid);
+
+ imp.video = utils.deepClone(bid.params.video)
+ imp.video.w = bid.params.size[0];
+ imp.video.h = bid.params.size[1];
+
+ const context = utils.deepAccess(bid, 'mediaTypes.video.context');
+ if (context) {
+ if (context === 'instream') {
+ imp.video.placement = 1;
+ } else if (context === 'outstream') {
+ imp.video.placement = 4;
+ } else {
+ utils.logWarn(`ix bidder params: video context '${context}' is not supported`);
+ }
+ }
+
+ return imp;
+}
+
+function bidToImp(bid) {
+ const imp = {};
+
+ imp.id = bid.bidId;
+
imp.ext = {};
imp.ext.siteID = bid.params.siteId;
@@ -58,7 +95,7 @@ function bidToBannerImp(bid) {
* @param {string} currency Global currency in bid response.
* @return {object} bid The parsed bid.
*/
-function parseBid(rawBid, currency) {
+function parseBid(rawBid, currency, bidRequest) {
const bid = {};
if (PRICE_TO_DOLLAR_FACTOR.hasOwnProperty(currency)) {
@@ -68,15 +105,27 @@ function parseBid(rawBid, currency) {
}
bid.requestId = rawBid.impid;
- bid.width = rawBid.w;
- bid.height = rawBid.h;
- bid.ad = rawBid.adm;
+
bid.dealId = utils.deepAccess(rawBid, 'ext.dealid');
- bid.ttl = TIME_TO_LIVE;
bid.netRevenue = NET_REVENUE;
bid.currency = currency;
bid.creativeId = rawBid.hasOwnProperty('crid') ? rawBid.crid : '-';
+ // in the event of a video
+ if (utils.deepAccess(rawBid, 'ext.vasturl')) {
+ bid.vastUrl = rawBid.ext.vasturl
+ bid.width = bidRequest.video.w;
+ bid.height = bidRequest.video.h;
+ bid.mediaType = VIDEO;
+ bid.ttl = VIDEO_TIME_TO_LIVE;
+ } else {
+ bid.ad = rawBid.adm;
+ bid.width = rawBid.w;
+ bid.height = rawBid.h;
+ bid.mediaType = BANNER;
+ bid.ttl = BANNER_TIME_TO_LIVE;
+ }
+
bid.meta = {};
bid.meta.networkId = utils.deepAccess(rawBid, 'ext.dspid');
bid.meta.brandId = utils.deepAccess(rawBid, 'ext.advbrandid');
@@ -133,6 +182,143 @@ function isValidBidFloorParams(bidFloor, bidFloorCur) {
bidFloorCur.match(curRegex));
}
+/**
+ * Finds the impression with the associated id.
+ *
+ * @param {*} id Id of the impression.
+ * @param {array} impressions List of impressions sent in the request.
+ * @return {object} The impression with the associated id.
+ */
+function getBidRequest(id, impressions) {
+ if (!id) {
+ return;
+ }
+ return find(impressions, imp => imp.id === id);
+}
+
+/**
+ * Builds a request object to be sent to the ad server based on bid requests.
+ *
+ * @param {array} validBidRequests A list of valid bid request config objects.
+ * @param {object} bidderRequest An object containing other info like gdprConsent.
+ * @param {array} impressions List of impression objects describing the bids.
+ * @param {array} version Endpoint version denoting banner or video.
+ * @return {object} Info describing the request to the server.
+ *
+ */
+function buildRequest(validBidRequests, bidderRequest, impressions, version) {
+ const userEids = [];
+
+ // Always start by assuming the protocol is HTTPS. This way, it will work
+ // whether the page protocol is HTTP or HTTPS. Then check if the page is
+ // actually HTTP.If we can guarantee it is, then, and only then, set protocol to
+ // HTTP.
+ let baseUrl = SECURE_BID_URL;
+
+ // RTI ids will be included in the bid request if the function getIdentityInfo() is loaded
+ // and if the data for the partner exist
+ if (window.headertag && typeof window.headertag.getIdentityInfo === 'function') {
+ let identityInfo = window.headertag.getIdentityInfo();
+ if (identityInfo && typeof identityInfo === 'object') {
+ for (const partnerName in identityInfo) {
+ if (identityInfo.hasOwnProperty(partnerName)) {
+ let response = identityInfo[partnerName];
+ if (!response.responsePending && response.data && typeof response.data === 'object' && Object.keys(response.data).length) {
+ userEids.push(response.data);
+ }
+ }
+ }
+ }
+ }
+ const r = {};
+
+ // Since bidderRequestId are the same for different bid request, just use the first one.
+ r.id = validBidRequests[0].bidderRequestId;
+
+ r.imp = impressions;
+
+ r.site = {};
+ r.ext = {};
+ r.ext.source = 'prebid';
+ if (userEids.length > 0) {
+ r.user = {};
+ r.user.eids = userEids;
+ }
+
+ if (document.referrer && document.referrer !== '') {
+ r.site.ref = document.referrer;
+ }
+
+ // Apply GDPR information to the request if GDPR is enabled.
+ if (bidderRequest) {
+ if (bidderRequest.gdprConsent) {
+ const gdprConsent = bidderRequest.gdprConsent;
+
+ if (gdprConsent.hasOwnProperty('gdprApplies')) {
+ r.regs = {
+ ext: {
+ gdpr: gdprConsent.gdprApplies ? 1 : 0
+ }
+ };
+ }
+
+ if (gdprConsent.hasOwnProperty('consentString')) {
+ r.user = r.user || {};
+ r.user.ext = {
+ consent: gdprConsent.consentString || ''
+ };
+ }
+ }
+
+ if (bidderRequest.refererInfo) {
+ r.site.page = bidderRequest.refererInfo.referer;
+
+ if (bidderRequest.refererInfo.referer && bidderRequest.refererInfo.referer.indexOf('https') !== 0) {
+ baseUrl = INSECURE_BID_URL;
+ }
+ }
+ }
+
+ const payload = {};
+
+ // Parse additional runtime configs.
+ const otherIxConfig = config.getConfig('ix');
+ if (otherIxConfig) {
+ // Append firstPartyData to r.site.page if firstPartyData exists.
+ if (typeof otherIxConfig.firstPartyData === 'object') {
+ const firstPartyData = otherIxConfig.firstPartyData;
+ let firstPartyString = '?';
+ for (const key in firstPartyData) {
+ if (firstPartyData.hasOwnProperty(key)) {
+ firstPartyString += `${encodeURIComponent(key)}=${encodeURIComponent(firstPartyData[key])}&`;
+ }
+ }
+ firstPartyString = firstPartyString.slice(0, -1);
+
+ r.site.page += firstPartyString;
+ }
+
+ // Create t in payload if timeout is configured.
+ if (typeof otherIxConfig.timeout === 'number') {
+ payload.t = otherIxConfig.timeout;
+ }
+ }
+
+ // Use the siteId in the first bid request as the main siteId.
+ payload.s = validBidRequests[0].params.siteId;
+ payload.v = version;
+ payload.r = JSON.stringify(r);
+ payload.ac = 'j';
+ payload.sd = 1;
+ payload.nf = 1;
+
+ return {
+ method: 'GET',
+ url: baseUrl,
+ data: payload
+ };
+}
+
export const spec = {
code: BIDDER_CODE,
@@ -146,22 +332,25 @@ export const spec = {
*/
isBidRequestValid: function (bid) {
if (!isValidSize(bid.params.size)) {
+ utils.logError('ix bidder params: bid size has invalid format.');
return false;
}
if (!includesSize(bid.sizes, bid.params.size)) {
+ utils.logError('ix bidder params: bid size is not included in ad unit sizes.');
return false;
}
- if (bid.hasOwnProperty('mediaType') && bid.mediaType !== 'banner') {
+ if (bid.hasOwnProperty('mediaType') && !(utils.contains(SUPPORTED_AD_TYPES, bid.mediaType))) {
return false;
}
- if (bid.hasOwnProperty('mediaTypes') && !utils.deepAccess(bid, 'mediaTypes.banner.sizes')) {
+ if (bid.hasOwnProperty('mediaTypes') && !(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || utils.deepAccess(bid, 'mediaTypes.video.playerSize'))) {
return false;
}
if (typeof bid.params.siteId !== 'string' && typeof bid.params.siteId !== 'number') {
+ utils.logError('ix bidder params: siteId must be string or number value.');
return false;
}
@@ -169,8 +358,10 @@ export const spec = {
const hasBidFloorCur = bid.params.hasOwnProperty('bidFloorCur');
if (hasBidFloor || hasBidFloorCur) {
- return hasBidFloor && hasBidFloorCur &&
- isValidBidFloorParams(bid.params.bidFloor, bid.params.bidFloorCur);
+ if (!(hasBidFloor && hasBidFloorCur && isValidBidFloorParams(bid.params.bidFloor, bid.params.bidFloorCur))) {
+ utils.logError('ix bidder params: bidFloor / bidFloorCur parameter has invalid format.');
+ return false;
+ }
}
return true;
@@ -180,139 +371,49 @@ export const spec = {
* Make a server request from the list of BidRequests.
*
* @param {array} validBidRequests A list of valid bid request config objects.
- * @param {object} options A object contains bids and other info like gdprConsent.
+ * @param {object} bidderRequest A object contains bids and other info like gdprConsent.
* @return {object} Info describing the request to the server.
*/
- buildRequests: function (validBidRequests, options) {
- const bannerImps = [];
- const userEids = [];
+ buildRequests: function (validBidRequests, bidderRequest) {
+ let reqs = [];
+ let bannerImps = [];
+ let videoImps = [];
let validBidRequest = null;
- let bannerImp = null;
-
- // Always start by assuming the protocol is HTTPS. This way, it will work
- // whether the page protocol is HTTP or HTTPS. Then check if the page is
- // actually HTTP.If we can guarantee it is, then, and only then, set protocol to
- // HTTP.
- let baseUrl = BANNER_SECURE_BID_URL;
for (let i = 0; i < validBidRequests.length; i++) {
validBidRequest = validBidRequests[i];
- // Transform the bid request based on the banner format.
- bannerImp = bidToBannerImp(validBidRequest);
- bannerImps.push(bannerImp);
- }
-
- // RTI ids will be included in the bid request if the function getIdentityInfo() is loaded
- // and if the data for the partner exist
- if (window.headertag && typeof window.headertag.getIdentityInfo === 'function') {
- let identityInfo = window.headertag.getIdentityInfo();
- if (identityInfo && typeof identityInfo === 'object') {
- for (const partnerName in identityInfo) {
- if (identityInfo.hasOwnProperty(partnerName)) {
- let response = identityInfo[partnerName];
- if (!response.responsePending && response.data && typeof response.data === 'object' && Object.keys(response.data).length) {
- userEids.push(response.data);
- }
- }
- }
- }
- }
- const r = {};
-
- // Since bidderRequestId are the same for different bid request, just use the first one.
- r.id = validBidRequests[0].bidderRequestId;
-
- r.imp = bannerImps;
- r.site = {};
- r.ext = {};
- r.ext.source = 'prebid';
- if (userEids.length > 0) {
- r.user = {};
- r.user.eids = userEids;
- }
-
- if (document.referrer && document.referrer !== '') {
- r.site.ref = document.referrer;
- }
-
- // Apply GDPR information to the request if GDPR is enabled.
- if (options) {
- if (options.gdprConsent) {
- const gdprConsent = options.gdprConsent;
-
- if (gdprConsent.hasOwnProperty('gdprApplies')) {
- r.regs = {
- ext: {
- gdpr: gdprConsent.gdprApplies ? 1 : 0
- }
- };
- }
-
- if (gdprConsent.hasOwnProperty('consentString')) {
- r.user = r.user || {};
- r.user.ext = {
- consent: gdprConsent.consentString || ''
- };
+ if (validBidRequest.mediaType === VIDEO || utils.deepAccess(validBidRequest, 'mediaTypes.video')) {
+ if (validBidRequest.mediaType === VIDEO || includesSize(validBidRequest.mediaTypes.video.playerSize, validBidRequest.params.size)) {
+ videoImps.push(bidToVideoImp(validBidRequest));
+ } else {
+ utils.logError('Bid size is not included in video playerSize')
}
}
-
- if (options.refererInfo) {
- r.site.page = options.refererInfo.referer;
-
- if (options.refererInfo.referer && options.refererInfo.referer.indexOf('https') !== 0) {
- baseUrl = BANNER_INSECURE_BID_URL;
- }
+ if (validBidRequest.mediaType === BANNER || utils.deepAccess(validBidRequest, 'mediaTypes.banner') ||
+ (!validBidRequest.mediaType && !validBidRequest.mediaTypes)) {
+ bannerImps.push(bidToBannerImp(validBidRequest));
}
}
- const payload = {};
-
- // Parse additional runtime configs.
- const otherIxConfig = config.getConfig('ix');
- if (otherIxConfig) {
- // Append firstPartyData to r.site.page if firstPartyData exists.
- if (typeof otherIxConfig.firstPartyData === 'object') {
- const firstPartyData = otherIxConfig.firstPartyData;
- let firstPartyString = '?';
- for (const key in firstPartyData) {
- if (firstPartyData.hasOwnProperty(key)) {
- firstPartyString += `${encodeURIComponent(key)}=${encodeURIComponent(firstPartyData[key])}&`;
- }
- }
- firstPartyString = firstPartyString.slice(0, -1);
-
- r.site.page += firstPartyString;
- }
-
- // Create t in payload if timeout is configured.
- if (typeof otherIxConfig.timeout === 'number') {
- payload.t = otherIxConfig.timeout;
- }
+ if (bannerImps.length > 0) {
+ reqs.push(buildRequest(validBidRequests, bidderRequest, bannerImps, BANNER_ENDPOINT_VERSION));
+ }
+ if (videoImps.length > 0) {
+ reqs.push(buildRequest(validBidRequests, bidderRequest, videoImps, VIDEO_ENDPOINT_VERSION));
}
- // Use the siteId in the first bid request as the main siteId.
- payload.s = validBidRequests[0].params.siteId;
-
- payload.v = ENDPOINT_VERSION;
- payload.r = JSON.stringify(r);
- payload.ac = 'j';
- payload.sd = 1;
-
- return {
- method: 'GET',
- url: baseUrl,
- data: payload
- };
+ return reqs;
},
/**
* Unpack the response from the server into a list of bids.
*
* @param {object} serverResponse A successful response from the server.
+ * @param {object} bidderRequest The bid request sent to the server.
* @return {array} An array of bids which were nested inside the server.
*/
- interpretResponse: function (serverResponse) {
+ interpretResponse: function (serverResponse, bidderRequest) {
const bids = [];
let bid = null;
@@ -329,8 +430,11 @@ export const spec = {
// Transform rawBid in bid response to the format that will be accepted by prebid.
const innerBids = seatbid[i].bid;
+ let requestBid = JSON.parse(bidderRequest.data.r);
+
for (let j = 0; j < innerBids.length; j++) {
- bid = parseBid(innerBids[j], responseBody.cur);
+ const bidRequest = getBidRequest(innerBids[j].impid, requestBid.imp);
+ bid = parseBid(innerBids[j], responseBody.cur, bidRequest);
bids.push(bid);
}
}
diff --git a/modules/ixBidAdapter.md b/modules/ixBidAdapter.md
index e99c42408f2..7bd60ac413b 100644
--- a/modules/ixBidAdapter.md
+++ b/modules/ixBidAdapter.md
@@ -42,16 +42,21 @@ var adUnits = [{
```javascript
var adUnits = [{
// ...
-
mediaTypes: {
banner: {
sizes: [
[300, 250],
[300, 600]
]
+ },
+ video: {
+ context: 'instream',
+ playerSize: [
+ [300, 250],
+ [300, 600]
+ ]
}
- }
-
+ },
// ...
}];
```
@@ -61,7 +66,7 @@ var adUnits = [{
| Type | Support
| --- | ---
| Banner | Fully supported for all IX approved sizes.
-| Video | Not supported.
+| Video | Fully supported for all IX approved sizes.
| Native | Not supported.
# Bid Parameters
@@ -76,6 +81,17 @@ object are detailed here.
| siteId | Required | String | An IX-specific identifier that is associated with a specific size on this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. Examples: `'3723'`, `'6482'`, `'3639'`
| size | Required | Number[] | The single size associated with the site ID. It should be one of the sizes listed in the ad unit under `adUnits[].sizes` or `adUnits[].mediaTypes.banner.sizes`. Examples: `[300, 250]`, `[300, 600]`, `[728, 90]`
+### Video
+
+| Key | Scope | Type | Description
+| --- | --- | --- | ---
+| siteId | Required | String | An IX-specific identifier that is associated with a specific size on this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. Examples: `'3723'`, `'6482'`, `'3639'`
+| size | Required | Number[] | The single size associated with the site ID. It should be one of the sizes listed in the ad unit under `adUnits[].sizes` or `adUnits[].mediaTypes.video.playerSize`. Examples: `[300, 250]`, `[300, 600]`
+| video | Required | Hash | The video object will serve as the properties of the video ad. You can create any field under the video object that is mentioned in the `OpenRTB Spec v2.5`. Some fields like `mimes, protocols, minduration, maxduration` are required.
+| video.mimes | Required | String[] | Array list of content MIME types supported. Popular MIME types include, but are not limited to, `"video/x-ms- wmv"` for Windows Media and `"video/x-flv"` for Flash Video.
+|video.minduration| Required | Integer | Minimum video ad duration in seconds.
+|video.maxduration| Required | Integer | Maximum video ad duration in seconds.
+|video.protocol / video.protocols| Required | Integer / Integer[] | Either a single protocol provided as an integer, or protocols provided as a list of integers. `2` - VAST 2.0, `3` - VAST 3.0, `5` - VAST 2.0 Wrapper, `6` - VAST 3.0 Wrapper
Setup Guide
@@ -84,7 +100,9 @@ Setup Guide
Follow these steps to configure and add the IX module to your Prebid.js
integration.
-The examples in this guide assume the following starting configuration:
+The examples in this guide assume the following starting configuration (you may remove banner or video, if either does not apply).
+
+In regards to video, `context` can either be `'instream'` or `'outstream'`. Note that `outstream` requires additional configuration on the adUnit.
```javascript
var adUnits = [{
@@ -98,6 +116,19 @@ var adUnits = [{
}
},
bids: []
+},
+{
+ code: 'video-div-a',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [
+ [300, 250],
+ [300, 600]
+ ]
+ }
+ },
+ bids: []
}];
```
@@ -119,7 +150,9 @@ bid objects under `adUnits[].bids`:
Set `params.siteId` and `params.size` in each bid object to the values provided
by your IX representative.
-**Example**
+**Examples**
+
+**Banner:**
```javascript
var adUnits = [{
code: 'banner-div-a',
@@ -146,18 +179,94 @@ var adUnits = [{
}]
}];
```
-
+**Video (Instream):**
+```javascript
+var adUnits = [{
+ code: 'video-div-a',
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [
+ [300, 250],
+ [300, 600]
+ ]
+ }
+ },
+ bids: [{
+ bidder: 'ix',
+ params: {
+ siteId: '12345',
+ size: [300, 250],
+ video: {
+ skippable: false,
+ mimes: [
+ 'video/mp4',
+ 'video/webm'
+ ],
+ minduration: 0,
+ maxduration: 60,
+ protocols: [6]
+ }
+ }
+ }, {
+ bidder: 'ix',
+ params: {
+ siteId: '12345',
+ size: [300, 600],
+ video: {
+ // openrtb v2.5 compatible video obj
+ }
+ }
+ }]
+}];
+```
Please note that you can re-use the existing `siteId` within the same flex
position.
+**Video (Outstream):**
+Note that currently, outstream video rendering must be configured by the publisher. In the adUnit, a `renderer` object must be defined, which includes a `url` pointing to the video rendering script, and a `render` function for creating the video player. See http://prebid.org/dev-docs/show-outstream-video-ads.html for more information.
+```javascript
+var adUnits = [{
+ code: 'video-div-a',
+ mediaTypes: {
+ video: {
+ context: 'outstream',
+ playerSize: [[300, 250]]
+ }
+ },
+ renderer: {
+ url: 'https://test.com/my-video-player.js',
+ render: function (bid) {
+ ...
+ }
+ },
+ bids: [{
+ bidder: 'ix',
+ params: {
+ siteId: '12345',
+ size: [300, 250],
+ video: {
+ skippable: false,
+ mimes: [
+ 'video/mp4',
+ 'video/webm'
+ ],
+ minduration: 0,
+ maxduration: 60,
+ protocols: [6]
+ }
+ }
+ }]
+}];
+```
##### 2. Include `ixBidAdapter` in your build process
-When running the build command, include `ixBidAdapter` as a module.
+When running the build command, include `ixBidAdapter` as a module, as well as `dfpAdServerVideo` if you require video support.
```
-gulp build --modules=ixBidAdapter,fooBidAdapter,bazBidAdapter
+gulp build --modules=ixBidAdapter,dfpAdServerVideo,fooBidAdapter,bazBidAdapter
```
If a JSON file is being used to specify the bidder modules, add `"ixBidAdapter"`
@@ -166,6 +275,7 @@ to the top-level array in that file.
```json
[
"ixBidAdapter",
+ "dfpAdServerVideo",
"fooBidAdapter",
"bazBidAdapter"
]
diff --git a/test/spec/modules/ixBidAdapter_spec.js b/test/spec/modules/ixBidAdapter_spec.js
index 38e64e8d338..634d5041e6e 100644
--- a/test/spec/modules/ixBidAdapter_spec.js
+++ b/test/spec/modules/ixBidAdapter_spec.js
@@ -7,7 +7,8 @@ import { spec } from 'modules/ixBidAdapter';
describe('IndexexchangeAdapter', function () {
const IX_INSECURE_ENDPOINT = 'http://as.casalemedia.com/cygnus';
const IX_SECURE_ENDPOINT = 'https://as-sec.casalemedia.com/cygnus';
- const BIDDER_VERSION = 7.2;
+ const VIDEO_ENDPOINT_VERSION = 8.1;
+ const BANNER_ENDPOINT_VERSION = 7.2;
const DEFAULT_BANNER_VALID_BID = [
{
@@ -29,17 +30,37 @@ describe('IndexexchangeAdapter', function () {
auctionId: '1aa2bb3cc4dd'
}
];
- const DEFAULT_BANNER_OPTION = {
- gdprConsent: {
- gdprApplies: true,
- consentString: '3huaa11=qu3198ae',
- vendorData: {}
- },
- refererInfo: {
- referer: 'http://www.prebid.org',
- canonicalUrl: 'http://www.prebid.org/the/link/to/the/page'
+
+ const DEFAULT_VIDEO_VALID_BID = [
+ {
+ bidder: 'ix',
+ params: {
+ siteId: '456',
+ video: {
+ skippable: false,
+ mimes: [
+ 'video/mp4',
+ 'video/webm'
+ ],
+ minduration: 0
+ },
+ size: [400, 100]
+ },
+ sizes: [[400, 100], [200, 400]],
+ mediaTypes: {
+ video: {
+ context: 'instream',
+ playerSize: [[400, 100], [200, 400]]
+ }
+ },
+ adUnitCode: 'div-gpt-ad-1460505748562-0',
+ transactionId: '173f49a8-7549-4218-a23c-e7ba59b47230',
+ bidId: '1a2b3c4e',
+ bidderRequestId: '11a22b33c44e',
+ auctionId: '1aa2bb3cc4de'
}
- };
+ ];
+
const DEFAULT_BANNER_BID_RESPONSE = {
cur: 'USD',
id: '11a22b33c44d',
@@ -69,6 +90,48 @@ describe('IndexexchangeAdapter', function () {
}
]
};
+
+ const DEFAULT_VIDEO_BID_RESPONSE = {
+ cur: 'USD',
+ id: '1aa2bb3cc4de',
+ seatbid: [
+ {
+ bid: [
+ {
+ crid: '12346',
+ adomain: ['www.abcd.com'],
+ adid: '14851456',
+ impid: '1a2b3c4e',
+ cid: '3051267',
+ price: 110,
+ id: '2',
+ ext: {
+ vasturl: 'www.abcd.com/vast',
+ errorurl: 'www.abcd.com/error',
+ dspid: 51,
+ pricelevel: '_110',
+ advbrandid: 303326,
+ advbrand: 'OECTB'
+ }
+ }
+ ],
+ seat: '3971'
+ }
+ ]
+ };
+
+ const DEFAULT_OPTION = {
+ gdprConsent: {
+ gdprApplies: true,
+ consentString: '3huaa11=qu3198ae',
+ vendorData: {}
+ },
+ refererInfo: {
+ referer: 'http://www.prebid.org',
+ canonicalUrl: 'http://www.prebid.org/the/link/to/the/page'
+ }
+ };
+
const DEFAULT_IDENTITY_RESPONSE = {
IdentityIp: {
responsePending: false,
@@ -83,6 +146,31 @@ describe('IndexexchangeAdapter', function () {
}
};
+ const DEFAULT_BIDDER_REQUEST_DATA = {
+ ac: 'j',
+ r: JSON.stringify({
+ id: '345',
+ imp: [
+ {
+ id: '1a2b3c4e',
+ video: {
+ w: 640,
+ h: 480,
+ placement: 1
+ }
+ }
+ ],
+ site: {
+ ref: 'http://ref.com/ref.html',
+ page: 'http://page.com'
+ },
+ }),
+ s: '21',
+ sd: 1,
+ t: 1000,
+ v: 8.1
+ };
+
describe('inherited functions', function () {
it('should exists and is a function', function () {
const adapter = newBidder(spec);
@@ -91,11 +179,12 @@ describe('IndexexchangeAdapter', function () {
});
describe('isBidRequestValid', function () {
- it('should return true when required params found for a banner ad', function () {
+ it('should return true when required params found for a banner or video ad', function () {
expect(spec.isBidRequestValid(DEFAULT_BANNER_VALID_BID[0])).to.equal(true);
+ expect(spec.isBidRequestValid(DEFAULT_VIDEO_VALID_BID[0])).to.equal(true);
});
- it('should return true when optional params found for a banner ad', function () {
+ it('should return true when optional bidFloor params found for an ad', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.bidFloor = 50;
bid.params.bidFloorCur = 'USD';
@@ -136,10 +225,10 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when mediaTypes is not banner', function () {
+ it('should return false when mediaTypes is not banner or video', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.mediaTypes = {
- video: {
+ native: {
sizes: [[300, 250]]
}
};
@@ -156,19 +245,13 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when mediaType is not banner', function () {
- const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
- delete bid.params.mediaTypes;
- bid.mediaType = 'banne';
- bid.sizes = [[300, 250]];
- expect(spec.isBidRequestValid(bid)).to.equal(false);
- });
-
- it('should return false when mediaType is video', function () {
- const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
- delete bid.params.mediaTypes;
- bid.mediaType = 'video';
- bid.sizes = [[300, 250]];
+ it('should return false when mediaTypes.video does not have sizes', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ bid.mediaTypes = {
+ video: {
+ size: [[300, 250]]
+ }
+ };
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
@@ -195,6 +278,14 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
+ it('should return true when mediaType is video', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ delete bid.mediaTypes;
+ bid.mediaType = 'video';
+ bid.sizes = [[400, 100]];
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
+ });
+
it('should return false when there is only bidFloor', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.bidFloor = 50;
@@ -232,7 +323,7 @@ describe('IndexexchangeAdapter', function () {
window.headertag.getIdentityInfo = function() {
return testCopy;
};
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
query = request.data;
});
afterEach(function() {
@@ -343,7 +434,7 @@ describe('IndexexchangeAdapter', function () {
window.headertag.getIdentityInfo = function() {
return undefined;
};
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
query = request.data;
const payload = JSON.parse(query.r);
@@ -356,7 +447,7 @@ describe('IndexexchangeAdapter', function () {
responsePending: true,
data: {}
}
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
query = request.data;
const payload = JSON.parse(query.r);
@@ -366,7 +457,7 @@ describe('IndexexchangeAdapter', function () {
it('payload should not have any user eids if identity data is pending for all partners', function () {
testCopy.IdentityIp.responsePending = true;
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
query = request.data;
const payload = JSON.parse(query.r);
@@ -377,7 +468,7 @@ describe('IndexexchangeAdapter', function () {
it('payload should not have any user eids if identity data is pending or not available for all partners', function () {
testCopy.IdentityIp.responsePending = false;
testCopy.IdentityIp.data = {};
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
query = request.data;
const payload = JSON.parse(query.r);
@@ -387,8 +478,8 @@ describe('IndexexchangeAdapter', function () {
});
});
- describe('buildRequestsBanner', function () {
- const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ describe('buildRequests', function () {
+ const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
const requestUrl = request.url;
const requestMethod = request.method;
const query = request.data;
@@ -396,7 +487,7 @@ describe('IndexexchangeAdapter', function () {
const bidWithoutMediaType = utils.deepClone(DEFAULT_BANNER_VALID_BID);
delete bidWithoutMediaType[0].mediaTypes;
bidWithoutMediaType[0].sizes = [[300, 250], [300, 600]];
- const requestWithoutMediaType = spec.buildRequests(bidWithoutMediaType, DEFAULT_BANNER_OPTION);
+ const requestWithoutMediaType = spec.buildRequests(bidWithoutMediaType, DEFAULT_OPTION)[0];
const queryWithoutMediaType = requestWithoutMediaType.data;
it('request should be made to IX endpoint with GET method', function () {
@@ -405,11 +496,12 @@ describe('IndexexchangeAdapter', function () {
});
it('query object (version, siteID and request) should be correct', function () {
- expect(query.v).to.equal(BIDDER_VERSION);
+ expect(query.v).to.equal(BANNER_ENDPOINT_VERSION);
expect(query.s).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
expect(query.r).to.exist;
expect(query.ac).to.equal('j');
expect(query.sd).to.equal(1);
+ expect(query.nf).to.equal(1);
});
it('payload should have correct format and value', function () {
@@ -417,7 +509,7 @@ describe('IndexexchangeAdapter', function () {
expect(payload.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidderRequestId);
expect(payload.site).to.exist;
- expect(payload.site.page).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
+ expect(payload.site.page).to.equal(DEFAULT_OPTION.refererInfo.referer);
expect(payload.site.ref).to.equal(document.referrer);
expect(payload.ext).to.exist;
expect(payload.ext.source).to.equal('prebid');
@@ -445,7 +537,7 @@ describe('IndexexchangeAdapter', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.bidFloor = 50;
bid.params.bidFloorCur = 'USD';
- const requestBidFloor = spec.buildRequests([bid]);
+ const requestBidFloor = spec.buildRequests([bid])[0];
const impression = JSON.parse(requestBidFloor.data.r).imp[0];
expect(impression.bidfloor).to.equal(bid.params.bidFloor);
@@ -457,7 +549,7 @@ describe('IndexexchangeAdapter', function () {
expect(payload.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidderRequestId);
expect(payload.site).to.exist;
- expect(payload.site.page).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
+ expect(payload.site.page).to.equal(DEFAULT_OPTION.refererInfo.referer);
expect(payload.site.ref).to.equal(document.referrer);
expect(payload.ext).to.exist;
expect(payload.ext.source).to.equal('prebid');
@@ -484,7 +576,7 @@ describe('IndexexchangeAdapter', function () {
it('impression should have sid if id is configured as number', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.id = 50;
- const requestBidFloor = spec.buildRequests([bid]);
+ const requestBidFloor = spec.buildRequests([bid])[0];
const impression = JSON.parse(requestBidFloor.data.r).imp[0];
expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
@@ -501,7 +593,7 @@ describe('IndexexchangeAdapter', function () {
it('impression should have sid if id is configured as string', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.id = 'abc';
- const requestBidFloor = spec.buildRequests([bid]);
+ const requestBidFloor = spec.buildRequests([bid])[0];
const impression = JSON.parse(requestBidFloor.data.r).imp[0];
expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
expect(impression.banner).to.exist;
@@ -526,9 +618,9 @@ describe('IndexexchangeAdapter', function () {
}
});
- const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
const pageUrl = JSON.parse(requestWithFirstPartyData.data.r).site.page;
- const expectedPageUrl = DEFAULT_BANNER_OPTION.refererInfo.referer + '?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
+ const expectedPageUrl = DEFAULT_OPTION.refererInfo.referer + '?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
expect(pageUrl).to.equal(expectedPageUrl);
});
@@ -540,10 +632,10 @@ describe('IndexexchangeAdapter', function () {
}
});
- const requestFirstPartyDataNumber = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ const requestFirstPartyDataNumber = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
const pageUrl = JSON.parse(requestFirstPartyDataNumber.data.r).site.page;
- expect(pageUrl).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
+ expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
});
it('should not set first party or timeout if it is not present', function () {
@@ -551,18 +643,18 @@ describe('IndexexchangeAdapter', function () {
ix: {}
});
- const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
- expect(pageUrl).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
+ expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
expect(requestWithoutConfig.data.t).to.be.undefined;
});
it('should not set first party or timeout if it is setConfig is not called', function () {
- const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
- expect(pageUrl).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
+ expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
expect(requestWithoutConfig.data.t).to.be.undefined;
});
@@ -572,7 +664,7 @@ describe('IndexexchangeAdapter', function () {
timeout: 500
}
});
- const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID);
+ const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
expect(requestWithTimeout.data.t).to.equal(500);
});
@@ -583,14 +675,98 @@ describe('IndexexchangeAdapter', function () {
timeout: '500'
}
});
- const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID);
+ const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
expect(requestStringTimeout.data.t).to.be.undefined;
});
+
+ it('request should contain both banner and video requests', function () {
+ const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]]);
+
+ const bannerImp = JSON.parse(request[0].data.r).imp[0];
+ expect(JSON.parse(request[0].data.v)).to.equal(BANNER_ENDPOINT_VERSION);
+ expect(bannerImp.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
+ expect(bannerImp.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
+ expect(bannerImp.banner).to.exist;
+ expect(bannerImp.banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
+ expect(bannerImp.banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
+
+ const videoImp = JSON.parse(request[1].data.r).imp[0];
+ expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
+ expect(videoImp.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
+ expect(videoImp.video).to.exist;
+ expect(videoImp.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
+ expect(videoImp.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
+ });
});
- describe('interpretResponseBanner', function () {
- it('should get correct bid response', function () {
+ describe('buildRequestVideo', function () {
+ const request = spec.buildRequests(DEFAULT_VIDEO_VALID_BID, DEFAULT_OPTION);
+ const query = request[0].data;
+
+ it('query object (version, siteID and request) should be correct', function () {
+ expect(query.v).to.equal(VIDEO_ENDPOINT_VERSION);
+ expect(query.s).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.siteId);
+ expect(query.r).to.exist;
+ expect(query.ac).to.equal('j');
+ expect(query.sd).to.equal(1);
+ });
+
+ it('impression should have correct format and value', function () {
+ const impression = JSON.parse(query.r).imp[0];
+ const sidValue = `${DEFAULT_VIDEO_VALID_BID[0].params.size[0].toString()}x${DEFAULT_VIDEO_VALID_BID[0].params.size[1].toString()}`;
+
+ expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
+ expect(impression.video).to.exist;
+ expect(impression.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
+ expect(impression.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
+ expect(impression.video.placement).to.exist;
+ expect(impression.video.placement).to.equal(1);
+ expect(impression.video.minduration).to.exist;
+ expect(impression.video.minduration).to.equal(0);
+ expect(impression.video.mimes).to.exist;
+ expect(impression.video.mimes[0]).to.equal('video/mp4');
+ expect(impression.video.mimes[1]).to.equal('video/webm');
+
+ expect(impression.video.skippable).to.equal(false);
+ expect(impression.ext).to.exist;
+ expect(impression.ext.siteID).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.siteId.toString());
+ expect(impression.ext.sid).to.equal(sidValue);
+ });
+
+ it('impression should have correct format when mediaType is specified.', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ delete bid.mediaTypes;
+ bid.mediaType = 'video';
+ const requestBidFloor = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(requestBidFloor.data.r).imp[0];
+ const sidValue = `${DEFAULT_VIDEO_VALID_BID[0].params.size[0].toString()}x${DEFAULT_VIDEO_VALID_BID[0].params.size[1].toString()}`;
+
+ expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
+ expect(impression.video).to.exist;
+ expect(impression.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
+ expect(impression.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
+ expect(impression.video.placement).to.not.exist;
+ expect(impression.ext).to.exist;
+ expect(impression.ext.siteID).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.siteId.toString());
+ expect(impression.ext.sid).to.equal(sidValue);
+ });
+
+ it('should set correct placement if context is outstream', function () {
+ const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
+ bid.mediaTypes.video.context = 'outstream';
+ const request = spec.buildRequests([bid])[0];
+ const impression = JSON.parse(request.data.r).imp[0];
+
+ expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
+ expect(impression.video).to.exist;
+ expect(impression.video.placement).to.exist;
+ expect(impression.video.placement).to.equal(4);
+ });
+ });
+
+ describe('interpretResponse', function () {
+ it('should get correct bid response for banner ad', function () {
const expectedParse = [
{
requestId: '1a2b3c4d',
@@ -598,6 +774,7 @@ describe('IndexexchangeAdapter', function () {
creativeId: '12345',
width: 300,
height: 250,
+ mediaType: 'banner',
ad: '',
currency: 'USD',
ttl: 35,
@@ -610,7 +787,7 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: DEFAULT_BANNER_BID_RESPONSE });
+ const result = spec.interpretResponse({ body: DEFAULT_BANNER_BID_RESPONSE }, { data: DEFAULT_BIDDER_REQUEST_DATA });
expect(result[0]).to.deep.equal(expectedParse[0]);
});
@@ -624,6 +801,7 @@ describe('IndexexchangeAdapter', function () {
creativeId: '-',
width: 300,
height: 250,
+ mediaType: 'banner',
ad: '',
currency: 'USD',
ttl: 35,
@@ -636,8 +814,7 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: bidResponse });
- expect(result[0]).to.deep.equal(expectedParse[0]);
+ const result = spec.interpretResponse({ body: bidResponse }, { data: DEFAULT_BIDDER_REQUEST_DATA });
});
it('should set Japanese price correctly', function () {
@@ -650,6 +827,7 @@ describe('IndexexchangeAdapter', function () {
creativeId: '12345',
width: 300,
height: 250,
+ mediaType: 'banner',
ad: '',
currency: 'JPY',
ttl: 35,
@@ -662,7 +840,7 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: bidResponse });
+ const result = spec.interpretResponse({ body: bidResponse }, { data: DEFAULT_BIDDER_REQUEST_DATA });
expect(result[0]).to.deep.equal(expectedParse[0]);
});
@@ -676,6 +854,7 @@ describe('IndexexchangeAdapter', function () {
creativeId: '12345',
width: 300,
height: 250,
+ mediaType: 'banner',
ad: '',
currency: 'USD',
ttl: 35,
@@ -688,13 +867,38 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: bidResponse });
+ const result = spec.interpretResponse({ body: bidResponse }, { data: DEFAULT_BIDDER_REQUEST_DATA });
+ expect(result[0]).to.deep.equal(expectedParse[0]);
+ });
+
+ it('should get correct bid response for video ad', function () {
+ const expectedParse = [
+ {
+ requestId: '1a2b3c4e',
+ cpm: 1.1,
+ creativeId: '12346',
+ mediaType: 'video',
+ width: 640,
+ height: 480,
+ currency: 'USD',
+ ttl: 3600,
+ netRevenue: true,
+ dealId: undefined,
+ vastUrl: 'www.abcd.com/vast',
+ meta: {
+ networkId: 51,
+ brandId: 303326,
+ brandName: 'OECTB'
+ }
+ }
+ ];
+ const result = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, { data: DEFAULT_BIDDER_REQUEST_DATA });
expect(result[0]).to.deep.equal(expectedParse[0]);
});
it('bidrequest should have consent info if gdprApplies and consentString exist', function () {
- const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
- const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
+ const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION);
+ const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
expect(requestWithConsent.regs.ext.gdpr).to.equal(1);
expect(requestWithConsent.user.ext.consent).to.equal('3huaa11=qu3198ae');
@@ -708,7 +912,7 @@ describe('IndexexchangeAdapter', function () {
}
};
const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
+ const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
expect(requestWithConsent.regs.ext.gdpr).to.equal(1);
expect(requestWithConsent.user).to.be.undefined;
@@ -722,7 +926,7 @@ describe('IndexexchangeAdapter', function () {
}
};
const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
+ const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
expect(requestWithConsent.regs).to.be.undefined;
expect(requestWithConsent.user.ext.consent).to.equal('3huaa11=qu3198ae');
@@ -731,7 +935,7 @@ describe('IndexexchangeAdapter', function () {
it('bidrequest should not have consent info if options.gdprConsent is undefined', function () {
const options = {};
const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
+ const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
expect(requestWithConsent.regs).to.be.undefined;
expect(requestWithConsent.user).to.be.undefined;
@@ -740,10 +944,10 @@ describe('IndexexchangeAdapter', function () {
it('bidrequest should not have page if options is undefined', function () {
const options = {};
const validBidWithoutreferInfo = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo.data.r);
+ const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo[0].data.r);
expect(requestWithoutreferInfo.site.page).to.be.undefined;
- expect(validBidWithoutreferInfo.url).to.equal(IX_SECURE_ENDPOINT);
+ expect(validBidWithoutreferInfo[0].url).to.equal(IX_SECURE_ENDPOINT);
});
it('bidrequest should not have page if options.refererInfo is an empty object', function () {
@@ -751,10 +955,10 @@ describe('IndexexchangeAdapter', function () {
refererInfo: {}
};
const validBidWithoutreferInfo = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo.data.r);
+ const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo[0].data.r);
expect(requestWithoutreferInfo.site.page).to.be.undefined;
- expect(validBidWithoutreferInfo.url).to.equal(IX_SECURE_ENDPOINT);
+ expect(validBidWithoutreferInfo[0].url).to.equal(IX_SECURE_ENDPOINT);
});
it('bidrequest should sent to secure endpoint if page url is secure', function () {
@@ -764,10 +968,10 @@ describe('IndexexchangeAdapter', function () {
}
};
const validBidWithoutreferInfo = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo.data.r);
+ const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo[0].data.r);
expect(requestWithoutreferInfo.site.page).to.equal(options.refererInfo.referer);
- expect(validBidWithoutreferInfo.url).to.equal(IX_SECURE_ENDPOINT);
+ expect(validBidWithoutreferInfo[0].url).to.equal(IX_SECURE_ENDPOINT);
});
});
});
From 8e198bb41e3e10aaa5b8ec5b3e63a50e5704651d Mon Sep 17 00:00:00 2001
From: Mirko Feddern
Date: Tue, 25 Jun 2019 20:14:11 +0200
Subject: [PATCH 032/285] Add Outstream Renderer for Yieldlab Adapter (#3910)
* Add Outstream Renderer
* Fix playerSize overwrite
Prebid is translating the playerSize to an array of arrays, so we have to return accordingly
---
modules/yieldlabBidAdapter.js | 53 +++++++++++++++++++-
modules/yieldlabBidAdapter.md | 2 +-
test/spec/modules/yieldlabBidAdapter_spec.js | 17 +++++++
3 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/modules/yieldlabBidAdapter.js b/modules/yieldlabBidAdapter.js
index 1bbb3f11a2e..116f1aae0a8 100644
--- a/modules/yieldlabBidAdapter.js
+++ b/modules/yieldlabBidAdapter.js
@@ -2,11 +2,13 @@ import * as utils from '../src/utils'
import { registerBidder } from '../src/adapters/bidderFactory'
import find from 'core-js/library/fn/array/find'
import { VIDEO, BANNER } from '../src/mediaTypes'
+import { Renderer } from 'src/Renderer'
const ENDPOINT = 'https://ad.yieldlab.net'
const BIDDER_CODE = 'yieldlab'
const BID_RESPONSE_TTL_SEC = 300
const CURRENCY_CODE = 'EUR'
+const OUTSTREAMPLAYER_URL = 'https://ad2.movad.net/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event'
export const spec = {
code: BIDDER_CODE,
@@ -93,8 +95,23 @@ export const spec = {
}
if (isVideo(bidRequest)) {
+ const playersize = getPlayerSize(bidRequest)
+ if (playersize) {
+ bidResponse.width = playersize[0]
+ bidResponse.height = playersize[1]
+ }
bidResponse.mediaType = VIDEO
bidResponse.vastUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/${customsize[0]}x${customsize[1]}?ts=${timestamp}${extId}`
+
+ if (isOutstream(bidRequest)) {
+ const renderer = Renderer.install({
+ id: bidRequest.bidId,
+ url: OUTSTREAMPLAYER_URL,
+ loaded: false
+ })
+ renderer.setRender(outstreamRender)
+ bidResponse.renderer = renderer
+ }
}
bidResponses.push(bidResponse)
@@ -106,13 +123,33 @@ export const spec = {
/**
* Is this a video format?
- * @param {String} format
+ * @param {Object} format
* @returns {Boolean}
*/
function isVideo (format) {
return utils.deepAccess(format, 'mediaTypes.video')
}
+/**
+ * Is this an outstream context?
+ * @param {Object} format
+ * @returns {Boolean}
+ */
+function isOutstream (format) {
+ let context = utils.deepAccess(format, 'mediaTypes.video.context')
+ return (context === 'outstream')
+}
+
+/**
+ * Gets optional player size
+ * @param {Object} format
+ * @returns {Array}
+ */
+function getPlayerSize (format) {
+ let playerSize = utils.deepAccess(format, 'mediaTypes.video.playerSize')
+ return (playerSize && utils.isArray(playerSize[0])) ? playerSize[0] : playerSize
+}
+
/**
* Expands a 'WxH' string as a 2-element [W, H] array
* @param {String} size
@@ -137,4 +174,18 @@ function createQueryString (obj) {
return str.join('&')
}
+/**
+ * Handles an outstream response after the library is loaded
+ * @param {Object} bid
+ */
+function outstreamRender(bid) {
+ bid.renderer.push(() => {
+ window.ma_width = bid.width
+ window.ma_height = bid.height
+ window.ma_vastUrl = bid.vastUrl
+ window.ma_container = bid.adUnitCode
+ window.document.dispatchEvent(new Event('ma-start-event'))
+ });
+}
+
registerBidder(spec)
diff --git a/modules/yieldlabBidAdapter.md b/modules/yieldlabBidAdapter.md
index de93baf42ae..37897b83f12 100644
--- a/modules/yieldlabBidAdapter.md
+++ b/modules/yieldlabBidAdapter.md
@@ -34,7 +34,7 @@ Module that connects to Yieldlab's demand sources
sizes: [[640, 480]],
mediaTypes: {
video: {
- context: "instream"
+ context: "instream" // or "outstream"
}
},
bids: [{
diff --git a/test/spec/modules/yieldlabBidAdapter_spec.js b/test/spec/modules/yieldlabBidAdapter_spec.js
index c2e12408cdd..c8709969e00 100644
--- a/test/spec/modules/yieldlabBidAdapter_spec.js
+++ b/test/spec/modules/yieldlabBidAdapter_spec.js
@@ -148,5 +148,22 @@ describe('yieldlabBidAdapter', function () {
expect(result[0].vastUrl).to.include('https://ad.yieldlab.net/d/1111/2222/728x90?ts=')
expect(result[0].vastUrl).to.include('&id=abc')
})
+
+ it('should add renderer if outstream context', function () {
+ const OUTSTREAM_REQUEST = Object.assign({}, REQUEST, {
+ 'mediaTypes': {
+ 'video': {
+ 'playerSize': [[640, 480]],
+ 'context': 'outstream'
+ }
+ }
+ })
+ const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [OUTSTREAM_REQUEST]})
+
+ expect(result[0].renderer.id).to.equal('2d925f27f5079f')
+ expect(result[0].renderer.url).to.equal('https://ad2.movad.net/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event')
+ expect(result[0].width).to.equal(640)
+ expect(result[0].height).to.equal(480)
+ })
})
})
From 64a258a7d2b29198cd16b946c780ad0c82670552 Mon Sep 17 00:00:00 2001
From: msm0504 <51493331+msm0504@users.noreply.github.com>
Date: Tue, 25 Jun 2019 14:44:32 -0400
Subject: [PATCH 033/285] Standardized COPPA support (#3936)
* Add microadBidAdapter
* Remove unnecessary encodeURIComponent from microadBidAdapter
* Submit Advangelists Prebid Adapter
* Submit Advangelists Prebid Adapter 1.1
* Correct procudtion endpoint for prebid
* Send coppa flag on requests to OpenRTB from Prebid server
* Support coppa flag being set in Prebid config
* Add unit tests for deepSetValue util function
---
modules/arteebeeBidAdapter.js | 2 +-
modules/openxBidAdapter.js | 2 +-
modules/openxoutstreamBidAdapter.js | 2 +-
modules/prebidServerBidAdapter/index.js | 4 ++++
modules/rubiconBidAdapter.js | 8 ++++++++
test/spec/utils_spec.js | 23 +++++++++++++++++++++++
6 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/modules/arteebeeBidAdapter.js b/modules/arteebeeBidAdapter.js
index ddf728a143e..74d5d5d3d52 100644
--- a/modules/arteebeeBidAdapter.js
+++ b/modules/arteebeeBidAdapter.js
@@ -96,7 +96,7 @@ function makeRtbRequest(req, bidderRequest) {
'tmax': config.getConfig('bidderTimeout')
};
- if (req.params.coppa) {
+ if (config.getConfig('coppa') === true || req.params.coppa) {
rtbReq.regs = {coppa: 1};
}
diff --git a/modules/openxBidAdapter.js b/modules/openxBidAdapter.js
index 8236be8c2e5..ef60d6e1856 100644
--- a/modules/openxBidAdapter.js
+++ b/modules/openxBidAdapter.js
@@ -262,7 +262,7 @@ function buildOXBannerRequest(bids, bidderRequest) {
queryParams.ns = 1;
}
- if (bids.some(bid => bid.params.coppa)) {
+ if (config.getConfig('coppa') === true || bids.some(bid => bid.params.coppa)) {
queryParams.tfcd = 1;
}
diff --git a/modules/openxoutstreamBidAdapter.js b/modules/openxoutstreamBidAdapter.js
index 42c7a3fff32..9011a949e7b 100644
--- a/modules/openxoutstreamBidAdapter.js
+++ b/modules/openxoutstreamBidAdapter.js
@@ -114,7 +114,7 @@ function buildOXBannerRequest(bid, bidderRequest) {
queryParams.ns = 1;
}
- if (bid.params.coppa) {
+ if (config.getConfig('coppa') === true || bid.params.coppa) {
queryParams.tfcd = 1;
}
diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js
index 028f02d9662..4ac1bccaeda 100644
--- a/modules/prebidServerBidAdapter/index.js
+++ b/modules/prebidServerBidAdapter/index.js
@@ -580,6 +580,10 @@ const OPEN_RTB_PROTOCOL = {
utils.deepSetValue(request, 'user.ext.consent', bidRequests[0].gdprConsent.consentString);
}
+ if (getConfig('coppa') === true) {
+ utils.deepSetValue(request, 'regs.coppa', 1);
+ }
+
return request;
},
diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js
index abeebd2e1b2..c3d0b48f14b 100644
--- a/modules/rubiconBidAdapter.js
+++ b/modules/rubiconBidAdapter.js
@@ -233,6 +233,10 @@ export const spec = {
}
}
+ if (config.getConfig('coppa') === true) {
+ utils.deepSetValue(request, 'regs.coppa', 1);
+ }
+
return {
method: 'POST',
url: VIDEO_ENDPOINT,
@@ -434,6 +438,10 @@ export const spec = {
const digitrustParams = _getDigiTrustQueryParams(bidRequest, 'FASTLANE');
Object.assign(data, digitrustParams);
+ if (config.getConfig('coppa') === true) {
+ data['coppa'] = 1;
+ }
+
return data;
},
diff --git a/test/spec/utils_spec.js b/test/spec/utils_spec.js
index df1c9b66b28..ff9b6ec2371 100755
--- a/test/spec/utils_spec.js
+++ b/test/spec/utils_spec.js
@@ -626,6 +626,29 @@ describe('Utils', function () {
});
});
+ describe('deepSetValue', function() {
+ it('should set existing properties at various depths', function() {
+ const testObj = {
+ prop: 'value',
+ nestedObj: {
+ nestedProp: 'nestedValue'
+ }
+ };
+ utils.deepSetValue(testObj, 'prop', 'newValue');
+ assert.equal(testObj.prop, 'newValue');
+ utils.deepSetValue(testObj, 'nestedObj.nestedProp', 'newNestedValue');
+ assert.equal(testObj.nestedObj.nestedProp, 'newNestedValue');
+ });
+
+ it('should create object levels between top and bottom of given path if they do not exist', function() {
+ const testObj = {};
+ utils.deepSetValue(testObj, 'level1.level2', 'value');
+ assert.notEqual(testObj.level1, undefined);
+ assert.notEqual(testObj.level1.level2, undefined);
+ assert.equal(testObj.level1.level2, 'value');
+ });
+ });
+
describe('createContentToExecuteExtScriptInFriendlyFrame', function () {
it('should return empty string if url is not passed', function () {
var output = utils.createContentToExecuteExtScriptInFriendlyFrame();
From e55684b0d7cf61dfb817022978d3ca5561d4b4da Mon Sep 17 00:00:00 2001
From: Jaimin Panchal <7393273+jaiminpanchal27@users.noreply.github.com>
Date: Tue, 25 Jun 2019 15:12:04 -0400
Subject: [PATCH 034/285] Adding privacy_supported flag (#3943)
---
modules/appnexusBidAdapter.js | 4 ++++
test/spec/modules/appnexusBidAdapter_spec.js | 3 ++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/modules/appnexusBidAdapter.js b/modules/appnexusBidAdapter.js
index e0ae19187b2..50c5a0e6f04 100644
--- a/modules/appnexusBidAdapter.js
+++ b/modules/appnexusBidAdapter.js
@@ -686,6 +686,10 @@ function buildNativeRequest(params) {
request[requestKey].sizes = transformSizes(request[requestKey].sizes);
}
}
+
+ if (requestKey === NATIVE_MAPPING.privacyLink) {
+ request.privacy_supported = true;
+ }
});
return request;
diff --git a/test/spec/modules/appnexusBidAdapter_spec.js b/test/spec/modules/appnexusBidAdapter_spec.js
index 9e37f6cbffb..e55e3e32029 100644
--- a/test/spec/modules/appnexusBidAdapter_spec.js
+++ b/test/spec/modules/appnexusBidAdapter_spec.js
@@ -432,7 +432,8 @@ describe('AppNexusAdapter', function () {
likes: {required: true},
phone: {required: true},
price: {required: true},
- saleprice: {required: true}
+ saleprice: {required: true},
+ privacy_supported: true
});
});
From 5e1d88986acdc902a0b0a919ad33db2d61fac30f Mon Sep 17 00:00:00 2001
From: Eric Harper
Date: Tue, 25 Jun 2019 15:47:00 -0400
Subject: [PATCH 035/285] Prebid 2.21.0 Release
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index a4e2985e1bd..6c0d2ace797 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.21.0-pre",
+ "version": "2.21.0",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 426676c829fbd398b2605df44537ca5f15fcd88b Mon Sep 17 00:00:00 2001
From: Eric Harper
Date: Tue, 25 Jun 2019 16:06:35 -0400
Subject: [PATCH 036/285] Increment pre version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 6c0d2ace797..ae1d5ba514a 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.21.0",
+ "version": "2.22.0-pre",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 6e0264908d9fd2dcb97aa53bda955eb815eb8ed2 Mon Sep 17 00:00:00 2001
From: Ryo Kato
Date: Wed, 26 Jun 2019 21:44:07 +0900
Subject: [PATCH 037/285] Fix import paths in adapters (#3946)
---
modules/bidglassBidAdapter.js | 4 ++--
modules/hpmdnetworkBidAdapter.js | 4 ++--
modules/open8BidAdapter.js | 2 +-
modules/reloadBidAdapter.js | 4 ++--
modules/yieldlabBidAdapter.js | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/modules/bidglassBidAdapter.js b/modules/bidglassBidAdapter.js
index 1898d1220fa..f5991f7f3a5 100644
--- a/modules/bidglassBidAdapter.js
+++ b/modules/bidglassBidAdapter.js
@@ -1,6 +1,6 @@
-import * as utils from 'src/utils';
+import * as utils from '../src/utils';
// import {config} from 'src/config';
-import {registerBidder} from 'src/adapters/bidderFactory';
+import {registerBidder} from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'bidglass';
diff --git a/modules/hpmdnetworkBidAdapter.js b/modules/hpmdnetworkBidAdapter.js
index ad17caba7bc..b23d17a7bf3 100644
--- a/modules/hpmdnetworkBidAdapter.js
+++ b/modules/hpmdnetworkBidAdapter.js
@@ -1,5 +1,5 @@
-import { registerBidder } from 'src/adapters/bidderFactory';
-import { BANNER } from 'src/mediaTypes';
+import { registerBidder } from '../src/adapters/bidderFactory';
+import { BANNER } from '../src/mediaTypes';
const BIDDER_CODE = 'hpmdnetwork';
const BIDDER_CODE_ALIAS = 'hpmd';
diff --git a/modules/open8BidAdapter.js b/modules/open8BidAdapter.js
index 3c2b94a528a..bac95f4499e 100644
--- a/modules/open8BidAdapter.js
+++ b/modules/open8BidAdapter.js
@@ -1,6 +1,6 @@
import { Renderer } from '../src/Renderer';
import {ajax} from '../src/ajax';
-import * as utils from 'src/utils';
+import * as utils from '../src/utils';
import { registerBidder } from '../src/adapters/bidderFactory';
import { VIDEO, BANNER } from '../src/mediaTypes';
diff --git a/modules/reloadBidAdapter.js b/modules/reloadBidAdapter.js
index a50949825a9..a5f5ba43c60 100644
--- a/modules/reloadBidAdapter.js
+++ b/modules/reloadBidAdapter.js
@@ -1,11 +1,11 @@
import {
BANNER
}
- from 'src/mediaTypes';
+ from '../src/mediaTypes';
import {
registerBidder
}
- from 'src/adapters/bidderFactory';
+ from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'reload';
diff --git a/modules/yieldlabBidAdapter.js b/modules/yieldlabBidAdapter.js
index 116f1aae0a8..9af3de24cb1 100644
--- a/modules/yieldlabBidAdapter.js
+++ b/modules/yieldlabBidAdapter.js
@@ -2,7 +2,7 @@ import * as utils from '../src/utils'
import { registerBidder } from '../src/adapters/bidderFactory'
import find from 'core-js/library/fn/array/find'
import { VIDEO, BANNER } from '../src/mediaTypes'
-import { Renderer } from 'src/Renderer'
+import { Renderer } from '../src/Renderer'
const ENDPOINT = 'https://ad.yieldlab.net'
const BIDDER_CODE = 'yieldlab'
From 5cdd5a37574dcd007718978b60b0528e3ca8f23d Mon Sep 17 00:00:00 2001
From: afsheenb
Date: Wed, 26 Jun 2019 09:02:35 -0400
Subject: [PATCH 038/285] ozone adapter 2.1 - bug fix for multi bids + GDPR
parameter handling (#3916)
* bug fix for multi bids + GDPR parameter handling
* Updated spec files and adapter files to remove references to ozoneData and more stringent GDPR checks.
---
modules/ozoneBidAdapter.js | 67 +++--
modules/ozoneBidAdapter.md | 6 +-
test/spec/modules/ozoneBidAdapter_spec.js | 300 ++++++++++++++++++----
3 files changed, 304 insertions(+), 69 deletions(-)
diff --git a/modules/ozoneBidAdapter.js b/modules/ozoneBidAdapter.js
index c5d9f16ef58..7ab69f1e37a 100644
--- a/modules/ozoneBidAdapter.js
+++ b/modules/ozoneBidAdapter.js
@@ -8,10 +8,10 @@ import { Renderer } from '../src/Renderer'
const BIDDER_CODE = 'ozone';
const OZONEURI = 'https://elb.the-ozone-project.com/openrtb2/auction';
-const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js'
-
const OZONECOOKIESYNC = 'https://elb.the-ozone-project.com/static/load-cookie.html';
-const OZONEVERSION = '2.0.0';
+const OZONE_RENDERER_URL = 'https://prebid.the-ozone-project.com/ozone-renderer.js';
+
+const OZONEVERSION = '2.1.1';
export const spec = {
code: BIDDER_CODE,
@@ -57,12 +57,6 @@ export const spec = {
utils.logInfo('OZONE: OZONE BID ADAPTER VALIDATION FAILED : customParams should be renamed to customData');
return false;
}
- if (bid.params.hasOwnProperty('ozoneData')) {
- if (typeof bid.params.ozoneData !== 'object') {
- utils.logInfo('OZONE: OZONE BID ADAPTER VALIDATION FAILED : ozoneData is not an object');
- return false;
- }
- }
if (bid.params.hasOwnProperty('lotameData')) {
if (typeof bid.params.lotameData !== 'object') {
utils.logInfo('OZONE: OZONE BID ADAPTER VALIDATION FAILED : lotameData is not an object');
@@ -90,18 +84,35 @@ export const spec = {
let htmlParams = validBidRequests[0].params; // the html page config params will be included in each element
let ozoneRequest = {}; // we only want to set specific properties on this, not validBidRequests[0].params
delete ozoneRequest.test; // don't allow test to be set in the config - ONLY use $_GET['pbjs_debug']
- if (bidderRequest.gdprConsent) {
+
+ if (bidderRequest && bidderRequest.gdprConsent) {
utils.logInfo('OZONE: ADDING GDPR info');
ozoneRequest.regs = {};
ozoneRequest.regs.ext = {};
- ozoneRequest.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies === true ? 1 : 0;
+ ozoneRequest.regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? 1 : 0;
if (ozoneRequest.regs.ext.gdpr) {
- ozoneRequest.user = {};
- ozoneRequest.user.ext = {'consent': bidderRequest.gdprConsent.consentString};
+ ozoneRequest.user = ozoneRequest.user || {};
+ if (
+ bidderRequest.gdprConsent.vendorData &&
+ bidderRequest.gdprConsent.vendorData.vendorConsents &&
+ typeof bidderRequest.gdprConsent.consentString !== 'undefined'
+ ) {
+ utils.logInfo('OZONE: found all info we need for GDPR - will add info to request object');
+ ozoneRequest.user.ext = {'consent': bidderRequest.gdprConsent.consentString};
+ // are we able to make this request?
+ let vendorConsents = bidderRequest.gdprConsent.vendorData.vendorConsents;
+ let boolGdprConsentForOzone = vendorConsents[524];
+ let arrGdprConsents = toFlatArray(bidderRequest.gdprConsent.vendorData.purposeConsents);
+ ozoneRequest.regs.ext.oz_con = boolGdprConsentForOzone ? 1 : 0;
+ ozoneRequest.regs.ext.gap = arrGdprConsents;
+ }
+ } else {
+ utils.logInfo('OZONE: **** Failed to find required info for GDPR for request object, even though bidderRequest.gdprConsent is TRUE ****');
}
} else {
- utils.logInfo('OZONE: WILL NOT ADD GDPR info');
+ utils.logInfo('OZONE: WILL NOT ADD GDPR info; no bidderRequest.gdprConsent object was present.');
}
+
ozoneRequest.device = {'w': window.innerWidth, 'h': window.innerHeight};
let tosendtags = validBidRequests.map(ozoneBidRequest => {
var obj = {};
@@ -157,9 +168,6 @@ export const spec = {
if (ozoneBidRequest.params.hasOwnProperty('customData')) {
obj.ext.ozone.customData = ozoneBidRequest.params.customData;
}
- if (ozoneBidRequest.params.hasOwnProperty('ozoneData')) {
- obj.ext.ozone.ozoneData = ozoneBidRequest.params.ozoneData;
- }
if (ozoneBidRequest.params.hasOwnProperty('lotameData')) {
obj.ext.ozone.lotameData = ozoneBidRequest.params.lotameData;
}
@@ -226,8 +234,8 @@ export const spec = {
serverResponse.seatbid = injectAdIdsIntoAllBidResponses(serverResponse.seatbid); // we now make sure that each bid in the bidresponse has a unique (within page) adId attribute.
for (let i = 0; i < serverResponse.seatbid.length; i++) {
let sb = serverResponse.seatbid[i];
- const {defaultWidth, defaultHeight} = defaultSize(request.bidderRequest.bids[i]);
for (let j = 0; j < sb.bid.length; j++) {
+ const {defaultWidth, defaultHeight} = defaultSize(request.bidderRequest.bids[j]); // there should be the same number of bids as requests, so index [j] should always exist.
let thisBid = ozoneAddStandardProperties(sb.bid[j], defaultWidth, defaultHeight);
// from https://github.com/prebid/Prebid.js/pull/1082
@@ -310,6 +318,13 @@ export function checkDeepArray(Arr) {
}
}
export function defaultSize(thebidObj) {
+ if (!thebidObj) {
+ utils.logInfo('defaultSize received empty bid obj! going to return fixed default size');
+ return {
+ 'defaultHeight': 250,
+ 'defaultWidth': 300
+ };
+ }
const {sizes} = thebidObj;
const returnObject = {};
returnObject.defaultWidth = checkDeepArray(sizes)[0];
@@ -499,5 +514,21 @@ function outstreamRender(bid) {
window.ozoneVideo.outstreamRender(bid);
}
+/**
+ * convert {1: true,
+ 2: true,
+ 3: true,
+ 4: true,
+ 5: true}
+ to : [1,2,3,4,5]
+ * @param obj
+ */
+function toFlatArray(obj) {
+ let ret = [];
+ Object.keys(obj).forEach(function(key) { if (obj[key]) { ret.push(parseInt(key)); } });
+ utils.logInfo('toFlatArray:', obj, 'returning', ret);
+ return ret;
+}
+
registerBidder(spec);
utils.logInfo('OZONE: ozoneBidAdapter ended');
diff --git a/modules/ozoneBidAdapter.md b/modules/ozoneBidAdapter.md
index 89760697088..1fe5e681e25 100644
--- a/modules/ozoneBidAdapter.md
+++ b/modules/ozoneBidAdapter.md
@@ -36,8 +36,7 @@ adUnits = [{
publisherId: 'OZONENUK0001', /* an ID to identify the publisher account - required */
siteId: '4204204201', /* An ID used to identify a site within a publisher account - required */
placementId: '0420420421', /* an ID used to identify the piece of inventory - required - for appnexus test use 13144370. */
- customData": [{"settings": {}, "targeting": {"key": "value", "key2": ["value1", "value2"],}}] /* optional array with 'targeting' placeholder for passing publisher specific key-values for targeting. */
- ozoneData: {"key1": "value1", "key2": "value2"}, /* optional JSON placeholder for for passing ozone project key-values for targeting. */
+ customData: [{"settings": {}, "targeting": {"key": "value", "key2": ["value1", "value2"]}}],/* optional array with 'targeting' placeholder for passing publisher specific key-values for targeting. */
lotameData: {"key1": "value1", "key2": "value2"} /* optional JSON placeholder for passing Lotame DMP data */
}
}]
@@ -65,8 +64,7 @@ adUnits = [{
siteId: '4204204201', /* An ID used to identify a site within a publisher account - required */
customData: [{"settings": {}, "targeting": { "key": "value", "key2": ["value1", "value2"]}}]
placementId: '0440440442', /* an ID used to identify the piece of inventory - required - for unruly test use 0440440442. */
- customData": [{"settings": {}, "targeting": {"key": "value", "key2": ["value1", "value2"],}}] /* optional array with 'targeting' placeholder for passing publisher specific key-values for targeting. */
- ozoneData: {"key1": "value1", "key2": "value2"}, /* optional JSON placeholder for for passing ozone project key-values for targeting. */
+ customData: [{"settings": {}, "targeting": {"key": "value", "key2": ["value1", "value2"]}}],/* optional array with 'targeting' placeholder for passing publisher specific key-values for targeting. */
lotameData: {"key1": "value1", "key2": "value2"}, /* optional JSON placeholder for passing Lotame DMP data */
video: {
skippable: true, /* optional */
diff --git a/test/spec/modules/ozoneBidAdapter_spec.js b/test/spec/modules/ozoneBidAdapter_spec.js
index b0f252d4469..e17d51804a1 100644
--- a/test/spec/modules/ozoneBidAdapter_spec.js
+++ b/test/spec/modules/ozoneBidAdapter_spec.js
@@ -18,7 +18,7 @@ var validBidRequests = [
bidder: 'ozone',
bidderRequestId: '1c1586b27a1b5c8',
crumbs: {pubcid: '203a0692-f728-4856-87f6-9a25a6b63715'},
- params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, ozoneData: {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, banner: { format: [{ w: 300, h: 250 }, { w: 300, h: 600 }], h: 250, topframe: 1, w: 300 } } ] },
+ params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, banner: { format: [{ w: 300, h: 250 }, { w: 300, h: 600 }], h: 250, topframe: 1, w: 300 } } ] },
sizes: [[300, 250], [300, 600]],
transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
}
@@ -45,7 +45,7 @@ var validBidRequestsNoSizes = [
bidder: 'ozone',
bidderRequestId: '1c1586b27a1b5c8',
crumbs: {pubcid: '203a0692-f728-4856-87f6-9a25a6b63715'},
- params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, ozoneData: {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, banner: { format: [{ w: 300, h: 250 }, { w: 300, h: 600 }], h: 250, topframe: 1, w: 300 } } ] },
+ params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, banner: { format: [{ w: 300, h: 250 }, { w: 300, h: 600 }], h: 250, topframe: 1, w: 300 } } ] },
transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
}
];
@@ -59,7 +59,7 @@ var validBidRequestsWithBannerMediaType = [
bidder: 'ozone',
bidderRequestId: '1c1586b27a1b5c8',
crumbs: {pubcid: '203a0692-f728-4856-87f6-9a25a6b63715'},
- params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, ozoneData: {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, banner: { format: [{ w: 300, h: 250 }, { w: 300, h: 600 }], h: 250, topframe: 1, w: 300 } } ] },
+ params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, banner: { format: [{ w: 300, h: 250 }, { w: 300, h: 600 }], h: 250, topframe: 1, w: 300 } } ] },
mediaTypes: {banner: {sizes: [[300, 250], [300, 600]]}},
transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
}
@@ -73,7 +73,7 @@ var validBidRequestsWithNonBannerMediaTypesAndValidOutstreamVideo = [
bidder: 'ozone',
bidderRequestId: '1c1586b27a1b5c8',
crumbs: {pubcid: '203a0692-f728-4856-87f6-9a25a6b63715'},
- params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, ozoneData: {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, video: {skippable: true, playback_method: ['auto_play_sound_off'], targetDiv: 'some-different-div-id-to-my-adunitcode'} } ] },
+ params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { id: '2899ec066a91ff8', tagid: 'undefined', secure: 1, video: {skippable: true, playback_method: ['auto_play_sound_off'], targetDiv: 'some-different-div-id-to-my-adunitcode'} } ] },
mediaTypes: {video: {mimes: ['video/mp4'], 'context': 'outstream'}, native: {info: 'dummy data'}},
transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
}
@@ -92,7 +92,7 @@ var validBidderRequest = {
bidder: 'ozone',
bidderRequestId: '1c1586b27a1b5c8',
crumbs: {pubcid: '203a0692-f728-4856-87f6-9a25a6b63715'},
- params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, ozoneData: {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { banner: { topframe: 1, w: 300, h: 250, format: [{ w: 300, h: 250 }, { w: 300, h: 600 }] }, id: '2899ec066a91ff8', secure: 1, tagid: 'undefined' } ] },
+ params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { banner: { topframe: 1, w: 300, h: 250, format: [{ w: 300, h: 250 }, { w: 300, h: 600 }] }, id: '2899ec066a91ff8', secure: 1, tagid: 'undefined' } ] },
sizes: [[300, 250], [300, 600]],
transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
}],
@@ -100,6 +100,65 @@ var validBidderRequest = {
start: 1536838908987,
timeout: 3000
};
+
+// bidder request with GDPR - change the values for testing:
+// gdprConsent.gdprApplies (true/false)
+// gdprConsent.vendorData.purposeConsents (make empty, make null, remove it)
+// gdprConsent.vendorData.vendorConsents (remove 524, remove all, make the element null, remove it)
+var bidderRequestWithFullGdpr = {
+ auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99',
+ auctionStart: 1536838908986,
+ bidderCode: 'ozone',
+ bidderRequestId: '1c1586b27a1b5c8',
+ bids: [{
+ adUnitCode: 'div-gpt-ad-1460505748561-0',
+ auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99',
+ bidId: '2899ec066a91ff8',
+ bidRequestsCount: 1,
+ bidder: 'ozone',
+ bidderRequestId: '1c1586b27a1b5c8',
+ crumbs: {pubcid: '203a0692-f728-4856-87f6-9a25a6b63715'},
+ params: { publisherId: '9876abcd12-3', customData: {'gender': 'bart', 'age': 'low'}, lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}}, placementId: '1310000099', siteId: '1234567890', id: 'fea37168-78f1-4a23-a40e-88437a99377e', auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99', imp: [ { banner: { topframe: 1, w: 300, h: 250, format: [{ w: 300, h: 250 }, { w: 300, h: 600 }] }, id: '2899ec066a91ff8', secure: 1, tagid: 'undefined' } ] },
+ sizes: [[300, 250], [300, 600]],
+ transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
+ }],
+ doneCbCallCount: 1,
+ start: 1536838908987,
+ timeout: 3000,
+ gdprConsent: {
+ 'consentString': 'BOh7mtYOh7mtYAcABBENCU-AAAAncgPIXJiiAoao0PxBFkgCAC8ACIAAQAQQAAIAAAIAAAhBGAAAQAQAEQgAAAAAAABAAAAAAAAAAAAAAACAAAAAAAACgAAAAABAAAAQAAAAAAA',
+ 'vendorData': {
+ 'metadata': 'BOh7mtYOh7mtYAcABBENCU-AAAAncgPIXJiiAoao0PxBFkgCAC8ACIAAQAQQAAIAAAIAAAhBGAAAQAQAEQgAAAAAAABAAAAAAAAAAAAAAACAAAAAAAACgAAAAABAAAAQAAAAAAA',
+ 'gdprApplies': true,
+ 'hasGlobalScope': false,
+ 'cookieVersion': '1',
+ 'created': '2019-05-31T12:46:48.825',
+ 'lastUpdated': '2019-05-31T12:46:48.825',
+ 'cmpId': '28',
+ 'cmpVersion': '1',
+ 'consentLanguage': 'en',
+ 'consentScreen': '1',
+ 'vendorListVersion': 148,
+ 'maxVendorId': 631,
+ 'purposeConsents': {
+ '1': true,
+ '2': true,
+ '3': true,
+ '4': true,
+ '5': true
+ },
+ 'vendorConsents': {
+ '468': true,
+ '522': true,
+ '524': true, /* 524 is ozone */
+ '565': true,
+ '591': true
+ }
+ },
+ 'gdprApplies': true
+ },
+};
+
// make sure the impid matches the request bidId
var validResponse = {
'body': {
@@ -216,7 +275,97 @@ var validOutstreamResponse = {
}
},
'headers': {}
-}
+};
+var validBidResponse1adWith2Bidders = {
+ 'body': {
+ 'id': '91221f96-b931-4acc-8f05-c2a1186fa5ac',
+ 'seatbid': [
+ {
+ 'bid': [
+ {
+ 'id': 'd6198807-7a53-4141-b2db-d2cb754d68ba',
+ 'impid': '2899ec066a91ff8',
+ 'price': 0.36754,
+ 'adm': '',
+ 'adid': '134928661',
+ 'adomain': [
+ 'somecompany.com'
+ ],
+ 'iurl': 'https:\/\/ams1-ib.adnxs.com\/cr?id=134928661',
+ 'cid': '8825',
+ 'crid': '134928661',
+ 'cat': [
+ 'IAB8-15',
+ 'IAB8-16',
+ 'IAB8-4',
+ 'IAB8-1',
+ 'IAB8-14',
+ 'IAB8-6',
+ 'IAB8-13',
+ 'IAB8-3',
+ 'IAB8-17',
+ 'IAB8-12',
+ 'IAB8-8',
+ 'IAB8-7',
+ 'IAB8-2',
+ 'IAB8-9',
+ 'IAB8',
+ 'IAB8-11'
+ ],
+ 'w': 300,
+ 'h': 250,
+ 'ext': {
+ 'prebid': {
+ 'type': 'banner'
+ },
+ 'bidder': {
+ 'appnexus': {
+ 'brand_id': 14640,
+ 'auction_id': 1.8369641905139e+18,
+ 'bidder_id': 2,
+ 'bid_ad_type': 0
+ }
+ }
+ }
+ }
+ ],
+ 'seat': 'appnexus'
+ },
+ {
+ 'bid': [
+ {
+ 'id': '75665207-a1ca-49db-ba0e-a5e9c7d26f32',
+ 'impid': '37fff511779365a',
+ 'price': 1.046,
+ 'adm': 'removed
',
+ 'adomain': [
+ 'kx.com'
+ ],
+ 'crid': '13005',
+ 'w': 300,
+ 'h': 250,
+ 'ext': {
+ 'prebid': {
+ 'type': 'banner'
+ }
+ }
+ }
+ ],
+ 'seat': 'openx'
+ }
+ ],
+ 'ext': {
+ 'responsetimemillis': {
+ 'appnexus': 91,
+ 'openx': 109,
+ 'ozappnexus': 46,
+ 'ozbeeswax': 2,
+ 'pangaea': 91
+ }
+ }
+ },
+ 'headers': {}
+};
describe('ozone Adapter', function () {
describe('isBidRequestValid', function () {
@@ -242,7 +391,6 @@ describe('ozone Adapter', function () {
publisherId: '9876abcd12-3',
siteId: '1234567890',
customData: {'gender': 'bart', 'age': 'low'},
- ozoneData: {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'},
lotameData: {'Profile': {'tpid': 'c8ef27a0d4ba771a81159f0d2e792db4', 'Audiences': {'Audience': [{'id': '99999', 'abbr': 'sports'}, {'id': '88888', 'abbr': 'movie'}, {'id': '77777', 'abbr': 'blogger'}], 'ThirdPartyAudience': [{'id': '123', 'name': 'Automobiles'}, {'id': '456', 'name': 'Ages: 30-39'}]}}},
},
siteId: 1234567890
@@ -485,20 +633,6 @@ describe('ozone Adapter', function () {
expect(spec.isBidRequestValid(xCustomParams)).to.equal(false);
});
- var xBadOzoneData = {
- bidder: BIDDER_CODE,
- params: {
- 'placementId': '1234567890',
- 'publisherId': '9876abcd12-3',
- 'ozoneData': 'this should be an object',
- siteId: '1234567890'
- }
- };
-
- it('should not validate ozoneData being sent', function () {
- expect(spec.isBidRequestValid(xBadOzoneData)).to.equal(false);
- });
-
var xBadCustomData = {
bidder: BIDDER_CODE,
params: {
@@ -508,10 +642,10 @@ describe('ozone Adapter', function () {
siteId: '1234567890'
}
};
-
it('should not validate ozoneData being sent', function () {
expect(spec.isBidRequestValid(xBadCustomData)).to.equal(false);
});
+
var xBadLotame = {
bidder: BIDDER_CODE,
params: {
@@ -521,7 +655,6 @@ describe('ozone Adapter', function () {
siteId: '1234567890'
}
};
-
it('should not validate lotameData being sent', function () {
expect(spec.isBidRequestValid(xBadLotame)).to.equal(false);
});
@@ -585,10 +718,21 @@ describe('ozone Adapter', function () {
const request = spec.buildRequests(validBidRequests, validBidderRequest);
expect(request.data).to.be.a('string');
var data = JSON.parse(request.data);
- expect(data.imp[0].ext.ozone.ozoneData).to.be.an('object');
expect(data.imp[0].ext.ozone.lotameData).to.be.an('object');
expect(data.imp[0].ext.ozone.customData).to.be.an('object');
- expect(request).not.to.have.key('ozoneData');
+ expect(request).not.to.have.key('lotameData');
+ expect(request).not.to.have.key('customData');
+ });
+
+ it('ignores ozoneData in & after version 2.1.1', function () {
+ let validBidRequestsWithOzoneData = validBidRequests;
+ validBidRequestsWithOzoneData[0].params.ozoneData = {'networkID': '3048', 'dfpSiteID': 'd.thesun', 'sectionID': 'homepage', 'path': '/', 'sec_id': 'null', 'sec': 'sec', 'topics': 'null', 'kw': 'null', 'aid': 'null', 'search': 'null', 'article_type': 'null', 'hide_ads': '', 'article_slug': 'null'};
+ const request = spec.buildRequests(validBidRequests, validBidderRequest);
+ expect(request.data).to.be.a('string');
+ var data = JSON.parse(request.data);
+ expect(data.imp[0].ext.ozone.lotameData).to.be.an('object');
+ expect(data.imp[0].ext.ozone.customData).to.be.an('object');
+ expect(data.imp[0].ext.ozone.ozoneData).to.be.undefined;
expect(request).not.to.have.key('lotameData');
expect(request).not.to.have.key('customData');
});
@@ -618,28 +762,6 @@ describe('ozone Adapter', function () {
expect(request).to.have.all.keys(['bidderRequest', 'data', 'method', 'url']);
});
- it('should add gdpr consent information to the request', function () {
- let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
- let bidderRequest = {
- 'bidderCode': 'ozone',
- 'auctionId': '1d1a030790a475',
- 'bidderRequestId': '22edbae2733bf6',
- 'timeout': 3000,
- 'gdprConsent': {
- consentString: consentString,
- gdprApplies: true
- }
- };
- bidderRequest.bids = validBidRequests;
-
- const request = spec.buildRequests(validBidRequests, bidderRequest);
- const payload = JSON.parse(request.data);
-
- expect(payload.user.ext).to.exist;
- expect(payload.user.ext.consent).to.exist.and.to.equal(consentString);
- expect(payload.regs.ext.gdpr).to.exist.and.to.equal(1);
- });
-
it('should be able to handle non-single requests', function () {
config.setConfig({'ozone': {'singleRequest': false}});
const request = spec.buildRequests(validBidRequestsNoSizes, validBidderRequest);
@@ -648,6 +770,82 @@ describe('ozone Adapter', function () {
// need to reset the singleRequest config flag:
config.setConfig({'ozone': {'singleRequest': true}});
});
+
+ it('should add gdpr consent information to the request when ozone is true', function () {
+ let consentString = 'BOcocyaOcocyaAfEYDENCD-AAAAjx7_______9______9uz_Ov_v_f__33e8__9v_l_7_-___u_-33d4-_1vf99yfm1-7ftr3tp_87ues2_Xur__59__3z3_NphLgA==';
+ let bidderRequest = validBidderRequest;
+ bidderRequest.gdprConsent = {
+ consentString: consentString,
+ gdprApplies: true,
+ vendorData: {
+ vendorConsents: {524: true},
+ purposeConsents: {1: true, 2: true, 3: true, 4: true, 5: true}
+ }
+ }
+
+ const request = spec.buildRequests(validBidRequestsNoSizes, bidderRequest);
+ const payload = JSON.parse(request.data);
+ expect(payload.regs.ext.gdpr).to.equal(1);
+ expect(payload.regs.ext.oz_con).to.exist.and.to.equal(1);
+ expect(payload.regs.ext.gap).to.exist.and.to.be.an('array').and.to.eql([1, 2, 3, 4, 5]);
+ });
+
+ it('should add correct gdpr consent information to the request when user has accepted only some purpose consents', function () {
+ let consentString = 'BOcocyaOcocyaAfEYDENCD-AAAAjx7_______9______9uz_Ov_v_f__33e8__9v_l_7_-___u_-33d4-_1vf99yfm1-7ftr3tp_87ues2_Xur__59__3z3_NphLgA==';
+ let bidderRequest = validBidderRequest;
+ bidderRequest.gdprConsent = {
+ consentString: consentString,
+ gdprApplies: true,
+ vendorData: {
+ vendorConsents: {524: true},
+ purposeConsents: {1: true, 4: true, 5: true}
+ }
+ }
+
+ const request = spec.buildRequests(validBidRequestsNoSizes, bidderRequest);
+ const payload = JSON.parse(request.data);
+ expect(payload.regs.ext.gdpr).to.equal(1);
+ expect(payload.regs.ext.oz_con).to.exist.and.to.equal(1);
+ expect(payload.regs.ext.gap).to.exist.and.to.be.an('array').and.to.eql([1, 4, 5]);
+ });
+
+ it('should add gdpr consent information to the request when ozone is false', function () {
+ let consentString = 'BOcocyaOcocyaAfEYDENCD-AAAAjx7_______9______9uz_Ov_v_f__33e8__9v_l_7_-___u_-33d4-_1vf99yfm1-7ftr3tp_87ues2_Xur__59__3z3_NphLgA==';
+ let bidderRequest = validBidderRequest;
+ bidderRequest.gdprConsent = {
+ consentString: consentString,
+ gdprApplies: true,
+ vendorData: {
+ vendorConsents: {}, /* 524 is not present */
+ purposeConsents: {1: true, 2: true, 3: true, 4: true, 5: true}
+ }
+ };
+
+ const request = spec.buildRequests(validBidRequestsNoSizes, bidderRequest);
+ const payload = JSON.parse(request.data);
+ expect(payload.regs.ext.gdpr).to.equal(1);
+ expect(payload.regs.ext.oz_con).to.exist.and.to.equal(0);
+ expect(payload.regs.ext.gap).to.exist.and.to.be.an('array').and.to.eql([1, 2, 3, 4, 5]);
+ });
+
+ it('should set regs.ext.gdpr flag to 0 when gdprApplies is false', function () {
+ let consentString = 'BOcocyaOcocyaAfEYDENCD-AAAAjx7_______9______9uz_Ov_v_f__33e8__9v_l_7_-___u_-33d4-_1vf99yfm1-7ftr3tp_87ues2_Xur__59__3z3_NphLgA==';
+ let bidderRequest = validBidderRequest;
+ bidderRequest.gdprConsent = {
+ consentString: consentString,
+ gdprApplies: false,
+ vendorData: {
+ vendorConsents: {}, /* 524 is not present */
+ purposeConsents: {1: true, 2: true, 3: true, 4: true, 5: true}
+ }
+ };
+
+ const request = spec.buildRequests(validBidRequestsNoSizes, bidderRequest);
+ const payload = JSON.parse(request.data);
+ expect(payload.regs.ext.gdpr).to.equal(0);
+ expect(payload.regs.ext.oz_con).to.be.undefined;
+ expect(payload.regs.ext.gap).to.be.undefined;
+ });
});
describe('interpretResponse', function () {
@@ -673,11 +871,13 @@ describe('ozone Adapter', function () {
const result = spec.interpretResponse(validResponse, request);
expect(result.length).to.equal(1);
});
+
it('should fail ok if no seatbid in server response', function () {
const result = spec.interpretResponse({}, {});
expect(result).to.be.an('array');
expect(result).to.be.empty;
});
+
it('should fail ok if seatbid is not an array', function () {
const result = spec.interpretResponse({'body': {'seatbid': 'nothing_here'}}, {});
expect(result).to.be.an('array');
@@ -690,6 +890,12 @@ describe('ozone Adapter', function () {
const bid = result[0];
expect(bid.renderer).to.be.an.instanceOf(Renderer);
});
+
+ it('should correctly parse response where there are more bidders than ad slots', function () {
+ const request = spec.buildRequests(validBidRequests, validBidderRequest);
+ const result = spec.interpretResponse(validBidResponse1adWith2Bidders, request);
+ expect(result.length).to.equal(2);
+ });
});
describe('userSyncs', function () {
From 7b70c14750bac886ba7e34c2ccc3189392a1747b Mon Sep 17 00:00:00 2001
From: Isaac Dettman
Date: Thu, 27 Jun 2019 12:53:04 -0700
Subject: [PATCH 039/285] added cur to ortb
---
modules/prebidServerBidAdapter/index.js | 8 +++++
.../modules/prebidServerBidAdapter_spec.js | 31 ++++++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js
index 4ac1bccaeda..1d177464b9f 100644
--- a/modules/prebidServerBidAdapter/index.js
+++ b/modules/prebidServerBidAdapter/index.js
@@ -523,6 +523,14 @@ const OPEN_RTB_PROTOCOL = {
request.ext.prebid = Object.assign(request.ext.prebid, _s2sConfig.extPrebid);
}
+ /**
+ * @type {(string[]|undefined)} - OpenRTB property 'cur', currencies available for bids
+ */
+ const adServerCur = config.getConfig('currency.adServerCurrency');
+ if (Array.isArray(adServerCur) && adServerCur.length) {
+ request.cur = adServerCur.slice();
+ }
+
_appendSiteAppDevice(request);
const digiTrust = _getDigiTrustQueryParams(bidRequests && bidRequests[0]);
diff --git a/test/spec/modules/prebidServerBidAdapter_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js
index e2a3a5b111a..61db09b6451 100644
--- a/test/spec/modules/prebidServerBidAdapter_spec.js
+++ b/test/spec/modules/prebidServerBidAdapter_spec.js
@@ -831,7 +831,36 @@ describe('S2S Adapter', function () {
expect(requestBid.user.ext.eids.filter(eid => eid.source === 'adserver.org')[0].uids[0].id).is.equal('abc123');
expect(requestBid.user.ext.eids.filter(eid => eid.source === 'pubcommon')).is.not.empty; ;
expect(requestBid.user.ext.eids.filter(eid => eid.source === 'pubcommon')[0].uids[0].id).is.equal('1234');
- })
+ });
+
+ it('setting currency.adServerCurrency results in the openRTB JSON containing cur: ["AAA"]', function () {
+ let ortb2Config = utils.deepClone(CONFIG);
+ ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction';
+ config.setConfig({
+ currency: {adServerCurrency: ['USD', 'GB', 'UK', 'AU']},
+ s2sConfig: ortb2Config
+ });
+
+ const userIdBidRequest = utils.deepClone(BID_REQUESTS);
+ adapter.callBids(REQUEST, userIdBidRequest, addBidResponse, done, ajax);
+
+ const parsedRequestBody = JSON.parse(requests[0].requestBody);
+ expect(parsedRequestBody.cur).to.deep.equal(['USD', 'GB', 'UK', 'AU']);
+ });
+
+ it('when currency.adServerCurrency is unset, the OpenRTB JSON should not contain cur', function () {
+ let ortb2Config = utils.deepClone(CONFIG);
+ ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction';
+ config.setConfig({
+ s2sConfig: ortb2Config
+ });
+
+ const userIdBidRequest = utils.deepClone(BID_REQUESTS);
+ adapter.callBids(REQUEST, userIdBidRequest, addBidResponse, done, ajax);
+
+ const parsedRequestBody = JSON.parse(requests[0].requestBody);
+ expect(typeof parsedRequestBody.cur).to.equal('undefined');
+ });
it('always add ext.prebid.targeting.includebidderkeys: false for ORTB', function () {
const s2sConfig = Object.assign({}, CONFIG, {
From 99a165af280584324a074f19abf674481f89aa6c Mon Sep 17 00:00:00 2001
From: Isaac Dettman
Date: Thu, 27 Jun 2019 13:10:52 -0700
Subject: [PATCH 040/285] Revert "added cur to ortb"
This reverts commit 7b70c14750bac886ba7e34c2ccc3189392a1747b.
---
modules/prebidServerBidAdapter/index.js | 8 -----
.../modules/prebidServerBidAdapter_spec.js | 31 +------------------
2 files changed, 1 insertion(+), 38 deletions(-)
diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js
index 1d177464b9f..4ac1bccaeda 100644
--- a/modules/prebidServerBidAdapter/index.js
+++ b/modules/prebidServerBidAdapter/index.js
@@ -523,14 +523,6 @@ const OPEN_RTB_PROTOCOL = {
request.ext.prebid = Object.assign(request.ext.prebid, _s2sConfig.extPrebid);
}
- /**
- * @type {(string[]|undefined)} - OpenRTB property 'cur', currencies available for bids
- */
- const adServerCur = config.getConfig('currency.adServerCurrency');
- if (Array.isArray(adServerCur) && adServerCur.length) {
- request.cur = adServerCur.slice();
- }
-
_appendSiteAppDevice(request);
const digiTrust = _getDigiTrustQueryParams(bidRequests && bidRequests[0]);
diff --git a/test/spec/modules/prebidServerBidAdapter_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js
index 61db09b6451..e2a3a5b111a 100644
--- a/test/spec/modules/prebidServerBidAdapter_spec.js
+++ b/test/spec/modules/prebidServerBidAdapter_spec.js
@@ -831,36 +831,7 @@ describe('S2S Adapter', function () {
expect(requestBid.user.ext.eids.filter(eid => eid.source === 'adserver.org')[0].uids[0].id).is.equal('abc123');
expect(requestBid.user.ext.eids.filter(eid => eid.source === 'pubcommon')).is.not.empty; ;
expect(requestBid.user.ext.eids.filter(eid => eid.source === 'pubcommon')[0].uids[0].id).is.equal('1234');
- });
-
- it('setting currency.adServerCurrency results in the openRTB JSON containing cur: ["AAA"]', function () {
- let ortb2Config = utils.deepClone(CONFIG);
- ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction';
- config.setConfig({
- currency: {adServerCurrency: ['USD', 'GB', 'UK', 'AU']},
- s2sConfig: ortb2Config
- });
-
- const userIdBidRequest = utils.deepClone(BID_REQUESTS);
- adapter.callBids(REQUEST, userIdBidRequest, addBidResponse, done, ajax);
-
- const parsedRequestBody = JSON.parse(requests[0].requestBody);
- expect(parsedRequestBody.cur).to.deep.equal(['USD', 'GB', 'UK', 'AU']);
- });
-
- it('when currency.adServerCurrency is unset, the OpenRTB JSON should not contain cur', function () {
- let ortb2Config = utils.deepClone(CONFIG);
- ortb2Config.endpoint = 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction';
- config.setConfig({
- s2sConfig: ortb2Config
- });
-
- const userIdBidRequest = utils.deepClone(BID_REQUESTS);
- adapter.callBids(REQUEST, userIdBidRequest, addBidResponse, done, ajax);
-
- const parsedRequestBody = JSON.parse(requests[0].requestBody);
- expect(typeof parsedRequestBody.cur).to.equal('undefined');
- });
+ })
it('always add ext.prebid.targeting.includebidderkeys: false for ORTB', function () {
const s2sConfig = Object.assign({}, CONFIG, {
From cec25d584e6f1e2f744a74f7683e61146ba16d5b Mon Sep 17 00:00:00 2001
From: hdeodhar <35999856+hdeodhar@users.noreply.github.com>
Date: Fri, 28 Jun 2019 16:04:00 +0100
Subject: [PATCH 041/285] Added 640x320 size (#3954)
---
modules/rubiconBidAdapter.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js
index c3d0b48f14b..881ce480aef 100644
--- a/modules/rubiconBidAdapter.js
+++ b/modules/rubiconBidAdapter.js
@@ -83,6 +83,7 @@ var sizeMap = {
126: '200x600',
144: '980x600',
145: '980x150',
+ 156: '640x320',
159: '320x250',
179: '250x600',
195: '600x300',
From bac5e3bf33a2c99f42174e5623618b0dc5ecc2ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deivydas=20=C5=A0abaras?=
Date: Fri, 28 Jun 2019 19:45:04 +0100
Subject: [PATCH 042/285] OpenX should run only banner auction if it is multi
format solution (#3940)
---
modules/openxBidAdapter.js | 2 +-
test/spec/modules/openxBidAdapter_spec.js | 35 +++++++++++++++++++++++
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/modules/openxBidAdapter.js b/modules/openxBidAdapter.js
index ef60d6e1856..7be1023450f 100644
--- a/modules/openxBidAdapter.js
+++ b/modules/openxBidAdapter.js
@@ -75,7 +75,7 @@ export const spec = {
};
function isVideoRequest(bidRequest) {
- return utils.deepAccess(bidRequest, 'mediaTypes.video') || bidRequest.mediaType === VIDEO;
+ return (utils.deepAccess(bidRequest, 'mediaTypes.video') && !utils.deepAccess(bidRequest, 'mediaTypes.banner')) || bidRequest.mediaType === VIDEO;
}
function createBannerBidResponses(oxResponseObj, {bids, startTime}) {
diff --git a/test/spec/modules/openxBidAdapter_spec.js b/test/spec/modules/openxBidAdapter_spec.js
index 0fda846faa1..cf8f4f8d62b 100644
--- a/test/spec/modules/openxBidAdapter_spec.js
+++ b/test/spec/modules/openxBidAdapter_spec.js
@@ -178,6 +178,41 @@ describe('OpenxAdapter', function () {
});
});
+ describe('when request is for a multiformat ad', function () {
+ describe('and request config uses mediaTypes video and banner', () => {
+ const multiformatBid = {
+ bidder: 'openx',
+ params: {
+ unit: '12345678',
+ delDomain: 'test-del-domain'
+ },
+ adUnitCode: 'adunit-code',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ },
+ video: {
+ playerSize: [300, 250]
+ }
+ },
+ bidId: '30b31c1838de1e',
+ bidderRequestId: '22edbae2733bf6',
+ auctionId: '1d1a030790a475',
+ transactionId: '4008d88a-8137-410b-aa35-fbfdabcb478e'
+ };
+ it('should return true multisize when required params found', function () {
+ expect(spec.isBidRequestValid(multiformatBid)).to.equal(true);
+ });
+
+ it('should send bid request to openx url via GET, with mediaType specified as banner', function () {
+ const request = spec.buildRequests([multiformatBid]);
+ expect(request[0].url).to.equal(`//${multiformatBid.params.delDomain}${URLBASE}`);
+ expect(request[0].data.ph).to.be.undefined;
+ expect(request[0].method).to.equal('GET');
+ });
+ });
+ });
+
describe('when request is for a video ad', function () {
describe('and request config uses mediaTypes', () => {
const videoBidWithMediaTypes = {
From 2bd04a1f9b7f706d9c60d8b1f401d9b743a8c8a3 Mon Sep 17 00:00:00 2001
From: Robert Ray Martinez III
Date: Fri, 28 Jun 2019 12:21:42 -0700
Subject: [PATCH 043/285] Update creative.html (#3955)
Updating for the new safe frame issue discovered, see https://github.com/prebid/prebid-universal-creative/pull/64/ for more details!
---
integrationExamples/gpt/x-domain/creative.html | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/integrationExamples/gpt/x-domain/creative.html b/integrationExamples/gpt/x-domain/creative.html
index 3b0058f2ee8..a6981706227 100644
--- a/integrationExamples/gpt/x-domain/creative.html
+++ b/integrationExamples/gpt/x-domain/creative.html
@@ -2,10 +2,11 @@
// this script can be returned by an ad server delivering a cross domain iframe, into which the
// creative will be rendered, e.g. DFP delivering a SafeFrame
+let windowLocation = window.location;
var urlParser = document.createElement('a');
urlParser.href = '%%PATTERN:url%%';
var publisherDomain = urlParser.protocol + '//' + urlParser.hostname;
-var adServerDomain = urlParser.protocol + '//tpc.googlesyndication.com';
+var adServerDomain = windowLocation.protocol + '//tpc.googlesyndication.com';
function renderAd(ev) {
var key = ev.message ? 'message' : 'data';
From 9c736313c3181adbf2cce3e84a8fa1946fa3f946 Mon Sep 17 00:00:00 2001
From: ix-certification
Date: Mon, 1 Jul 2019 15:34:18 -0400
Subject: [PATCH 044/285] Revert addition of video support to IX adapter as it
is still in testing (#3956)
---
modules/ixBidAdapter.js | 366 +++++++++----------------
modules/ixBidAdapter.md | 128 +--------
test/spec/modules/ixBidAdapter_spec.js | 344 +++++------------------
3 files changed, 210 insertions(+), 628 deletions(-)
diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js
index f26c5e413c5..c63b920dc93 100644
--- a/modules/ixBidAdapter.js
+++ b/modules/ixBidAdapter.js
@@ -1,75 +1,38 @@
import * as utils from '../src/utils';
-import { BANNER, VIDEO } from '../src/mediaTypes';
-import find from 'core-js/library/fn/array/find';
+import { BANNER } from '../src/mediaTypes';
import { config } from '../src/config';
import isArray from 'core-js/library/fn/array/is-array';
import isInteger from 'core-js/library/fn/number/is-integer';
import { registerBidder } from '../src/adapters/bidderFactory';
const BIDDER_CODE = 'ix';
-const SECURE_BID_URL = 'https://as-sec.casalemedia.com/cygnus';
-const INSECURE_BID_URL = 'http://as.casalemedia.com/cygnus';
-const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
-const BANNER_ENDPOINT_VERSION = 7.2;
-const VIDEO_ENDPOINT_VERSION = 8.1;
-
+const BANNER_SECURE_BID_URL = 'https://as-sec.casalemedia.com/cygnus';
+const BANNER_INSECURE_BID_URL = 'http://as.casalemedia.com/cygnus';
+const SUPPORTED_AD_TYPES = [BANNER];
+const ENDPOINT_VERSION = 7.2;
const CENT_TO_DOLLAR_FACTOR = 100;
-const BANNER_TIME_TO_LIVE = 35;
-const VIDEO_TIME_TO_LIVE = 3600; // 1hr
+const TIME_TO_LIVE = 35;
const NET_REVENUE = true;
const PRICE_TO_DOLLAR_FACTOR = {
JPY: 1
};
/**
- * Transform valid bid request config object to banner impression object that will be sent to ad server.
+ * Transform valid bid request config object to impression object that will be sent to ad server.
*
* @param {object} bid A valid bid request config object.
* @return {object} A impression object that will be sent to ad server.
*/
function bidToBannerImp(bid) {
- const imp = bidToImp(bid);
+ const imp = {};
+
+ imp.id = bid.bidId;
imp.banner = {};
imp.banner.w = bid.params.size[0];
imp.banner.h = bid.params.size[1];
imp.banner.topframe = utils.inIframe() ? 0 : 1;
- return imp;
-}
-
-/**
- * Transform valid bid request config object to video impression object that will be sent to ad server.
- *
- * @param {object} bid A valid bid request config object.
- * @return {object} A impression object that will be sent to ad server.
- */
-function bidToVideoImp(bid) {
- const imp = bidToImp(bid);
-
- imp.video = utils.deepClone(bid.params.video)
- imp.video.w = bid.params.size[0];
- imp.video.h = bid.params.size[1];
-
- const context = utils.deepAccess(bid, 'mediaTypes.video.context');
- if (context) {
- if (context === 'instream') {
- imp.video.placement = 1;
- } else if (context === 'outstream') {
- imp.video.placement = 4;
- } else {
- utils.logWarn(`ix bidder params: video context '${context}' is not supported`);
- }
- }
-
- return imp;
-}
-
-function bidToImp(bid) {
- const imp = {};
-
- imp.id = bid.bidId;
-
imp.ext = {};
imp.ext.siteID = bid.params.siteId;
@@ -95,7 +58,7 @@ function bidToImp(bid) {
* @param {string} currency Global currency in bid response.
* @return {object} bid The parsed bid.
*/
-function parseBid(rawBid, currency, bidRequest) {
+function parseBid(rawBid, currency) {
const bid = {};
if (PRICE_TO_DOLLAR_FACTOR.hasOwnProperty(currency)) {
@@ -105,27 +68,15 @@ function parseBid(rawBid, currency, bidRequest) {
}
bid.requestId = rawBid.impid;
-
+ bid.width = rawBid.w;
+ bid.height = rawBid.h;
+ bid.ad = rawBid.adm;
bid.dealId = utils.deepAccess(rawBid, 'ext.dealid');
+ bid.ttl = TIME_TO_LIVE;
bid.netRevenue = NET_REVENUE;
bid.currency = currency;
bid.creativeId = rawBid.hasOwnProperty('crid') ? rawBid.crid : '-';
- // in the event of a video
- if (utils.deepAccess(rawBid, 'ext.vasturl')) {
- bid.vastUrl = rawBid.ext.vasturl
- bid.width = bidRequest.video.w;
- bid.height = bidRequest.video.h;
- bid.mediaType = VIDEO;
- bid.ttl = VIDEO_TIME_TO_LIVE;
- } else {
- bid.ad = rawBid.adm;
- bid.width = rawBid.w;
- bid.height = rawBid.h;
- bid.mediaType = BANNER;
- bid.ttl = BANNER_TIME_TO_LIVE;
- }
-
bid.meta = {};
bid.meta.networkId = utils.deepAccess(rawBid, 'ext.dspid');
bid.meta.brandId = utils.deepAccess(rawBid, 'ext.advbrandid');
@@ -182,143 +133,6 @@ function isValidBidFloorParams(bidFloor, bidFloorCur) {
bidFloorCur.match(curRegex));
}
-/**
- * Finds the impression with the associated id.
- *
- * @param {*} id Id of the impression.
- * @param {array} impressions List of impressions sent in the request.
- * @return {object} The impression with the associated id.
- */
-function getBidRequest(id, impressions) {
- if (!id) {
- return;
- }
- return find(impressions, imp => imp.id === id);
-}
-
-/**
- * Builds a request object to be sent to the ad server based on bid requests.
- *
- * @param {array} validBidRequests A list of valid bid request config objects.
- * @param {object} bidderRequest An object containing other info like gdprConsent.
- * @param {array} impressions List of impression objects describing the bids.
- * @param {array} version Endpoint version denoting banner or video.
- * @return {object} Info describing the request to the server.
- *
- */
-function buildRequest(validBidRequests, bidderRequest, impressions, version) {
- const userEids = [];
-
- // Always start by assuming the protocol is HTTPS. This way, it will work
- // whether the page protocol is HTTP or HTTPS. Then check if the page is
- // actually HTTP.If we can guarantee it is, then, and only then, set protocol to
- // HTTP.
- let baseUrl = SECURE_BID_URL;
-
- // RTI ids will be included in the bid request if the function getIdentityInfo() is loaded
- // and if the data for the partner exist
- if (window.headertag && typeof window.headertag.getIdentityInfo === 'function') {
- let identityInfo = window.headertag.getIdentityInfo();
- if (identityInfo && typeof identityInfo === 'object') {
- for (const partnerName in identityInfo) {
- if (identityInfo.hasOwnProperty(partnerName)) {
- let response = identityInfo[partnerName];
- if (!response.responsePending && response.data && typeof response.data === 'object' && Object.keys(response.data).length) {
- userEids.push(response.data);
- }
- }
- }
- }
- }
- const r = {};
-
- // Since bidderRequestId are the same for different bid request, just use the first one.
- r.id = validBidRequests[0].bidderRequestId;
-
- r.imp = impressions;
-
- r.site = {};
- r.ext = {};
- r.ext.source = 'prebid';
- if (userEids.length > 0) {
- r.user = {};
- r.user.eids = userEids;
- }
-
- if (document.referrer && document.referrer !== '') {
- r.site.ref = document.referrer;
- }
-
- // Apply GDPR information to the request if GDPR is enabled.
- if (bidderRequest) {
- if (bidderRequest.gdprConsent) {
- const gdprConsent = bidderRequest.gdprConsent;
-
- if (gdprConsent.hasOwnProperty('gdprApplies')) {
- r.regs = {
- ext: {
- gdpr: gdprConsent.gdprApplies ? 1 : 0
- }
- };
- }
-
- if (gdprConsent.hasOwnProperty('consentString')) {
- r.user = r.user || {};
- r.user.ext = {
- consent: gdprConsent.consentString || ''
- };
- }
- }
-
- if (bidderRequest.refererInfo) {
- r.site.page = bidderRequest.refererInfo.referer;
-
- if (bidderRequest.refererInfo.referer && bidderRequest.refererInfo.referer.indexOf('https') !== 0) {
- baseUrl = INSECURE_BID_URL;
- }
- }
- }
-
- const payload = {};
-
- // Parse additional runtime configs.
- const otherIxConfig = config.getConfig('ix');
- if (otherIxConfig) {
- // Append firstPartyData to r.site.page if firstPartyData exists.
- if (typeof otherIxConfig.firstPartyData === 'object') {
- const firstPartyData = otherIxConfig.firstPartyData;
- let firstPartyString = '?';
- for (const key in firstPartyData) {
- if (firstPartyData.hasOwnProperty(key)) {
- firstPartyString += `${encodeURIComponent(key)}=${encodeURIComponent(firstPartyData[key])}&`;
- }
- }
- firstPartyString = firstPartyString.slice(0, -1);
-
- r.site.page += firstPartyString;
- }
-
- // Create t in payload if timeout is configured.
- if (typeof otherIxConfig.timeout === 'number') {
- payload.t = otherIxConfig.timeout;
- }
- }
-
- // Use the siteId in the first bid request as the main siteId.
- payload.s = validBidRequests[0].params.siteId;
- payload.v = version;
- payload.r = JSON.stringify(r);
- payload.ac = 'j';
- payload.sd = 1;
- payload.nf = 1;
-
- return {
- method: 'GET',
- url: baseUrl,
- data: payload
- };
-}
-
export const spec = {
code: BIDDER_CODE,
@@ -332,25 +146,22 @@ export const spec = {
*/
isBidRequestValid: function (bid) {
if (!isValidSize(bid.params.size)) {
- utils.logError('ix bidder params: bid size has invalid format.');
return false;
}
if (!includesSize(bid.sizes, bid.params.size)) {
- utils.logError('ix bidder params: bid size is not included in ad unit sizes.');
return false;
}
- if (bid.hasOwnProperty('mediaType') && !(utils.contains(SUPPORTED_AD_TYPES, bid.mediaType))) {
+ if (bid.hasOwnProperty('mediaType') && bid.mediaType !== 'banner') {
return false;
}
- if (bid.hasOwnProperty('mediaTypes') && !(utils.deepAccess(bid, 'mediaTypes.banner.sizes') || utils.deepAccess(bid, 'mediaTypes.video.playerSize'))) {
+ if (bid.hasOwnProperty('mediaTypes') && !utils.deepAccess(bid, 'mediaTypes.banner.sizes')) {
return false;
}
if (typeof bid.params.siteId !== 'string' && typeof bid.params.siteId !== 'number') {
- utils.logError('ix bidder params: siteId must be string or number value.');
return false;
}
@@ -358,10 +169,8 @@ export const spec = {
const hasBidFloorCur = bid.params.hasOwnProperty('bidFloorCur');
if (hasBidFloor || hasBidFloorCur) {
- if (!(hasBidFloor && hasBidFloorCur && isValidBidFloorParams(bid.params.bidFloor, bid.params.bidFloorCur))) {
- utils.logError('ix bidder params: bidFloor / bidFloorCur parameter has invalid format.');
- return false;
- }
+ return hasBidFloor && hasBidFloorCur &&
+ isValidBidFloorParams(bid.params.bidFloor, bid.params.bidFloorCur);
}
return true;
@@ -371,49 +180,139 @@ export const spec = {
* Make a server request from the list of BidRequests.
*
* @param {array} validBidRequests A list of valid bid request config objects.
- * @param {object} bidderRequest A object contains bids and other info like gdprConsent.
+ * @param {object} options A object contains bids and other info like gdprConsent.
* @return {object} Info describing the request to the server.
*/
- buildRequests: function (validBidRequests, bidderRequest) {
- let reqs = [];
- let bannerImps = [];
- let videoImps = [];
+ buildRequests: function (validBidRequests, options) {
+ const bannerImps = [];
+ const userEids = [];
let validBidRequest = null;
+ let bannerImp = null;
+
+ // Always start by assuming the protocol is HTTPS. This way, it will work
+ // whether the page protocol is HTTP or HTTPS. Then check if the page is
+ // actually HTTP.If we can guarantee it is, then, and only then, set protocol to
+ // HTTP.
+ let baseUrl = BANNER_SECURE_BID_URL;
for (let i = 0; i < validBidRequests.length; i++) {
validBidRequest = validBidRequests[i];
- if (validBidRequest.mediaType === VIDEO || utils.deepAccess(validBidRequest, 'mediaTypes.video')) {
- if (validBidRequest.mediaType === VIDEO || includesSize(validBidRequest.mediaTypes.video.playerSize, validBidRequest.params.size)) {
- videoImps.push(bidToVideoImp(validBidRequest));
- } else {
- utils.logError('Bid size is not included in video playerSize')
+ // Transform the bid request based on the banner format.
+ bannerImp = bidToBannerImp(validBidRequest);
+ bannerImps.push(bannerImp);
+ }
+
+ // RTI ids will be included in the bid request if the function getIdentityInfo() is loaded
+ // and if the data for the partner exist
+ if (window.headertag && typeof window.headertag.getIdentityInfo === 'function') {
+ let identityInfo = window.headertag.getIdentityInfo();
+ if (identityInfo && typeof identityInfo === 'object') {
+ for (const partnerName in identityInfo) {
+ if (identityInfo.hasOwnProperty(partnerName)) {
+ let response = identityInfo[partnerName];
+ if (!response.responsePending && response.data && typeof response.data === 'object' && Object.keys(response.data).length) {
+ userEids.push(response.data);
+ }
+ }
}
}
- if (validBidRequest.mediaType === BANNER || utils.deepAccess(validBidRequest, 'mediaTypes.banner') ||
- (!validBidRequest.mediaType && !validBidRequest.mediaTypes)) {
- bannerImps.push(bidToBannerImp(validBidRequest));
- }
}
+ const r = {};
+
+ // Since bidderRequestId are the same for different bid request, just use the first one.
+ r.id = validBidRequests[0].bidderRequestId;
+
+ r.imp = bannerImps;
+ r.site = {};
+ r.ext = {};
+ r.ext.source = 'prebid';
+ if (userEids.length > 0) {
+ r.user = {};
+ r.user.eids = userEids;
+ }
+
+ if (document.referrer && document.referrer !== '') {
+ r.site.ref = document.referrer;
+ }
+
+ // Apply GDPR information to the request if GDPR is enabled.
+ if (options) {
+ if (options.gdprConsent) {
+ const gdprConsent = options.gdprConsent;
+
+ if (gdprConsent.hasOwnProperty('gdprApplies')) {
+ r.regs = {
+ ext: {
+ gdpr: gdprConsent.gdprApplies ? 1 : 0
+ }
+ };
+ }
+
+ if (gdprConsent.hasOwnProperty('consentString')) {
+ r.user = r.user || {};
+ r.user.ext = {
+ consent: gdprConsent.consentString || ''
+ };
+ }
+ }
+
+ if (options.refererInfo) {
+ r.site.page = options.refererInfo.referer;
- if (bannerImps.length > 0) {
- reqs.push(buildRequest(validBidRequests, bidderRequest, bannerImps, BANNER_ENDPOINT_VERSION));
+ if (options.refererInfo.referer && options.refererInfo.referer.indexOf('https') !== 0) {
+ baseUrl = BANNER_INSECURE_BID_URL;
+ }
+ }
}
- if (videoImps.length > 0) {
- reqs.push(buildRequest(validBidRequests, bidderRequest, videoImps, VIDEO_ENDPOINT_VERSION));
+
+ const payload = {};
+
+ // Parse additional runtime configs.
+ const otherIxConfig = config.getConfig('ix');
+ if (otherIxConfig) {
+ // Append firstPartyData to r.site.page if firstPartyData exists.
+ if (typeof otherIxConfig.firstPartyData === 'object') {
+ const firstPartyData = otherIxConfig.firstPartyData;
+ let firstPartyString = '?';
+ for (const key in firstPartyData) {
+ if (firstPartyData.hasOwnProperty(key)) {
+ firstPartyString += `${encodeURIComponent(key)}=${encodeURIComponent(firstPartyData[key])}&`;
+ }
+ }
+ firstPartyString = firstPartyString.slice(0, -1);
+
+ r.site.page += firstPartyString;
+ }
+
+ // Create t in payload if timeout is configured.
+ if (typeof otherIxConfig.timeout === 'number') {
+ payload.t = otherIxConfig.timeout;
+ }
}
- return reqs;
+ // Use the siteId in the first bid request as the main siteId.
+ payload.s = validBidRequests[0].params.siteId;
+
+ payload.v = ENDPOINT_VERSION;
+ payload.r = JSON.stringify(r);
+ payload.ac = 'j';
+ payload.sd = 1;
+
+ return {
+ method: 'GET',
+ url: baseUrl,
+ data: payload
+ };
},
/**
* Unpack the response from the server into a list of bids.
*
* @param {object} serverResponse A successful response from the server.
- * @param {object} bidderRequest The bid request sent to the server.
* @return {array} An array of bids which were nested inside the server.
*/
- interpretResponse: function (serverResponse, bidderRequest) {
+ interpretResponse: function (serverResponse) {
const bids = [];
let bid = null;
@@ -430,11 +329,8 @@ export const spec = {
// Transform rawBid in bid response to the format that will be accepted by prebid.
const innerBids = seatbid[i].bid;
- let requestBid = JSON.parse(bidderRequest.data.r);
-
for (let j = 0; j < innerBids.length; j++) {
- const bidRequest = getBidRequest(innerBids[j].impid, requestBid.imp);
- bid = parseBid(innerBids[j], responseBody.cur, bidRequest);
+ bid = parseBid(innerBids[j], responseBody.cur);
bids.push(bid);
}
}
diff --git a/modules/ixBidAdapter.md b/modules/ixBidAdapter.md
index 7bd60ac413b..e99c42408f2 100644
--- a/modules/ixBidAdapter.md
+++ b/modules/ixBidAdapter.md
@@ -42,21 +42,16 @@ var adUnits = [{
```javascript
var adUnits = [{
// ...
+
mediaTypes: {
banner: {
sizes: [
[300, 250],
[300, 600]
]
- },
- video: {
- context: 'instream',
- playerSize: [
- [300, 250],
- [300, 600]
- ]
}
- },
+ }
+
// ...
}];
```
@@ -66,7 +61,7 @@ var adUnits = [{
| Type | Support
| --- | ---
| Banner | Fully supported for all IX approved sizes.
-| Video | Fully supported for all IX approved sizes.
+| Video | Not supported.
| Native | Not supported.
# Bid Parameters
@@ -81,17 +76,6 @@ object are detailed here.
| siteId | Required | String | An IX-specific identifier that is associated with a specific size on this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. Examples: `'3723'`, `'6482'`, `'3639'`
| size | Required | Number[] | The single size associated with the site ID. It should be one of the sizes listed in the ad unit under `adUnits[].sizes` or `adUnits[].mediaTypes.banner.sizes`. Examples: `[300, 250]`, `[300, 600]`, `[728, 90]`
-### Video
-
-| Key | Scope | Type | Description
-| --- | --- | --- | ---
-| siteId | Required | String | An IX-specific identifier that is associated with a specific size on this ad unit. This is similar to a placement ID or an ad unit ID that some other modules have. Examples: `'3723'`, `'6482'`, `'3639'`
-| size | Required | Number[] | The single size associated with the site ID. It should be one of the sizes listed in the ad unit under `adUnits[].sizes` or `adUnits[].mediaTypes.video.playerSize`. Examples: `[300, 250]`, `[300, 600]`
-| video | Required | Hash | The video object will serve as the properties of the video ad. You can create any field under the video object that is mentioned in the `OpenRTB Spec v2.5`. Some fields like `mimes, protocols, minduration, maxduration` are required.
-| video.mimes | Required | String[] | Array list of content MIME types supported. Popular MIME types include, but are not limited to, `"video/x-ms- wmv"` for Windows Media and `"video/x-flv"` for Flash Video.
-|video.minduration| Required | Integer | Minimum video ad duration in seconds.
-|video.maxduration| Required | Integer | Maximum video ad duration in seconds.
-|video.protocol / video.protocols| Required | Integer / Integer[] | Either a single protocol provided as an integer, or protocols provided as a list of integers. `2` - VAST 2.0, `3` - VAST 3.0, `5` - VAST 2.0 Wrapper, `6` - VAST 3.0 Wrapper
Setup Guide
@@ -100,9 +84,7 @@ Setup Guide
Follow these steps to configure and add the IX module to your Prebid.js
integration.
-The examples in this guide assume the following starting configuration (you may remove banner or video, if either does not apply).
-
-In regards to video, `context` can either be `'instream'` or `'outstream'`. Note that `outstream` requires additional configuration on the adUnit.
+The examples in this guide assume the following starting configuration:
```javascript
var adUnits = [{
@@ -116,19 +98,6 @@ var adUnits = [{
}
},
bids: []
-},
-{
- code: 'video-div-a',
- mediaTypes: {
- video: {
- context: 'instream',
- playerSize: [
- [300, 250],
- [300, 600]
- ]
- }
- },
- bids: []
}];
```
@@ -150,9 +119,7 @@ bid objects under `adUnits[].bids`:
Set `params.siteId` and `params.size` in each bid object to the values provided
by your IX representative.
-**Examples**
-
-**Banner:**
+**Example**
```javascript
var adUnits = [{
code: 'banner-div-a',
@@ -179,94 +146,18 @@ var adUnits = [{
}]
}];
```
-**Video (Instream):**
-```javascript
-var adUnits = [{
- code: 'video-div-a',
- mediaTypes: {
- video: {
- context: 'instream',
- playerSize: [
- [300, 250],
- [300, 600]
- ]
- }
- },
- bids: [{
- bidder: 'ix',
- params: {
- siteId: '12345',
- size: [300, 250],
- video: {
- skippable: false,
- mimes: [
- 'video/mp4',
- 'video/webm'
- ],
- minduration: 0,
- maxduration: 60,
- protocols: [6]
- }
- }
- }, {
- bidder: 'ix',
- params: {
- siteId: '12345',
- size: [300, 600],
- video: {
- // openrtb v2.5 compatible video obj
- }
- }
- }]
-}];
-```
+
Please note that you can re-use the existing `siteId` within the same flex
position.
-**Video (Outstream):**
-Note that currently, outstream video rendering must be configured by the publisher. In the adUnit, a `renderer` object must be defined, which includes a `url` pointing to the video rendering script, and a `render` function for creating the video player. See http://prebid.org/dev-docs/show-outstream-video-ads.html for more information.
-```javascript
-var adUnits = [{
- code: 'video-div-a',
- mediaTypes: {
- video: {
- context: 'outstream',
- playerSize: [[300, 250]]
- }
- },
- renderer: {
- url: 'https://test.com/my-video-player.js',
- render: function (bid) {
- ...
- }
- },
- bids: [{
- bidder: 'ix',
- params: {
- siteId: '12345',
- size: [300, 250],
- video: {
- skippable: false,
- mimes: [
- 'video/mp4',
- 'video/webm'
- ],
- minduration: 0,
- maxduration: 60,
- protocols: [6]
- }
- }
- }]
-}];
-```
##### 2. Include `ixBidAdapter` in your build process
-When running the build command, include `ixBidAdapter` as a module, as well as `dfpAdServerVideo` if you require video support.
+When running the build command, include `ixBidAdapter` as a module.
```
-gulp build --modules=ixBidAdapter,dfpAdServerVideo,fooBidAdapter,bazBidAdapter
+gulp build --modules=ixBidAdapter,fooBidAdapter,bazBidAdapter
```
If a JSON file is being used to specify the bidder modules, add `"ixBidAdapter"`
@@ -275,7 +166,6 @@ to the top-level array in that file.
```json
[
"ixBidAdapter",
- "dfpAdServerVideo",
"fooBidAdapter",
"bazBidAdapter"
]
diff --git a/test/spec/modules/ixBidAdapter_spec.js b/test/spec/modules/ixBidAdapter_spec.js
index 634d5041e6e..38e64e8d338 100644
--- a/test/spec/modules/ixBidAdapter_spec.js
+++ b/test/spec/modules/ixBidAdapter_spec.js
@@ -7,8 +7,7 @@ import { spec } from 'modules/ixBidAdapter';
describe('IndexexchangeAdapter', function () {
const IX_INSECURE_ENDPOINT = 'http://as.casalemedia.com/cygnus';
const IX_SECURE_ENDPOINT = 'https://as-sec.casalemedia.com/cygnus';
- const VIDEO_ENDPOINT_VERSION = 8.1;
- const BANNER_ENDPOINT_VERSION = 7.2;
+ const BIDDER_VERSION = 7.2;
const DEFAULT_BANNER_VALID_BID = [
{
@@ -30,37 +29,17 @@ describe('IndexexchangeAdapter', function () {
auctionId: '1aa2bb3cc4dd'
}
];
-
- const DEFAULT_VIDEO_VALID_BID = [
- {
- bidder: 'ix',
- params: {
- siteId: '456',
- video: {
- skippable: false,
- mimes: [
- 'video/mp4',
- 'video/webm'
- ],
- minduration: 0
- },
- size: [400, 100]
- },
- sizes: [[400, 100], [200, 400]],
- mediaTypes: {
- video: {
- context: 'instream',
- playerSize: [[400, 100], [200, 400]]
- }
- },
- adUnitCode: 'div-gpt-ad-1460505748562-0',
- transactionId: '173f49a8-7549-4218-a23c-e7ba59b47230',
- bidId: '1a2b3c4e',
- bidderRequestId: '11a22b33c44e',
- auctionId: '1aa2bb3cc4de'
+ const DEFAULT_BANNER_OPTION = {
+ gdprConsent: {
+ gdprApplies: true,
+ consentString: '3huaa11=qu3198ae',
+ vendorData: {}
+ },
+ refererInfo: {
+ referer: 'http://www.prebid.org',
+ canonicalUrl: 'http://www.prebid.org/the/link/to/the/page'
}
- ];
-
+ };
const DEFAULT_BANNER_BID_RESPONSE = {
cur: 'USD',
id: '11a22b33c44d',
@@ -90,48 +69,6 @@ describe('IndexexchangeAdapter', function () {
}
]
};
-
- const DEFAULT_VIDEO_BID_RESPONSE = {
- cur: 'USD',
- id: '1aa2bb3cc4de',
- seatbid: [
- {
- bid: [
- {
- crid: '12346',
- adomain: ['www.abcd.com'],
- adid: '14851456',
- impid: '1a2b3c4e',
- cid: '3051267',
- price: 110,
- id: '2',
- ext: {
- vasturl: 'www.abcd.com/vast',
- errorurl: 'www.abcd.com/error',
- dspid: 51,
- pricelevel: '_110',
- advbrandid: 303326,
- advbrand: 'OECTB'
- }
- }
- ],
- seat: '3971'
- }
- ]
- };
-
- const DEFAULT_OPTION = {
- gdprConsent: {
- gdprApplies: true,
- consentString: '3huaa11=qu3198ae',
- vendorData: {}
- },
- refererInfo: {
- referer: 'http://www.prebid.org',
- canonicalUrl: 'http://www.prebid.org/the/link/to/the/page'
- }
- };
-
const DEFAULT_IDENTITY_RESPONSE = {
IdentityIp: {
responsePending: false,
@@ -146,31 +83,6 @@ describe('IndexexchangeAdapter', function () {
}
};
- const DEFAULT_BIDDER_REQUEST_DATA = {
- ac: 'j',
- r: JSON.stringify({
- id: '345',
- imp: [
- {
- id: '1a2b3c4e',
- video: {
- w: 640,
- h: 480,
- placement: 1
- }
- }
- ],
- site: {
- ref: 'http://ref.com/ref.html',
- page: 'http://page.com'
- },
- }),
- s: '21',
- sd: 1,
- t: 1000,
- v: 8.1
- };
-
describe('inherited functions', function () {
it('should exists and is a function', function () {
const adapter = newBidder(spec);
@@ -179,12 +91,11 @@ describe('IndexexchangeAdapter', function () {
});
describe('isBidRequestValid', function () {
- it('should return true when required params found for a banner or video ad', function () {
+ it('should return true when required params found for a banner ad', function () {
expect(spec.isBidRequestValid(DEFAULT_BANNER_VALID_BID[0])).to.equal(true);
- expect(spec.isBidRequestValid(DEFAULT_VIDEO_VALID_BID[0])).to.equal(true);
});
- it('should return true when optional bidFloor params found for an ad', function () {
+ it('should return true when optional params found for a banner ad', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.bidFloor = 50;
bid.params.bidFloorCur = 'USD';
@@ -225,10 +136,10 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when mediaTypes is not banner or video', function () {
+ it('should return false when mediaTypes is not banner', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.mediaTypes = {
- native: {
+ video: {
sizes: [[300, 250]]
}
};
@@ -245,13 +156,19 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
- it('should return false when mediaTypes.video does not have sizes', function () {
- const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
- bid.mediaTypes = {
- video: {
- size: [[300, 250]]
- }
- };
+ it('should return false when mediaType is not banner', function () {
+ const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
+ delete bid.params.mediaTypes;
+ bid.mediaType = 'banne';
+ bid.sizes = [[300, 250]];
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
+
+ it('should return false when mediaType is video', function () {
+ const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
+ delete bid.params.mediaTypes;
+ bid.mediaType = 'video';
+ bid.sizes = [[300, 250]];
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
@@ -278,14 +195,6 @@ describe('IndexexchangeAdapter', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
- it('should return true when mediaType is video', function () {
- const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
- delete bid.mediaTypes;
- bid.mediaType = 'video';
- bid.sizes = [[400, 100]];
- expect(spec.isBidRequestValid(bid)).to.equal(true);
- });
-
it('should return false when there is only bidFloor', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.bidFloor = 50;
@@ -323,7 +232,7 @@ describe('IndexexchangeAdapter', function () {
window.headertag.getIdentityInfo = function() {
return testCopy;
};
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
query = request.data;
});
afterEach(function() {
@@ -434,7 +343,7 @@ describe('IndexexchangeAdapter', function () {
window.headertag.getIdentityInfo = function() {
return undefined;
};
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
query = request.data;
const payload = JSON.parse(query.r);
@@ -447,7 +356,7 @@ describe('IndexexchangeAdapter', function () {
responsePending: true,
data: {}
}
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
query = request.data;
const payload = JSON.parse(query.r);
@@ -457,7 +366,7 @@ describe('IndexexchangeAdapter', function () {
it('payload should not have any user eids if identity data is pending for all partners', function () {
testCopy.IdentityIp.responsePending = true;
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
query = request.data;
const payload = JSON.parse(query.r);
@@ -468,7 +377,7 @@ describe('IndexexchangeAdapter', function () {
it('payload should not have any user eids if identity data is pending or not available for all partners', function () {
testCopy.IdentityIp.responsePending = false;
testCopy.IdentityIp.data = {};
- request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
query = request.data;
const payload = JSON.parse(query.r);
@@ -478,8 +387,8 @@ describe('IndexexchangeAdapter', function () {
});
});
- describe('buildRequests', function () {
- const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ describe('buildRequestsBanner', function () {
+ const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
const requestUrl = request.url;
const requestMethod = request.method;
const query = request.data;
@@ -487,7 +396,7 @@ describe('IndexexchangeAdapter', function () {
const bidWithoutMediaType = utils.deepClone(DEFAULT_BANNER_VALID_BID);
delete bidWithoutMediaType[0].mediaTypes;
bidWithoutMediaType[0].sizes = [[300, 250], [300, 600]];
- const requestWithoutMediaType = spec.buildRequests(bidWithoutMediaType, DEFAULT_OPTION)[0];
+ const requestWithoutMediaType = spec.buildRequests(bidWithoutMediaType, DEFAULT_BANNER_OPTION);
const queryWithoutMediaType = requestWithoutMediaType.data;
it('request should be made to IX endpoint with GET method', function () {
@@ -496,12 +405,11 @@ describe('IndexexchangeAdapter', function () {
});
it('query object (version, siteID and request) should be correct', function () {
- expect(query.v).to.equal(BANNER_ENDPOINT_VERSION);
+ expect(query.v).to.equal(BIDDER_VERSION);
expect(query.s).to.equal(DEFAULT_BANNER_VALID_BID[0].params.siteId);
expect(query.r).to.exist;
expect(query.ac).to.equal('j');
expect(query.sd).to.equal(1);
- expect(query.nf).to.equal(1);
});
it('payload should have correct format and value', function () {
@@ -509,7 +417,7 @@ describe('IndexexchangeAdapter', function () {
expect(payload.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidderRequestId);
expect(payload.site).to.exist;
- expect(payload.site.page).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(payload.site.page).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
expect(payload.site.ref).to.equal(document.referrer);
expect(payload.ext).to.exist;
expect(payload.ext.source).to.equal('prebid');
@@ -537,7 +445,7 @@ describe('IndexexchangeAdapter', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.bidFloor = 50;
bid.params.bidFloorCur = 'USD';
- const requestBidFloor = spec.buildRequests([bid])[0];
+ const requestBidFloor = spec.buildRequests([bid]);
const impression = JSON.parse(requestBidFloor.data.r).imp[0];
expect(impression.bidfloor).to.equal(bid.params.bidFloor);
@@ -549,7 +457,7 @@ describe('IndexexchangeAdapter', function () {
expect(payload.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidderRequestId);
expect(payload.site).to.exist;
- expect(payload.site.page).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(payload.site.page).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
expect(payload.site.ref).to.equal(document.referrer);
expect(payload.ext).to.exist;
expect(payload.ext.source).to.equal('prebid');
@@ -576,7 +484,7 @@ describe('IndexexchangeAdapter', function () {
it('impression should have sid if id is configured as number', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.id = 50;
- const requestBidFloor = spec.buildRequests([bid])[0];
+ const requestBidFloor = spec.buildRequests([bid]);
const impression = JSON.parse(requestBidFloor.data.r).imp[0];
expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
@@ -593,7 +501,7 @@ describe('IndexexchangeAdapter', function () {
it('impression should have sid if id is configured as string', function () {
const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
bid.params.id = 'abc';
- const requestBidFloor = spec.buildRequests([bid])[0];
+ const requestBidFloor = spec.buildRequests([bid]);
const impression = JSON.parse(requestBidFloor.data.r).imp[0];
expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
expect(impression.banner).to.exist;
@@ -618,9 +526,9 @@ describe('IndexexchangeAdapter', function () {
}
});
- const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
const pageUrl = JSON.parse(requestWithFirstPartyData.data.r).site.page;
- const expectedPageUrl = DEFAULT_OPTION.refererInfo.referer + '?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
+ const expectedPageUrl = DEFAULT_BANNER_OPTION.refererInfo.referer + '?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
expect(pageUrl).to.equal(expectedPageUrl);
});
@@ -632,10 +540,10 @@ describe('IndexexchangeAdapter', function () {
}
});
- const requestFirstPartyDataNumber = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ const requestFirstPartyDataNumber = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
const pageUrl = JSON.parse(requestFirstPartyDataNumber.data.r).site.page;
- expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(pageUrl).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
});
it('should not set first party or timeout if it is not present', function () {
@@ -643,18 +551,18 @@ describe('IndexexchangeAdapter', function () {
ix: {}
});
- const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
- expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(pageUrl).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
expect(requestWithoutConfig.data.t).to.be.undefined;
});
it('should not set first party or timeout if it is setConfig is not called', function () {
- const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
+ const requestWithoutConfig = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
const pageUrl = JSON.parse(requestWithoutConfig.data.r).site.page;
- expect(pageUrl).to.equal(DEFAULT_OPTION.refererInfo.referer);
+ expect(pageUrl).to.equal(DEFAULT_BANNER_OPTION.refererInfo.referer);
expect(requestWithoutConfig.data.t).to.be.undefined;
});
@@ -664,7 +572,7 @@ describe('IndexexchangeAdapter', function () {
timeout: 500
}
});
- const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
+ const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID);
expect(requestWithTimeout.data.t).to.equal(500);
});
@@ -675,98 +583,14 @@ describe('IndexexchangeAdapter', function () {
timeout: '500'
}
});
- const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0];
+ const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID);
expect(requestStringTimeout.data.t).to.be.undefined;
});
-
- it('request should contain both banner and video requests', function () {
- const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]]);
-
- const bannerImp = JSON.parse(request[0].data.r).imp[0];
- expect(JSON.parse(request[0].data.v)).to.equal(BANNER_ENDPOINT_VERSION);
- expect(bannerImp.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
- expect(bannerImp.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
- expect(bannerImp.banner).to.exist;
- expect(bannerImp.banner.w).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[0]);
- expect(bannerImp.banner.h).to.equal(DEFAULT_BANNER_VALID_BID[0].params.size[1]);
-
- const videoImp = JSON.parse(request[1].data.r).imp[0];
- expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION);
- expect(videoImp.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
- expect(videoImp.video).to.exist;
- expect(videoImp.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
- expect(videoImp.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
- });
});
- describe('buildRequestVideo', function () {
- const request = spec.buildRequests(DEFAULT_VIDEO_VALID_BID, DEFAULT_OPTION);
- const query = request[0].data;
-
- it('query object (version, siteID and request) should be correct', function () {
- expect(query.v).to.equal(VIDEO_ENDPOINT_VERSION);
- expect(query.s).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.siteId);
- expect(query.r).to.exist;
- expect(query.ac).to.equal('j');
- expect(query.sd).to.equal(1);
- });
-
- it('impression should have correct format and value', function () {
- const impression = JSON.parse(query.r).imp[0];
- const sidValue = `${DEFAULT_VIDEO_VALID_BID[0].params.size[0].toString()}x${DEFAULT_VIDEO_VALID_BID[0].params.size[1].toString()}`;
-
- expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
- expect(impression.video).to.exist;
- expect(impression.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
- expect(impression.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
- expect(impression.video.placement).to.exist;
- expect(impression.video.placement).to.equal(1);
- expect(impression.video.minduration).to.exist;
- expect(impression.video.minduration).to.equal(0);
- expect(impression.video.mimes).to.exist;
- expect(impression.video.mimes[0]).to.equal('video/mp4');
- expect(impression.video.mimes[1]).to.equal('video/webm');
-
- expect(impression.video.skippable).to.equal(false);
- expect(impression.ext).to.exist;
- expect(impression.ext.siteID).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.siteId.toString());
- expect(impression.ext.sid).to.equal(sidValue);
- });
-
- it('impression should have correct format when mediaType is specified.', function () {
- const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
- delete bid.mediaTypes;
- bid.mediaType = 'video';
- const requestBidFloor = spec.buildRequests([bid])[0];
- const impression = JSON.parse(requestBidFloor.data.r).imp[0];
- const sidValue = `${DEFAULT_VIDEO_VALID_BID[0].params.size[0].toString()}x${DEFAULT_VIDEO_VALID_BID[0].params.size[1].toString()}`;
-
- expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
- expect(impression.video).to.exist;
- expect(impression.video.w).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[0]);
- expect(impression.video.h).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.size[1]);
- expect(impression.video.placement).to.not.exist;
- expect(impression.ext).to.exist;
- expect(impression.ext.siteID).to.equal(DEFAULT_VIDEO_VALID_BID[0].params.siteId.toString());
- expect(impression.ext.sid).to.equal(sidValue);
- });
-
- it('should set correct placement if context is outstream', function () {
- const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]);
- bid.mediaTypes.video.context = 'outstream';
- const request = spec.buildRequests([bid])[0];
- const impression = JSON.parse(request.data.r).imp[0];
-
- expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId);
- expect(impression.video).to.exist;
- expect(impression.video.placement).to.exist;
- expect(impression.video.placement).to.equal(4);
- });
- });
-
- describe('interpretResponse', function () {
- it('should get correct bid response for banner ad', function () {
+ describe('interpretResponseBanner', function () {
+ it('should get correct bid response', function () {
const expectedParse = [
{
requestId: '1a2b3c4d',
@@ -774,7 +598,6 @@ describe('IndexexchangeAdapter', function () {
creativeId: '12345',
width: 300,
height: 250,
- mediaType: 'banner',
ad: '',
currency: 'USD',
ttl: 35,
@@ -787,7 +610,7 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: DEFAULT_BANNER_BID_RESPONSE }, { data: DEFAULT_BIDDER_REQUEST_DATA });
+ const result = spec.interpretResponse({ body: DEFAULT_BANNER_BID_RESPONSE });
expect(result[0]).to.deep.equal(expectedParse[0]);
});
@@ -801,7 +624,6 @@ describe('IndexexchangeAdapter', function () {
creativeId: '-',
width: 300,
height: 250,
- mediaType: 'banner',
ad: '',
currency: 'USD',
ttl: 35,
@@ -814,7 +636,8 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: bidResponse }, { data: DEFAULT_BIDDER_REQUEST_DATA });
+ const result = spec.interpretResponse({ body: bidResponse });
+ expect(result[0]).to.deep.equal(expectedParse[0]);
});
it('should set Japanese price correctly', function () {
@@ -827,7 +650,6 @@ describe('IndexexchangeAdapter', function () {
creativeId: '12345',
width: 300,
height: 250,
- mediaType: 'banner',
ad: '',
currency: 'JPY',
ttl: 35,
@@ -840,7 +662,7 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: bidResponse }, { data: DEFAULT_BIDDER_REQUEST_DATA });
+ const result = spec.interpretResponse({ body: bidResponse });
expect(result[0]).to.deep.equal(expectedParse[0]);
});
@@ -854,7 +676,6 @@ describe('IndexexchangeAdapter', function () {
creativeId: '12345',
width: 300,
height: 250,
- mediaType: 'banner',
ad: '',
currency: 'USD',
ttl: 35,
@@ -867,38 +688,13 @@ describe('IndexexchangeAdapter', function () {
}
}
];
- const result = spec.interpretResponse({ body: bidResponse }, { data: DEFAULT_BIDDER_REQUEST_DATA });
- expect(result[0]).to.deep.equal(expectedParse[0]);
- });
-
- it('should get correct bid response for video ad', function () {
- const expectedParse = [
- {
- requestId: '1a2b3c4e',
- cpm: 1.1,
- creativeId: '12346',
- mediaType: 'video',
- width: 640,
- height: 480,
- currency: 'USD',
- ttl: 3600,
- netRevenue: true,
- dealId: undefined,
- vastUrl: 'www.abcd.com/vast',
- meta: {
- networkId: 51,
- brandId: 303326,
- brandName: 'OECTB'
- }
- }
- ];
- const result = spec.interpretResponse({ body: DEFAULT_VIDEO_BID_RESPONSE }, { data: DEFAULT_BIDDER_REQUEST_DATA });
+ const result = spec.interpretResponse({ body: bidResponse });
expect(result[0]).to.deep.equal(expectedParse[0]);
});
it('bidrequest should have consent info if gdprApplies and consentString exist', function () {
- const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION);
- const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
+ const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_BANNER_OPTION);
+ const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
expect(requestWithConsent.regs.ext.gdpr).to.equal(1);
expect(requestWithConsent.user.ext.consent).to.equal('3huaa11=qu3198ae');
@@ -912,7 +708,7 @@ describe('IndexexchangeAdapter', function () {
}
};
const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
+ const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
expect(requestWithConsent.regs.ext.gdpr).to.equal(1);
expect(requestWithConsent.user).to.be.undefined;
@@ -926,7 +722,7 @@ describe('IndexexchangeAdapter', function () {
}
};
const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
+ const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
expect(requestWithConsent.regs).to.be.undefined;
expect(requestWithConsent.user.ext.consent).to.equal('3huaa11=qu3198ae');
@@ -935,7 +731,7 @@ describe('IndexexchangeAdapter', function () {
it('bidrequest should not have consent info if options.gdprConsent is undefined', function () {
const options = {};
const validBidWithConsent = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithConsent = JSON.parse(validBidWithConsent[0].data.r);
+ const requestWithConsent = JSON.parse(validBidWithConsent.data.r);
expect(requestWithConsent.regs).to.be.undefined;
expect(requestWithConsent.user).to.be.undefined;
@@ -944,10 +740,10 @@ describe('IndexexchangeAdapter', function () {
it('bidrequest should not have page if options is undefined', function () {
const options = {};
const validBidWithoutreferInfo = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo[0].data.r);
+ const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo.data.r);
expect(requestWithoutreferInfo.site.page).to.be.undefined;
- expect(validBidWithoutreferInfo[0].url).to.equal(IX_SECURE_ENDPOINT);
+ expect(validBidWithoutreferInfo.url).to.equal(IX_SECURE_ENDPOINT);
});
it('bidrequest should not have page if options.refererInfo is an empty object', function () {
@@ -955,10 +751,10 @@ describe('IndexexchangeAdapter', function () {
refererInfo: {}
};
const validBidWithoutreferInfo = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo[0].data.r);
+ const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo.data.r);
expect(requestWithoutreferInfo.site.page).to.be.undefined;
- expect(validBidWithoutreferInfo[0].url).to.equal(IX_SECURE_ENDPOINT);
+ expect(validBidWithoutreferInfo.url).to.equal(IX_SECURE_ENDPOINT);
});
it('bidrequest should sent to secure endpoint if page url is secure', function () {
@@ -968,10 +764,10 @@ describe('IndexexchangeAdapter', function () {
}
};
const validBidWithoutreferInfo = spec.buildRequests(DEFAULT_BANNER_VALID_BID, options);
- const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo[0].data.r);
+ const requestWithoutreferInfo = JSON.parse(validBidWithoutreferInfo.data.r);
expect(requestWithoutreferInfo.site.page).to.equal(options.refererInfo.referer);
- expect(validBidWithoutreferInfo[0].url).to.equal(IX_SECURE_ENDPOINT);
+ expect(validBidWithoutreferInfo.url).to.equal(IX_SECURE_ENDPOINT);
});
});
});
From be7668259b30ab8da17352fca917ceb183e08af8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=83=A1=E9=9B=A8=E8=BB=92=20=D0=9F=D0=B5=D1=82=D1=80?=
Date: Mon, 1 Jul 2019 23:38:29 +0200
Subject: [PATCH 045/285] Update emoteevBidAdapter.js (#3928)
* Update emoteevBidAdapter.js
Retrieve various data from the adapter configuration, and ensure they
are properly formatted:
- GDPR vendor consent
- Metadata: intended to be used as an ID for external partners
- Context: describe the context of the current ad unit
Test coverage for emoteevBidAdapter.js:
- Statements 94.83%
- Branches 98.39%
- Functions 100%
- Lines 94.34%
fixup! Update emoteevBidAdapter.js
* remove pubCommonId import from emoteevBidAdapter
* Format indentation
* More detailed integration page example
* Rename attribute to externalId
* Simplify names of constants
* Minor tweak
* Update context value
---
.../gpt/hello_world_emoteev.html | 145 +++++++++++-------
modules/emoteevBidAdapter.js | 52 ++++++-
modules/emoteevBidAdapter.md | 6 +-
test/spec/modules/emoteevBidAdapter_spec.js | 139 +++++++++++++++--
4 files changed, 263 insertions(+), 79 deletions(-)
diff --git a/integrationExamples/gpt/hello_world_emoteev.html b/integrationExamples/gpt/hello_world_emoteev.html
index 5a33e2d9701..f41ef308332 100644
--- a/integrationExamples/gpt/hello_world_emoteev.html
+++ b/integrationExamples/gpt/hello_world_emoteev.html
@@ -5,68 +5,99 @@
@@ -75,9 +106,9 @@ Basic Prebid.js Example
Div-1
diff --git a/modules/emoteevBidAdapter.js b/modules/emoteevBidAdapter.js
index 4436d39bb70..db84b6ea36d 100644
--- a/modules/emoteevBidAdapter.js
+++ b/modules/emoteevBidAdapter.js
@@ -22,11 +22,12 @@ import {
contains,
deepAccess,
isArray,
- getParameterByName
+ isInteger,
+ getParameterByName,
+ getCookie
} from '../src/utils';
import {config} from '../src/config';
import * as url from '../src/url';
-import {getCookie} from './pubCommonId';
export const BIDDER_CODE = 'emoteev';
@@ -60,6 +61,19 @@ export const ON_ADAPTER_CALLED = 'on_adapter_called';
export const ON_BID_WON = 'on_bid_won';
export const ON_BIDDER_TIMEOUT = 'on_bidder_timeout';
+export const IN_CONTENT = 'content';
+export const FOOTER = 'footer';
+export const OVERLAY = 'overlay';
+export const WALLPAPER = 'wallpaper';
+
+/**
+ * Vendor ID assigned to Emoteev from the Global Vendor & CMP List.
+ *
+ * See https://vendorlist.consensu.org/vendorinfo.json for more information.
+ * @type {number}
+ */
+export const VENDOR_ID = 15;
+
/**
* Pure function. See http://prebid.org/dev-docs/bidder-adaptor.html#valid-build-requests-array for detailed semantic.
*
@@ -71,6 +85,8 @@ export const isBidRequestValid = (bidRequest) => {
bidRequest &&
bidRequest.params &&
deepAccess(bidRequest, 'params.adSpaceId') &&
+ validateContext(deepAccess(bidRequest, 'params.context')) &&
+ validateExternalId(deepAccess(bidRequest, 'params.externalId')) &&
bidRequest.bidder === BIDDER_CODE &&
validateSizes(deepAccess(bidRequest, 'mediaTypes.banner.sizes')));
};
@@ -89,7 +105,7 @@ export const buildRequests = (env, debug, currency, validBidRequests, bidderRequ
return {
method: 'POST',
url: bidderUrl(env),
- data: JSON.stringify(requestsPayload(debug, currency, validBidRequests, bidderRequest))
+ data: JSON.stringify(requestsPayload(debug, currency, validBidRequests, bidderRequest)) // Keys with undefined values will be filtered out.
};
};
@@ -264,7 +280,23 @@ export const userSyncImageUrl = env => url.format({
* @param {Array>} sizes
* @returns {boolean} are sizes valid?
*/
-const validateSizes = sizes => isArray(sizes) && sizes.some(size => isArray(size) && size.length === 2);
+export const validateSizes = sizes => isArray(sizes) && sizes.length > 0 && sizes.every(size => isArray(size) && size.length === 2);
+
+/**
+ * Pure function.
+ *
+ * @param {string} context
+ * @returns {boolean} is param `context` valid?
+ */
+export const validateContext = context => contains([IN_CONTENT, FOOTER, OVERLAY, WALLPAPER], context);
+
+/**
+ * Pure function.
+ *
+ * @param {(number|null|undefined)} externalId
+ * @returns {boolean} is param `externalId` valid?
+ */
+export const validateExternalId = externalId => externalId === undefined || externalId === null || (isInteger(externalId) && externalId > 0);
/**
* Pure function.
@@ -282,6 +314,14 @@ export const conformBidRequest = bidRequest => {
};
};
+/**
+ * Pure function.
+ *
+ * @param {object} bidderRequest
+ * @returns {(boolean|undefined)} raw consent data.
+ */
+export const gdprConsent = (bidderRequest) => (deepAccess(bidderRequest, 'gdprConsent.vendorData.vendorConsents') || {})[VENDOR_ID];
+
/**
* Pure function.
*
@@ -306,7 +346,7 @@ export const requestsPayload = (debug, currency, validBidRequests, bidderRequest
isWebGLEnabled(document)),
userAgent: navigator.userAgent,
gdprApplies: deepAccess(bidderRequest, 'gdprConsent.gdprApplies'),
- gdprConsent: deepAccess(bidderRequest, 'gdprConsent.consentString'),
+ gdprConsent: gdprConsent(bidderRequest),
};
};
@@ -426,7 +466,7 @@ export const getDeviceInfo = (deviceDimensions, viewDimensions, documentDimensio
* Pure function
* @param {object} config pbjs config value
* @param {string} parameter Environment override from URL query param.
- * @returns One of [PRODUCTION, STAGING, DEVELOPMENT].
+ * @returns {string} One of [PRODUCTION, STAGING, DEVELOPMENT].
*/
export const resolveEnv = (config, parameter) => {
const configEnv = deepAccess(config, 'emoteev.env');
diff --git a/modules/emoteevBidAdapter.md b/modules/emoteevBidAdapter.md
index 88b0b21a96f..226a8374369 100644
--- a/modules/emoteevBidAdapter.md
+++ b/modules/emoteevBidAdapter.md
@@ -18,14 +18,16 @@ Module that connects to Emoteev's demand sources
code: 'test-div',
mediaTypes: {
banner: {
- sizes: [[300, 250]],
+ sizes: [[720, 90]],
}
},
bids: [
{
bidder: 'emoteev',
params: {
- adSpaceId: 5084
+ adSpaceId: 5084,
+ context: 'footer',
+ externalId: 42,
}
}
]
diff --git a/test/spec/modules/emoteevBidAdapter_spec.js b/test/spec/modules/emoteevBidAdapter_spec.js
index a5460ab939d..aa97b58ec38 100644
--- a/test/spec/modules/emoteevBidAdapter_spec.js
+++ b/test/spec/modules/emoteevBidAdapter_spec.js
@@ -15,20 +15,23 @@ import {
DEVELOPMENT,
EVENTS_PATH,
eventsUrl,
+ FOOTER,
+ gdprConsent,
getDeviceDimensions,
getDeviceInfo,
getDocumentDimensions,
getUserSyncs,
getViewDimensions,
+ IN_CONTENT,
interpretResponse,
isBidRequestValid,
- isWebGLEnabled,
ON_ADAPTER_CALLED,
ON_BID_WON,
ON_BIDDER_TIMEOUT,
onBidWon,
onAdapterCalled,
onTimeout,
+ OVERLAY,
PRODUCTION,
requestsPayload,
resolveDebug,
@@ -39,10 +42,14 @@ import {
USER_SYNC_IMAGE_PATH,
userSyncIframeUrl,
userSyncImageUrl,
+ validateSizes,
+ validateContext,
+ validateExternalId,
+ VENDOR_ID,
+ WALLPAPER,
} from 'modules/emoteevBidAdapter';
import * as url from '../../../src/url';
import * as utils from '../../../src/utils';
-import * as pubCommonId from '../../../modules/pubCommonId';
import {config} from '../../../src/config';
const cannedValidBidRequests = [{
@@ -53,7 +60,11 @@ const cannedValidBidRequests = [{
bidder: 'emoteev',
bidderRequestId: '1203b39fecc6a5',
crumbs: {pubcid: 'f3371d16-4e8b-42b5-a770-7e5be1fdf03d'},
- params: {adSpaceId: 5084},
+ params: {
+ adSpaceId: 5084,
+ context: IN_CONTENT,
+ externalId: 42
+ },
sizes: [[300, 250], [250, 300], [300, 600]],
transactionId: '58dbd732-7a39-45f1-b23e-1c24051a941c',
}];
@@ -74,7 +85,7 @@ const cannedBidderRequest = {
timeout: 3000,
gdprConsent: {
gdprApplies: true,
- consentString: 'my consentString'
+ vendorData: {vendorConsents: {[VENDOR_ID]: true}},
}
};
const serverResponse =
@@ -102,6 +113,8 @@ describe('emoteevBidAdapter', function () {
bidId: '23a45b4e3',
params: {
adSpaceId: 12345,
+ context: IN_CONTENT,
+ externalId: 42
},
mediaTypes: {
banner: {
@@ -120,6 +133,8 @@ describe('emoteevBidAdapter', function () {
bidder: '', // invalid bidder
params: {
adSpaceId: 12345,
+ context: IN_CONTENT,
+ externalId: 42
},
mediaTypes: {
banner: {
@@ -131,6 +146,21 @@ describe('emoteevBidAdapter', function () {
bidder: 'emoteev',
params: {
adSpaceId: '', // invalid adSpaceId
+ context: IN_CONTENT,
+ externalId: 42
+ },
+ mediaTypes: {
+ banner: {
+ sizes: [[750, 200]]
+ }
+ },
+ })).to.equal(false);
+ expect(isBidRequestValid({
+ bidder: 'emoteev',
+ params: {
+ adSpaceId: 12345,
+ context: 'something', // invalid context
+ externalId: 42
},
mediaTypes: {
banner: {
@@ -142,6 +172,21 @@ describe('emoteevBidAdapter', function () {
bidder: 'emoteev',
params: {
adSpaceId: 12345,
+ context: IN_CONTENT,
+ externalId: 'lol' // invalid externalId
+ },
+ mediaTypes: {
+ banner: {
+ sizes: [[750, 200]]
+ }
+ },
+ })).to.equal(false);
+ expect(isBidRequestValid({
+ bidder: 'emoteev',
+ params: {
+ adSpaceId: 12345,
+ context: IN_CONTENT,
+ externalId: 42
},
mediaTypes: {
banner: {
@@ -401,6 +446,39 @@ describe('emoteevBidAdapter', function () {
});
});
+ describe('gdprConsent', function () {
+ describe('gdpr applies, consent given', function () {
+ const bidderRequest = {
+ ...cannedBidderRequest,
+ gdprConsent: {
+ gdprApplies: true,
+ vendorData: {vendorConsents: {[VENDOR_ID]: true}},
+ }
+ };
+ expect(gdprConsent(bidderRequest)).to.deep.equal(true);
+ });
+ describe('gdpr applies, consent withdrawn', function () {
+ const bidderRequest = {
+ ...cannedBidderRequest,
+ gdprConsent: {
+ gdprApplies: true,
+ vendorData: {vendorConsents: {[VENDOR_ID]: false}},
+ }
+ };
+ expect(gdprConsent(bidderRequest)).to.deep.equal(false);
+ });
+ describe('gdpr applies, consent unknown', function () {
+ const bidderRequest = {
+ ...cannedBidderRequest,
+ gdprConsent: {
+ gdprApplies: true,
+ vendorData: {},
+ }
+ };
+ expect(gdprConsent(bidderRequest)).to.deep.equal(undefined);
+ });
+ });
+
describe('requestsPayload', function () {
const
currency = 'EUR',
@@ -418,7 +496,7 @@ describe('emoteevBidAdapter', function () {
'deviceInfo',
'userAgent',
'gdprApplies',
- 'gdprConsent'
+ 'gdprConsent',
);
expect(payload.bidRequests[0]).to.exist.and.have.all.keys(
@@ -449,7 +527,6 @@ describe('emoteevBidAdapter', function () {
);
expect(payload.userAgent).to.deep.equal(navigator.userAgent);
expect(payload.gdprApplies).to.deep.equal(cannedBidderRequest.gdprConsent.gdprApplies);
- expect(payload.gdprConsent).to.deep.equal(cannedBidderRequest.gdprConsent.consentString);
});
describe('getViewDimensions', function () {
@@ -665,7 +742,7 @@ describe('emoteevBidAdapter', function () {
let getParameterByNameSpy;
beforeEach(function () {
triggerPixelSpy = sinon.spy(utils, 'triggerPixel');
- getCookieSpy = sinon.spy(pubCommonId, 'getCookie');
+ getCookieSpy = sinon.spy(utils, 'getCookie');
getConfigSpy = sinon.spy(config, 'getConfig');
getParameterByNameSpy = sinon.spy(utils, 'getParameterByName');
});
@@ -692,7 +769,7 @@ describe('emoteevBidAdapter', function () {
};
spec.isBidRequestValid(validBidRequest);
sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(pubCommonId.getCookie);
+ sinon.assert.notCalled(utils.getCookie);
sinon.assert.notCalled(config.getConfig);
sinon.assert.notCalled(utils.getParameterByName);
});
@@ -700,7 +777,7 @@ describe('emoteevBidAdapter', function () {
const invalidBidRequest = {};
spec.isBidRequestValid(invalidBidRequest);
sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(pubCommonId.getCookie);
+ sinon.assert.notCalled(utils.getCookie);
sinon.assert.notCalled(config.getConfig);
sinon.assert.notCalled(utils.getParameterByName);
});
@@ -709,7 +786,7 @@ describe('emoteevBidAdapter', function () {
it('has intended side-effects', function () {
spec.buildRequests(cannedValidBidRequests, cannedBidderRequest);
sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(pubCommonId.getCookie);
+ sinon.assert.notCalled(utils.getCookie);
sinon.assert.callCount(config.getConfig, 3);
sinon.assert.callCount(utils.getParameterByName, 2);
});
@@ -718,7 +795,7 @@ describe('emoteevBidAdapter', function () {
it('has intended side-effects', function () {
spec.interpretResponse(serverResponse);
sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(pubCommonId.getCookie);
+ sinon.assert.notCalled(utils.getCookie);
sinon.assert.notCalled(config.getConfig);
sinon.assert.notCalled(utils.getParameterByName);
});
@@ -728,7 +805,7 @@ describe('emoteevBidAdapter', function () {
const bidObject = serverResponse.body[0];
spec.onBidWon(bidObject);
sinon.assert.calledOnce(utils.triggerPixel);
- sinon.assert.calledOnce(pubCommonId.getCookie);
+ sinon.assert.calledOnce(utils.getCookie);
sinon.assert.calledOnce(config.getConfig);
sinon.assert.calledOnce(utils.getParameterByName);
});
@@ -737,7 +814,7 @@ describe('emoteevBidAdapter', function () {
it('has intended side-effects', function () {
spec.onTimeout(cannedValidBidRequests[0]);
sinon.assert.calledOnce(utils.triggerPixel);
- sinon.assert.notCalled(pubCommonId.getCookie);
+ sinon.assert.notCalled(utils.getCookie);
sinon.assert.calledOnce(config.getConfig);
sinon.assert.calledOnce(utils.getParameterByName);
});
@@ -746,10 +823,44 @@ describe('emoteevBidAdapter', function () {
it('has intended side-effects', function () {
spec.getUserSyncs({});
sinon.assert.notCalled(utils.triggerPixel);
- sinon.assert.notCalled(pubCommonId.getCookie);
+ sinon.assert.notCalled(utils.getCookie);
sinon.assert.calledOnce(config.getConfig);
sinon.assert.calledOnce(utils.getParameterByName);
});
});
});
+
+ describe('validateSizes', function () {
+ it('only accepts valid array of sizes', function () {
+ expect(validateSizes([])).to.deep.equal(false);
+ expect(validateSizes([[]])).to.deep.equal(false);
+ expect(validateSizes([[450, 450], undefined])).to.deep.equal(false);
+ expect(validateSizes([[450, 450], 'size'])).to.deep.equal(false);
+ expect(validateSizes([[1, 1]])).to.deep.equal(true);
+ expect(validateSizes([[1, 1], [450, 450]])).to.deep.equal(true);
+ });
+ });
+
+ describe('validateContext', function () {
+ it('only accepts valid context', function () {
+ expect(validateContext(IN_CONTENT)).to.deep.equal(true);
+ expect(validateContext(FOOTER)).to.deep.equal(true);
+ expect(validateContext(OVERLAY)).to.deep.equal(true);
+ expect(validateContext(WALLPAPER)).to.deep.equal(true);
+ expect(validateContext(null)).to.deep.equal(false);
+ expect(validateContext('anything else')).to.deep.equal(false);
+ });
+ });
+
+ describe('validateExternalId', function () {
+ it('only accepts a positive integer or null', function () {
+ expect(validateExternalId(0)).to.deep.equal(false);
+ expect(validateExternalId(42)).to.deep.equal(true);
+ expect(validateExternalId(42.0)).to.deep.equal(true); // edge case: valid externalId
+ expect(validateExternalId(3.14159)).to.deep.equal(false);
+ expect(validateExternalId('externalId')).to.deep.equal(false);
+ expect(validateExternalId(undefined)).to.deep.equal(true);
+ expect(validateExternalId(null)).to.deep.equal(true);
+ });
+ });
});
From 113cfe9865f154486b659c4e21f4186284adb4fb Mon Sep 17 00:00:00 2001
From: Rich Snapp
Date: Tue, 2 Jul 2019 12:04:40 -0600
Subject: [PATCH 046/285] Submodule system using hooks (#3924)
* prebid-core only contains src and a few node_modules
* add back removed neverBundle to webpack build
* add module and submodule hooks
* allow vargs for submodules for flexibility
* fix jsdoc type syntax
* updated id5 userid submodule for submodule bundle size duplication fix
* add id5 userid submodule to .submodules
* fix opt out logic
* spelling fix to comment
* update to automatically include 'pubcommon' and 'unifiedid' (uncomment to optional submodule for prebid3.0)
* additional update to automatically include 'pubcommon' and 'unifiedid'
* additional update to automatically include 'pubcommon' and 'unifiedid'
* merged differences from master
* adpod changes to support submodules
* fix --modules argument with .json to work correctly with submodules
* fix to remove included and duplicated submodules
---
gulpHelpers.js | 15 +++++++-
modules/.submodules.json | 9 +++++
modules/adpod.js | 31 +++++++++++++---
modules/digiTrustIdSystem.js | 4 +--
modules/freeWheelAdserverVideo.js | 23 ++++++------
modules/id5IdSystem.js | 10 +++---
modules/{userId.js => userId/index.js} | 36 ++++++++-----------
modules/{ => userId}/pubCommonIdSystem.js | 2 +-
modules/{ => userId}/unifiedIdSystem.js | 4 +--
modules/{ => userId}/userId.md | 24 ++-----------
src/hook.js | 13 +++++++
.../modules/freeWheelAdserverVideo_spec.js | 5 ++-
test/spec/modules/userId_spec.js | 8 ++---
webpack.conf.js | 10 ++++--
14 files changed, 116 insertions(+), 78 deletions(-)
create mode 100644 modules/.submodules.json
rename modules/{userId.js => userId/index.js} (94%)
rename modules/{ => userId}/pubCommonIdSystem.js (96%)
rename modules/{ => userId}/unifiedIdSystem.js (95%)
rename modules/{ => userId}/userId.md (72%)
diff --git a/gulpHelpers.js b/gulpHelpers.js
index f20a2673ade..04428133347 100644
--- a/gulpHelpers.js
+++ b/gulpHelpers.js
@@ -6,12 +6,14 @@ const MANIFEST = 'package.json';
const through = require('through2');
const _ = require('lodash');
const gutil = require('gulp-util');
+const submodules = require('./modules/.submodules.json');
const MODULE_PATH = './modules';
const BUILD_PATH = './build/dist';
const DEV_PATH = './build/dev';
const ANALYTICS_PATH = '../analytics';
+
// get only subdirectories that contain package.json with 'main' property
function isModuleDirectory(filePath) {
try {
@@ -39,7 +41,9 @@ module.exports = {
.replace(/\/>/g, '\\/>');
},
getArgModules() {
- var modules = (argv.modules || '').split(',').filter(module => !!module);
+ var modules = (argv.modules || '')
+ .split(',')
+ .filter(module => !!module);
try {
if (modules.length === 1 && path.extname(modules[0]).toLowerCase() === '.json') {
@@ -56,6 +60,15 @@ module.exports = {
});
}
+ Object.keys(submodules).forEach(parentModule => {
+ if (
+ !modules.includes(parentModule) &&
+ modules.some(module => submodules[parentModule].includes(module))
+ ) {
+ modules.unshift(parentModule);
+ }
+ });
+
return modules;
},
getModules: _.memoize(function(externalModules) {
diff --git a/modules/.submodules.json b/modules/.submodules.json
new file mode 100644
index 00000000000..f321e075208
--- /dev/null
+++ b/modules/.submodules.json
@@ -0,0 +1,9 @@
+{
+ "userId": [
+ "digiTrustIdSystem",
+ "id5IdSystem"
+ ],
+ "adpod": [
+ "freeWheelAdserverVideo"
+ ]
+}
diff --git a/modules/adpod.js b/modules/adpod.js
index 021d4722f53..46671e9fb0a 100644
--- a/modules/adpod.js
+++ b/modules/adpod.js
@@ -16,16 +16,17 @@ import * as utils from '../src/utils';
import { addBidToAuction, doCallbacksIfTimedout, AUCTION_IN_PROGRESS, callPrebidCache } from '../src/auction';
import { checkAdUnitSetup } from '../src/prebid';
import { checkVideoBidSetup } from '../src/video';
-import { setupBeforeHookFnOnce } from '../src/hook';
+import { setupBeforeHookFnOnce, module } from '../src/hook';
import { store } from '../src/videoCache';
import { config } from '../src/config';
import { ADPOD } from '../src/mediaTypes';
import Set from 'core-js/library/fn/set';
import find from 'core-js/library/fn/array/find';
+
const from = require('core-js/library/fn/array/from');
-export const TARGETING_KEY_PB_CAT_DUR = 'hb_pb_cat_dur';
-export const TARGETING_KEY_CACHE_ID = 'hb_cache_id'
+const TARGETING_KEY_PB_CAT_DUR = 'hb_pb_cat_dur';
+const TARGETING_KEY_CACHE_ID = 'hb_cache_id';
let queueTimeDelay = 50;
let queueSizeLimit = 5;
@@ -385,12 +386,13 @@ config.getConfig('adpod', config => adpodSetConfig(config.adpod));
/**
* This function initializes the adpod module's hooks. This is called by the corresponding adserver video module.
*/
-export function initAdpodHooks() {
+function initAdpodHooks() {
setupBeforeHookFnOnce(callPrebidCache, callPrebidCacheHook);
setupBeforeHookFnOnce(checkAdUnitSetup, checkAdUnitSetupHook);
setupBeforeHookFnOnce(checkVideoBidSetup, checkVideoBidSetupHook);
}
+initAdpodHooks()
/**
*
* @param {Array[Object]} bids list of 'winning' bids that need to be cached
@@ -428,3 +430,24 @@ export function sortByPricePerSecond(a, b) {
}
return 0;
}
+
+const sharedMethods = {
+ TARGETING_KEY_PB_CAT_DUR: TARGETING_KEY_PB_CAT_DUR,
+ TARGETING_KEY_CACHE_ID: TARGETING_KEY_CACHE_ID,
+ 'sortByPricePerSecond': sortByPricePerSecond,
+ 'callPrebidCacheAfterAuction': callPrebidCacheAfterAuction
+}
+Object.freeze(sharedMethods);
+
+module('adpod', function shareAdpodUtilities(...args) {
+ if (!utils.isPlainObject(args[0])) {
+ utils.logError('Adpod module needs plain object to share methods with submodule');
+ return;
+ }
+ function addMethods(object, func) {
+ for (let name in func) {
+ object[name] = func[name];
+ }
+ }
+ addMethods(args[0], sharedMethods);
+});
diff --git a/modules/digiTrustIdSystem.js b/modules/digiTrustIdSystem.js
index 454e6864846..1db65031848 100644
--- a/modules/digiTrustIdSystem.js
+++ b/modules/digiTrustIdSystem.js
@@ -12,7 +12,7 @@
// import { config } from 'src/config';
import * as utils from '../src/utils'
import { ajax } from '../src/ajax';
-import { attachIdSystem } from '../modules/userId';
+import { submodule } from '../src/hook';
// import { getGlobal } from 'src/prebidGlobal';
/**
@@ -336,4 +336,4 @@ export const digiTrustIdSubmodule = {
_testInit: surfaceTestHook
};
-attachIdSystem(digiTrustIdSubmodule);
+submodule('userId', digiTrustIdSubmodule);
diff --git a/modules/freeWheelAdserverVideo.js b/modules/freeWheelAdserverVideo.js
index c81f3356d71..a93e5ab9159 100644
--- a/modules/freeWheelAdserverVideo.js
+++ b/modules/freeWheelAdserverVideo.js
@@ -7,8 +7,7 @@ import { auctionManager } from '../src/auctionManager';
import { groupBy, deepAccess, logError, compareOn } from '../src/utils';
import { config } from '../src/config';
import { ADPOD } from '../src/mediaTypes';
-import { initAdpodHooks, TARGETING_KEY_PB_CAT_DUR, TARGETING_KEY_CACHE_ID, callPrebidCacheAfterAuction, sortByPricePerSecond } from './adpod';
-import { getHook } from '../src/hook';
+import { getHook, submodule } from '../src/hook';
export function notifyTranslationModule(fn) {
fn.call(this, 'freewheel');
@@ -37,7 +36,7 @@ export function getTargeting({codes, callback} = {}) {
let bids = getBidsForAdpod(bidsReceived, adPodAdUnits);
bids = (competiveExclusionEnabled || deferCachingEnabled) ? getExclusiveBids(bids) : bids;
- bids.sort(sortByPricePerSecond);
+ bids.sort(adpodUtils.sortByPricePerSecond);
let targeting = {};
if (deferCachingEnabled === false) {
@@ -50,13 +49,13 @@ export function getTargeting({codes, callback} = {}) {
.forEach((bid, index, arr) => {
if (bid.video.durationBucket <= adPodDurationSeconds) {
adPodTargeting.push({
- [TARGETING_KEY_PB_CAT_DUR]: bid.adserverTargeting[TARGETING_KEY_PB_CAT_DUR]
+ [adpodUtils.TARGETING_KEY_PB_CAT_DUR]: bid.adserverTargeting[adpodUtils.TARGETING_KEY_PB_CAT_DUR]
});
adPodDurationSeconds -= bid.video.durationBucket;
}
if (index === arr.length - 1 && adPodTargeting.length > 0) {
adPodTargeting.push({
- [TARGETING_KEY_CACHE_ID]: bid.adserverTargeting[TARGETING_KEY_CACHE_ID]
+ [adpodUtils.TARGETING_KEY_CACHE_ID]: bid.adserverTargeting[adpodUtils.TARGETING_KEY_CACHE_ID]
});
}
});
@@ -79,7 +78,7 @@ export function getTargeting({codes, callback} = {}) {
});
});
- callPrebidCacheAfterAuction(bidsToCache, function(error, bidsSuccessfullyCached) {
+ adpodUtils.callPrebidCacheAfterAuction(bidsToCache, function(error, bidsSuccessfullyCached) {
if (error) {
callback(error, null);
} else {
@@ -89,12 +88,12 @@ export function getTargeting({codes, callback} = {}) {
groupedBids[adUnitCode].forEach((bid, index, arr) => {
adPodTargeting.push({
- [TARGETING_KEY_PB_CAT_DUR]: bid.adserverTargeting[TARGETING_KEY_PB_CAT_DUR]
+ [adpodUtils.TARGETING_KEY_PB_CAT_DUR]: bid.adserverTargeting[adpodUtils.TARGETING_KEY_PB_CAT_DUR]
});
if (index === arr.length - 1 && adPodTargeting.length > 0) {
adPodTargeting.push({
- [TARGETING_KEY_CACHE_ID]: bid.adserverTargeting[TARGETING_KEY_CACHE_ID]
+ [adpodUtils.TARGETING_KEY_CACHE_ID]: bid.adserverTargeting[adpodUtils.TARGETING_KEY_CACHE_ID]
});
}
});
@@ -126,8 +125,8 @@ function getAdPodAdUnits(codes) {
*/
function getExclusiveBids(bidsReceived) {
let bids = bidsReceived
- .map((bid) => Object.assign({}, bid, {[TARGETING_KEY_PB_CAT_DUR]: bid.adserverTargeting[TARGETING_KEY_PB_CAT_DUR]}));
- bids = groupBy(bids, TARGETING_KEY_PB_CAT_DUR);
+ .map((bid) => Object.assign({}, bid, {[adpodUtils.TARGETING_KEY_PB_CAT_DUR]: bid.adserverTargeting[adpodUtils.TARGETING_KEY_PB_CAT_DUR]}));
+ bids = groupBy(bids, adpodUtils.TARGETING_KEY_PB_CAT_DUR);
let filteredBids = [];
Object.keys(bids).forEach((targetingKey) => {
bids[targetingKey].sort(compareOn('responseTimestamp'));
@@ -148,7 +147,9 @@ function getBidsForAdpod(bidsReceived, adPodAdUnits) {
.filter((bid) => adUnitCodes.indexOf(bid.adUnitCode) != -1 && (bid.video && bid.video.context === ADPOD))
}
-initAdpodHooks();
registerVideoSupport('freewheel', {
getTargeting: getTargeting
});
+
+export const adpodUtils = {};
+submodule('adpod', adpodUtils);
diff --git a/modules/id5IdSystem.js b/modules/id5IdSystem.js
index 39ab256a81e..7ed1fdf6bf3 100644
--- a/modules/id5IdSystem.js
+++ b/modules/id5IdSystem.js
@@ -5,9 +5,9 @@
* @requires module:modules/userId
*/
-import * as utils from '../src/utils.js'
-import {ajax} from '../src/ajax.js';
-import {isGDPRApplicable, attachIdSystem} from './userId.js';
+import * as utils from '../src/utils'
+import {ajax} from '../src/ajax';
+import {submodule} from '../src/hook';
/** @type {Submodule} */
export const id5IdSubmodule = {
@@ -37,7 +37,7 @@ export const id5IdSubmodule = {
utils.logError(`User ID - ID5 submodule requires partner to be defined as a number`);
return;
}
- const hasGdpr = isGDPRApplicable(consentData) ? 1 : 0;
+ const hasGdpr = (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) ? 1 : 0;
const gdprConsentString = hasGdpr ? consentData.consentString : '';
const url = `https://id5-sync.com/g/v1/${configParams.partner}.json?gdpr=${hasGdpr}&gdpr_consent=${gdprConsentString}`;
@@ -57,4 +57,4 @@ export const id5IdSubmodule = {
}
};
-attachIdSystem(id5IdSubmodule);
+submodule('userId', id5IdSubmodule);
diff --git a/modules/userId.js b/modules/userId/index.js
similarity index 94%
rename from modules/userId.js
rename to modules/userId/index.js
index c80ea21a0a0..2091a6a763a 100644
--- a/modules/userId.js
+++ b/modules/userId/index.js
@@ -13,7 +13,7 @@
* @name Submodule#getId
* @param {SubmoduleParams} configParams
* @param {ConsentData} consentData
- * @return {(Object|function} id data or a callback, the callback is called on the auction end event
+ * @return {(Object|function)} id data or a callback, the callback is called on the auction end event
*/
/**
@@ -21,7 +21,7 @@
* @summary decode a stored value for passing to bid requests
* @name Submodule#decode
* @param {Object|string} value
- * @return {(Object|undefined}
+ * @return {(Object|undefined)}
*/
/**
@@ -68,14 +68,15 @@
*/
import find from 'core-js/library/fn/array/find';
-import {config} from '../src/config.js';
-import events from '../src/events.js';
-import * as utils from '../src/utils.js';
-import {getGlobal} from '../src/prebidGlobal.js';
-import {gdprDataHandler} from '../src/adapterManager.js';
+import {config} from '../../src/config';
+import events from '../../src/events';
+import * as utils from '../../src/utils';
+import {getGlobal} from '../../src/prebidGlobal';
+import {gdprDataHandler} from '../../src/adapterManager';
+import CONSTANTS from '../../src/constants.json';
+import {module} from '../../src/hook';
import {unifiedIdSubmodule} from './unifiedIdSystem.js';
import {pubCommonIdSubmodule} from './pubCommonIdSystem.js';
-import CONSTANTS from '../src/constants.json';
const MODULE_NAME = 'User ID';
const COOKIE = 'cookie';
@@ -158,22 +159,13 @@ function getStoredValue(storage) {
return storedValue;
}
-/**
- * test if consent module is present, and if GDPR applies
- * @param {ConsentData} consentData
- * @returns {boolean}
- */
-export function isGDPRApplicable(consentData) {
- return consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies;
-}
-
/**
* test if consent module is present, applies, and is valid for local storage or cookies (purpose 1)
* @param {ConsentData} consentData
* @returns {boolean}
*/
-export function hasGDPRConsent(consentData) {
- if (isGDPRApplicable(consentData)) {
+function hasGDPRConsent(consentData) {
+ if (consentData && typeof consentData.gdprApplies === 'boolean' && consentData.gdprApplies) {
if (!consentData.consentString) {
return false;
}
@@ -331,7 +323,7 @@ function getValidSubmoduleConfigs(configRegistry, submoduleRegistry, activeStora
if (!config || utils.isEmptyStr(config.name)) {
return carry;
}
- // alidate storage config contains 'type' and 'name' properties with non-empty string values
+ // Validate storage config contains 'type' and 'name' properties with non-empty string values
// 'type' must be a value currently enabled in the browser
if (config.storage &&
!utils.isEmptyStr(config.storage.type) &&
@@ -409,7 +401,7 @@ export function init(config) {
return;
}
// _pubcid_optout is checked for compatiblility with pubCommonId
- if (validStorageTypes.indexOf(LOCAL_STORAGE) !== -1 && (localStorage.getItem('_pbjs_id_optout') && localStorage.getItem('_pubcid_optout'))) {
+ if (validStorageTypes.indexOf(LOCAL_STORAGE) !== -1 && (localStorage.getItem('_pbjs_id_optout') || localStorage.getItem('_pubcid_optout'))) {
utils.logInfo(`${MODULE_NAME} - opt-out localStorage found, exit module`);
return;
}
@@ -431,3 +423,5 @@ init(config);
// add submodules after init has been called
attachIdSystem(pubCommonIdSubmodule);
attachIdSystem(unifiedIdSubmodule);
+
+module('userId', attachIdSystem);
diff --git a/modules/pubCommonIdSystem.js b/modules/userId/pubCommonIdSystem.js
similarity index 96%
rename from modules/pubCommonIdSystem.js
rename to modules/userId/pubCommonIdSystem.js
index 39d1feea0ad..f4d6b41a127 100644
--- a/modules/pubCommonIdSystem.js
+++ b/modules/userId/pubCommonIdSystem.js
@@ -5,7 +5,7 @@
* @requires module:modules/userId
*/
-import * as utils from '../src/utils.js'
+import * as utils from '../../src/utils';
/** @type {Submodule} */
export const pubCommonIdSubmodule = {
diff --git a/modules/unifiedIdSystem.js b/modules/userId/unifiedIdSystem.js
similarity index 95%
rename from modules/unifiedIdSystem.js
rename to modules/userId/unifiedIdSystem.js
index 6b67b7bf5f1..cf86c049d2a 100644
--- a/modules/unifiedIdSystem.js
+++ b/modules/userId/unifiedIdSystem.js
@@ -5,8 +5,8 @@
* @requires module:modules/userId
*/
-import * as utils from '../src/utils.js'
-import {ajax} from '../src/ajax.js';
+import * as utils from '../../src/utils'
+import {ajax} from '../../src/ajax';
/** @type {Submodule} */
export const unifiedIdSubmodule = {
diff --git a/modules/userId.md b/modules/userId/userId.md
similarity index 72%
rename from modules/userId.md
rename to modules/userId/userId.md
index b36b9b1007c..782e7782554 100644
--- a/modules/userId.md
+++ b/modules/userId/userId.md
@@ -3,12 +3,12 @@
Example showing `cookie` storage for user id data for both submodules
```
pbjs.setConfig({
- usersync: {
+ userSync: {
userIds: [{
name: "unifiedId",
params: {
partner: "prebid",
- url: "http://match.adsrvr.org/track/rid?ttd_pid=prebid&fmt=json"
+ url: "//match.adsrvr.org/track/rid?ttd_pid=prebid&fmt=json"
},
storage: {
type: "cookie",
@@ -28,26 +28,6 @@ pbjs.setConfig({
});
```
-Example showing `cookie` storage for user id data for id5 submodule
-```
-pbjs.setConfig({
- usersync: {
- userIds: [{
- name: "id5Id",
- params: {
- partner: 173 // @TODO: Set your real ID5 partner ID here for production, please ask for one contact@id5.io
- },
- storage: {
- type: "cookie",
- name: "id5id",
- expires: 90
- }
- }],
- syncDelay: 5000
- }
-});
-```
-
Example showing `localStorage` for user id data for both submodules
```
pbjs.setConfig({
diff --git a/src/hook.js b/src/hook.js
index ddf0d134357..220e1c39111 100644
--- a/src/hook.js
+++ b/src/hook.js
@@ -13,3 +13,16 @@ export function setupBeforeHookFnOnce(baseFn, hookFn, priority = 15) {
baseFn.before(hookFn, priority);
}
}
+
+export function module(name, install) {
+ hook('async', function (submodules) {
+ submodules.forEach(args => install(...args));
+ }, name)([]); // will be queued until hook.ready() called in pbjs.processQueue();
+}
+
+export function submodule(name, ...args) {
+ getHook(name).before((next, modules) => {
+ modules.push(args);
+ next(modules);
+ });
+}
diff --git a/test/spec/modules/freeWheelAdserverVideo_spec.js b/test/spec/modules/freeWheelAdserverVideo_spec.js
index 5846774c8b1..ffc690e5a92 100644
--- a/test/spec/modules/freeWheelAdserverVideo_spec.js
+++ b/test/spec/modules/freeWheelAdserverVideo_spec.js
@@ -1,8 +1,7 @@
import { expect } from 'chai';
-import { getTargeting } from 'modules/freeWheelAdserverVideo';
+import { getTargeting, adpodUtils } from 'modules/freeWheelAdserverVideo';
import { auctionManager } from 'src/auctionManager';
import { config } from 'src/config';
-import * as adpod from 'modules/adpod';
describe('freeWheel adserver module', function() {
let amStub;
@@ -53,7 +52,7 @@ describe('freeWheel adserver module', function() {
amGetAdUnitsStub = sinon.stub(auctionManager, 'getAdUnits');
amGetAdUnitsStub.returns(adUnits);
amStub = sinon.stub(auctionManager, 'getBidsReceived');
- pbcStub = sinon.stub(adpod, 'callPrebidCacheAfterAuction').callsFake(function (...args) {
+ pbcStub = sinon.stub(adpodUtils, 'callPrebidCacheAfterAuction').callsFake(function (...args) {
args[1](null, getBidsReceived());
});
});
diff --git a/test/spec/modules/userId_spec.js b/test/spec/modules/userId_spec.js
index 60df468a903..a158d2e9fed 100644
--- a/test/spec/modules/userId_spec.js
+++ b/test/spec/modules/userId_spec.js
@@ -4,11 +4,11 @@ import {
setSubmoduleRegistry,
syncDelay,
attachIdSystem
-} from 'modules/userId';
+} from 'modules/userId/index.js';
import {config} from 'src/config';
import * as utils from 'src/utils';
-import {unifiedIdSubmodule} from 'modules/unifiedIdSystem';
-import {pubCommonIdSubmodule} from 'modules/pubCommonIdSystem';
+import {unifiedIdSubmodule} from 'modules/userId/unifiedIdSystem';
+import {pubCommonIdSubmodule} from 'modules/userId/pubCommonIdSystem';
import {id5IdSubmodule} from 'modules/id5IdSystem';
let assert = require('chai').assert;
let expect = require('chai').expect;
@@ -327,7 +327,7 @@ describe('User ID', function() {
}, {adUnits});
});
- it('test hook from unifiedid html5', function(done) {
+ it('test hook from pubcommonid html5', function(done) {
// simulate existing browser local storage values
localStorage.setItem('unifiedid_alt', JSON.stringify({'TDID': 'testunifiedid_alt'}));
localStorage.setItem('unifiedid_alt_exp', '');
diff --git a/webpack.conf.js b/webpack.conf.js
index 61cdf82df32..8e1787de329 100644
--- a/webpack.conf.js
+++ b/webpack.conf.js
@@ -25,8 +25,14 @@ plugins.push( // this plugin must be last so it can be easily removed for karma
new webpack.optimize.CommonsChunkPlugin({
name: 'prebid',
filename: 'prebid-core.js',
- minChunks: function(module, count) {
- return !(count < 2 || neverBundle.indexOf(path.basename(module.resource)) !== -1)
+ minChunks: function(module) {
+ return (
+ (
+ module.context && module.context === path.resolve('./src') &&
+ !(module.resource && neverBundle.some(name => module.resource.includes(name)))
+ ) ||
+ module.resource && module.resource.includes(path.resolve('./node_modules/core-js'))
+ );
}
})
);
From 1087329579096f7b3d45564aeeb01b40b45ea7a1 Mon Sep 17 00:00:00 2001
From: Salomon Rada
Date: Tue, 2 Jul 2019 21:19:23 +0300
Subject: [PATCH 047/285] Gamoshi: Add adasta new bidder alias (#3949)
* Add support for multi-format ad units. Add favoredMediaType property to params.
* Add tests for gdpr consent.
* Add adId to outbids
* Modify media type resolving
* Refactor multi-format ad units handler.
* Add adasta - new bidder alias for gamoshi
* Unify rtb endpoints
* Modify adasta alias code
---
modules/gamoshiBidAdapter.js | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/modules/gamoshiBidAdapter.js b/modules/gamoshiBidAdapter.js
index 67475f8d8d9..3fb045cd7c2 100644
--- a/modules/gamoshiBidAdapter.js
+++ b/modules/gamoshiBidAdapter.js
@@ -5,10 +5,7 @@ import {Renderer} from '../src/Renderer';
import {BANNER, VIDEO} from '../src/mediaTypes';
const ENDPOINTS = {
- 'viewdeos': 'https://rtb.viewdeos.com',
- 'cleanmedia': 'https://bidder.cleanmediaads.com',
- 'gamoshi': 'https://rtb.gamoshi.io',
- 'gambid': 'https://rtb.gamoshi.io',
+ 'gamoshi': 'https://rtb.gamoshi.io'
};
const DEFAULT_TTL = 360;
@@ -45,7 +42,7 @@ export const helper = {
export const spec = {
code: 'gamoshi',
- aliases: ['gambid', 'cleanmedia', 'viewdeos'],
+ aliases: ['gambid', 'cleanmedia', 'viewdeos', 'adastaMedia'],
supportedMediaTypes: ['banner', 'video'],
isBidRequestValid: function (bid) {
@@ -61,7 +58,7 @@ export const spec = {
buildRequests: function (validBidRequests, bidderRequest) {
return validBidRequests.map(bidRequest => {
const {adUnitCode, auctionId, mediaTypes, params, sizes, transactionId} = bidRequest;
- const baseEndpoint = params['rtbEndpoint'] || ENDPOINTS[bidRequest.bidder] || ENDPOINTS['gamoshi'];
+ const baseEndpoint = params['rtbEndpoint'] || ENDPOINTS['gamoshi'];
const rtbEndpoint = `${baseEndpoint}/r/${params.supplyPartnerId}/bidr?rformat=open_rtb&reqformat=rtb_json&bidder=prebid` + (params.query ? '&' + params.query : '');
let url = config.getConfig('pageUrl') || bidderRequest.refererInfo.referer;
From d418f61e7d1790238b3c1f9152492ccbd9292073 Mon Sep 17 00:00:00 2001
From: Carlos Barreiro Mata
Date: Tue, 2 Jul 2019 20:22:44 +0200
Subject: [PATCH 048/285] Added bid adapter for seedtag (#3915)
* Added bid adapter for seedtag
* Revert changes to package-lock
* added safe check
---
modules/seedtagBidAdapter.js | 205 ++++++++++
modules/seedtagBidAdapter.md | 79 ++++
test/spec/modules/seedtagBidAdapter_spec.js | 396 ++++++++++++++++++++
3 files changed, 680 insertions(+)
create mode 100644 modules/seedtagBidAdapter.js
create mode 100644 modules/seedtagBidAdapter.md
create mode 100644 test/spec/modules/seedtagBidAdapter_spec.js
diff --git a/modules/seedtagBidAdapter.js b/modules/seedtagBidAdapter.js
new file mode 100644
index 00000000000..845d8ffec9d
--- /dev/null
+++ b/modules/seedtagBidAdapter.js
@@ -0,0 +1,205 @@
+import * as utils from '../src/utils'
+import { registerBidder } from '../src/adapters/bidderFactory'
+import { VIDEO, BANNER } from '../src/mediaTypes'
+
+const BIDDER_CODE = 'seedtag';
+const SEEDTAG_ALIAS = 'st';
+const SEEDTAG_SSP_ENDPOINT = 'https://s.seedtag.com/c/hb/bid';
+const SEEDTAG_SSP_ONTIMEOUT_ENDPOINT = 'https://s.seedtag.com/se/hb/timeout';
+
+const mediaTypesMap = {
+ [BANNER]: 'display',
+ [VIDEO]: 'video'
+};
+
+function mapMediaType(seedtagMediaType) {
+ if (seedtagMediaType === 'display') return BANNER;
+ if (seedtagMediaType === 'video') return VIDEO;
+ else return seedtagMediaType;
+}
+
+function getMediaTypeFromBid(bid) {
+ return bid.mediaTypes && Object.keys(bid.mediaTypes)[0]
+}
+
+function hasMandatoryParams(params) {
+ return (
+ !!params.publisherId &&
+ !!params.adUnitId &&
+ !!params.placement &&
+ (params.placement === 'inImage' ||
+ params.placement === 'inScreen' ||
+ params.placement === 'banner' ||
+ params.placement === 'video')
+ );
+}
+
+function hasVideoMandatoryParams(mediaTypes) {
+ const isVideoInStream =
+ !!mediaTypes.video && mediaTypes.video.context === 'instream';
+ const isPlayerSize =
+ !!utils.deepAccess(mediaTypes, 'video.playerSize') &&
+ utils.isArray(utils.deepAccess(mediaTypes, 'video.playerSize'));
+ return isVideoInStream && isPlayerSize;
+}
+
+function buildBidRequests(validBidRequests) {
+ return utils._map(validBidRequests, function(validBidRequest) {
+ const params = validBidRequest.params;
+ const mediaTypes = utils._map(
+ Object.keys(validBidRequest.mediaTypes),
+ function(pbjsType) {
+ return mediaTypesMap[pbjsType];
+ }
+ );
+ const bidRequest = {
+ id: validBidRequest.bidId,
+ transactionId: validBidRequest.transactionId,
+ sizes: validBidRequest.sizes,
+ supplyTypes: mediaTypes,
+ adUnitId: params.adUnitId,
+ placement: params.placement
+ };
+
+ if (params.adPosition) {
+ bidRequest.adPosition = params.adPosition;
+ }
+
+ if (params.video) {
+ bidRequest.videoParams = params.video || {};
+ bidRequest.videoParams.w =
+ validBidRequest.mediaTypes.video.playerSize[0][0];
+ bidRequest.videoParams.h =
+ validBidRequest.mediaTypes.video.playerSize[0][1];
+ }
+
+ return bidRequest;
+ })
+}
+
+function buildBid(seedtagBid) {
+ const mediaType = mapMediaType(seedtagBid.mediaType);
+ const bid = {
+ requestId: seedtagBid.bidId,
+ cpm: seedtagBid.price,
+ width: seedtagBid.width,
+ height: seedtagBid.height,
+ creativeId: seedtagBid.creativeId,
+ currency: seedtagBid.currency,
+ netRevenue: true,
+ mediaType: mediaType,
+ ttl: seedtagBid.ttl
+ };
+ if (mediaType === VIDEO) {
+ bid.vastXml = seedtagBid.content;
+ } else {
+ bid.ad = seedtagBid.content;
+ }
+ return bid;
+}
+
+export function getTimeoutUrl (data) {
+ let queryParams = '';
+ if (
+ utils.isArray(data) && data[0] &&
+ utils.isArray(data[0].params) && data[0].params[0]
+ ) {
+ const params = data[0].params[0];
+ queryParams =
+ '?publisherToken=' + params.publisherId +
+ '&adUnitId=' + params.adUnitId;
+ }
+ return SEEDTAG_SSP_ONTIMEOUT_ENDPOINT + queryParams;
+}
+
+export const spec = {
+ code: BIDDER_CODE,
+ aliases: [SEEDTAG_ALIAS],
+ supportedMediaTypes: [BANNER, VIDEO],
+
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {BidRequest} bid The bid params to validate.
+ * @return boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid(bid) {
+ return getMediaTypeFromBid(bid) === VIDEO
+ ? hasMandatoryParams(bid.params) && hasVideoMandatoryParams(bid.mediaTypes)
+ : hasMandatoryParams(bid.params);
+ },
+
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {validBidRequests[]} - an array of bids
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests(validBidRequests, bidderRequest) {
+ const payload = {
+ url: bidderRequest.refererInfo.referer,
+ publisherToken: validBidRequests[0].params.publisherId,
+ cmp: !!bidderRequest.gdprConsent,
+ timeout: bidderRequest.timeout,
+ version: '$prebid.version$',
+ bidRequests: buildBidRequests(validBidRequests)
+ };
+
+ if (payload.cmp) {
+ const gdprApplies = bidderRequest.gdprConsent.gdprApplies;
+ if (gdprApplies !== undefined) payload['ga'] = gdprApplies;
+ payload['cd'] = bidderRequest.gdprConsent.consentString;
+ }
+
+ const payloadString = JSON.stringify(payload)
+ return {
+ method: 'POST',
+ url: SEEDTAG_SSP_ENDPOINT,
+ data: payloadString
+ }
+ },
+
+ /**
+ * Unpack the response from the server into a list of bids.
+ *
+ * @param {ServerResponse} serverResponse A successful response from the server.
+ * @return {Bid[]} An array of bids which were nested inside the server.
+ */
+ interpretResponse: function(serverResponse) {
+ const serverBody = serverResponse.body;
+ if (serverBody && serverBody.bids && utils.isArray(serverBody.bids)) {
+ return utils._map(serverBody.bids, function(bid) {
+ return buildBid(bid);
+ });
+ } else {
+ return [];
+ }
+ },
+
+ /**
+ * Register the user sync pixels which should be dropped after the auction.
+ *
+ * @param {SyncOptions} syncOptions Which user syncs are allowed?
+ * @param {ServerResponse[]} serverResponses List of server's responses.
+ * @return {UserSync[]} The user syncs which should be dropped.
+ */
+ getUserSyncs(syncOptions, serverResponses) {
+ const serverResponse = serverResponses[0];
+ if (syncOptions.iframeEnabled && serverResponse) {
+ const cookieSyncUrl = serverResponse.body.cookieSync;
+ return cookieSyncUrl ? [{ type: 'iframe', url: cookieSyncUrl }] : [];
+ } else {
+ return [];
+ }
+ },
+
+ /**
+ * Register bidder specific code, which will execute if bidder timed out after an auction
+ * @param {data} Containing timeout specific data
+ */
+ onTimeout(data) {
+ getTimeoutUrl(data);
+ utils.triggerPixel(SEEDTAG_SSP_ONTIMEOUT_ENDPOINT);
+ }
+}
+registerBidder(spec);
diff --git a/modules/seedtagBidAdapter.md b/modules/seedtagBidAdapter.md
new file mode 100644
index 00000000000..627ff8333ad
--- /dev/null
+++ b/modules/seedtagBidAdapter.md
@@ -0,0 +1,79 @@
+# Overview
+
+```
+Module Name: Seedtag Bidder Adapter
+Module Type: Bidder Adapter
+Maintainer: prebid@seedtag.com
+```
+
+# Description
+
+Module that connects to Seedtag demand sources to fetch bids.
+
+# Test Parameters
+
+## Sample Banner Ad Unit
+
+```js
+const adUnits = [
+ {
+ code: '/21804003197/prebid_test_300x250',
+ mediaTypes: {
+ banner: {
+ sizes: [[300, 250]]
+ }
+ },
+ bids: [
+ {
+ bidder: 'seedtag',
+ params: {
+ publisherId: '0000-0000-01', // required
+ adUnitId: '0000', // required
+ placement: 'banner', // required
+ adPosition: 0 // optional
+ }
+ }
+ ]
+ }
+]
+```
+
+## Sample inStream Video Ad Unit
+
+```js
+var adUnits = [{
+ code: 'video',
+ mediaTypes: {
+ video: {
+ context: 'instream', // required
+ playerSize: [600, 300] // required
+ }
+ },
+ bids: [
+ {
+ bidder: 'seedtag',
+ params: {
+ publisherId: '0000-0000-01', // required
+ adUnitId: '0000', // required
+ placement: 'video', // required
+ adPosition: 0, // optional
+ // Video object as specified in OpenRTB 2.5
+ video: {
+ mimes: ['video/mp4'], // recommended
+ minduration: 5, // optional
+ maxduration: 60, // optional
+ boxingallowed: 1, // optional
+ skip: 1, // optional
+ startdelay: 1, // optional
+ linearity: 1, // optional
+ battr: [1, 2], // optional
+ maxbitrate: 10, // optional
+ playbackmethod: [1], // optional
+ delivery: [1], // optional
+ placement: 1, // optional
+ }
+ }
+ }
+ ]
+}];
+```
diff --git a/test/spec/modules/seedtagBidAdapter_spec.js b/test/spec/modules/seedtagBidAdapter_spec.js
new file mode 100644
index 00000000000..4bd4b599c55
--- /dev/null
+++ b/test/spec/modules/seedtagBidAdapter_spec.js
@@ -0,0 +1,396 @@
+import { expect } from 'chai'
+import { spec, getTimeoutUrl } from 'modules/seedtagBidAdapter'
+
+function getSlotConfigs(mediaTypes, params) {
+ return {
+ params: params,
+ sizes: [[300, 250], [300, 600]],
+ bidId: '30b31c1838de1e',
+ bidderRequestId: '22edbae2733bf6',
+ auctionId: '1d1a030790a475',
+ bidRequestsCount: 1,
+ bidder: 'seedtag',
+ mediaTypes: mediaTypes,
+ src: 'client',
+ transactionId: 'd704d006-0d6e-4a09-ad6c-179e7e758096'
+ }
+}
+
+describe('Seedtag Adapter', function() {
+ describe('isBidRequestValid method', function() {
+ const PUBLISHER_ID = '0000-0000-01'
+ const ADUNIT_ID = '000000'
+ describe('returns true', function() {
+ describe('when banner slot config has all mandatory params', () => {
+ describe('and placement has the correct value', function() {
+ const createBannerSlotConfig = placement => {
+ return getSlotConfigs(
+ { banner: {} },
+ {
+ publisherId: PUBLISHER_ID,
+ adUnitId: ADUNIT_ID,
+ placement
+ }
+ )
+ }
+ const placements = ['banner', 'video', 'inImage', 'inScreen']
+ placements.forEach(placement => {
+ it('should be ' + placement, function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createBannerSlotConfig(placement)
+ )
+ expect(isBidRequestValid).to.equal(true)
+ })
+ })
+ })
+ })
+ describe('when video slot has all mandatory params.', function() {
+ it('should return true, when video mediatype object are correct.', function() {
+ const slotConfig = getSlotConfigs(
+ {
+ video: {
+ context: 'instream',
+ playerSize: [[600, 200]]
+ }
+ },
+ {
+ publisherId: PUBLISHER_ID,
+ adUnitId: ADUNIT_ID,
+ placement: 'video'
+ }
+ )
+ const isBidRequestValid = spec.isBidRequestValid(slotConfig)
+ expect(isBidRequestValid).to.equal(true)
+ })
+ })
+ })
+ describe('returns false', function() {
+ describe('when params are not correct', function() {
+ function createSlotconfig(params) {
+ return getSlotConfigs({ banner: {} }, params)
+ }
+ it('does not have the PublisherToken.', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createSlotconfig({
+ adUnitId: '000000',
+ placement: 'banner'
+ })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ it('does not have the AdUnitId.', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createSlotconfig({
+ publisherId: '0000-0000-01',
+ placement: 'banner'
+ })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ it('does not have the placement.', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createSlotconfig({
+ publisherId: '0000-0000-01',
+ adUnitId: '000000'
+ })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ it('does not have a the correct placement.', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createSlotconfig({
+ publisherId: '0000-0000-01',
+ adUnitId: '000000',
+ placement: 'another_thing'
+ })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ })
+ describe('when video mediaType object is not correct.', function() {
+ function createVideoSlotconfig(mediaType) {
+ return getSlotConfigs(mediaType, {
+ publisherId: PUBLISHER_ID,
+ adUnitId: ADUNIT_ID,
+ placement: 'video'
+ })
+ }
+ it('is a void object', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createVideoSlotconfig({ video: {} })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ it('does not have playerSize.', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createVideoSlotconfig({ video: { context: 'instream' } })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ it('is not instream ', function() {
+ const isBidRequestValid = spec.isBidRequestValid(
+ createVideoSlotconfig({
+ video: {
+ context: 'outstream',
+ playerSize: [[600, 200]]
+ }
+ })
+ )
+ expect(isBidRequestValid).to.equal(false)
+ })
+ })
+ })
+ })
+
+ describe('buildRequests method', function() {
+ const bidderRequest = {
+ refererInfo: { referer: 'referer' },
+ timeout: 1000
+ }
+ const mandatoryParams = {
+ publisherId: '0000-0000-01',
+ adUnitId: '000000',
+ placement: 'banner'
+ }
+ const inStreamParams = Object.assign({}, mandatoryParams, {
+ video: {
+ mimes: 'mp4'
+ }
+ })
+ const validBidRequests = [
+ getSlotConfigs({ banner: {} }, mandatoryParams),
+ getSlotConfigs(
+ { video: { context: 'instream', playerSize: [[300, 200]] } },
+ inStreamParams
+ )
+ ]
+ it('Url params should be correct ', function() {
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ expect(request.method).to.equal('POST')
+ expect(request.url).to.equal('https://s.seedtag.com/c/hb/bid')
+ })
+
+ it('Common data request should be correct', function() {
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ expect(data.url).to.equal('referer')
+ expect(data.publisherToken).to.equal('0000-0000-01')
+ expect(typeof data.version).to.equal('string')
+ })
+
+ describe('adPosition param', function() {
+ it('should sended when publisher set adPosition param', function() {
+ const params = Object.assign({}, mandatoryParams, {
+ adPosition: 1
+ })
+ const validBidRequests = [getSlotConfigs({ banner: {} }, params)]
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ expect(data.bidRequests[0].adPosition).to.equal(1)
+ })
+ it('should not sended when publisher has not set adPosition param', function() {
+ const validBidRequests = [
+ getSlotConfigs({ banner: {} }, mandatoryParams)
+ ]
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ expect(data.bidRequests[0].adPosition).to.equal(undefined)
+ })
+ })
+
+ describe('GDPR params', function() {
+ describe('when there arent consent management platform', function() {
+ it('cmp should be false', function() {
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ expect(data.cmp).to.equal(false)
+ })
+ })
+ describe('when there are consent management platform', function() {
+ it('cmps should be true and ga should not sended, when gdprApplies is undefined', function() {
+ bidderRequest['gdprConsent'] = {
+ gdprApplies: undefined,
+ consentString: 'consentString'
+ }
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ expect(data.cmp).to.equal(true)
+ expect(Object.keys(data).indexOf('data')).to.equal(-1)
+ expect(data.cd).to.equal('consentString')
+ })
+ it('cmps should be true and all gdpr parameters should be sended, when there are gdprApplies', function() {
+ bidderRequest['gdprConsent'] = {
+ gdprApplies: true,
+ consentString: 'consentString'
+ }
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ expect(data.cmp).to.equal(true)
+ expect(data.ga).to.equal(true)
+ expect(data.cd).to.equal('consentString')
+ })
+ })
+ })
+
+ describe('BidRequests params', function() {
+ const request = spec.buildRequests(validBidRequests, bidderRequest)
+ const data = JSON.parse(request.data)
+ const bidRequests = data.bidRequests
+ it('should request a Banner', function() {
+ const bannerBid = bidRequests[0]
+ expect(bannerBid.id).to.equal('30b31c1838de1e')
+ expect(bannerBid.transactionId).to.equal(
+ 'd704d006-0d6e-4a09-ad6c-179e7e758096'
+ )
+ expect(bannerBid.supplyTypes[0]).to.equal('display')
+ expect(bannerBid.adUnitId).to.equal('000000')
+ expect(bannerBid.sizes[0][0]).to.equal(300)
+ expect(bannerBid.sizes[0][1]).to.equal(250)
+ expect(bannerBid.sizes[1][0]).to.equal(300)
+ expect(bannerBid.sizes[1][1]).to.equal(600)
+ })
+ it('should request an InStream Video', function() {
+ const videoBid = bidRequests[1]
+ expect(videoBid.id).to.equal('30b31c1838de1e')
+ expect(videoBid.transactionId).to.equal(
+ 'd704d006-0d6e-4a09-ad6c-179e7e758096'
+ )
+ expect(videoBid.supplyTypes[0]).to.equal('video')
+ expect(videoBid.adUnitId).to.equal('000000')
+ expect(videoBid.videoParams.mimes).to.equal('mp4')
+ expect(videoBid.videoParams.w).to.equal(300)
+ expect(videoBid.videoParams.h).to.equal(200)
+ expect(videoBid.sizes[0][0]).to.equal(300)
+ expect(videoBid.sizes[0][1]).to.equal(250)
+ expect(videoBid.sizes[1][0]).to.equal(300)
+ expect(videoBid.sizes[1][1]).to.equal(600)
+ })
+ })
+ })
+
+ describe('interpret response method', function() {
+ it('should return a void array, when the server response are not correct.', function() {
+ const request = { data: JSON.stringify({}) }
+ const serverResponse = {
+ body: {}
+ }
+ const bids = spec.interpretResponse(serverResponse, request)
+ expect(typeof bids).to.equal('object')
+ expect(bids.length).to.equal(0)
+ })
+ it('should return a void array, when the server response have not got bids.', function() {
+ const request = { data: JSON.stringify({}) }
+ const serverResponse = { body: { bids: [] } }
+ const bids = spec.interpretResponse(serverResponse, request)
+ expect(typeof bids).to.equal('object')
+ expect(bids.length).to.equal(0)
+ })
+ describe('when the server response return a bid', function() {
+ describe('the bid is a banner', function() {
+ it('should return a banner bid', function() {
+ const request = { data: JSON.stringify({}) }
+ const serverResponse = {
+ body: {
+ bids: [
+ {
+ bidId: '2159a54dc2566f',
+ price: 0.5,
+ currency: 'USD',
+ content: 'content',
+ width: 728,
+ height: 90,
+ mediaType: 'display',
+ ttl: 360
+ }
+ ],
+ cookieSync: { url: '' }
+ }
+ }
+ const bids = spec.interpretResponse(serverResponse, request)
+ expect(bids.length).to.equal(1)
+ expect(bids[0].requestId).to.equal('2159a54dc2566f')
+ expect(bids[0].cpm).to.equal(0.5)
+ expect(bids[0].width).to.equal(728)
+ expect(bids[0].height).to.equal(90)
+ expect(bids[0].currency).to.equal('USD')
+ expect(bids[0].netRevenue).to.equal(true)
+ expect(bids[0].ad).to.equal('content')
+ })
+ })
+ describe('the bid is a video', function() {
+ it('should return a instream bid', function() {
+ const request = { data: JSON.stringify({}) }
+ const serverResponse = {
+ body: {
+ bids: [
+ {
+ bidId: '2159a54dc2566f',
+ price: 0.5,
+ currency: 'USD',
+ content: 'content',
+ width: 728,
+ height: 90,
+ mediaType: 'video',
+ ttl: 360
+ }
+ ],
+ cookieSync: { url: '' }
+ }
+ }
+ const bids = spec.interpretResponse(serverResponse, request)
+ expect(bids.length).to.equal(1)
+ expect(bids[0].requestId).to.equal('2159a54dc2566f')
+ expect(bids[0].cpm).to.equal(0.5)
+ expect(bids[0].width).to.equal(728)
+ expect(bids[0].height).to.equal(90)
+ expect(bids[0].currency).to.equal('USD')
+ expect(bids[0].netRevenue).to.equal(true)
+ expect(bids[0].vastXml).to.equal('content')
+ })
+ })
+ })
+ })
+
+ describe('user syncs method', function() {
+ it('should return empty array, when iframe sync option are disabled.', function() {
+ const syncOption = { iframeEnabled: false }
+ const serverResponses = [{ body: { cookieSync: 'someUrl' } }]
+ const cookieSyncArray = spec.getUserSyncs(syncOption, serverResponses)
+ expect(cookieSyncArray.length).to.equal(0)
+ })
+ it('should return empty array, when the server response are wrong.', function() {
+ const syncOption = { iframeEnabled: true }
+ const serverResponses = [{ body: {} }]
+ const cookieSyncArray = spec.getUserSyncs(syncOption, serverResponses)
+ expect(cookieSyncArray.length).to.equal(0)
+ })
+ it('should return empty array, when the server response are void.', function() {
+ const syncOption = { iframeEnabled: true }
+ const serverResponses = [{ body: { cookieSync: '' } }]
+ const cookieSyncArray = spec.getUserSyncs(syncOption, serverResponses)
+ expect(cookieSyncArray.length).to.equal(0)
+ })
+ it('should return a array with the cookie sync, when the server response with a cookie sync.', function() {
+ const syncOption = { iframeEnabled: true }
+ const serverResponses = [{ body: { cookieSync: 'someUrl' } }]
+ const cookieSyncArray = spec.getUserSyncs(syncOption, serverResponses)
+ expect(cookieSyncArray.length).to.equal(1)
+ expect(cookieSyncArray[0].type).to.equal('iframe')
+ expect(cookieSyncArray[0].url).to.equal('someUrl')
+ })
+ })
+
+ describe('onTimeout', function () {
+ it('should return the correct endpoint', function () {
+ const params = { publisherId: '0000', adUnitId: '11111' }
+ const timeoutData = [{ params: [ params ] }];
+ const timeoutUrl = getTimeoutUrl(timeoutData);
+ expect(timeoutUrl).to.equal(
+ 'https://s.seedtag.com/se/hb/timeout?publisherToken=' +
+ params.publisherId +
+ '&adUnitId=' +
+ params.adUnitId
+ )
+ })
+ })
+})
From f6059313fde741701752846eeb7696fbf9d7c33c Mon Sep 17 00:00:00 2001
From: Aparna Rao-Hegde
Date: Tue, 2 Jul 2019 14:24:00 -0400
Subject: [PATCH 049/285] 33Across: Update GDPR handling (#3944)
* check gdpr in buildRequest
* User sync based on whether gdpr applies or not
* check if consent data exists during user sync
* split user sync into further branches: 1) when gdpr does not apply 2) when consent data is unavailable
* contribute viewability to ttxRequest
* update tests
* remove window mock from tests
* use local variables
* introduce ServerRequestBuilder
* add withOptions() method to ServerRequestBuilder
* add semicolons
* sync up package-lock.json with upstream/master
* stub window.top in tests
* introduce getTopWindowSize() for test purpose
* reformat code
* add withSite() method to TtxRequestBuilder
add withSite() method to TtxRequestBuilder
* add isIframe() and _isViewabilityMeasurable()
* handle NON_MEASURABLE viewability in nested iframes
* consider page visibility, stub utils functions getWindowTop() and getWindowSelf()
* contribute viewability as 0 for inactive tab
* add prebidjs version to ttx request
* send caller as an array
* fix JSDoc in utils.js
* send viewability as non measurable when unable to locate target HTMLElement, add warning message
* introduce mapAdSlotPathToElementId()
* introduce getAdSlotHTMLElement(), add logging
* introduce mapAdSlotPathToElementId()
* update logging in ad unit path to element id mapping
* rephrase logging, fix tests
* update adapter documentation
* remove excessive logging
* improve logging
* revert change
* fix return of _mapAdUnitPathToElementId()
* improve logging of _mapAdUnitPathToElementId()
* do not use Array.find()
* return id once element is found
* return id once element is found
* let -> const
* Removing killswitch behavior for GDPR
* Updated comments to reflect current gdpr logic
* URI encode consent string
* Updated example site ID to help Prebid team e2e test our adapter
---
modules/33acrossBidAdapter.js | 30 ++--
modules/33acrossBidAdapter.md | 2 +-
test/spec/modules/33acrossBidAdapter_spec.js | 147 ++++++++++++++-----
3 files changed, 125 insertions(+), 54 deletions(-)
diff --git a/modules/33acrossBidAdapter.js b/modules/33acrossBidAdapter.js
index 801a5d564a3..f53bf8b9d17 100644
--- a/modules/33acrossBidAdapter.js
+++ b/modules/33acrossBidAdapter.js
@@ -64,7 +64,7 @@ function _getAdSlotHTMLElement(adUnitCode) {
// Infer the necessary data from valid bid for a minimal ttxRequest and create HTTP request
// NOTE: At this point, TTX only accepts request for a single impression
-function _createServerRequest(bidRequest, gdprConsent) {
+function _createServerRequest(bidRequest, gdprConsent = {}) {
const ttxRequest = {};
const params = bidRequest.params;
const element = _getAdSlotHTMLElement(bidRequest.adUnitCode);
@@ -143,14 +143,22 @@ function _createServerRequest(bidRequest, gdprConsent) {
}
// Sync object will always be of type iframe for TTX
-function _createSync(siteId) {
+function _createSync({siteId, gdprConsent = {}}) {
const ttxSettings = config.getConfig('ttxSettings');
const syncUrl = (ttxSettings && ttxSettings.syncUrl) || SYNC_ENDPOINT;
- return {
+ const {consentString, gdprApplies} = gdprConsent;
+
+ const sync = {
type: 'iframe',
- url: `${syncUrl}&id=${siteId}`
+ url: `${syncUrl}&id=${siteId}&gdpr_consent=${encodeURIComponent(consentString)}`
+ };
+
+ if (typeof gdprApplies === 'boolean') {
+ sync.url += `&gdpr=${Number(gdprApplies)}`;
}
+
+ return sync;
}
function _getSize(size) {
@@ -282,8 +290,6 @@ function isBidRequestValid(bid) {
// NOTE: With regards to gdrp consent data,
// - the server independently infers gdpr applicability therefore, setting the default value to false
-// - the server, at this point, also doesn't need the consent string to handle gdpr compliance. So passing
-// value whether set or not, for the sake of future dev.
function buildRequests(bidRequests, bidderRequest) {
const gdprConsent = Object.assign({
consentString: undefined,
@@ -307,14 +313,12 @@ function interpretResponse(serverResponse, bidRequest) {
return bidResponses;
}
-// Register one sync per unique guid
-// NOTE: If gdpr applies do not sync
+// Register one sync per unique guid so long as iframe is enable
+// Else no syncs
+// For logic on how we handle gdpr data see _createSyncs and module's unit tests
+// '33acrossBidAdapter#getUserSyncs'
function getUserSyncs(syncOptions, responses, gdprConsent) {
- if (gdprConsent && gdprConsent.gdprApplies === true) {
- return []
- } else {
- return (syncOptions.iframeEnabled) ? adapterState.uniqueSiteIds.map(_createSync) : ([]);
- }
+ return (syncOptions.iframeEnabled) ? adapterState.uniqueSiteIds.map((siteId) => _createSync({gdprConsent, siteId})) : ([]);
}
export const spec = {
diff --git a/modules/33acrossBidAdapter.md b/modules/33acrossBidAdapter.md
index 58e3b2b273a..c313f3b6e0b 100644
--- a/modules/33acrossBidAdapter.md
+++ b/modules/33acrossBidAdapter.md
@@ -24,7 +24,7 @@ var adUnits = [
bids: [{
bidder: '33across',
params: {
- siteId: 'examplePub1234',
+ siteId: 'cxBE0qjUir6iopaKkGJozW',
productId: 'siab'
}
}]
diff --git a/test/spec/modules/33acrossBidAdapter_spec.js b/test/spec/modules/33acrossBidAdapter_spec.js
index 7e1a8619c63..08ea0a863ee 100644
--- a/test/spec/modules/33acrossBidAdapter_spec.js
+++ b/test/spec/modules/33acrossBidAdapter_spec.js
@@ -618,73 +618,140 @@ describe('33acrossBidAdapter:', function () {
];
});
- context('when gdpr does not apply', function() {
- let gdprConsent;
+ context('when iframe is not enabled', function() {
+ it('returns empty sync array', function() {
+ const syncOptions = {};
+
+ spec.buildRequests(bidRequests);
+
+ expect(spec.getUserSyncs(syncOptions)).to.deep.equal([]);
+ });
+ });
+ context('when iframe is enabled', function() {
+ let syncOptions;
beforeEach(function() {
- gdprConsent = {
- gdprApplies: false
+ syncOptions = {
+ iframeEnabled: true
};
});
- context('when iframe is not enabled', function() {
- it('returns empty sync array', function() {
- const syncOptions = {};
+ context('when there is no gdpr consent data', function() {
+ it('returns sync urls with undefined consent string as param', function() {
+ spec.buildRequests(bidRequests);
+
+ const syncResults = spec.getUserSyncs(syncOptions, {}, undefined);
+ const expectedSyncs = [
+ {
+ type: 'iframe',
+ url: `${syncs[0].url}&gdpr_consent=undefined`
+ },
+ {
+ type: 'iframe',
+ url: `${syncs[1].url}&gdpr_consent=undefined`
+ }
+ ]
+
+ expect(syncResults).to.deep.equal(expectedSyncs);
+ })
+ });
+ context('when gdpr applies but there is no consent string', function() {
+ it('returns sync urls with undefined consent string as param and gdpr=1', function() {
spec.buildRequests(bidRequests);
- expect(spec.getUserSyncs(syncOptions, {}, gdprConsent)).to.deep.equal([]);
+ const syncResults = spec.getUserSyncs(syncOptions, {}, {gdprApplies: true});
+ const expectedSyncs = [
+ {
+ type: 'iframe',
+ url: `${syncs[0].url}&gdpr_consent=undefined&gdpr=1`
+ },
+ {
+ type: 'iframe',
+ url: `${syncs[1].url}&gdpr_consent=undefined&gdpr=1`
+ }
+ ];
+
+ expect(syncResults).to.deep.equal(expectedSyncs);
});
});
- context('when iframe is enabled', function() {
- it('returns sync array equal to number of unique siteIDs', function() {
- const syncOptions = {
- iframeEnabled: true
- };
-
+ context('when gdpr applies and there is consent string', function() {
+ it('returns sync urls with gdpr_consent=consent string as param and gdpr=1', function() {
spec.buildRequests(bidRequests);
- expect(spec.getUserSyncs(syncOptions, {}, gdprConsent)).to.deep.equal(syncs);
+ const syncResults = spec.getUserSyncs(syncOptions, {}, {gdprApplies: true, consentString: 'consent123A'});
+ const expectedSyncs = [
+ {
+ type: 'iframe',
+ url: `${syncs[0].url}&gdpr_consent=consent123A&gdpr=1`
+ },
+ {
+ type: 'iframe',
+ url: `${syncs[1].url}&gdpr_consent=consent123A&gdpr=1`
+ }
+ ];
+
+ expect(syncResults).to.deep.equal(expectedSyncs);
});
});
- });
-
- context('when consent data is not defined', function() {
- context('when iframe is not enabled', function() {
- it('returns empty sync array', function() {
- const syncOptions = {};
+ context('when gdpr does not apply and there is no consent string', function() {
+ it('returns sync urls with undefined consent string as param and gdpr=0', function() {
spec.buildRequests(bidRequests);
- expect(spec.getUserSyncs(syncOptions)).to.deep.equal([]);
+ const syncResults = spec.getUserSyncs(syncOptions, {}, {gdprApplies: false});
+ const expectedSyncs = [
+ {
+ type: 'iframe',
+ url: `${syncs[0].url}&gdpr_consent=undefined&gdpr=0`
+ },
+ {
+ type: 'iframe',
+ url: `${syncs[1].url}&gdpr_consent=undefined&gdpr=0`
+ }
+ ];
+ expect(syncResults).to.deep.equal(expectedSyncs);
});
});
- context('when iframe is enabled', function() {
- it('returns sync array equal to number of unique siteIDs', function() {
- const syncOptions = {
- iframeEnabled: true
- };
-
+ context('when gdpr is unknown and there is consent string', function() {
+ it('returns sync urls with only consent string as param', function() {
spec.buildRequests(bidRequests);
- expect(spec.getUserSyncs(syncOptions)).to.deep.equal(syncs);
+ const syncResults = spec.getUserSyncs(syncOptions, {}, {consentString: 'consent123A'});
+ const expectedSyncs = [
+ {
+ type: 'iframe',
+ url: `${syncs[0].url}&gdpr_consent=consent123A`
+ },
+ {
+ type: 'iframe',
+ url: `${syncs[1].url}&gdpr_consent=consent123A`
+ }
+ ];
+ expect(syncResults).to.deep.equal(expectedSyncs);
});
});
- });
- context('when gdpr applies', function() {
- it('returns empty sync array', function() {
- const syncOptions = {};
- const gdprConsent = {
- gdprApplies: true
- };
-
- spec.buildRequests(bidRequests);
+ context('when gdpr does not apply and there is consent string (yikes!)', function() {
+ it('returns sync urls with consent string as param and gdpr=0', function() {
+ spec.buildRequests(bidRequests);
- expect(spec.getUserSyncs(syncOptions, {}, gdprConsent)).to.deep.equal([]);
+ const syncResults = spec.getUserSyncs(syncOptions, {}, {gdprApplies: false, consentString: 'consent123A'});
+ const expectedSyncs = [
+ {
+ type: 'iframe',
+ url: `${syncs[0].url}&gdpr_consent=consent123A&gdpr=0`
+ },
+ {
+ type: 'iframe',
+ url: `${syncs[1].url}&gdpr_consent=consent123A&gdpr=0`
+ }
+ ];
+ expect(syncResults).to.deep.equal(expectedSyncs);
+ });
});
- })
+ });
});
});
From 0a96baf1ed8a00b88aaf2c3ca89cca925e45a855 Mon Sep 17 00:00:00 2001
From: Jason Snellbaker
Date: Tue, 2 Jul 2019 15:40:11 -0400
Subject: [PATCH 050/285] Prebid 2.22.0 Release
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index ae1d5ba514a..75618208b5c 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.22.0-pre",
+ "version": "2.22.0",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From b02a00c67b76a741424c785d10b0ce106da45ce4 Mon Sep 17 00:00:00 2001
From: Jason Snellbaker
Date: Tue, 2 Jul 2019 15:54:22 -0400
Subject: [PATCH 051/285] increment pre version
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 75618208b5c..5e2806fe5f4 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "prebid.js",
- "version": "2.22.0",
+ "version": "2.23.0-pre",
"description": "Header Bidding Management Library",
"main": "src/prebid.js",
"scripts": {
From 2e0ea780d1ef8e8b9142234c83c2700c4511cfc5 Mon Sep 17 00:00:00 2001
From: Scott
Date: Tue, 9 Jul 2019 15:24:42 +0200
Subject: [PATCH 052/285] adding back the ID5 documentation in `userId.md` that
had been accidentally removed (#3975)
---
modules/userId/userId.md | 24 +++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/modules/userId/userId.md b/modules/userId/userId.md
index 782e7782554..cd7aaf92d39 100644
--- a/modules/userId/userId.md
+++ b/modules/userId/userId.md
@@ -1,10 +1,17 @@
## User ID Example Configuration
-Example showing `cookie` storage for user id data for both submodules
+Example showing `cookie` storage for user id data for each of the submodules
```
pbjs.setConfig({
userSync: {
userIds: [{
+ name: "pubCommonId",
+ storage: {
+ type: "cookie",
+ name: "_pubcid",
+ expires: 60
+ }
+ }, {
name: "unifiedId",
params: {
partner: "prebid",
@@ -16,11 +23,14 @@ pbjs.setConfig({
expires: 60
}
}, {
- name: "pubCommonId",
+ name: "id5Id",
+ params: {
+ partner: 173 // @TODO: Set your real ID5 partner ID here for production, please ask for one at http://id5.io/prebid
+ },
storage: {
type: "cookie",
- name: "_pubcid",
- expires: 60
+ name: "id5id",
+ expires: 5
}
}],
syncDelay: 5000
@@ -28,7 +38,7 @@ pbjs.setConfig({
});
```
-Example showing `localStorage` for user id data for both submodules
+Example showing `localStorage` for user id data for some submodules
```
pbjs.setConfig({
usersync: {
@@ -65,6 +75,10 @@ pbjs.setConfig({
value: {
"providedPubCommonId": "1234567890"
}
+ },
+ {
+ name: "id5Id",
+ value: { "id5id": "ID5-abcdef" }
}],
syncDelay: 5000
}
From 3e6460ddb7db1d2c4254121645e25b3094e86cbc Mon Sep 17 00:00:00 2001
From: DeepthiNeeladri
Date: Tue, 9 Jul 2019 22:36:02 +0530
Subject: [PATCH 053/285] Support of outstream renderer in oneVideo Adaptor
(#3959)
* outstream changes
* removing global filtet
* reverting page
* message
* adapter change
* remove space
* testcases
* testpage
* spaces for test page
* renderer exist case
* reverting package-lock.json
---
modules/oneVideoBidAdapter.js | 22 ++++++++++++++++++--
test/pages/video.html | 2 +-
test/spec/modules/oneVideoBidAdapter_spec.js | 16 +++++++++++---
3 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/modules/oneVideoBidAdapter.js b/modules/oneVideoBidAdapter.js
index 818c31a84af..c05158f28c4 100644
--- a/modules/oneVideoBidAdapter.js
+++ b/modules/oneVideoBidAdapter.js
@@ -76,19 +76,22 @@ export const spec = {
requestId: bidRequest.bidId,
bidderCode: spec.code,
cpm: bid.price,
- creativeId: bid.id,
+ adId: bid.adid,
+ creativeId: bid.crid,
width: size.width,
height: size.height,
mediaType: 'video',
currency: response.cur,
ttl: 100,
- netRevenue: true
+ netRevenue: true,
+ adUnitCode: bidRequest.adUnitCode
};
if (bid.nurl) {
bidResponse.vastUrl = bid.nurl;
} else if (bid.adm) {
bidResponse.vastXml = bid.adm;
}
+ bidResponse.renderer = (bidRequest.mediaTypes.video.context === 'outstream') ? newRenderer(bidRequest, bidResponse) : undefined;
return bidResponse;
},
/**
@@ -216,5 +219,20 @@ function getRequestData(bid, consentData) {
function isSecure() {
return document.location.protocol === 'https:';
}
+/**
+ * Create oneVideo renderer
+ * @returns {*}
+ */
+function newRenderer(bidRequest, bid) {
+ if (!bidRequest.renderer) {
+ bidRequest.renderer = {};
+ bidRequest.renderer.url = 'https://cdn.vidible.tv/prod/hb-outstream-renderer/renderer.js';
+ bidRequest.renderer.render = function(bid) {
+ setTimeout(function () {
+ o2PlayerRender(bid);
+ }, 700)
+ };
+ }
+}
registerBidder(spec);
diff --git a/test/pages/video.html b/test/pages/video.html
index e040b65fe23..09e75379e69 100644
--- a/test/pages/video.html
+++ b/test/pages/video.html
@@ -133,4 +133,4 @@ Prebid Video -- video.js